mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
Linux 4.14 compat: blk_queue_stackable()
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
This commit is contained in:
committed by
Tony Hutter
parent
17cd9a8e0c
commit
b5ee3df776
+10
-12
@@ -168,23 +168,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 " \
|
||||
@@ -198,9 +195,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("ZFS: Unable to set \"%s\" scheduler for %s (%s): %d\n",
|
||||
if (error) {
|
||||
zfs_dbgmsg("Unable to set \"%s\" scheduler for %s (%s): %d\n",
|
||||
elevator, v->vdev_path, device, error);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user