Skip to content

Commit

Permalink
net/hinic: fix crash in secondary process
Browse files Browse the repository at this point in the history
[ upstream commit 4c670df ]

Some apps, such as fstack, will use secondary process to access the
memory of eth_dev_ops, and they want to get the info of dev, but hinic
driver does not initialized it when in secondary process.

Fixes: 66f64dd ("net/hinic: fix secondary process")

Signed-off-by: Guoyang Zhou <zhouguoyang@huawei.com>
  • Loading branch information
Guoyang Zhou authored and steevenlee committed May 8, 2021
1 parent a1b0bff commit de81fe2
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 17 deletions.
25 changes: 8 additions & 17 deletions drivers/net/hinic/base/hinic_compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,7 @@ static inline u32 readl(const volatile void *addr)
#else
#define CLOCK_TYPE CLOCK_MONOTONIC
#endif
#define HINIC_MUTEX_TIMEOUT 10

static inline unsigned long clock_gettime_ms(void)
{
Expand Down Expand Up @@ -225,24 +226,14 @@ static inline int hinic_mutex_destroy(pthread_mutex_t *pthreadmutex)
static inline int hinic_mutex_lock(pthread_mutex_t *pthreadmutex)
{
int err;
struct timespec tout;

err = pthread_mutex_lock(pthreadmutex);
if (!err) {
return err;
} else if (err == EOWNERDEAD) {
PMD_DRV_LOG(ERR, "Mutex lock failed. (ErrorNo=%d)", errno);
#if defined(__GLIBC__)
#if __GLIBC_PREREQ(2, 12)
(void)pthread_mutex_consistent(pthreadmutex);
#else
(void)pthread_mutex_consistent_np(pthreadmutex);
#endif
#else
(void)pthread_mutex_consistent(pthreadmutex);
#endif
} else {
PMD_DRV_LOG(ERR, "Mutex lock failed. (ErrorNo=%d)", errno);
}
(void)clock_gettime(CLOCK_TYPE, &tout);

tout.tv_sec += HINIC_MUTEX_TIMEOUT;
err = pthread_mutex_timedlock(pthreadmutex, &tout);
if (err)
PMD_DRV_LOG(ERR, "Mutex lock failed. (ErrorNo=%d)", err);

return err;
}
Expand Down
5 changes: 5 additions & 0 deletions drivers/net/hinic/hinic_pmd_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -3085,6 +3085,10 @@ static const struct eth_dev_ops hinic_pmd_vf_ops = {
.filter_ctrl = hinic_dev_filter_ctrl,
};

static const struct eth_dev_ops hinic_dev_sec_ops = {
.dev_infos_get = hinic_dev_infos_get,
};

static int hinic_func_init(struct rte_eth_dev *eth_dev)
{
struct rte_pci_device *pci_dev;
Expand All @@ -3099,6 +3103,7 @@ static int hinic_func_init(struct rte_eth_dev *eth_dev)

/* EAL is SECONDARY and eth_dev is already created */
if (rte_eal_process_type() != RTE_PROC_PRIMARY) {
eth_dev->dev_ops = &hinic_dev_sec_ops;
PMD_DRV_LOG(INFO, "Initialize %s in secondary process",
eth_dev->data->name);

Expand Down

0 comments on commit de81fe2

Please sign in to comment.