]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Linux 4.14 compat: blk_queue_stackable()
authorBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 20 Jun 2018 04:52:45 +0000 (21:52 -0700)
committerGitHub <noreply@github.com>
Wed, 20 Jun 2018 04:52:45 +0000 (21:52 -0700)
The blk_queue_stackable() function was replaced in the 4.14 kernel
by queue_is_rq_based(), commit torvalds/linux@5fdee212.  This change
resulted in the default elevator being used which can negatively
impact performance.

Rather than adding additional compatibility code to detect the
new interface unconditionally attempt to set the elevator.  Since
we expect this to fail for block devices without an elevator the
error message has been moved in to zfs_dbgmsg().

Finally, it was observed that the elevator_change() was removed
from the 4.12 kernel, commit torvalds/linux@c033269.  Update the
comment to clearly specify which are expected to export the
elevator_change() symbol.

Reviewed-by: Matthew Ahrens <mahrens@delphix.com>
Reviewed-by: Tony Hutter <hutter2@llnl.gov>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #7645

config/kernel-elevator-change.m4
include/linux/blkdev_compat.h
module/zfs/vdev_disk.c

index ace5aa82d3d353297604fd1d3ce8fd4e4babbd82..eba252579bcc5218ccb762257cc01ad6a183ee1c 100644 (file)
@@ -1,6 +1,6 @@
 dnl #
-dnl # 2.6.36 API change
-dnl # Verify the elevator_change() symbol is available.
+dnl # 2.6.36 API, exported elevator_change() symbol
+dnl # 4.12 API, removed elevator_change() symbol
 dnl #
 AC_DEFUN([ZFS_AC_KERNEL_ELEVATOR_CHANGE], [
        AC_MSG_CHECKING([whether elevator_change() is available])
index 27a4743c0fadf858ccbcb2c5abe834d9920ad63e..88b0e48cda0955e3d599fc514112e1e983df91a2 100644 (file)
@@ -106,17 +106,6 @@ blk_queue_set_write_cache(struct request_queue *q, bool wc, bool fua)
 #define        blk_fs_request(rq)      ((rq)->cmd_type == REQ_TYPE_FS)
 #endif
 
-/*
- * 2.6.27 API change,
- * The blk_queue_stackable() queue flag was added in 2.6.27 to handle dm
- * stacking drivers.  Prior to this request stacking drivers were detected
- * by checking (q->request_fn == NULL), for earlier kernels we revert to
- * this legacy behavior.
- */
-#ifndef blk_queue_stackable
-#define        blk_queue_stackable(q)  ((q)->request_fn == NULL)
-#endif
-
 /*
  * 2.6.34 API change,
  * The blk_queue_max_hw_sectors() function replaces blk_queue_max_sectors().
index 11744c1c10a7f0b93cf8a8e8c3e01a8ae669e74a..996bab43c6ce7117fe20a6fc419078a2070c586b 100644 (file)
@@ -167,23 +167,20 @@ vdev_elevator_switch(vdev_t *v, char *elevator)
        if (!v->vdev_wholedisk && strncmp(device, "dm-", 3) != 0)
                return;
 
-       /* Skip devices without schedulers (loop, ram, dm, etc) */
-       if (!q->elevator || !blk_queue_stackable(q))
-               return;
-
        /* Leave existing scheduler when set to "none" */
        if ((strncmp(elevator, "none", 4) == 0) && (strlen(elevator) == 4))
                return;
 
+       /*
+        * The elevator_change() function was available in kernels from
+        * 2.6.36 to 4.11.  When not available fall back to using the user
+        * mode helper functionality to set the elevator via sysfs.  This
+        * requires /bin/echo and sysfs to be mounted which may not be true
+        * early in the boot process.
+        */
 #ifdef HAVE_ELEVATOR_CHANGE
        error = elevator_change(q, elevator);
 #else
-       /*
-        * For pre-2.6.36 kernels elevator_change() is not available.
-        * Therefore we fall back to using a usermodehelper to echo the
-        * elevator into sysfs;  This requires /bin/echo and sysfs to be
-        * mounted which may not be true early in the boot process.
-        */
 #define        SET_SCHEDULER_CMD \
        "exec 0</dev/null " \
        "     1>/sys/block/%s/queue/scheduler " \
@@ -197,10 +194,10 @@ vdev_elevator_switch(vdev_t *v, char *elevator)
        error = call_usermodehelper(argv[0], argv, envp, UMH_WAIT_PROC);
        strfree(argv[2]);
 #endif /* HAVE_ELEVATOR_CHANGE */
-       if (error)
-               printk(KERN_NOTICE "ZFS: Unable to set \"%s\" scheduler"
-                   " for %s (%s): %d\n", elevator, v->vdev_path, device,
-                   error);
+       if (error) {
+               zfs_dbgmsg("Unable to set \"%s\" scheduler for %s (%s): %d\n",
+                   elevator, v->vdev_path, device, error);
+       }
 }
 
 /*