Module Name:    src
Committed By:   jdolecek
Date:           Tue Apr  7 14:07:01 UTC 2020

Modified Files:
        src/sys/arch/xen/include: xenbus.h
        src/sys/arch/xen/xen: xbdback_xenbus.c
        src/sys/arch/xen/xenbus: xenbus_client.c xenbus_probe.c

Log Message:
convert the node watch code to use kmem_alloc() instead of malloc()


To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/xen/include/xenbus.h
cvs rdiff -u -r1.76 -r1.77 src/sys/arch/xen/xen/xbdback_xenbus.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/xen/xenbus/xenbus_client.c
cvs rdiff -u -r1.43 -r1.44 src/sys/arch/xen/xenbus/xenbus_probe.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/xen/include/xenbus.h
diff -u src/sys/arch/xen/include/xenbus.h:1.18 src/sys/arch/xen/include/xenbus.h:1.19
--- src/sys/arch/xen/include/xenbus.h:1.18	Tue Apr  7 13:38:50 2020
+++ src/sys/arch/xen/include/xenbus.h	Tue Apr  7 14:07:01 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: xenbus.h,v 1.18 2020/04/07 13:38:50 jdolecek Exp $ */
+/* $NetBSD: xenbus.h,v 1.19 2020/04/07 14:07:01 jdolecek Exp $ */
 /******************************************************************************
  * xenbus.h
  *
@@ -58,6 +58,7 @@ struct xenbus_watch {
 
 	/* Path being watched. */
 	char *node;
+	size_t node_sz;
 
 	/* Callback (executed in a process context with no locks held). */
 	void (*xbw_callback)(struct xenbus_watch *,
@@ -180,6 +181,8 @@ int xenbus_watch_path2(struct xenbus_dev
 		       void (*callback)(struct xenbus_watch *,
 					const char **, unsigned int));
 
+/* Unregister the watch, and free associated internal structures. */
+void xenbus_unwatch_path(struct xenbus_watch *);
 
 /**
  * Advertise in the store a change of the given driver to the given new_state.

Index: src/sys/arch/xen/xen/xbdback_xenbus.c
diff -u src/sys/arch/xen/xen/xbdback_xenbus.c:1.76 src/sys/arch/xen/xen/xbdback_xenbus.c:1.77
--- src/sys/arch/xen/xen/xbdback_xenbus.c:1.76	Tue Apr  7 13:36:22 2020
+++ src/sys/arch/xen/xen/xbdback_xenbus.c	Tue Apr  7 14:07:01 2020
@@ -1,4 +1,4 @@
-/*      $NetBSD: xbdback_xenbus.c,v 1.76 2020/04/07 13:36:22 jdolecek Exp $      */
+/*      $NetBSD: xbdback_xenbus.c,v 1.77 2020/04/07 14:07:01 jdolecek Exp $      */
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.76 2020/04/07 13:36:22 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.77 2020/04/07 14:07:01 jdolecek Exp $");
 
 #include <sys/atomic.h>
 #include <sys/buf.h>
@@ -487,11 +487,9 @@ xbdback_xenbus_destroy(void *arg)
 	xbdback_disconnect(xbdi);
 
 	/* unregister watch */
-	if (xbdi->xbdi_watch.node) {
-		unregister_xenbus_watch(&xbdi->xbdi_watch);
-		free(xbdi->xbdi_watch.node, M_DEVBUF);
-		xbdi->xbdi_watch.node = NULL;
-	}
+	if (xbdi->xbdi_watch.node)
+		xenbus_unwatch_path(&xbdi->xbdi_watch);
+
 	/* unmap ring */
 	if (xbdi->xbdi_ring_va != 0) {
 		ungrop.host_addr = xbdi->xbdi_ring_va;

Index: src/sys/arch/xen/xenbus/xenbus_client.c
diff -u src/sys/arch/xen/xenbus/xenbus_client.c:1.15 src/sys/arch/xen/xenbus/xenbus_client.c:1.16
--- src/sys/arch/xen/xenbus/xenbus_client.c:1.15	Tue Apr  7 13:38:50 2020
+++ src/sys/arch/xen/xenbus/xenbus_client.c	Tue Apr  7 14:07:01 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: xenbus_client.c,v 1.15 2020/04/07 13:38:50 jdolecek Exp $ */
+/* $NetBSD: xenbus_client.c,v 1.16 2020/04/07 14:07:01 jdolecek Exp $ */
 /******************************************************************************
  * Client-facing interface for the Xenbus driver.  In other words, the
  * interface between the Xenbus and the device-specific code, be it the
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xenbus_client.c,v 1.15 2020/04/07 13:38:50 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xenbus_client.c,v 1.16 2020/04/07 14:07:01 jdolecek Exp $");
 
 #if 0
 #define DPRINTK(fmt, args...) \
@@ -42,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: xenbus_clien
 #include <sys/null.h>
 #include <sys/errno.h>
 #include <sys/malloc.h>
+#include <sys/kmem.h>
 #include <sys/systm.h>
 
 #include <xen/xen.h>
@@ -50,30 +51,6 @@ __KERNEL_RCSID(0, "$NetBSD: xenbus_clien
 #include <xen/xenbus.h>
 #include <xen/granttables.h>
 
-
-static int
-xenbus_watch_path(struct xenbus_device *dev, char *path,
-		      struct xenbus_watch *watch, 
-		      void (*callback)(struct xenbus_watch *,
-				       const char **, unsigned int))
-{
-	int err;
-
-	watch->node = path;
-	watch->xbw_callback = callback;
-
-	err = register_xenbus_watch(watch);
-
-	if (err) {
-		watch->node = NULL;
-		watch->xbw_callback = NULL;
-		xenbus_dev_fatal(dev, err, "adding watch on %s", path);
-	}
-	err = 0;
-
-	return err;
-}
-
 int
 xenbus_watch_path2(struct xenbus_device *dev, const char *path,
 		       const char *path2, struct xenbus_watch *watch, 
@@ -84,21 +61,37 @@ xenbus_watch_path2(struct xenbus_device 
 	char *state;
 
 	DPRINTK("xenbus_watch_path2 path %s path2 %s\n", path, path2);
-	state =
-		malloc(strlen(path) + 1 + strlen(path2) + 1, M_DEVBUF,
-		    M_WAITOK);
+
+	watch->node_sz = strlen(path) + 1 + strlen(path2) + 1;
+	state = kmem_alloc(watch->node_sz, KM_SLEEP);
 	strcpy(state, path);
 	strcat(state, "/");
 	strcat(state, path2);
 
-	err = xenbus_watch_path(dev, state, watch, callback);
+	watch->node = state;
+	watch->xbw_callback = callback;
+
+	err = register_xenbus_watch(watch);
 
 	if (err) {
-		free(state, M_DEVBUF);
+		watch->node = NULL;
+		watch->node_sz = 0;
+		watch->xbw_callback = NULL;
+		xenbus_dev_fatal(dev, err, "adding watch on %s", state);
+		kmem_free(state, watch->node_sz);
 	}
 	return err;
 }
 
+void
+xenbus_unwatch_path(struct xenbus_watch *watch)
+{
+	if (watch->node != NULL) {
+		unregister_xenbus_watch(watch);
+		kmem_free(watch->node, watch->node_sz);
+		watch->node = NULL;
+	}
+}
 
 int
 xenbus_switch_state(struct xenbus_device *dev,

Index: src/sys/arch/xen/xenbus/xenbus_probe.c
diff -u src/sys/arch/xen/xenbus/xenbus_probe.c:1.43 src/sys/arch/xen/xenbus/xenbus_probe.c:1.44
--- src/sys/arch/xen/xenbus/xenbus_probe.c:1.43	Tue Apr  7 13:36:22 2020
+++ src/sys/arch/xen/xenbus/xenbus_probe.c	Tue Apr  7 14:07:01 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: xenbus_probe.c,v 1.43 2020/04/07 13:36:22 jdolecek Exp $ */
+/* $NetBSD: xenbus_probe.c,v 1.44 2020/04/07 14:07:01 jdolecek Exp $ */
 /******************************************************************************
  * Talks to Xen Store to figure out what devices we have.
  *
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xenbus_probe.c,v 1.43 2020/04/07 13:36:22 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xenbus_probe.c,v 1.44 2020/04/07 14:07:01 jdolecek Exp $");
 
 #if 0
 #define DPRINTK(fmt, args...) \
@@ -42,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: xenbus_probe
 #include <sys/null.h>
 #include <sys/errno.h>
 #include <sys/malloc.h>
+#include <sys/kmem.h>
 #include <sys/systm.h>
 #include <sys/param.h>
 #include <sys/kthread.h>
@@ -232,11 +233,8 @@ free_otherend_details(struct xenbus_devi
 static void
 free_otherend_watch(struct xenbus_device *dev)
 {
-	if (dev->xbusd_otherend_watch.node) {
-		unregister_xenbus_watch(&dev->xbusd_otherend_watch);
-		free(dev->xbusd_otherend_watch.node, M_DEVBUF);
-		dev->xbusd_otherend_watch.node = NULL;
-	}
+	if (dev->xbusd_otherend_watch.node)
+		xenbus_unwatch_path(&dev->xbusd_otherend_watch);
 }
 
 static void
@@ -615,11 +613,14 @@ xenbus_probe(void *unused)
 	xenbus_probe_backends();
 
 	/* Watch for changes. */
-	fe_watch.node = malloc(strlen("device") + 1, M_DEVBUF, M_NOWAIT);
+	fe_watch.node_sz = strlen("device") + 1;
+	fe_watch.node = kmem_alloc(fe_watch.node_sz, KM_SLEEP);
 	strcpy(fe_watch.node, "device");
 	fe_watch.xbw_callback = frontend_changed;
 	register_xenbus_watch(&fe_watch);
-	be_watch.node = malloc(strlen("backend") + 1, M_DEVBUF, M_NOWAIT);
+
+	be_watch.node_sz = strlen("backend") + 1;
+	be_watch.node = kmem_alloc(be_watch.node_sz, KM_SLEEP);
 	strcpy(be_watch.node, "backend");
 	be_watch.xbw_callback = backend_changed;
 	register_xenbus_watch(&be_watch);

Reply via email to