Skip to content

Commit

Permalink
Linux 4.14 compat: blk_queue_stackable()
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Tony Hutter <[email protected]>
Signed-off-by: Brian Behlendorf <[email protected]>
Closes openzfs#7645
  • Loading branch information
behlendorf authored and tonyhutter committed Jul 6, 2018
1 parent 17cd9a8 commit b5ee3df
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 25 deletions.
4 changes: 2 additions & 2 deletions config/kernel-elevator-change.m4
Original file line number Diff line number Diff line change
@@ -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])
Expand Down
11 changes: 0 additions & 11 deletions include/linux/blkdev_compat.h
Original file line number Diff line number Diff line change
Expand Up @@ -105,17 +105,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().
Expand Down
22 changes: 10 additions & 12 deletions module/zfs/vdev_disk.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 " \
Expand All @@ -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);
}
}

/*
Expand Down

0 comments on commit b5ee3df

Please sign in to comment.