kernel - Remove unnecessary mplock from ata I/O path
authorMatthew Dillon <dillon@apollo.backplane.com>
Mon, 10 Dec 2012 22:59:38 +0000 (14:59 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Mon, 10 Dec 2012 22:59:38 +0000 (14:59 -0800)
* ata_finish() doesn't need the MP Lock; moving it from taskqueue_swi
  to taskqueue_swi_mp will make sure it's not taken.

* Note that taskqueue_swi(_mp) will be processed when this ithread
  attempts to switch back to the thread it preempted. This means that
  taskqueue_swi(_mp) processing exclude processing further interrupts
  on the ithread while they're running. This may not be desirable and
  is different than taskqueue_swi / swi_* / setsoft* in FreeBSD 4.x.

Submitted-by: vsrinivas
sys/dev/disk/nata/ata-queue.c

index b1b96a3..157d5cf 100644 (file)
@@ -285,8 +285,8 @@ ata_finish(struct ata_request *request)
        /* put request on the proper taskqueue for completion */
        /* XXX FreeBSD has some sort of bio_taskqueue code here */
         TASK_INIT(&request->task, 0, ata_completed, request);
-       ATA_DEBUG_RQ(request, "finish taskqueue_swi");
-       taskqueue_enqueue(taskqueue_swi, &request->task);
+       ATA_DEBUG_RQ(request, "finish taskqueue_swi_mp");
+       taskqueue_enqueue(taskqueue_swi_mp, &request->task);
     }
 }