From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org,
Mitko Haralanov <mitko.haralanov@intel.com>,
Mike Marciniszyn <mike.marciniszyn@intel.com>,
"Michael J. Ruhl" <michael.j.ruhl@intel.com>,
Dennis Dalessandro <dennis.dalessandro@intel.com>,
Jason Gunthorpe <jgg@mellanox.com>,
Sasha Levin <sashal@kernel.org>
Subject: [PATCH 4.19 03/67] IB/hfi1: Remove race conditions in user_sdma send path
Date: Thu, 20 Dec 2018 10:18:15 +0100 [thread overview]
Message-ID: <20181220085903.702233696@linuxfoundation.org> (raw)
In-Reply-To: <20181220085903.562090333@linuxfoundation.org>
4.19-stable review patch. If anyone has any objections, please let me know.
------------------
commit 28a9a9e83ceae2cee25b9af9ad20d53aaa9ab951 upstream
Packet queue state is over used to determine SDMA descriptor
availablitity and packet queue request state.
cpu 0 ret = user_sdma_send_pkts(req, pcount);
cpu 0 if (atomic_read(&pq->n_reqs))
cpu 1 IRQ user_sdma_txreq_cb calls pq_update() (state to _INACTIVE)
cpu 0 xchg(&pq->state, SDMA_PKT_Q_ACTIVE);
At this point pq->n_reqs == 0 and pq->state is incorrectly
SDMA_PKT_Q_ACTIVE. The close path will hang waiting for the state
to return to _INACTIVE.
This can also change the state from _DEFERRED to _ACTIVE. However,
this is a mostly benign race.
Remove the racy code path.
Use n_reqs to determine if a packet queue is active or not.
Cc: <stable@vger.kernel.org> # 4.19.x
Reviewed-by: Mitko Haralanov <mitko.haralanov@intel.com>
Reviewed-by: Mike Marciniszyn <mike.marciniszyn@intel.com>
Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
drivers/infiniband/hw/hfi1/user_sdma.c | 24 ++++++++++--------------
drivers/infiniband/hw/hfi1/user_sdma.h | 9 +++++----
2 files changed, 15 insertions(+), 18 deletions(-)
diff --git a/drivers/infiniband/hw/hfi1/user_sdma.c b/drivers/infiniband/hw/hfi1/user_sdma.c
index 39134dd305f5..51831bfbf90f 100644
--- a/drivers/infiniband/hw/hfi1/user_sdma.c
+++ b/drivers/infiniband/hw/hfi1/user_sdma.c
@@ -187,7 +187,6 @@ int hfi1_user_sdma_alloc_queues(struct hfi1_ctxtdata *uctxt,
pq->ctxt = uctxt->ctxt;
pq->subctxt = fd->subctxt;
pq->n_max_reqs = hfi1_sdma_comp_ring_size;
- pq->state = SDMA_PKT_Q_INACTIVE;
atomic_set(&pq->n_reqs, 0);
init_waitqueue_head(&pq->wait);
atomic_set(&pq->n_locked, 0);
@@ -276,7 +275,7 @@ int hfi1_user_sdma_free_queues(struct hfi1_filedata *fd,
/* Wait until all requests have been freed. */
wait_event_interruptible(
pq->wait,
- (READ_ONCE(pq->state) == SDMA_PKT_Q_INACTIVE));
+ !atomic_read(&pq->n_reqs));
kfree(pq->reqs);
kfree(pq->req_in_use);
kmem_cache_destroy(pq->txreq_cache);
@@ -312,6 +311,13 @@ static u8 dlid_to_selector(u16 dlid)
return mapping[hash];
}
+/**
+ * hfi1_user_sdma_process_request() - Process and start a user sdma request
+ * @fd: valid file descriptor
+ * @iovec: array of io vectors to process
+ * @dim: overall iovec array size
+ * @count: number of io vector array entries processed
+ */
int hfi1_user_sdma_process_request(struct hfi1_filedata *fd,
struct iovec *iovec, unsigned long dim,
unsigned long *count)
@@ -560,20 +566,12 @@ int hfi1_user_sdma_process_request(struct hfi1_filedata *fd,
req->ahg_idx = sdma_ahg_alloc(req->sde);
set_comp_state(pq, cq, info.comp_idx, QUEUED, 0);
+ pq->state = SDMA_PKT_Q_ACTIVE;
/* Send the first N packets in the request to buy us some time */
ret = user_sdma_send_pkts(req, pcount);
if (unlikely(ret < 0 && ret != -EBUSY))
goto free_req;
- /*
- * It is possible that the SDMA engine would have processed all the
- * submitted packets by the time we get here. Therefore, only set
- * packet queue state to ACTIVE if there are still uncompleted
- * requests.
- */
- if (atomic_read(&pq->n_reqs))
- xchg(&pq->state, SDMA_PKT_Q_ACTIVE);
-
/*
* This is a somewhat blocking send implementation.
* The driver will block the caller until all packets of the
@@ -1409,10 +1407,8 @@ static void user_sdma_txreq_cb(struct sdma_txreq *txreq, int status)
static inline void pq_update(struct hfi1_user_sdma_pkt_q *pq)
{
- if (atomic_dec_and_test(&pq->n_reqs)) {
- xchg(&pq->state, SDMA_PKT_Q_INACTIVE);
+ if (atomic_dec_and_test(&pq->n_reqs))
wake_up(&pq->wait);
- }
}
static void user_sdma_free_request(struct user_sdma_request *req, bool unpin)
diff --git a/drivers/infiniband/hw/hfi1/user_sdma.h b/drivers/infiniband/hw/hfi1/user_sdma.h
index 0ae06456c868..91c343f91776 100644
--- a/drivers/infiniband/hw/hfi1/user_sdma.h
+++ b/drivers/infiniband/hw/hfi1/user_sdma.h
@@ -105,9 +105,10 @@ static inline int ahg_header_set(u32 *arr, int idx, size_t array_size,
#define TXREQ_FLAGS_REQ_ACK BIT(0) /* Set the ACK bit in the header */
#define TXREQ_FLAGS_REQ_DISABLE_SH BIT(1) /* Disable header suppression */
-#define SDMA_PKT_Q_INACTIVE BIT(0)
-#define SDMA_PKT_Q_ACTIVE BIT(1)
-#define SDMA_PKT_Q_DEFERRED BIT(2)
+enum pkt_q_sdma_state {
+ SDMA_PKT_Q_ACTIVE,
+ SDMA_PKT_Q_DEFERRED,
+};
/*
* Maximum retry attempts to submit a TX request
@@ -133,7 +134,7 @@ struct hfi1_user_sdma_pkt_q {
struct user_sdma_request *reqs;
unsigned long *req_in_use;
struct iowait busy;
- unsigned state;
+ enum pkt_q_sdma_state state;
wait_queue_head_t wait;
unsigned long unpinned;
struct mmu_rb_handler *handler;
--
2.19.1
next prev parent reply other threads:[~2018-12-20 9:18 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-20 9:18 [PATCH 4.19 00/67] 4.19.12-stable review Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 01/67] locking/qspinlock: Re-order code Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 02/67] locking/qspinlock, x86: Provide liveness guarantee Greg Kroah-Hartman
2018-12-20 9:18 ` Greg Kroah-Hartman [this message]
2018-12-20 9:18 ` [PATCH 4.19 04/67] mac80211_hwsim: fix module init error paths for netlink Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 05/67] Input: hyper-v - fix wakeup from suspend-to-idle Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 06/67] i2c: rcar: check bus state before reinitializing Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 07/67] scsi: libiscsi: Fix NULL pointer dereference in iscsi_eh_session_reset Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 08/67] scsi: vmw_pscsi: Rearrange code to avoid multiple calls to free_irq during unload Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 09/67] tools/bpf: fix two test_btf unit test cases Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 10/67] tools/bpf: add addition type tests to test_btf Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 11/67] net: ethernet: ave: Replace NET_IP_ALIGN with AVE_FRAME_HEADROOM Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 12/67] drm/amd/display: Fix 6x4K displays light-up on Vega20 (v2) Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 13/67] x86/earlyprintk/efi: Fix infinite loop on some screen widths Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 14/67] drm/msm: Fix task dump in gpu recovery Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 15/67] drm/msm/gpu: Fix a couple memory leaks in debugfs Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 16/67] drm/msm: fix handling of cmdstream offset Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 17/67] drm/msm/dsi: configure VCO rate for 10nm PLL driver Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 18/67] drm/msm: Grab a vblank reference when waiting for commit_done Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 19/67] drm/ttm: fix LRU handling in ttm_buffer_object_transfer Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 20/67] drm/amdgpu: wait for IB test on first device open Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 21/67] ARC: io.h: Implement reads{x}()/writes{x}() Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 22/67] net: stmmac: Move debugfs init/exit to ->probe()/->remove() Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 23/67] net: aquantia: fix rx checksum offload bits Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 24/67] bonding: fix 802.3ad state sent to partner when unbinding slave Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 25/67] bpf: Fix verifier log string check for bad alignment Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 26/67] liquidio: read sc->iq_no before release sc Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 27/67] nfs: dont dirty kernel pages read by direct-io Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 28/67] SUNRPC: Fix a potential race in xprt_connect() Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 29/67] sbus: char: add of_node_put() Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 30/67] drivers/sbus/char: " Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 31/67] drivers/tty: add missing of_node_put() Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 32/67] ide: pmac: add of_node_put() Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 33/67] drm/msm/hdmi: Enable HPD after HDMI IRQ is set up Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 34/67] drm/msm: dpu: Dont set legacy plane->crtc pointer Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 35/67] drm/msm: dpu: Fix "WARNING: invalid free of devm_ allocated data" Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 36/67] drm/msm: Fix error return checking Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 37/67] drm/amd/powerplay: issue pre-display settings for display change event Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 38/67] clk: mvebu: Off by one bugs in cp110_of_clk_get() Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 39/67] clk: mmp: Off by one in mmp_clk_add() Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 40/67] Input: synaptics - enable SMBus for HP 15-ay000 Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 41/67] Input: omap-keypad - fix keyboard debounce configuration Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 42/67] libata: whitelist all SAMSUNG MZ7KM* solid-state disks Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 43/67] macvlan: return correct error value Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 44/67] mv88e6060: disable hardware level MAC learning Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 45/67] net/mlx4_en: Fix build break when CONFIG_INET is off Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 46/67] bpf: check pending signals while verifying programs Greg Kroah-Hartman
2018-12-20 9:18 ` [PATCH 4.19 47/67] ARM: 8814/1: mm: improve/fix ARM v7_dma_inv_range() unaligned address handling Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 48/67] ARM: 8815/1: V7M: align v7m_dma_inv_range() with v7 counterpart Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 49/67] ARM: 8816/1: dma-mapping: fix potential uninitialized return Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 50/67] ethernet: fman: fix wrong of_node_put() in probe function Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 51/67] thermal: armada: fix legacy validity test sense Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 52/67] net: mvpp2: fix detection of 10G SFP modules Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 53/67] net: mvpp2: fix phylink handling of invalid PHY modes Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 54/67] drm/amdgpu/vcn: Update vcn.cur_state during suspend Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 55/67] tools/testing/nvdimm: Align test resources to 128M Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 56/67] acpi/nfit: Fix user-initiated ARS to be "ARS-long" rather than "ARS-short" Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 57/67] drm/ast: Fix connector leak during driver unload Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 58/67] cifs: In Kconfig CONFIG_CIFS_POSIX needs depends on legacy (insecure cifs) Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 59/67] vhost/vsock: fix reset orphans race with close timeout Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 60/67] mlxsw: spectrum_switchdev: Fix VLAN device deletion via ioctl Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 61/67] i2c: axxia: properly handle master timeout Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 62/67] i2c: scmi: Fix probe error on devices with an empty SMB0001 ACPI device node Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 63/67] i2c: uniphier: fix violation of tLOW requirement for Fast-mode Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 64/67] i2c: uniphier-f: " Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 65/67] nvme: validate controller state before rescheduling keep alive Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 66/67] nvmet-rdma: fix response use after free Greg Kroah-Hartman
2018-12-20 9:19 ` [PATCH 4.19 67/67] Btrfs: fix missing delayed iputs on unmount Greg Kroah-Hartman
2018-12-20 15:03 ` [PATCH 4.19 00/67] 4.19.12-stable review Naresh Kamboju
2018-12-21 7:10 ` Greg Kroah-Hartman
2018-12-20 18:29 ` Guenter Roeck
2018-12-21 7:10 ` Greg Kroah-Hartman
2018-12-20 22:48 ` shuah
2018-12-21 7:09 ` Greg Kroah-Hartman
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=20181220085903.702233696@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=dennis.dalessandro@intel.com \
--cc=jgg@mellanox.com \
--cc=linux-kernel@vger.kernel.org \
--cc=michael.j.ruhl@intel.com \
--cc=mike.marciniszyn@intel.com \
--cc=mitko.haralanov@intel.com \
--cc=sashal@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).