ide tcq support, 2.5.40-bk
PATCH 1/1 ide tcq support, 2.5.40-bk
Hi,
Tagged command queueing support for IDE is available again. It has a few rough edges from a source style POV, nothing that should impact stability though.
Patch against 2.5.40-BK attached.
# This is a BitKeeper generated patch for the following project:
# Project Name: Linux kernel tree
# This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas:
# ChangeSet 1.776 -> 1.777
# drivers/ide/ide-taskfile.c 1.5 -> 1.6
# drivers/ide/Config.in 1.5 -> 1.6
# drivers/ide/ide.c 1.24 -> 1.25
# include/linux/ide.h 1.21 -> 1.22
# drivers/ide/ide-disk.c 1.18 -> 1.19
# drivers/ide/ide-dma.c 1.4 -> 1.5
# drivers/ide/Makefile 1.5 -> 1.6
# drivers/ide/ide-probe.c 1.17 -> 1.18
# drivers/ide/Config.help 1.27 -> 1.28
# (new) -> 1.1 drivers/ide/ide-tcq.c
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/10/07 [email protected] 1.777
# Tagged command queueing for IDE, 2.5.40-BK
# --------------------------------------------
#
drivers/ide/Config.help +31 -0
@@ -258,6 +258,37 @@ If in doubt, say N. +CONFIG_BLK_DEV_IDE_TCQ + Support for tagged command queueing on ATA disk drives. This enables + the IDE layer to have multiple in-flight requests on hardware that + supports it. For now this includes the IBM Deskstar series drives, + such as the 22GXP, 75GXP, 40GV, 60GXP, and 120GXP (ie any Deskstar made + in the last couple of years), and at least some of the Western + Digital drives in the Expert series (by nature of really being IBM + drives). + + If you have such a drive, say Y here. + +CONFIG_BLK_DEV_IDE_TCQ_DEPTH + Maximum size of commands to enable per-drive. Any value between 1 + and 32 is valid, with 32 being the maxium that the hardware supports. + + You probably just want the default of 32 here. If you enter an invalid + number, the default value will be used. + +CONFIG_BLK_DEV_IDE_TCQ_DEFAULT + Enabled tagged command queueing unconditionally on drives that report + support for it. Regardless of the chosen value here, tagging can be + controlled at run time: + + echo "using_tcq:32" > /proc/ide/hdX/settings + + where any value between 1-32 selects chosen queue depth and enables + TCQ, and 0 disables it. hdparm version 4.7 an above also support + TCQ manipulations. + + Generally say Y here. + CONFIG_BLK_DEV_OFFBOARD Normally, IDE controllers built into the motherboard (on-board controllers) are assigned to ide0 and ide1 while those on add-in PCI
drivers/ide/Config.in +5 -0
@@ -36,6 +36,11 @@ dep_bool ' Generic PCI IDE Chipset Support' CONFIG_BLK_DEV_GENERIC $CONFIG_BLK_DEV_IDEPCI bool ' Sharing PCI IDE interrupts support' CONFIG_IDEPCI_SHARE_IRQ bool ' Generic PCI bus-master DMA support' CONFIG_BLK_DEV_IDEDMA_PCI + dep_bool ' ATA tagged command queueing' CONFIG_BLK_DEV_IDE_TCQ $CONFIG_BLK_DEV_IDEDMA_PCI + dep_bool ' TCQ on by default' CONFIG_BLK_DEV_IDE_TCQ_DEFAULT $CONFIG_BLK_DEV_IDE_TCQ + if [ "$CONFIG_BLK_DEV_IDE_TCQ" != "n" ]; then + int ' Default queue depth' CONFIG_BLK_DEV_IDE_TCQ_DEPTH 32 + fi bool ' Boot off-board chipsets first support' CONFIG_BLK_DEV_OFFBOARD dep_bool ' Force enable legacy 2.0.X HOSTS to use DMA' CONFIG_BLK_DEV_IDEDMA_FORCED $CONFIG_BLK_DEV_IDEDMA_PCI dep_bool ' Use PCI DMA by default when available' CONFIG_IDEDMA_PCI_AUTO $CONFIG_BLK_DEV_IDEDMA_PCI
drivers/ide/Makefile +1 -0
@@ -22,6 +22,7 @@ obj-$(CONFIG_BLK_DEV_IDEPCI) += setup-pci.o obj-$(CONFIG_BLK_DEV_IDEDMA_PCI) += ide-dma.o +obj-$(CONFIG_BLK_DEV_IDE_TCQ) += ide-tcq.o obj-$(CONFIG_BLK_DEV_ISAPNP) += ide-pnp.o ifeq ($(CONFIG_BLK_DEV_IDE),y)
drivers/ide/ide-disk.c +188 -21
332 lines not on this page · raw message
drivers/ide/ide-dma.c +73 -46
202 lines not on this page · raw message
drivers/ide/ide-probe.c +19 -0
@@ -221,6 +221,17 @@ drive->media = ide_disk;printk ("%s DISK drive\n" , (drive->is_flash) ?"CFA" :"ATA" );QUIRK_LIST (drive); + +/* Initialize queue depth settings */ + drive->queue_depth =1 ; +#ifdef CONFIG_BLK_DEV_IDE_TCQ_DEPTH + drive->queue_depth =CONFIG_BLK_DEV_IDE_TCQ_DEPTH ; +#else + drive->queue_depth = drive->id->queue_depth +1 ; +#endif +if (drive->queue_depth <1 || drive->queue_depth >IDE_MAX_TAG ) + drive->queue_depth =IDE_MAX_TAG ; +return ; err_misc:
@@ -776,6 +787,7 @@ q->queuedata =HWGROUP (drive);blk_init_queue (q, do_ide_request, &ide_lock); + drive->queue_setup =1 ;blk_queue_segment_boundary (q,0xffff );#ifdef CONFIG_BLK_DEV_PDC4030
@@ -792,6 +804,10 @@blk_queue_max_phys_segments (q,PRD_ENTRIES );ide_toggle_bounce (drive,1 ); + +#ifdef CONFIG_BLK_DEV_IDE_TCQ_DEFAULT +HWIF (drive)->ide_dma_queued_on (drive); +#endif }/*
@@ -917,8 +933,11 @@ hwgroup->drive = drive; drive->next = hwgroup->drive->next; hwgroup->drive->next = drive; +spin_unlock_irqrestore (&ide_lock, flags);ide_init_queue (drive); +spin_lock_irqsave (&ide_lock, flags); } +if (!hwgroup->hwif) { hwgroup->hwif =HWIF (hwgroup->drive);#ifdef DEBUG
drivers/ide/ide-taskfile.c +6 -0
@@ -201,6 +201,12 @@if (hwif->ide_dma_read (drive))return ide_stopped;break ; +case WIN_READDMA_QUEUED : +case WIN_READDMA_QUEUED_EXT : +return hwif->ide_dma_queued_read (drive); +case WIN_WRITEDMA_QUEUED : +case WIN_WRITEDMA_QUEUED_EXT : +return hwif->ide_dma_queued_write (drive);default :if (task->handler ==NULL )return ide_stopped;
drivers/ide/ide-tcq.c new file +719 -0
719 lines not on this page · raw message
drivers/ide/ide.c +30 -3
@@ -407,7 +407,10 @@if (!end_that_request_first (rq, uptodate, nr_sectors)) {add_blkdev_randomness (major (rq->rq_dev)); -blkdev_dequeue_request (rq); +if (!blk_rq_tagged (rq)) +blkdev_dequeue_request (rq); +else +blk_queue_end_tag (&drive->queue, rq);HWGROUP (drive)->rq =NULL ;end_that_request_last (rq); ret =0 ;
@@ -1117,9 +1120,30 @@ drive->sleep =0 ; drive->service_start = jiffies; -BUG_ON (blk_queue_plugged (&drive->queue)); +queue_next: +if (!ata_can_queue (drive)) { +if (!ata_pending_commands (drive)) + hwgroup->busy =0 ; + +break ; + } + +if (blk_queue_plugged (&drive->queue)) { +if (drive->using_tcq) +break ; + +printk ("ide: huh? queue was plugged!\n" ); +break ; + } + + rq =elv_next_request (&drive->queue); +if (!rq) +break ; + +if (!rq->bio &&ata_pending_commands (drive)) +break ; - rq = hwgroup->rq =elv_next_request (&drive->queue); + hwgroup->rq = rq;/* * Some systems have trouble with IDE IRQs arriving while
@@ -1138,6 +1162,8 @@spin_lock_irq (&ide_lock);if (masked_irq && hwif->irq != masked_irq)enable_irq (hwif->irq); +if (startstop == ide_released) + goto queue_next;if (startstop == ide_stopped) hwgroup->busy =0 ; }
@@ -1379,6 +1405,7 @@if ((handler = hwgroup->handler) ==NULL || hwgroup->poll_timeout !=0 ) { +printk ("ide: unexpected interrupt\n" );/* * Not expecting an interrupt from this drive. * That means this could be:
include/linux/ide.h +79 -17
168 lines not on this page · raw message
Signature · 1 line
Jens Axboe
Hi,
Quoted 6 lines · Jens Axboe
Hi,
Tagged command queueing support for IDE is available again. It has a few rough edges from a source style POV, nothing that should impact stability though.
[snip]
great work as usual - running it on 2.5.41. Ive given it a good beating on my old WD Experts, but havent met any problems yet.
I`d like this to go into mainline (again) - when Jens feels the time is right, of course.
== Morten
Signature · 8 lines
"Livet er ikke for nybegynnere" - sitat fra en klok person. mvh Morten Helgesen UNIX System Administrator & C Developer Nextframe AS [email protected] / 93445641 http://www.nextframe.net
Quoted 10 lines · Morten Helgesen
Hi,
Quoted 6 lines · Jens Axboe
Hi,
Tagged command queueing support for IDE is available again. It has a few rough edges from a source style POV, nothing that should impact stability though.
Quoted 4 lines
[snip]
great work as usual - running it on 2.5.41. I
ve given it a good beating on my old WD Experts, but havent met any problems yet.
Thanks for testing!
Quoted 2 lines
I`d like this to go into mainline (again) - when Jens feels the time is right, of course.
I submitted it earlier today.
Signature · 1 line
Jens Axboe