svn commit: r209104 - in head/sys: kern sys

Konstantin Belousov kib at FreeBSD.org
Sat Jun 12 13:20:39 UTC 2010


Author: kib
Date: Sat Jun 12 13:20:38 2010
New Revision: 209104
URL: http://svn.freebsd.org/changeset/base/209104

Log:
  Add modifications of devctl_notify(9) functions that take flags. Use
  flags to specify M_WAITOK/M_NOWAIT. M_WAITOK allows devctl to sleep for
  the memory allocation.
  
  As Warner noted, allowing the functions to sleep might cause
  reordering of the queued notifications.
  
  Reviewed by:	imp, jh
  MFC after:	3 weeks

Modified:
  head/sys/kern/subr_bus.c
  head/sys/sys/bus.h

Modified: head/sys/kern/subr_bus.c
==============================================================================
--- head/sys/kern/subr_bus.c	Sat Jun 12 13:10:03 2010	(r209103)
+++ head/sys/kern/subr_bus.c	Sat Jun 12 13:20:38 2010	(r209104)
@@ -539,7 +539,7 @@ devctl_process_running(void)
  * that @p data is allocated using the M_BUS malloc type.
  */
 void
-devctl_queue_data(char *data)
+devctl_queue_data_f(char *data, int flags)
 {
 	struct dev_event_info *n1 = NULL, *n2 = NULL;
 	struct proc *p;
@@ -548,7 +548,7 @@ devctl_queue_data(char *data)
 		goto out;
 	if (devctl_queue_length == 0)
 		goto out;
-	n1 = malloc(sizeof(*n1), M_BUS, M_NOWAIT);
+	n1 = malloc(sizeof(*n1), M_BUS, flags);
 	if (n1 == NULL)
 		goto out;
 	n1->dei_data = data;
@@ -588,12 +588,19 @@ out:
 	return;
 }
 
+void
+devctl_queue_data(char *data)
+{
+
+	devctl_queue_data_f(data, M_NOWAIT);
+}
+
 /**
  * @brief Send a 'notification' to userland, using standard ways
  */
 void
-devctl_notify(const char *system, const char *subsystem, const char *type,
-    const char *data)
+devctl_notify_f(const char *system, const char *subsystem, const char *type,
+    const char *data, int flags)
 {
 	int len = 0;
 	char *msg;
@@ -611,7 +618,7 @@ devctl_notify(const char *system, const 
 	if (data != NULL)
 		len += strlen(data);
 	len += 3;	/* '!', '\n', and NUL */
-	msg = malloc(len, M_BUS, M_NOWAIT);
+	msg = malloc(len, M_BUS, flags);
 	if (msg == NULL)
 		return;		/* Drop it on the floor */
 	if (data != NULL)
@@ -620,7 +627,15 @@ devctl_notify(const char *system, const 
 	else
 		snprintf(msg, len, "!system=%s subsystem=%s type=%s\n",
 		    system, subsystem, type);
-	devctl_queue_data(msg);
+	devctl_queue_data_f(msg, flags);
+}
+
+void
+devctl_notify(const char *system, const char *subsystem, const char *type,
+    const char *data)
+{
+
+	devctl_notify_f(system, subsystem, type, data, M_NOWAIT);
 }
 
 /*

Modified: head/sys/sys/bus.h
==============================================================================
--- head/sys/sys/bus.h	Sat Jun 12 13:10:03 2010	(r209103)
+++ head/sys/sys/bus.h	Sat Jun 12 13:20:38 2010	(r209104)
@@ -85,8 +85,11 @@ struct u_device {
  * included in case devctl_notify isn't sufficiently general.
  */
 boolean_t devctl_process_running(void);
+void devctl_notify_f(const char *__system, const char *__subsystem,
+    const char *__type, const char *__data, int __flags);
 void devctl_notify(const char *__system, const char *__subsystem,
     const char *__type, const char *__data);
+void devctl_queue_data_f(char *__data, int __flags);
 void devctl_queue_data(char *__data);
 
 /**


More information about the svn-src-head mailing list