DragonFly BSD
DragonFly bugs List (threaded) for 2011-07
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

[issue2092] Panic: Bad link elm 0x... next->prev != elm

From: "Magliano Andrea \(via DragonFly issue tracker\)" <sinknull@xxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 04 Jul 2011 10:08:55 +0000

Magliano Andrea <masterblaster@tiscali.it> added the comment:

A further possible source of problems:

in sys/bus/cam/cam_xpt.c:camisr() a TAILQ_REMOVE is done before CAM_SIM_LOCK(sim).

With the attached patch it's now running stable since a week.
As i'm new to dfly kernel, could please someone at least say if these changes
are meaningful at all?

status: chatting -> testing

DragonFly issue tracker <bugs@lists.dragonflybsd.org>
From 7d030949f06a69f721b27167364b4a573315bae8 Mon Sep 17 00:00:00 2001
From: Magliano Andrea <masterblaster@tiscali.it>
Date: Mon, 4 Jul 2011 11:37:11 +0200
Subject: [PATCH 3/3] Fix race condition on cam simqueue

* move spin_lock after local queue init (doesn't need it)
* lock the sim before tailq removing: this possible solves issue 2092,
  as it's running stable over 1 week now
 sys/bus/cam/cam_xpt.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/sys/bus/cam/cam_xpt.c b/sys/bus/cam/cam_xpt.c
index a3b5651..82341bf 100644
--- a/sys/bus/cam/cam_xpt.c
+++ b/sys/bus/cam/cam_xpt.c
@@ -7230,16 +7230,16 @@ camisr(void *dummy)
 	cam_simq_t queue;
 	struct cam_sim *sim;
-	spin_lock(&cam_simq_spin);
+	spin_lock(&cam_simq_spin);
     while (!TAILQ_EMPTY(&cam_simq)) {
         TAILQ_CONCAT(&queue, &cam_simq, links);
         while ((sim = TAILQ_FIRST(&queue)) != NULL) {
-            TAILQ_REMOVE(&queue, sim, links);
+            TAILQ_REMOVE(&queue, sim, links);
             sim->flags &= ~CAM_SIM_ON_DONEQ;

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