]> granicus.if.org Git - zfs/commitdiff
Set "none" scheduler if available (initramfs)
authorcolmbuckley <colm@tuatha.org>
Mon, 19 Aug 2019 22:11:47 +0000 (23:11 +0100)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 19 Aug 2019 22:11:46 +0000 (15:11 -0700)
Existing zfs initramfs script logic will attempt to set the 'noop'
scheduler if it's available on the vdev block devices. Newer kernels
have the similar 'none' scheduler on multiqueue devices; this change
alters the initramfs script logic to also attempt to set this scheduler
if it's available.

Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Garrett Fields <ghfields@gmail.com>
Reviewed-by: Richard Laager <rlaager@wiktel.com>
Signed-off-by: Colm Buckley <colm@tuatha.org>
Closes #9042

contrib/initramfs/scripts/zfs.in

index ad604a82ce526750d2f44aad56594ad5e3d4c9ca..9d11e1926afde92761779b789dc35c55cf7e4f6d 100644 (file)
@@ -884,20 +884,27 @@ mountroot()
                ZFS_RPOOL="${pool}"
        fi
 
-       # Set elevator=noop on the root pool's vdevs' disks.  ZFS already
-       # does this for wholedisk vdevs (for all pools), so this is only
-       # important for partitions.
+       # Set the no-op scheduler on the disks containing the vdevs of
+       # the root pool. For single-queue devices, this scheduler is
+       # "noop", for multi-queue devices, it is "none".
+       # ZFS already does this for wholedisk vdevs (for all pools), so this
+       # is only important for partitions.
        "${ZPOOL}" status -L "${ZFS_RPOOL}" 2> /dev/null |
            awk '/^\t / && !/(mirror|raidz)/ {
                dev=$1;
                sub(/[0-9]+$/, "", dev);
                print dev
            }' |
-           while read i
+       while read -r i
        do
-               if grep -sq noop /sys/block/$i/queue/scheduler
+               SCHEDULER=/sys/block/$i/queue/scheduler
+               if [ -e "${SCHEDULER}" ]
                then
-                       echo noop > "/sys/block/$i/queue/scheduler"
+                       # Query to see what schedulers are available
+                       case "$(cat "${SCHEDULER}")" in
+                               *noop*) echo noop > "${SCHEDULER}" ;;
+                               *none*) echo none > "${SCHEDULER}" ;;
+                       esac
                fi
        done