diff options
author | davide <davide@FreeBSD.org> | 2013-08-23 14:12:39 +0000 |
---|---|---|
committer | davide <davide@FreeBSD.org> | 2013-08-23 14:12:39 +0000 |
commit | 7cf3eec1d47287096a555d0fc2d1d8052234abf5 (patch) | |
tree | cf0fd0554d2a91e22e4c56d86234981ed8f3fa10 | |
parent | d2eb50cd0ca5fb81f2abdfd917bf5c0ce0fe9ac7 (diff) | |
download | FreeBSD-src-7cf3eec1d47287096a555d0fc2d1d8052234abf5.zip FreeBSD-src-7cf3eec1d47287096a555d0fc2d1d8052234abf5.tar.gz |
Introduce callout_init_rm() so that callouts can be used in conjunction
with rmlocks. This works only with non-sleepable rm because handlers run
in SWI context. While here, document the new KPI in the timeout(9)
manpage.
Requested by: adrian, scottl
Reviewed by: mav, remko(manpage)
-rw-r--r-- | share/man/man9/timeout.9 | 26 | ||||
-rw-r--r-- | sys/sys/callout.h | 3 |
2 files changed, 23 insertions, 6 deletions
diff --git a/share/man/man9/timeout.9 b/share/man/man9/timeout.9 index c63c201..5179d79 100644 --- a/share/man/man9/timeout.9 +++ b/share/man/man9/timeout.9 @@ -38,6 +38,7 @@ .Nm callout_handle_init , .Nm callout_init , .Nm callout_init_mtx , +.Nm callout_init_rm , .Nm callout_init_rw , .Nm callout_stop , .Nm callout_drain , @@ -73,6 +74,8 @@ struct callout_handle handle = CALLOUT_HANDLE_INITIALIZER(&handle); .Fn callout_init "struct callout *c" "int mpsafe" .Ft void .Fn callout_init_mtx "struct callout *c" "struct mtx *mtx" "int flags" +.Fn void +.Fn callout_init_rm "struct callout *c" "struct rmlock *rm" "int flags" .Ft void .Fn callout_init_rw "struct callout *c" "struct rwlock *rw" "int flags" .Ft int @@ -203,6 +206,7 @@ Thus they are protected from re-entrancy. The functions .Fn callout_init , .Fn callout_init_mtx , +.Fn callout_init_rm , .Fn callout_init_rw , .Fn callout_stop , .Fn callout_drain , @@ -252,15 +256,25 @@ after the callout function returns. .Pp The .Fn callout_init_rw -function serves the need of using rwlocks in conjunction with callouts. -The function does basically the same as -.Fn callout_init_mtx +and the +.Fn callout_init_rm +fuctions serve the need of using rwlocks and rmlocks in conjunction +with callouts. +The functions do the same as +.Fn callout_init with the possibility of specifying an extra .Fa rw +or +.Fa rm argument. -The usable lock classes are currently limited to mutexes and rwlocks, -because callout handlers run in softclock swi, so they cannot sleep nor -acquire sleepable locks like sx or lockmgr. +If an +.Fa rm +argument is specified, the lock should be created without passing the +.It Dv RM_SLEEPABLE +flag. +The usable lock classes are currently limited to mutexes, rwlocks and +non-sleepable rmlocks, because callout handlers run in softclock swi, +so they cannot sleep nor acquire sleepable locks like sx or lockmgr. The following .Fa flags may be specified: diff --git a/sys/sys/callout.h b/sys/sys/callout.h index 9e3eb90..536a0c5 100644 --- a/sys/sys/callout.h +++ b/sys/sys/callout.h @@ -71,6 +71,9 @@ void _callout_init_lock(struct callout *, struct lock_object *, int); #define callout_init_mtx(c, mtx, flags) \ _callout_init_lock((c), ((mtx) != NULL) ? &(mtx)->lock_object : \ NULL, (flags)) +#define callout_init_rm(c, rm, flags) + _callout_init_lock((c), ((rm != NULL) ? &(rm)->lock_object : \ + NULL, (flags)) #define callout_init_rw(c, rw, flags) \ _callout_init_lock((c), ((rw) != NULL) ? &(rw)->lock_object : \ NULL, (flags)) |