Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/xen/xen similar treatment as xennetback_xenbus.c:



details:   https://anonhg.NetBSD.org/src/rev/20d084baec49
branches:  trunk
changeset: 320161:20d084baec49
user:      jdolecek <jdolecek%NetBSD.org@localhost>
date:      Sun Jun 24 20:15:00 2018 +0000

description:
similar treatment as xennetback_xenbus.c:
- protect instance list with mutex
- mark more local variables static
- mark with XXXSMP what looks suspicious
- in pciback.c use kmem_zalloc() et.al to allocate the device structures

diffstat:

 sys/arch/xen/xen/pciback.c        |  56 ++++++++++++++++++++++----------------
 sys/arch/xen/xen/xbdback_xenbus.c |  31 +++++++++++++++------
 2 files changed, 54 insertions(+), 33 deletions(-)

diffs (281 lines):

diff -r 90bba06c0350 -r 20d084baec49 sys/arch/xen/xen/pciback.c
--- a/sys/arch/xen/xen/pciback.c        Sun Jun 24 19:53:50 2018 +0000
+++ b/sys/arch/xen/xen/pciback.c        Sun Jun 24 20:15:00 2018 +0000
@@ -1,4 +1,4 @@
-/*      $NetBSD: pciback.c,v 1.13 2018/06/24 13:35:33 jdolecek Exp $      */
+/*      $NetBSD: pciback.c,v 1.14 2018/06/24 20:15:00 jdolecek Exp $      */
 
 /*
  * Copyright (c) 2009 Manuel Bouyer.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pciback.c,v 1.13 2018/06/24 13:35:33 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pciback.c,v 1.14 2018/06/24 20:15:00 jdolecek Exp $");
 
 #include "opt_xen.h"
 
@@ -79,7 +79,8 @@
 };
 
 /* list of devices we want to match */
-SLIST_HEAD(pciback_pci_devlist, pciback_pci_dev) pciback_pci_devlist_head  =
+static SLIST_HEAD(pciback_pci_devlist, pciback_pci_dev)
+    pciback_pci_devlist_head  =
     SLIST_HEAD_INITIALIZER(pciback_pci_devlist_head);
        
 /* PCI-related functions and definitions  */
@@ -128,7 +129,7 @@
 static int  pciback_xenbus_create(struct xenbus_device *);
 static int  pciback_xenbus_destroy(void *);
 static void pciback_xenbus_frontend_changed(void *, XenbusState);
-static struct pb_xenbus_instance * pbxif_lookup(domid_t);
+static bool pbxif_lookup(domid_t);
 static void pciback_xenbus_export_device(struct pb_xenbus_instance *, char *);
 static void pciback_xenbus_export_roots(struct pb_xenbus_instance *);
 
@@ -192,7 +193,8 @@
         grant_handle_t pbx_shinfo_handle; /* to unmap shared page */
 };
 
-SLIST_HEAD(, pb_xenbus_instance) pb_xenbus_instances;
+static SLIST_HEAD(, pb_xenbus_instance) pb_xenbus_instances;
+static kmutex_t pb_xenbus_lock;
 
 static struct xenbus_backend_driver pci_backend_driver = {
         .xbakd_create = pciback_xenbus_create,
@@ -351,6 +353,7 @@
 pciback_pci_lookup(u_int bus, u_int dev, u_int func)
 {
        struct pciback_pci_dev *pbd;
+       /* Safe without lock, only written during init */
        SLIST_FOREACH(pbd, &pciback_pci_devlist_head, pb_devlist_next) {
                if (pbd->pb_bus == bus &&
                    pbd->pb_device == dev &&
@@ -374,7 +377,7 @@
        if (strlen(xi.xcp_pcidevs) == 0)
                return;
        pcidevs = xi.xcp_pcidevs;
-       for(pcidevs = xi.xcp_pcidevs; *pcidevs != '\0';) {
+       for (pcidevs = xi.xcp_pcidevs; *pcidevs != '\0';) {
                if (*pcidevs != '(')
                        goto error;
                pcidevs++;
@@ -384,12 +387,7 @@
                        goto error;
                *c = '\0';
                if (pciback_parse_pci(pcidevs, &bus, &dev, &func) == 0) {
-                       pb = malloc(sizeof(struct pciback_pci_dev), M_DEVBUF,
-                           M_NOWAIT | M_ZERO);
-                       if (pb == NULL) {
-                               aprint_error("pciback_pci_init: out or memory\n");
-                               return;
-                       }
+                       pb = kmem_zalloc(sizeof(*pb), KM_SLEEP);
                        pb->pb_bus = bus;
                        pb->pb_device = dev;
                        pb->pb_function = func;
@@ -400,6 +398,10 @@
                }
                pcidevs = c + 1;
        }
+
+       SLIST_INIT(&pb_xenbus_instances);
+       mutex_init(&pb_xenbus_lock, MUTEX_DEFAULT, IPL_NONE);
+
        xenbus_backend_register(&pci_backend_driver);
 
        KERNFS_ALLOCENTRY(dkt, M_TEMP, M_WAITOK);
@@ -459,14 +461,10 @@
                return err;
        }
 
-       if (pbxif_lookup(domid) != NULL) {
+       if (pbxif_lookup(domid)) {
                return EEXIST;
        }
-       pbxi = malloc(sizeof(struct pb_xenbus_instance), M_DEVBUF,
-           M_NOWAIT | M_ZERO);
-       if (pbxi == NULL) {
-               return ENOMEM;
-       }
+       pbxi = kmem_zalloc(sizeof(*pbxi), KM_SLEEP);
        pbxi->pbx_domid = domid;
 
        xbusd->xbusd_u.b.b_cookie = pbxi;
@@ -475,7 +473,9 @@
 
        SLIST_INIT(&pbxi->pbx_pb_pci_dev);
 
+       mutex_enter(&pb_xenbus_lock);
        SLIST_INSERT_HEAD(&pb_xenbus_instances, pbxi, pbx_next);
+       mutex_exit(&pb_xenbus_lock);
 
        xbusd->xbusd_otherend_changed = pciback_xenbus_frontend_changed;
 
@@ -511,7 +511,7 @@
 
        return 0;
 fail:
-       free(pbxi, M_DEVBUF);
+       kmem_free(pbxi, sizeof(*pbxi));
        return err;
 }
 
@@ -527,8 +527,10 @@
        event_remove_handler(pbxi->pbx_evtchn,
            pciback_xenbus_evthandler, pbxi);
 
+       mutex_enter(&pb_xenbus_lock);
        SLIST_REMOVE(&pb_xenbus_instances,
            pbxi, pb_xenbus_instance, pbx_next);
+       mutex_exit(&pb_xenbus_lock);
 
        if (pbxi->pbx_sh_info) {
                op.host_addr = (vaddr_t)pbxi->pbx_sh_info;
@@ -545,7 +547,7 @@
        }
        uvm_km_free(kernel_map, (vaddr_t)pbxi->pbx_sh_info,
            PAGE_SIZE, UVM_KMF_VAONLY);
-       free(pbxi, M_DEVBUF);
+       kmem_free(pbxi, sizeof(*pbxi));
        return 0;
 }
 
@@ -645,16 +647,22 @@
 }
 
 /* lookup a pbxi based on domain id and interface handle */
-static struct pb_xenbus_instance *
+static bool
 pbxif_lookup(domid_t dom)
 {
        struct pb_xenbus_instance *pbxi;
+       bool found = false;
 
+       mutex_enter(&pb_xenbus_lock);
        SLIST_FOREACH(pbxi, &pb_xenbus_instances, pbx_next) {
-               if (pbxi->pbx_domid == dom)
-                       return pbxi;
+               if (pbxi->pbx_domid == dom) {
+                       found = true;
+                       break;
+               }
        }
-       return NULL;
+       mutex_exit(&pb_xenbus_lock);
+
+       return found;
 }
 
 static void
diff -r 90bba06c0350 -r 20d084baec49 sys/arch/xen/xen/xbdback_xenbus.c
--- a/sys/arch/xen/xen/xbdback_xenbus.c Sun Jun 24 19:53:50 2018 +0000
+++ b/sys/arch/xen/xen/xbdback_xenbus.c Sun Jun 24 20:15:00 2018 +0000
@@ -1,4 +1,4 @@
-/*      $NetBSD: xbdback_xenbus.c,v 1.65 2017/11/11 21:03:01 riastradh Exp $      */
+/*      $NetBSD: xbdback_xenbus.c,v 1.66 2018/06/24 20:15:00 jdolecek Exp $      */
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.65 2017/11/11 21:03:01 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xbdback_xenbus.c,v 1.66 2018/06/24 20:15:00 jdolecek Exp $");
 
 #include <sys/atomic.h>
 #include <sys/buf.h>
@@ -212,7 +212,8 @@
                xbdback_finish_disconnect(xbdip);             \
 } while (/* CONSTCOND */ 0)
 
-SLIST_HEAD(, xbdback_instance) xbdback_instances;
+static SLIST_HEAD(, xbdback_instance) xbdback_instances;
+static kmutex_t xbdback_lock;
 
 /*
  * For each request from a guest, a xbdback_request is allocated from
@@ -281,6 +282,7 @@
  * Pools to manage the chain of block requests and I/Os fragments
  * submitted by frontend.
  */
+/* XXXSMP */
 struct xbdback_pool {
        struct pool_cache pc;
        struct timeval last_warning;
@@ -308,7 +310,7 @@
 static void xbdback_disconnect(struct xbdback_instance *);
 static void xbdback_finish_disconnect(struct xbdback_instance *);
 
-static struct xbdback_instance *xbdif_lookup(domid_t, uint32_t);
+static bool xbdif_lookup(domid_t, uint32_t);
 
 static void *xbdback_co_main(struct xbdback_instance *, void *);
 static void *xbdback_co_main_loop(struct xbdback_instance *, void *);
@@ -363,6 +365,7 @@
         * and send driver up message.
         */
        SLIST_INIT(&xbdback_instances);
+       mutex_init(&xbdback_lock, MUTEX_DEFAULT, IPL_NONE);
        SIMPLEQ_INIT(&xbdback_shmq);
        xbdback_shmcb = 0;
 
@@ -424,7 +427,7 @@
                return EFTYPE;
        }
                        
-       if (xbdif_lookup(domid, handle) != NULL) {
+       if (xbdif_lookup(domid, handle)) {
                return EEXIST;
        }
        xbdi = kmem_zalloc(sizeof(*xbdi), KM_SLEEP);
@@ -440,7 +443,9 @@
 
        mutex_init(&xbdi->xbdi_lock, MUTEX_DEFAULT, IPL_BIO);
        cv_init(&xbdi->xbdi_cv, xbdi->xbdi_name);
+       mutex_enter(&xbdback_lock);
        SLIST_INSERT_HEAD(&xbdback_instances, xbdi, next);
+       mutex_exit(&xbdback_lock);
 
        xbusd->xbusd_u.b.b_cookie = xbdi;       
        xbusd->xbusd_u.b.b_detach = xbdback_xenbus_destroy;
@@ -512,7 +517,9 @@
                    name, xbdi->xbdi_domid);
                vn_close(xbdi->xbdi_vp, FREAD, NOCRED);
        }
+       mutex_enter(&xbdback_lock);
        SLIST_REMOVE(&xbdback_instances, xbdi, xbdback_instance, next);
+       mutex_exit(&xbdback_lock);
        mutex_destroy(&xbdi->xbdi_lock);
        cv_destroy(&xbdi->xbdi_cv);
        kmem_free(xbdi, sizeof(*xbdi));
@@ -894,16 +901,22 @@
        cv_signal(&xbdi->xbdi_cv);
 }
 
-static struct xbdback_instance *
+static bool
 xbdif_lookup(domid_t dom , uint32_t handle)
 {
        struct xbdback_instance *xbdi;
+       bool found = false;
 
+       mutex_enter(&xbdback_lock);
        SLIST_FOREACH(xbdi, &xbdback_instances, next) {
-               if (xbdi->xbdi_domid == dom && xbdi->xbdi_handle == handle)
-                       return xbdi;
+               if (xbdi->xbdi_domid == dom && xbdi->xbdi_handle == handle) {
+                       found = true;
+                       break;
+               }
        }
-       return NULL;
+       mutex_exit(&xbdback_lock);
+
+       return found;
 }
 
 static int



Home | Main Index | Thread Index | Old Index