Re: ide-scsi problems with multiple CD-Rs on same channel (2.2.14)

From: Gadi Oxman (gadio@netvision.net.il)
Date: Wed Jan 26 2000 - 19:18:05 EST


On Wed, 26 Jan 2000, Tkil wrote:

> >>>>> "Gadi" == Gadi Oxman <gadio@netvision.net.il> writes:
>
> Gadi> I'd recommend changing choose_drive() in drivers/block/ide.c
> Gadi> as follows -- replacing the "drive = hwgroup->drive;" line with
> Gadi> "drive = hwgroup->drive->next;" line, and commenting out the
> Gadi> part later which tests the best->nice1 flag (the second part
> Gadi> of the patch can alternatively be done by using "echo nice1:0 >
> Gadi> /proc/ide/hdx/settings for each IDE drive).
>
> Gadi> This will select round-robin scheduling between the drives. This
> Gadi> is usually not the best for throughput, but might be more
> Gadi> appropriate when real-time constrains are involved.
>
> Well, a few issues:
>
> 1. Switching to hwgroup->drive->next causes serious problems at boot.
> The four IDE devices are detected, but it stops at the "partition
> check" for hda.
>
> So I reverted this portion of the patch. It might still be usable,
> but I suspect that we would need to fix the termination condition
> there too.

Sorry, my bad (the end of the while block also has to check for
hwgroup->drive->next). Here is a corrected patch (against stock kernel).

Cheers,

Gadi

--- ide.c~ Wed Nov 17 08:15:22 1999
+++ ide.c Thu Jan 27 02:14:55 2000
@@ -1079,19 +1079,20 @@
 
 repeat:
         best = NULL;
- drive = hwgroup->drive;
+ drive = hwgroup->drive->next;
         do {
                 if (drive->queue && (!drive->sleep || 0 <= (signed long)(jiffies - drive->sleep))) {
                         if (!best
                          || (drive->sleep && (!best->sleep || 0 < (signed long)(best->sleep - drive->sleep)))
- || (!best->sleep && 0 < (signed long)(WAKEUP(best) - WAKEUP(drive))))
+ || 0 /* (!best->sleep && 0 < (signed long)(WAKEUP(best) - WAKEUP(drive)))*/ )
                         {
                                 struct blk_dev_struct *bdev = &blk_dev[HWIF(drive)->major];
                                 if (bdev->current_request != &bdev->plug)
                                         best = drive;
                         }
                 }
- } while ((drive = drive->next) != hwgroup->drive);
+ } while ((drive = drive->next) != hwgroup->drive->next);
+#if 0
         if (best && best->nice1 && !best->sleep && best != hwgroup->drive && best->service_time > WAIT_MIN_SLEEP) {
                 long t = (signed long)(WAKEUP(best) - jiffies);
                 if (t >= WAIT_MIN_SLEEP) {
@@ -1111,6 +1112,7 @@
                         } while ((drive = drive->next) != best);
                 }
         }
+#endif
         return best;
 }
 

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.rutgers.edu
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Jan 31 2000 - 21:00:17 EST