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

Reply via email to