HomeFreeBSD

Cleanup: Use OpenSolaris functions to call scheduler

Description

Cleanup: Use OpenSolaris functions to call scheduler

In our codebase, cond_resched() and schedule()` are Linux kernel
functions that have replaced the OpenSolaris kpreempt() functions in
the codebase to such an extent that kpreempt() in zfs_context.h was
broken. Nobody noticed because we did not actually use it. The header
had defined kpreempt() as yield(), which works on OpenSolaris and
Illumos where sched_yield() is a wrapper for yield(), but that does
not work on any other platform.

The FreeBSD platform specific code implemented shims for these, but the
shim for schedule() forced us to wait, which is different than merely
rescheduling to another thread as the original Linux code does, while
the shim for cond_resched() had the same definition as its kernel
kpreempt() shim.

After studying this, I have concluded that we should reintroduce the
kpreempt() function in platform independent code with the following
definitions:

  • In the Linux kernel:
		kpreempt(unused)	-> cond_resched()
  • In the FreeBSD kernel:
		kpreempt(unused)	-> kern_yield(PRI_USER)
  • In userspace:
		kpreempt(unused)	-> sched_yield()

In userspace, nothing changes from this cleanup. In the kernels, the
function fm_fini() will now call kern_yield(PRI_USER) on FreeBSD and
cond_resched() on Linux. This is instead of pause("schedule", 1) on
FreeBSD and schedule() on Linux. This makes our behavior consistent
across platforms.

Note that Linux's SPL continues to use cond_resched() and
schedule(). However, those functions have been removed from both the
FreeBSD code and userspace code.

This should have the benefit of making it slightly easier to port the
code to new platforms by making how things should be mapped less
confusing.

Reviewed-by: Alexander Motin <mav@FreeBSD.org>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Reviewed-by: Neal Gompa <ngompa@datto.com>
Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu>
Closes #13845

Details

Provenance
Richard Yao <richard.yao@alumni.stonybrook.edu>Authored on Sep 12 2022, 4:55 PM
GitHub <noreply@github.com>Committed on Sep 12 2022, 4:55 PM
Parents
rGede037cda736: Make zfs-share service resilient to stale exports
Branches
Unknown
Tags
Unknown

Event Timeline

GitHub <noreply@github.com> committed rG0e4c830bc197: Cleanup: Use OpenSolaris functions to call scheduler (authored by Richard Yao <richard.yao@alumni.stonybrook.edu>).Sep 12 2022, 4:55 PM