linux-rdma.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] Two additional RDMA/rxe fixes
@ 2018-01-12 23:11 Bart Van Assche
  2018-01-12 23:11 ` [PATCH 1/2] RDMA/rxe: Fix a race condition in rxe_requester() Bart Van Assche
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Bart Van Assche @ 2018-01-12 23:11 UTC (permalink / raw)
  To: Jason Gunthorpe
  Cc: Doug Ledford, Moni Shoua, linux-rdma-u79uwXL29TY76Z2rM5mHXA,
	Bart Van Assche

Hello Jason,

This patch series provides two additional fixes for issues I ran into while
testing the RDMA/CM support in the SRP initiator driver. Please consider these
for inclusion in the upstream kernel.

Thanks,

Bart.

Bart Van Assche (2):
  RDMA/rxe: Fix a race condition in rxe_requester()
  RDMA/rxe: Fix rxe_qp_cleanup()

 drivers/infiniband/sw/rxe/rxe_loc.h   |  1 -
 drivers/infiniband/sw/rxe/rxe_qp.c    | 12 ++++++++++--
 drivers/infiniband/sw/rxe/rxe_req.c   |  9 +--------
 drivers/infiniband/sw/rxe/rxe_resp.c  |  2 +-
 drivers/infiniband/sw/rxe/rxe_verbs.h |  3 +++
 5 files changed, 15 insertions(+), 12 deletions(-)

-- 
2.15.1

--
To unsubscribe from this list: send the line "unsubscribe linux-rdma" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 1/2] RDMA/rxe: Fix a race condition in rxe_requester()
  2018-01-12 23:11 [PATCH 0/2] Two additional RDMA/rxe fixes Bart Van Assche
@ 2018-01-12 23:11 ` Bart Van Assche
  2018-01-12 23:11 ` [PATCH 2/2] RDMA/rxe: Fix rxe_qp_cleanup() Bart Van Assche
       [not found] ` <20180112231159.26569-1-bart.vanassche-Sjgp3cTcYWE@public.gmane.org>
  2 siblings, 0 replies; 4+ messages in thread
From: Bart Van Assche @ 2018-01-12 23:11 UTC (permalink / raw)
  To: Jason Gunthorpe
  Cc: Doug Ledford, Moni Shoua, linux-rdma, Bart Van Assche, stable

The rxe driver works as follows:
* The send queue, receive queue and completion queues are implemented as
  circular buffers.
* ib_post_send() and ib_post_recv() calls are serialized through a spinlock.
* Removing elements from various queues happens from tasklet
  context. Tasklets are guaranteed to run on at most one CPU. This serializes
  access to these queues. See also rxe_completer(), rxe_requester() and
  rxe_responder().
* rxe_completer() processes the skbs queued onto qp->resp_pkts.
* rxe_requester() handles the send queue (qp->sq.queue).
* rxe_responder() processes the skbs queued onto qp->req_pkts.

Since rxe_drain_req_pkts() processes qp->req_pkts, calling
rxe_drain_req_pkts() from rxe_requester() is racy. Hence this patch.

Reported-by: Moni Shoua <monis@mellanox.com>
Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Cc: stable@vger.kernel.org
---
 drivers/infiniband/sw/rxe/rxe_loc.h  | 1 -
 drivers/infiniband/sw/rxe/rxe_req.c  | 9 +--------
 drivers/infiniband/sw/rxe/rxe_resp.c | 2 +-
 3 files changed, 2 insertions(+), 10 deletions(-)

diff --git a/drivers/infiniband/sw/rxe/rxe_loc.h b/drivers/infiniband/sw/rxe/rxe_loc.h
index d7472a442a2c..96c3a6c5c4b5 100644
--- a/drivers/infiniband/sw/rxe/rxe_loc.h
+++ b/drivers/infiniband/sw/rxe/rxe_loc.h
@@ -237,7 +237,6 @@ int rxe_srq_from_attr(struct rxe_dev *rxe, struct rxe_srq *srq,
 
 void rxe_release(struct kref *kref);
 
-void rxe_drain_req_pkts(struct rxe_qp *qp, bool notify);
 int rxe_completer(void *arg);
 int rxe_requester(void *arg);
 int rxe_responder(void *arg);
diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c
index 26a7f923045b..7bdaf71b8221 100644
--- a/drivers/infiniband/sw/rxe/rxe_req.c
+++ b/drivers/infiniband/sw/rxe/rxe_req.c
@@ -594,15 +594,8 @@ int rxe_requester(void *arg)
 	rxe_add_ref(qp);
 
 next_wqe:
-	if (unlikely(!qp->valid)) {
-		rxe_drain_req_pkts(qp, true);
+	if (unlikely(!qp->valid || qp->req.state == QP_STATE_ERROR))
 		goto exit;
-	}
-
-	if (unlikely(qp->req.state == QP_STATE_ERROR)) {
-		rxe_drain_req_pkts(qp, true);
-		goto exit;
-	}
 
 	if (unlikely(qp->req.state == QP_STATE_RESET)) {
 		qp->req.wqe_index = consumer_index(qp->sq.queue);
diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c b/drivers/infiniband/sw/rxe/rxe_resp.c
index 4240866a5331..01f926fd9029 100644
--- a/drivers/infiniband/sw/rxe/rxe_resp.c
+++ b/drivers/infiniband/sw/rxe/rxe_resp.c
@@ -1210,7 +1210,7 @@ static enum resp_states do_class_d1e_error(struct rxe_qp *qp)
 	}
 }
 
-void rxe_drain_req_pkts(struct rxe_qp *qp, bool notify)
+static void rxe_drain_req_pkts(struct rxe_qp *qp, bool notify)
 {
 	struct sk_buff *skb;
 
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] RDMA/rxe: Fix rxe_qp_cleanup()
  2018-01-12 23:11 [PATCH 0/2] Two additional RDMA/rxe fixes Bart Van Assche
  2018-01-12 23:11 ` [PATCH 1/2] RDMA/rxe: Fix a race condition in rxe_requester() Bart Van Assche
@ 2018-01-12 23:11 ` Bart Van Assche
       [not found] ` <20180112231159.26569-1-bart.vanassche-Sjgp3cTcYWE@public.gmane.org>
  2 siblings, 0 replies; 4+ messages in thread
From: Bart Van Assche @ 2018-01-12 23:11 UTC (permalink / raw)
  To: Jason Gunthorpe
  Cc: Doug Ledford, Moni Shoua, linux-rdma, Bart Van Assche, stable

rxe_qp_cleanup() can sleep so it must be run in thread context and
not in atomic context. This patch avoids that the following bug is
triggered:

Kernel BUG at 00000000560033f3 [verbose debug info unavailable]
BUG: sleeping function called from invalid context at net/core/sock.c:2761
in_atomic(): 1, irqs_disabled(): 0, pid: 7, name: ksoftirqd/0
INFO: lockdep is turned off.
Preemption disabled at:
[<00000000b6e69628>] __do_softirq+0x4e/0x540
CPU: 0 PID: 7 Comm: ksoftirqd/0 Not tainted 4.15.0-rc7-dbg+ #4
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.0.0-prebuilt.qemu-project.org 04/01/2014
Call Trace:
 dump_stack+0x85/0xbf
 ___might_sleep+0x177/0x260
 lock_sock_nested+0x1d/0x90
 inet_shutdown+0x2e/0xd0
 rxe_qp_cleanup+0x107/0x140 [rdma_rxe]
 rxe_elem_release+0x18/0x80 [rdma_rxe]
 rxe_requester+0x1cf/0x11b0 [rdma_rxe]
 rxe_do_task+0x78/0xf0 [rdma_rxe]
 tasklet_action+0x99/0x270
 __do_softirq+0xc0/0x540
 run_ksoftirqd+0x1c/0x70
 smpboot_thread_fn+0x1be/0x270
 kthread+0x117/0x130
 ret_from_fork+0x24/0x30

Signed-off-by: Bart Van Assche <bart.vanassche@wdc.com>
Cc: Moni Shoua <monis@mellanox.com>
Cc: stable@vger.kernel.org
---
 drivers/infiniband/sw/rxe/rxe_qp.c    | 12 ++++++++++--
 drivers/infiniband/sw/rxe/rxe_verbs.h |  3 +++
 2 files changed, 13 insertions(+), 2 deletions(-)

diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
index 4469592b839d..137d6c0c49d4 100644
--- a/drivers/infiniband/sw/rxe/rxe_qp.c
+++ b/drivers/infiniband/sw/rxe/rxe_qp.c
@@ -824,9 +824,9 @@ void rxe_qp_destroy(struct rxe_qp *qp)
 }
 
 /* called when the last reference to the qp is dropped */
-void rxe_qp_cleanup(struct rxe_pool_entry *arg)
+static void rxe_qp_do_cleanup(struct work_struct *work)
 {
-	struct rxe_qp *qp = container_of(arg, typeof(*qp), pelem);
+	struct rxe_qp *qp = container_of(work, typeof(*qp), cleanup_work.work);
 
 	rxe_drop_all_mcast_groups(qp);
 
@@ -859,3 +859,11 @@ void rxe_qp_cleanup(struct rxe_pool_entry *arg)
 	kernel_sock_shutdown(qp->sk, SHUT_RDWR);
 	sock_release(qp->sk);
 }
+
+/* called when the last reference to the qp is dropped */
+void rxe_qp_cleanup(struct rxe_pool_entry *arg)
+{
+	struct rxe_qp *qp = container_of(arg, typeof(*qp), pelem);
+
+	execute_in_process_context(rxe_qp_do_cleanup, &qp->cleanup_work);
+}
diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h
index 0c2dbe45c729..1019f5e7dbdd 100644
--- a/drivers/infiniband/sw/rxe/rxe_verbs.h
+++ b/drivers/infiniband/sw/rxe/rxe_verbs.h
@@ -35,6 +35,7 @@
 #define RXE_VERBS_H
 
 #include <linux/interrupt.h>
+#include <linux/workqueue.h>
 #include <rdma/rdma_user_rxe.h>
 #include "rxe_pool.h"
 #include "rxe_task.h"
@@ -281,6 +282,8 @@ struct rxe_qp {
 	struct timer_list rnr_nak_timer;
 
 	spinlock_t		state_lock; /* guard requester and completer */
+
+	struct execute_work	cleanup_work;
 };
 
 enum rxe_mem_state {
-- 
2.15.1

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 0/2] Two additional RDMA/rxe fixes
       [not found] ` <20180112231159.26569-1-bart.vanassche-Sjgp3cTcYWE@public.gmane.org>
@ 2018-01-17 15:13   ` Doug Ledford
  0 siblings, 0 replies; 4+ messages in thread
From: Doug Ledford @ 2018-01-17 15:13 UTC (permalink / raw)
  To: Bart Van Assche, Jason Gunthorpe
  Cc: Moni Shoua, linux-rdma-u79uwXL29TY76Z2rM5mHXA

[-- Attachment #1: Type: text/plain, Size: 958 bytes --]

On Fri, 2018-01-12 at 15:11 -0800, Bart Van Assche wrote:
> Hello Jason,
> 
> This patch series provides two additional fixes for issues I ran into while
> testing the RDMA/CM support in the SRP initiator driver. Please consider these
> for inclusion in the upstream kernel.
> 
> Thanks,
> 
> Bart.
> 
> Bart Van Assche (2):
>   RDMA/rxe: Fix a race condition in rxe_requester()
>   RDMA/rxe: Fix rxe_qp_cleanup()
> 
>  drivers/infiniband/sw/rxe/rxe_loc.h   |  1 -
>  drivers/infiniband/sw/rxe/rxe_qp.c    | 12 ++++++++++--
>  drivers/infiniband/sw/rxe/rxe_req.c   |  9 +--------
>  drivers/infiniband/sw/rxe/rxe_resp.c  |  2 +-
>  drivers/infiniband/sw/rxe/rxe_verbs.h |  3 +++
>  5 files changed, 15 insertions(+), 12 deletions(-)

Thanks, series applied.

-- 
Doug Ledford <dledford-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
    GPG KeyID: B826A3330E572FDD
    Key fingerprint = AE6B 1BDA 122B 23B4 265B  1274 B826 A333 0E57 2FDD

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2018-01-17 15:13 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-01-12 23:11 [PATCH 0/2] Two additional RDMA/rxe fixes Bart Van Assche
2018-01-12 23:11 ` [PATCH 1/2] RDMA/rxe: Fix a race condition in rxe_requester() Bart Van Assche
2018-01-12 23:11 ` [PATCH 2/2] RDMA/rxe: Fix rxe_qp_cleanup() Bart Van Assche
     [not found] ` <20180112231159.26569-1-bart.vanassche-Sjgp3cTcYWE@public.gmane.org>
2018-01-17 15:13   ` [PATCH 0/2] Two additional RDMA/rxe fixes Doug Ledford

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).