lkml.org 
[lkml]   [2004]   [Jan]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
SubjectRe: [PATCH] various IDE patches/cleanups

2nd patch notes
---------------

The function "ide_stall_queue" is used to "give back excess bandwidth" for
a drive. What this means is that some request comes in a drive, and it is
unable to process the request immediately (because the hardware is still
seeking or powering up or somesuch) then, instead of just waiting for the
hardware, we can stall the queue. See drivers/ide/ide-cdrom.c for example.

The intention would seem to be to stall the drive - there doesn't seem to
be any necessity to stall other drives in the same hwgroup (or even on the
same interface). But this is exactly what the current code does.

This patch changes the behaviour to stall only the drive, not the whole
hwgroup.

- (ide-io.c)
- ide_do_request()
- Set hwgroup->busy false when sleeping, so that requests on other drives
can still come in.
- if no requests can be served (choose_drive returns NULL) and we are
already sleeping, break out early (after setting ->busy false)
- if a request is chosen (choose_drive) and ->sleeping is currently set,
remove the expiry timer and clear ->sleeping.
- ide_timer_expiry()
- no need to clear ->busy when the sleep timer expires, as we now sleep
with ->busy clear.



diff -urN linux-2.6.0-patch1/drivers/ide/ide-io.c linux-2.6.0/drivers/ide/ide-io.c
--- linux-2.6.0-patch1/drivers/ide/ide-io.c Thu Nov 27 07:45:21 2003
+++ linux-2.6.0/drivers/ide/ide-io.c Wed Jan 28 22:55:00 2004
@@ -843,6 +843,8 @@
drive = choose_drive(hwgroup);
if (drive == NULL) {
unsigned long sleep = 0;
+ hwgroup->busy = ata_pending_commands(hwgroup->drive);
+ if (hwgroup->sleeping) break;
hwgroup->rq = NULL;
drive = hwgroup->drive;
do {
@@ -865,8 +867,6 @@
/* so that ide_timer_expiry knows what to do */
hwgroup->sleeping = 1;
mod_timer(&hwgroup->timer, sleep);
- /* we purposely leave hwgroup->busy==1
- * while sleeping */
} else {
/* Ugly, but how can we sleep for the lock
* otherwise? perhaps from tq_disk?
@@ -874,12 +874,20 @@

/* for atari only */
ide_release_lock();
- hwgroup->busy = 0;
}

/* no more work for this hwgroup (for now) */
return;
}
+
+ if (hwgroup->sleeping) {
+ if (!del_timer(&hwgroup->timer)) {
+ hwgroup->busy = 0;
+ break; /* let the timer handler finish; it will call us again */
+ }
+ hwgroup->sleeping = 0;
+ }
+
hwif = HWIF(drive);
if (hwgroup->hwif->sharing_irq &&
hwif != hwgroup->hwif &&
@@ -1060,7 +1068,6 @@
*/
if (hwgroup->sleeping) {
hwgroup->sleeping = 0;
- hwgroup->busy = 0;
}
} else {
ide_drive_t *drive = hwgroup->drive;
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
\
 
 \ /
  Last update: 2005-03-22 14:00    [W:0.084 / U:0.672 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site