[PATCH for-rc] IB/hfi1: Correctly move list in sc_disable()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Dean Luick <dean.luick@xxxxxxxxxxxxxxxxxxxx>

Commit 13bac861952a ("IB/hfi1: Fix abba locking issue with
sc_disable()") incorrectly tries to move a list from one list
head to another.  The result is a kernel crash.

The crash is triggered when a link goes down and there are
waiters for a send to complete.  The following signature is
seen:

BUG: kernel NULL pointer dereference, address: 0000000000000030
[...]
Call Trace:
 <TASK>
 sc_disable+0x1ba/0x240 [hfi1]
 pio_freeze+0x3d/0x60 [hfi1]
 handle_freeze+0x27/0x1b0 [hfi1]
 process_one_work+0x1b0/0x380
 ? process_one_work+0x380/0x380
 worker_thread+0x30/0x360
 ? process_one_work+0x380/0x380
 kthread+0xd7/0x100
 ? kthread_complete_and_exit+0x20/0x20
 ret_from_fork+0x1f/0x30
 </TASK>

The fix is to use the correct call to move the list.

Fixes: 13bac861952a ("IB/hfi1: Fix abba locking issue with sc_disable()")
Signed-off-by: Dean Luick <dean.luick@xxxxxxxxxxxxxxxxxxxx>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@xxxxxxxxxxxxxxxxxxxx>
---
 drivers/infiniband/hw/hfi1/pio.c |    3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/infiniband/hw/hfi1/pio.c b/drivers/infiniband/hw/hfi1/pio.c
index 3d42bd2b36bd..51ae58c02b15 100644
--- a/drivers/infiniband/hw/hfi1/pio.c
+++ b/drivers/infiniband/hw/hfi1/pio.c
@@ -913,8 +913,7 @@ void sc_disable(struct send_context *sc)
 	spin_unlock(&sc->release_lock);
 
 	write_seqlock(&sc->waitlock);
-	if (!list_empty(&sc->piowait))
-		list_move(&sc->piowait, &wake_list);
+	list_splice_init(&sc->piowait, &wake_list);
 	write_sequnlock(&sc->waitlock);
 	while (!list_empty(&wake_list)) {
 		struct iowait *wait;





[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux