On Tue, Jan 04, 2011 at 05:48:49AM +0000, Jukka Ruohonen wrote: > "Do not queue functions via sysmon_taskq(9) in the pmf(9) resume hooks. > There is a small and unlikely race when the drivers are loaded as modules; > suspend, resume, queue a function, and immediately unload the module."
Anything against adding for instance the following to sysmon_taskq(9)? Or better ideas how this should be handled? - Jukka. Index: sysmon_taskq.c =================================================================== RCS file: /cvsroot/src/sys/dev/sysmon/sysmon_taskq.c,v retrieving revision 1.14 diff -u -p -r1.14 sysmon_taskq.c --- sysmon_taskq.c 5 Sep 2008 22:06:52 -0000 1.14 +++ sysmon_taskq.c 4 Jan 2011 06:17:45 -0000 @@ -209,3 +209,30 @@ sysmon_task_queue_sched(u_int pri, void return 0; } + +/* + * sysmon_task_queue_cancel: + * + * Cancel a scheduled task. + */ +int +sysmon_task_queue_cancel(void (*func)(void *)) +{ + struct sysmon_task *st; + + if (func == NULL) + return EINVAL; + + mutex_enter(&sysmon_task_queue_mtx); + TAILQ_FOREACH(st, &sysmon_task_queue, st_list) { + if (st->st_func == func) { + TAILQ_REMOVE(&sysmon_task_queue, st, st_list); + mutex_exit(&sysmon_task_queue_mtx); + free(st, M_TEMP); + mutex_enter(&sysmon_task_queue_mtx); + } + } + mutex_exit(&sysmon_task_queue_mtx); + + return 0; +} Index: sysmon_taskq.h =================================================================== RCS file: /cvsroot/src/sys/dev/sysmon/sysmon_taskq.h,v retrieving revision 1.2 diff -u -p -r1.2 sysmon_taskq.h --- sysmon_taskq.h 21 Jul 2007 23:15:17 -0000 1.2 +++ sysmon_taskq.h 4 Jan 2011 06:17:45 -0000 @@ -42,5 +42,6 @@ void sysmon_task_queue_preinit(void); void sysmon_task_queue_init(void); void sysmon_task_queue_fini(void); int sysmon_task_queue_sched(u_int, void (*)(void *), void *); +int sysmon_task_queue_cancel(void (*func)(void *)); #endif /* _DEV_SYSMON_SYSMON_TASKQ_H_ */ Index: sysmon_taskq.9 =================================================================== RCS file: /cvsroot/src/share/man/man9/sysmon_taskq.9,v retrieving revision 1.6 diff -u -p -r1.6 sysmon_taskq.9 --- sysmon_taskq.9 26 Jan 2010 08:48:39 -0000 1.6 +++ sysmon_taskq.9 4 Jan 2011 06:18:23 -0000 @@ -43,6 +43,8 @@ .Fn sysmon_task_queue_fini "void" .Ft int .Fn sysmon_task_queue_sched "u_int pri" "void (*func)(void *)" "void *arg" +.Ft int +.Fn sysmon_task_queue_cancel "void (*func)(void *)" .Sh DESCRIPTION The machine-independent .Nm @@ -78,10 +80,15 @@ The single argument passed to .Fa func is specified by .Fa arg . +The +.Fn sysmon_task_queue_cancel +function can be used to cancel the execution of already scheduled function. .Sh RETURN VALUES -Upon successful completion, +Both .Fn sysmon_task_queue_sched -returns 0. +and +.Fn sysmon_task_queue_cancel +return 0 upon successful completion, Otherwise, the following error values are returned: .Bl -tag -width [EINVAL] .It Bq Er EINVAL