* [RFC 1/6] ethdev: fix flow_ops_mutex for multi-process
2026-01-30 5:17 [RFC 0/6] Fix pthread mutexes for multi-process support Stephen Hemminger
@ 2026-01-30 5:17 ` Stephen Hemminger
2026-01-30 5:17 ` [RFC 2/6] net/failsafe: fix hotplug_mutex " Stephen Hemminger
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Stephen Hemminger @ 2026-01-30 5:17 UTC (permalink / raw)
To: dev
Cc: Stephen Hemminger, stable, Thomas Monjalon, Andrew Rybchenko,
Matan Azrad, Suanming Mou, Ajit Khaparde
The flow_ops_mutex in rte_eth_dev_data is located in shared memory
that is accessed by both primary and secondary processes. However,
the mutex is initialized without PTHREAD_PROCESS_SHARED attribute,
which means synchronization between processes is undefined behavior.
POSIX mutexes are by default private to the process creating them.
When a mutex protects data structures in shared memory that are
accessed by multiple processes, pthread_mutexattr_setpshared() must
be called with PTHREAD_PROCESS_SHARED.
This bug has existed since the flow_ops_mutex was added and affects
any multi-process DPDK application using rte_flow APIs.
Bugzilla ID: 662
Fixes: 80d1a9aff7f6 ("ethdev: make flow API thread safe")
Cc: stable@dpdk.org
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
lib/ethdev/ethdev_driver.c | 18 +++++++++++++++++-
1 file changed, 17 insertions(+), 1 deletion(-)
diff --git a/lib/ethdev/ethdev_driver.c b/lib/ethdev/ethdev_driver.c
index 2ec665be0f..d12395efe0 100644
--- a/lib/ethdev/ethdev_driver.c
+++ b/lib/ethdev/ethdev_driver.c
@@ -89,6 +89,22 @@ eth_dev_set_dummy_fops(struct rte_eth_dev *eth_dev)
eth_dev->recycle_rx_descriptors_refill = rte_eth_recycle_rx_descriptors_refill_dummy;
}
+/*
+ * Initialize mutex for process-shared access.
+ * The rte_eth_dev_data structure is in shared memory, so any mutex
+ * protecting it must use PTHREAD_PROCESS_SHARED.
+ */
+static void
+eth_dev_flow_ops_mutex_init(pthread_mutex_t *mutex)
+{
+ pthread_mutexattr_t attr;
+
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
+ pthread_mutex_init(mutex, &attr);
+ pthread_mutexattr_destroy(&attr);
+}
+
RTE_EXPORT_INTERNAL_SYMBOL(rte_eth_dev_allocate)
struct rte_eth_dev *
rte_eth_dev_allocate(const char *name)
@@ -135,7 +151,7 @@ rte_eth_dev_allocate(const char *name)
eth_dev->data->port_id = port_id;
eth_dev->data->backer_port_id = RTE_MAX_ETHPORTS;
eth_dev->data->mtu = RTE_ETHER_MTU;
- pthread_mutex_init(ð_dev->data->flow_ops_mutex, NULL);
+ eth_dev_flow_ops_mutex_init(ð_dev->data->flow_ops_mutex);
RTE_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
eth_dev_shared_data->allocated_ports++;
--
2.51.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [RFC 2/6] net/failsafe: fix hotplug_mutex for multi-process
2026-01-30 5:17 [RFC 0/6] Fix pthread mutexes for multi-process support Stephen Hemminger
2026-01-30 5:17 ` [RFC 1/6] ethdev: fix flow_ops_mutex for multi-process Stephen Hemminger
@ 2026-01-30 5:17 ` Stephen Hemminger
2026-01-30 5:17 ` [RFC 3/6] net/atlantic: fix mbox_mutex " Stephen Hemminger
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Stephen Hemminger @ 2026-01-30 5:17 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, stable, Gaetan Rivet, Matan Azrad
The failsafe driver supports secondary process attachment via
rte_eth_dev_attach_secondary() in rte_pmd_failsafe_probe(). The
hotplug_mutex in fs_priv protects shared state but is initialized
without PTHREAD_PROCESS_SHARED attribute.
POSIX mutexes are by default private to the process creating them.
When a mutex protects data structures accessed by multiple processes,
pthread_mutexattr_setpshared() must be called with PTHREAD_PROCESS_SHARED.
Also add missing pthread_mutexattr_destroy() call to avoid resource leak.
Bugzilla ID: 662
Fixes: 655fcd68c7d2 ("net/failsafe: fix hotplug races")
Cc: stable@dpdk.org
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/failsafe/failsafe.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/drivers/net/failsafe/failsafe.c b/drivers/net/failsafe/failsafe.c
index 3e590d38f7..aa3fe53b22 100644
--- a/drivers/net/failsafe/failsafe.c
+++ b/drivers/net/failsafe/failsafe.c
@@ -144,11 +144,20 @@ fs_mutex_init(struct fs_priv *priv)
/* Allow mutex relocks for the thread holding the mutex. */
ret = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
if (ret) {
- ERROR("Cannot set mutex type - %s", strerror(ret));
- return ret;
+ ERROR("Cannot set mutex recursive - %s", strerror(ret));
+ goto out;
+ }
+ /* Allow mutex to be shared between processes. */
+ ret = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
+ if (ret) {
+ ERROR("Cannot set mutex pshared - %s", strerror(ret));
+ goto out;
}
+ pthread_mutex_init(&priv->hotplug_mutex, &attr);
- return pthread_mutex_init(&priv->hotplug_mutex, &attr);
+out:
+ pthread_mutexattr_destroy(&attr);
+ return ret;
}
static int
--
2.51.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [RFC 3/6] net/atlantic: fix mbox_mutex for multi-process
2026-01-30 5:17 [RFC 0/6] Fix pthread mutexes for multi-process support Stephen Hemminger
2026-01-30 5:17 ` [RFC 1/6] ethdev: fix flow_ops_mutex for multi-process Stephen Hemminger
2026-01-30 5:17 ` [RFC 2/6] net/failsafe: fix hotplug_mutex " Stephen Hemminger
@ 2026-01-30 5:17 ` Stephen Hemminger
2026-01-30 5:17 ` [RFC 4/6] net/axgbe: fix mutexes " Stephen Hemminger
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Stephen Hemminger @ 2026-01-30 5:17 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, stable, Igor Russkikh, Pavel Belous
The Atlantic driver supports secondary processes, as shown by the
explicit check in eth_atl_dev_init(). The mbox_mutex in aq_hw_s
is located in dev_private which is in shared memory accessible
by both primary and secondary processes.
However, the mutex is initialized without PTHREAD_PROCESS_SHARED
attribute, which means synchronization between processes is
undefined behavior.
POSIX mutexes are by default private to the process creating them.
When a mutex protects data structures in shared memory that are
accessed by multiple processes, pthread_mutexattr_setpshared() must
be called with PTHREAD_PROCESS_SHARED.
Bugzilla ID: 662
Fixes: e9924638f5c9 ("net/atlantic: add FW mailbox guard mutex")
Cc: stable@dpdk.org
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/atlantic/atl_ethdev.c | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/drivers/net/atlantic/atl_ethdev.c b/drivers/net/atlantic/atl_ethdev.c
index 2925dc2478..7282f9b691 100644
--- a/drivers/net/atlantic/atl_ethdev.c
+++ b/drivers/net/atlantic/atl_ethdev.c
@@ -3,6 +3,7 @@
*/
#include <rte_string_fns.h>
+#include <pthread.h>
#include <ethdev_pci.h>
#include <rte_alarm.h>
@@ -355,6 +356,17 @@ atl_disable_intr(struct aq_hw_s *hw)
hw_atl_itr_irq_msk_clearlsw_set(hw, 0xffffffff);
}
+static void
+atl_init_mutex(pthread_mutex_t *mutex)
+{
+ pthread_mutexattr_t attr;
+
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
+ pthread_mutex_init(mutex, &attr);
+ pthread_mutexattr_destroy(&attr);
+}
+
static int
eth_atl_dev_init(struct rte_eth_dev *eth_dev)
{
@@ -405,7 +417,7 @@ eth_atl_dev_init(struct rte_eth_dev *eth_dev)
hw->aq_nic_cfg = &adapter->hw_cfg;
- pthread_mutex_init(&hw->mbox_mutex, NULL);
+ atl_init_mutex(&hw->mbox_mutex);
/* disable interrupt */
atl_disable_intr(hw);
--
2.51.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [RFC 4/6] net/axgbe: fix mutexes for multi-process
2026-01-30 5:17 [RFC 0/6] Fix pthread mutexes for multi-process support Stephen Hemminger
` (2 preceding siblings ...)
2026-01-30 5:17 ` [RFC 3/6] net/atlantic: fix mbox_mutex " Stephen Hemminger
@ 2026-01-30 5:17 ` Stephen Hemminger
2026-01-30 5:17 ` [RFC 5/6] net/bnxt: " Stephen Hemminger
2026-01-30 5:17 ` [RFC 6/6] net/hinic: " Stephen Hemminger
5 siblings, 0 replies; 7+ messages in thread
From: Stephen Hemminger @ 2026-01-30 5:17 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, stable, Selwin Sebastian, Ravi Kumar
The AXGBE driver supports secondary processes, as shown by the
explicit check in eth_axgbe_dev_init(). The xpcs_mutex, i2c_mutex,
an_mutex, and phy_mutex in axgbe_port are located in dev_private
which is in shared memory accessible by both primary and secondary
processes.
However, the mutexes are initialized without PTHREAD_PROCESS_SHARED
attribute, which means synchronization between processes is
undefined behavior.
POSIX mutexes are by default private to the process creating them.
When a mutex protects data structures in shared memory that are
accessed by multiple processes, pthread_mutexattr_setpshared() must
be called with PTHREAD_PROCESS_SHARED.
Bugzilla ID: 662
Fixes: 572890ef6625 ("net/axgbe: add structs for MAC init and reset")
Cc: stable@dpdk.org
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/axgbe/axgbe_ethdev.c | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c
index cf3b0d9ef5..0fedac72ab 100644
--- a/drivers/net/axgbe/axgbe_ethdev.c
+++ b/drivers/net/axgbe/axgbe_ethdev.c
@@ -193,6 +193,17 @@ static const struct axgbe_xstats axgbe_xstats_strings[] = {
#define AMD_PCI_AXGBE_DEVICE_V2A 0x1458
#define AMD_PCI_AXGBE_DEVICE_V2B 0x1459
+static void
+axgbe_init_mutex(pthread_mutex_t *mutex)
+{
+ pthread_mutexattr_t attr;
+
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
+ pthread_mutex_init(mutex, &attr);
+ pthread_mutexattr_destroy(&attr);
+}
+
static const struct rte_pci_id pci_id_axgbe_map[] = {
{RTE_PCI_DEVICE(AMD_PCI_VENDOR_ID, AMD_PCI_AXGBE_DEVICE_V2A)},
{RTE_PCI_DEVICE(AMD_PCI_VENDOR_ID, AMD_PCI_AXGBE_DEVICE_V2B)},
@@ -2403,10 +2414,10 @@ eth_axgbe_dev_init(struct rte_eth_dev *eth_dev)
pdata->tx_desc_count = AXGBE_MAX_RING_DESC;
pdata->rx_desc_count = AXGBE_MAX_RING_DESC;
- pthread_mutex_init(&pdata->xpcs_mutex, NULL);
- pthread_mutex_init(&pdata->i2c_mutex, NULL);
- pthread_mutex_init(&pdata->an_mutex, NULL);
- pthread_mutex_init(&pdata->phy_mutex, NULL);
+ axgbe_init_mutex(&pdata->xpcs_mutex);
+ axgbe_init_mutex(&pdata->i2c_mutex);
+ axgbe_init_mutex(&pdata->an_mutex);
+ axgbe_init_mutex(&pdata->phy_mutex);
ret = pdata->phy_if.phy_init(pdata);
if (ret) {
--
2.51.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [RFC 5/6] net/bnxt: fix mutexes for multi-process
2026-01-30 5:17 [RFC 0/6] Fix pthread mutexes for multi-process support Stephen Hemminger
` (3 preceding siblings ...)
2026-01-30 5:17 ` [RFC 4/6] net/axgbe: fix mutexes " Stephen Hemminger
@ 2026-01-30 5:17 ` Stephen Hemminger
2026-01-30 5:17 ` [RFC 6/6] net/hinic: " Stephen Hemminger
5 siblings, 0 replies; 7+ messages in thread
From: Stephen Hemminger @ 2026-01-30 5:17 UTC (permalink / raw)
To: dev
Cc: Stephen Hemminger, stable, Kishore Padmanabha, Ajit Khaparde,
Kalesh AP, Venkat Duvvuru, Somnath Kotur
The BNXT driver supports secondary processes, as shown by the
explicit check in bnxt_dev_init(). Multiple mutexes are located
in structures allocated in shared memory (dev_private and
rte_zmalloc'd structures) that are accessible by both primary
and secondary processes.
However, the mutexes are initialized without PTHREAD_PROCESS_SHARED
attribute, which means synchronization between processes is
undefined behavior.
POSIX mutexes are by default private to the process creating them.
When a mutex protects data structures in shared memory that are
accessed by multiple processes, pthread_mutexattr_setpshared() must
be called with PTHREAD_PROCESS_SHARED.
This patch adds a helper function and updates all mutex
initializations in the BNXT driver:
- flow_lock, def_cp_lock, health_check_lock, err_recovery_lock
in struct bnxt (bnxt_ethdev.c)
- vfr_start_lock in rep_info (bnxt_ethdev.c)
- txq_lock in struct bnxt_tx_queue (bnxt_txq.c)
- bnxt_ulp_mutex in session state (bnxt_ulp.c)
- flow_db_lock in cfg_data (bnxt_ulp_tf.c, bnxt_ulp_tfc.c)
Bugzilla ID: 662
Fixes: 1cb3d39a48f7 ("net/bnxt: synchronize between flow related functions")
Fixes: 5526c8025d4d ("net/bnxt: fix race between interrupt handler and dev config")
Fixes: b59e4be2b6a7 ("net/bnxt: fix VF representor port add")
Cc: stable@dpdk.org
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/bnxt/bnxt_ethdev.c | 11 ++++++-----
drivers/net/bnxt/bnxt_txq.c | 3 ++-
drivers/net/bnxt/bnxt_util.c | 13 +++++++++++++
drivers/net/bnxt/bnxt_util.h | 2 ++
drivers/net/bnxt/tf_ulp/bnxt_ulp.c | 2 +-
drivers/net/bnxt/tf_ulp/bnxt_ulp_tf.c | 2 +-
drivers/net/bnxt/tf_ulp/bnxt_ulp_tfc.c | 2 +-
7 files changed, 26 insertions(+), 9 deletions(-)
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index 3c618c6e82..a954514014 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -5858,10 +5858,10 @@ static int bnxt_get_config(struct bnxt *bp)
static int
bnxt_init_locks(struct bnxt *bp)
{
- pthread_mutex_init(&bp->flow_lock, NULL);
- pthread_mutex_init(&bp->def_cp_lock, NULL);
- pthread_mutex_init(&bp->health_check_lock, NULL);
- pthread_mutex_init(&bp->err_recovery_lock, NULL);
+ bnxt_init_mutex(&bp->flow_lock);
+ bnxt_init_mutex(&bp->def_cp_lock);
+ bnxt_init_mutex(&bp->health_check_lock);
+ bnxt_init_mutex(&bp->err_recovery_lock);
return 0;
}
@@ -6879,7 +6879,8 @@ static int bnxt_init_rep_info(struct bnxt *bp)
for (i = 0; i < BNXT_MAX_CFA_CODE; i++)
bp->cfa_code_map[i] = BNXT_VF_IDX_INVALID;
- return pthread_mutex_init(&bp->rep_info->vfr_start_lock, NULL);
+ bnxt_init_mutex(&bp->rep_info->vfr_start_lock);
+ return 0;
}
static int bnxt_rep_port_probe(struct rte_pci_device *pci_dev,
diff --git a/drivers/net/bnxt/bnxt_txq.c b/drivers/net/bnxt/bnxt_txq.c
index 3938ebc709..6deed08ad7 100644
--- a/drivers/net/bnxt/bnxt_txq.c
+++ b/drivers/net/bnxt/bnxt_txq.c
@@ -198,7 +198,8 @@ int bnxt_tx_queue_setup_op(struct rte_eth_dev *eth_dev,
goto err;
}
- return pthread_mutex_init(&txq->txq_lock, NULL);
+ bnxt_init_mutex(&txq->txq_lock);
+ return 0;
err:
bnxt_tx_queue_release_op(eth_dev, queue_idx);
return rc;
diff --git a/drivers/net/bnxt/bnxt_util.c b/drivers/net/bnxt/bnxt_util.c
index aa184496c2..c3f0a03f25 100644
--- a/drivers/net/bnxt/bnxt_util.c
+++ b/drivers/net/bnxt/bnxt_util.c
@@ -3,6 +3,7 @@
* All rights reserved.
*/
+#include <pthread.h>
#include <inttypes.h>
#include <rte_ether.h>
@@ -37,3 +38,15 @@ uint8_t hweight32(uint32_t word32)
res = res + (res >> 8);
return (res + (res >> 16)) & 0x000000FF;
}
+
+/* Initialize mutex so that it can be shared between processes */
+void
+bnxt_init_mutex(pthread_mutex_t *mutex)
+{
+ pthread_mutexattr_t attr;
+
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
+ pthread_mutex_init(mutex, &attr);
+ pthread_mutexattr_destroy(&attr);
+}
diff --git a/drivers/net/bnxt/bnxt_util.h b/drivers/net/bnxt/bnxt_util.h
index 416a6a2609..e1b45d1bb5 100644
--- a/drivers/net/bnxt/bnxt_util.h
+++ b/drivers/net/bnxt/bnxt_util.h
@@ -16,4 +16,6 @@
int bnxt_check_zero_bytes(const uint8_t *bytes, int len);
void bnxt_eth_hw_addr_random(uint8_t *mac_addr);
uint8_t hweight32(uint32_t word32);
+void bnxt_init_mutex(pthread_mutex_t *mutex);
+
#endif /* _BNXT_UTIL_H_ */
diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
index 0c03ae7a83..c2c93859ff 100644
--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
@@ -214,7 +214,7 @@ ulp_session_init(struct bnxt *bp,
session->pci_info.domain = pci_addr->domain;
session->pci_info.bus = pci_addr->bus;
memcpy(session->dsn, bp->dsn, sizeof(session->dsn));
- pthread_mutex_init(&session->bnxt_ulp_mutex, NULL);
+ bnxt_init_mutex(&session->bnxt_ulp_mutex);
STAILQ_INSERT_TAIL(&bnxt_ulp_session_list,
session, next);
}
diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp_tf.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp_tf.c
index 38cb5c8b31..5cb79a03e4 100644
--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp_tf.c
+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp_tf.c
@@ -1469,7 +1469,7 @@ ulp_tf_init(struct bnxt *bp,
goto jump_to_error;
}
- pthread_mutex_init(&bp->ulp_ctx->cfg_data->flow_db_lock, NULL);
+ bnxt_init_mutex(&bp->ulp_ctx->cfg_data->flow_db_lock);
/* Initialize ulp dparms with values devargs passed */
rc = ulp_tf_dparms_init(bp, bp->ulp_ctx);
diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp_tfc.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp_tfc.c
index ad44ec93ca..0c3d1f7dae 100644
--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp_tfc.c
+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp_tfc.c
@@ -1038,7 +1038,7 @@ ulp_tfc_init(struct bnxt *bp,
goto jump_to_error;
}
- pthread_mutex_init(&bp->ulp_ctx->cfg_data->flow_db_lock, NULL);
+ bnxt_init_mutex(&bp->ulp_ctx->cfg_data->flow_db_lock);
rc = ulp_tfc_dparms_init(bp, bp->ulp_ctx, ulp_dev_id);
if (rc) {
--
2.51.0
^ permalink raw reply related [flat|nested] 7+ messages in thread* [RFC 6/6] net/hinic: fix mutexes for multi-process
2026-01-30 5:17 [RFC 0/6] Fix pthread mutexes for multi-process support Stephen Hemminger
` (4 preceding siblings ...)
2026-01-30 5:17 ` [RFC 5/6] net/bnxt: " Stephen Hemminger
@ 2026-01-30 5:17 ` Stephen Hemminger
5 siblings, 0 replies; 7+ messages in thread
From: Stephen Hemminger @ 2026-01-30 5:17 UTC (permalink / raw)
To: dev; +Cc: Stephen Hemminger, stable, Ziyang Xuan, Xiaoyun Wang
The hinic driver supports secondary processes, as shown by the
explicit check in hinic_dev_init(). Multiple mutexes are located
in structures allocated in shared memory (dev_private and
rte_zmalloc'd structures) that are accessible by both primary
and secondary processes.
However, the mutexes are initialized without PTHREAD_PROCESS_SHARED
attribute, which means synchronization between processes is
undefined behavior.
POSIX mutexes are by default private to the process creating them.
When a mutex protects data structures in shared memory that are
accessed by multiple processes, pthread_mutexattr_setpshared() must
be called with PTHREAD_PROCESS_SHARED.
Fix the hinic_mutex_init() wrapper function to set the
PTHREAD_PROCESS_SHARED attribute on all mutexes.
Bugzilla ID: 662
Fixes: ae865766b334 ("net/hinic: replace spinlock with mutex")
Cc: stable@dpdk.org
Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
---
drivers/net/hinic/base/hinic_compat.h | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/drivers/net/hinic/base/hinic_compat.h b/drivers/net/hinic/base/hinic_compat.h
index d3994c50e9..18148a119e 100644
--- a/drivers/net/hinic/base/hinic_compat.h
+++ b/drivers/net/hinic/base/hinic_compat.h
@@ -197,10 +197,21 @@ static inline u16 ilog2(u32 n)
return res;
}
+/*
+ * Initialize mutex for process-shared access.
+ * Structures may be in shared memory accessible by multiple processes,
+ * so mutexes must use PTHREAD_PROCESS_SHARED.
+ */
static inline int hinic_mutex_init(pthread_mutex_t *pthreadmutex,
const pthread_mutexattr_t *mattr)
{
- return pthread_mutex_init(pthreadmutex, mattr);
+ pthread_mutexattr_t attr;
+
+ pthread_mutexattr_init(&attr);
+ pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
+ pthread_mutex_init(pthreadmutex, mattr ? mattr : &attr);
+ pthread_mutexattr_destroy(&attr);
+ return 0;
}
static inline int hinic_mutex_destroy(pthread_mutex_t *pthreadmutex)
--
2.51.0
^ permalink raw reply related [flat|nested] 7+ messages in thread