linux-sg2042/drivers/infiniband/sw/rdmavt
Petr Mladek 6efaf10f16 IB/rdmavt: Avoid queuing work into a destroyed cq kthread worker
The memory barrier is not enough to protect queuing works into
a destroyed cq kthread. Just imagine the following situation:

CPU1				CPU2

rvt_cq_enter()
  worker =  cq->rdi->worker;

				rvt_cq_exit()
				  rdi->worker = NULL;
				  smp_wmb();
				  kthread_flush_worker(worker);
				  kthread_stop(worker->task);
				  kfree(worker);

				  // nothing queued yet =>
				  // nothing flushed and
				  // happily stopped and freed

  if (likely(worker)) {
     // true => read before CPU2 acted
     cq->notify = RVT_CQ_NONE;
     cq->triggered++;
     kthread_queue_work(worker, &cq->comptask);

  BANG: worker has been flushed/stopped/freed in the meantime.

This patch solves this by protecting the critical sections by
rdi->n_cqs_lock. It seems that this lock is not much contended
and looks reasonable for this purpose.

One catch is that rvt_cq_enter() might be called from IRQ context.
Therefore we must always take the lock with IRQs disabled to avoid
a possible deadlock.

Signed-off-by: Petr Mladek <pmladek@suse.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
2016-12-14 12:16:11 -05:00
..
Kconfig IB/rdmavt: Disable by default 2016-08-03 21:03:31 -04:00
Makefile IB/rdmavt: Add support for tracing events 2016-03-10 20:37:24 -05:00
ah.c IB/rdmavt: Clean up comments and add more documentation 2016-03-10 20:38:08 -05:00
ah.h IB/rdmavt: Fix copyright date 2016-03-10 20:37:27 -05:00
cq.c IB/rdmavt: Avoid queuing work into a destroyed cq kthread worker 2016-12-14 12:16:11 -05:00
cq.h IB/rdmavt: Fix copyright date 2016-03-10 20:37:27 -05:00
dma.c IB/{rxe,core,rdmavt}: Fix kernel crash for reg MR 2016-10-06 13:50:04 -04:00
dma.h IB/rdmavt: Fix copyright date 2016-03-10 20:37:27 -05:00
mad.c IB/rdmavt: Clean up comments and add more documentation 2016-03-10 20:38:08 -05:00
mad.h IB/rdmavt: Clean up distinction between port number and index 2016-03-10 20:37:31 -05:00
mcast.c IB/hfi1: Replace qp->refcount release code with standard driver wrapper 2016-12-11 15:29:42 -05:00
mcast.h IB/rdmavt: Fix copyright date 2016-03-10 20:37:27 -05:00
mmap.c IB/rdmavt: Remove unnecessary exported functions 2016-03-10 20:38:10 -05:00
mmap.h IB/rdmavt: Remove unnecessary exported functions 2016-03-10 20:38:10 -05:00
mr.c IB/hfi1: Use reference count wrapper for MRs 2016-12-11 15:29:42 -05:00
mr.h IB/rdmavt: Add support for ib_map_mr_sg 2016-08-02 16:00:58 -04:00
pd.c IB/rdmavt: Clean up comments and add more documentation 2016-03-10 20:38:08 -05:00
pd.h IB/rdmavt: Fix copyright date 2016-03-10 20:37:27 -05:00
qp.c IB/rdmavt: Add a send completion helper 2016-12-11 15:29:42 -05:00
qp.h IB/rdmavt: Fix copyright date 2016-03-10 20:37:27 -05:00
srq.c IB/rdmavt: Remove unnecessary exported functions 2016-03-10 20:38:10 -05:00
srq.h IB/rdmavt: Add srq functionality to rdmavt 2016-03-10 20:37:30 -05:00
trace.c IB/rdmavt: Fix copyright date 2016-03-10 20:37:27 -05:00
trace.h IB/rdmavt: Add trace of MR segs 2016-12-11 15:29:42 -05:00
trace_mr.h IB/rdmavt: Add trace of MR segs 2016-12-11 15:29:42 -05:00
trace_qp.h IB/rdmavt: Fix trace hierarchy 2016-12-11 15:25:13 -05:00
trace_rvt.h IB/rdmavt: Fix trace hierarchy 2016-12-11 15:25:13 -05:00
trace_tx.h IB/rdmavt: Fix trace hierarchy 2016-12-11 15:25:13 -05:00
vt.c IB/rdmavt: Add support for ib_map_mr_sg 2016-08-02 16:00:58 -04:00
vt.h IB/rdmavt: Remove unnecessary exported functions 2016-03-10 20:38:10 -05:00