stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Michal Kalderon <michal.kalderon@marvell.com>,
	Ariel Elior <ariel.elior@marvell.com>,
	"David S . Miller" <davem@davemloft.net>,
	Sasha Levin <sashal@kernel.org>,
	netdev@vger.kernel.org
Subject: [PATCH AUTOSEL 5.5 42/66] qede: Fix race between rdma destroy workqueue and link change event
Date: Mon,  2 Mar 2020 21:45:51 -0500	[thread overview]
Message-ID: <20200303024615.8889-42-sashal@kernel.org> (raw)
In-Reply-To: <20200303024615.8889-1-sashal@kernel.org>

From: Michal Kalderon <michal.kalderon@marvell.com>

[ Upstream commit af6565adb02d3129d3fae4d9d5da945abaf4417a ]

If an event is added while the rdma workqueue is being destroyed
it could lead to several races, list corruption, null pointer
dereference during queue_work or init_queue.
This fixes the race between the two flows which can occur during
shutdown.

A kref object and a completion object are added to the rdma_dev
structure, these are initialized before the workqueue is created.
The refcnt is used to indicate work is being added to the
workqueue and ensures the cleanup flow won't start while we're in
the middle of adding the event.
Once the work is added, the refcnt is decreased and the cleanup flow
is safe to run.

Fixes: cee9fbd8e2e ("qede: Add qedr framework")
Signed-off-by: Ariel Elior <ariel.elior@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 drivers/net/ethernet/qlogic/qede/qede.h      |  2 ++
 drivers/net/ethernet/qlogic/qede/qede_rdma.c | 29 +++++++++++++++++++-
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/qlogic/qede/qede.h b/drivers/net/ethernet/qlogic/qede/qede.h
index e8a1b27db84de..234c6f30effb7 100644
--- a/drivers/net/ethernet/qlogic/qede/qede.h
+++ b/drivers/net/ethernet/qlogic/qede/qede.h
@@ -163,6 +163,8 @@ struct qede_rdma_dev {
 	struct list_head entry;
 	struct list_head rdma_event_list;
 	struct workqueue_struct *rdma_wq;
+	struct kref refcnt;
+	struct completion event_comp;
 	bool exp_recovery;
 };
 
diff --git a/drivers/net/ethernet/qlogic/qede/qede_rdma.c b/drivers/net/ethernet/qlogic/qede/qede_rdma.c
index ffabc2d2f0824..2d873ae8a234d 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_rdma.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_rdma.c
@@ -59,6 +59,9 @@ static void _qede_rdma_dev_add(struct qede_dev *edev)
 static int qede_rdma_create_wq(struct qede_dev *edev)
 {
 	INIT_LIST_HEAD(&edev->rdma_info.rdma_event_list);
+	kref_init(&edev->rdma_info.refcnt);
+	init_completion(&edev->rdma_info.event_comp);
+
 	edev->rdma_info.rdma_wq = create_singlethread_workqueue("rdma_wq");
 	if (!edev->rdma_info.rdma_wq) {
 		DP_NOTICE(edev, "qedr: Could not create workqueue\n");
@@ -83,8 +86,23 @@ static void qede_rdma_cleanup_event(struct qede_dev *edev)
 	}
 }
 
+static void qede_rdma_complete_event(struct kref *ref)
+{
+	struct qede_rdma_dev *rdma_dev =
+		container_of(ref, struct qede_rdma_dev, refcnt);
+
+	/* no more events will be added after this */
+	complete(&rdma_dev->event_comp);
+}
+
 static void qede_rdma_destroy_wq(struct qede_dev *edev)
 {
+	/* Avoid race with add_event flow, make sure it finishes before
+	 * we start accessing the list and cleaning up the work
+	 */
+	kref_put(&edev->rdma_info.refcnt, qede_rdma_complete_event);
+	wait_for_completion(&edev->rdma_info.event_comp);
+
 	qede_rdma_cleanup_event(edev);
 	destroy_workqueue(edev->rdma_info.rdma_wq);
 }
@@ -310,15 +328,24 @@ static void qede_rdma_add_event(struct qede_dev *edev,
 	if (!edev->rdma_info.qedr_dev)
 		return;
 
+	/* We don't want the cleanup flow to start while we're allocating and
+	 * scheduling the work
+	 */
+	if (!kref_get_unless_zero(&edev->rdma_info.refcnt))
+		return; /* already being destroyed */
+
 	event_node = qede_rdma_get_free_event_node(edev);
 	if (!event_node)
-		return;
+		goto out;
 
 	event_node->event = event;
 	event_node->ptr = edev;
 
 	INIT_WORK(&event_node->work, qede_rdma_handle_event);
 	queue_work(edev->rdma_info.rdma_wq, &event_node->work);
+
+out:
+	kref_put(&edev->rdma_info.refcnt, qede_rdma_complete_event);
 }
 
 void qede_rdma_dev_event_open(struct qede_dev *edev)
-- 
2.20.1


  parent reply	other threads:[~2020-03-03  3:01 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-03  2:45 [PATCH AUTOSEL 5.5 01/66] ALSA: hda: do not override bus codec_mask in link_get() Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 02/66] usb: charger: assign specific number for enum value Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 03/66] serial: ar933x_uart: set UART_CS_{RX,TX}_READY_ORIDE Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 04/66] Kernel selftests: tpm2: check for tpm support Sasha Levin
2020-04-14 16:04   ` shuah
2020-04-16 13:12     ` Jarkko Sakkinen
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 05/66] selftests: fix too long argument Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 06/66] usb: gadget: composite: Support more than 500mA MaxPower Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 07/66] usb: gadget: ffs: ffs_aio_cancel(): Save/restore IRQ flags Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 08/66] usb: gadget: serial: fix Tx stall after buffer overflow Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 09/66] habanalabs: halt the engines before hard-reset Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 10/66] habanalabs: do not halt CoreSight during hard reset Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 11/66] habanalabs: patched cb equals user cb in device memset Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 12/66] drm/msm/mdp5: rate limit pp done timeout warnings Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 13/66] drm: msm: Fix return type of dsi_mgr_connector_mode_valid for kCFI Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 14/66] drm/modes: Make sure to parse valid rotation value from cmdline Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 15/66] drm/modes: Allow DRM_MODE_ROTATE_0 when applying video mode parameters Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 16/66] scsi: megaraid_sas: silence a warning Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 17/66] drm/msm/dsi: save pll state before dsi host is powered off Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 18/66] drm/msm/dsi/pll: call vco set rate explicitly Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 19/66] selftests: forwarding: use proto icmp for {gretap, ip6gretap}_mac testing Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 20/66] net: macb: ensure interface is not suspended on at91rm9200 Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 21/66] selftests: forwarding: vxlan_bridge_1d: fix tos value Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 22/66] net: atlantic: checksum compat issue Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 23/66] net: atlantic: check rpc result and wait for rpc address Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 24/66] net: atlantic: ptp gpio adjustments Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 25/66] net: atlantic: better loopback mode handling Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 26/66] net: atlantic: fix use after free kasan warn Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 27/66] net: atlantic: fix potential error handling Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 28/66] net: atlantic: possible fault in transition to hibernation Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 29/66] net: atlantic: fix out of range usage of active_vlans array Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 30/66] net: phy: restore mdio regs in the iproc mdio driver Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 31/66] net: dsa: b53: Ensure the default VID is untagged Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 32/66] bonding: add missing netdev_update_lockdep_key() Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 33/66] net: ks8851-ml: Remove 8-bit bus accessors Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 34/66] net: ks8851-ml: Fix 16-bit data access Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 35/66] net: ks8851-ml: Fix 16-bit IO operation Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 36/66] net: ethernet: dm9000: Handle -EPROBE_DEFER in dm9000_parse_dt() Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 37/66] watchdog: da9062: do not ping the hw during stop() Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 38/66] s390/cio: cio_ignore_proc_seq_next should increase position index Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 39/66] s390: make 'install' not depend on vmlinux Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 40/66] net: mscc: fix in frame extraction Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 41/66] efi: Only print errors about failing to get certs if EFI vars are found Sasha Levin
2020-03-03  2:45 ` Sasha Levin [this message]
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 43/66] net/mlx5: DR, Fix matching on vport gvmi Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 44/66] iommu/amd: Disable IOMMU on Stoney Ridge systems Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 45/66] nvme/pci: Add sleep quirk for Samsung and Toshiba drives Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 46/66] nvme-pci: Use single IRQ vector for old Apple models Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 47/66] x86/boot/compressed: Don't declare __force_order in kaslr_64.c Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 48/66] s390/qdio: fill SL with absolute addresses Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 49/66] nvme: Fix uninitialized-variable warning Sasha Levin
2020-03-03  2:45 ` [PATCH AUTOSEL 5.5 50/66] nfc: pn544: Fix occasional HW initialization failure Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 51/66] ice: Don't tell the OS that link is going down Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 52/66] x86/xen: Distribute switch variables for initialization Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 53/66] s390/qeth: vnicc Fix EOPNOTSUPP precedence Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 54/66] s390/qeth: fix off-by-one in RX copybreak check Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 55/66] net: macb: Properly handle phylink on at91rm9200 Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 56/66] ionic: fix fw_status read Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 57/66] net: thunderx: workaround BGX TX Underflow issue Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 58/66] bnxt_en: Improve device shutdown method Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 59/66] bnxt_en: Issue PCIe FLR in kdump kernel to cleanup pending DMAs Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 60/66] csky/mm: Fixup export invalid_pte_table symbol Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 61/66] csky: Set regs->usp to kernel sp, when the exception is from kernel Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 62/66] csky/smp: Fixup boot failed when CONFIG_SMP Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 63/66] csky: Fixup ftrace modify panic Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 64/66] csky: Fixup compile warning for three unimplemented syscalls Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 65/66] arch/csky: fix some Kconfig typos Sasha Levin
2020-03-03  2:46 ` [PATCH AUTOSEL 5.5 66/66] selftests: forwarding: vxlan_bridge_1d: use more proper tos value Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200303024615.8889-42-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=ariel.elior@marvell.com \
    --cc=davem@davemloft.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=michal.kalderon@marvell.com \
    --cc=netdev@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).