Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/raidframe Modularize the raidframe driver, including...



details:   https://anonhg.NetBSD.org/src/rev/5f2235cde60d
branches:  trunk
changeset: 342508:5f2235cde60d
user:      pgoyette <pgoyette%NetBSD.org@localhost>
date:      Sat Dec 26 00:58:45 2015 +0000

description:
Modularize the raidframe driver, including rework of the unit attach
code to permit detaching (and possible module unloading).  Also,
convert tsleep()/wakeup() locking to use cv_wait_sig()/cv_broadcast().

Tested in non-modular, modular-builtin, and modular-loaded-at-runtime
environments.

diffstat:

 sys/dev/raidframe/rf_driver.c      |   25 +-
 sys/dev/raidframe/rf_driver.h      |    4 +-
 sys/dev/raidframe/rf_netbsdkintf.c |  289 +++++++++++++++++++++++++++++-------
 3 files changed, 251 insertions(+), 67 deletions(-)

diffs (truncated from 601 to 300 lines):

diff -r 4d95e8820a58 -r 5f2235cde60d sys/dev/raidframe/rf_driver.c
--- a/sys/dev/raidframe/rf_driver.c     Fri Dec 25 18:50:48 2015 +0000
+++ b/sys/dev/raidframe/rf_driver.c     Sat Dec 26 00:58:45 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rf_driver.c,v 1.131 2012/12/10 08:36:03 msaitoh Exp $  */
+/*     $NetBSD: rf_driver.c,v 1.132 2015/12/26 00:58:45 pgoyette Exp $ */
 /*-
  * Copyright (c) 1999 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -66,7 +66,7 @@
 
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_driver.c,v 1.131 2012/12/10 08:36:03 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_driver.c,v 1.132 2015/12/26 00:58:45 pgoyette Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_raid_diagnostic.h"
@@ -158,16 +158,21 @@
 
 /* called at system boot time */
 int
-rf_BootRaidframe(void)
+rf_BootRaidframe(bool boot)
 {
 
-       if (raidframe_booted)
-               return (EBUSY);
-       raidframe_booted = 1;
-       rf_init_mutex2(configureMutex, IPL_NONE);
-       configureCount = 0;
-       isconfigged = 0;
-       globalShutdown = NULL;
+       if (boot) {
+               if (raidframe_booted)
+                       return (EBUSY);
+               raidframe_booted = 1;
+               rf_init_mutex2(configureMutex, IPL_NONE);
+               configureCount = 0;
+               isconfigged = 0;
+               globalShutdown = NULL;
+       } else {
+               rf_destroy_mutex2(configureMutex);
+               raidframe_booted = 0;
+       }
        return (0);
 }
 
diff -r 4d95e8820a58 -r 5f2235cde60d sys/dev/raidframe/rf_driver.h
--- a/sys/dev/raidframe/rf_driver.h     Fri Dec 25 18:50:48 2015 +0000
+++ b/sys/dev/raidframe/rf_driver.h     Sat Dec 26 00:58:45 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rf_driver.h,v 1.19 2011/04/30 01:44:36 mrg Exp $       */
+/*     $NetBSD: rf_driver.h,v 1.20 2015/12/26 00:58:45 pgoyette Exp $  */
 /*
  * rf_driver.h
  */
@@ -42,7 +42,7 @@
 #endif
 
 extern rf_declare_mutex2(rf_printf_mutex);
-int rf_BootRaidframe(void);
+int rf_BootRaidframe(bool);
 int rf_UnbootRaidframe(void);
 int rf_Shutdown(RF_Raid_t *);
 int rf_Configure(RF_Raid_t *, RF_Config_t *, RF_AutoConfig_t *);
diff -r 4d95e8820a58 -r 5f2235cde60d sys/dev/raidframe/rf_netbsdkintf.c
--- a/sys/dev/raidframe/rf_netbsdkintf.c        Fri Dec 25 18:50:48 2015 +0000
+++ b/sys/dev/raidframe/rf_netbsdkintf.c        Sat Dec 26 00:58:45 2015 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: rf_netbsdkintf.c,v 1.326 2015/12/08 20:36:15 christos Exp $    */
+/*     $NetBSD: rf_netbsdkintf.c,v 1.327 2015/12/26 00:58:45 pgoyette Exp $    */
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2008-2011 The NetBSD Foundation, Inc.
@@ -101,7 +101,7 @@
  ***********************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.326 2015/12/08 20:36:15 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.327 2015/12/26 00:58:45 pgoyette Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -126,6 +126,7 @@
 #include <sys/bufq.h>
 #include <sys/reboot.h>
 #include <sys/kauth.h>
+#include <sys/module.h>
 
 #include <prop/proplib.h>
 
@@ -241,6 +242,8 @@
        int     sc_unit;
        int     sc_flags;       /* flags */
        int     sc_cflags;      /* configuration flags */
+       kmutex_t sc_mutex;      /* interlock mutex */
+       kcondvar_t sc_cv;       /* and the condvar */
        uint64_t sc_size;       /* size of the raid device */
        char    sc_xname[20];   /* XXX external name */
        struct disk sc_dkdev;   /* generic disk device info */
@@ -350,17 +353,21 @@
        }
        sc->sc_unit = unit;
        bufq_alloc(&sc->buf_queue, "fcfs", BUFQ_SORT_RAWBLOCK);
+       cv_init(&sc->sc_cv, "raidunit");
+       mutex_init(&sc->sc_mutex, MUTEX_DEFAULT, IPL_NONE);
        return sc;
 }
 
 static void
 raiddestroy(struct raid_softc *sc) {
+       cv_destroy(&sc->sc_cv);
+       mutex_destroy(&sc->sc_mutex);
        bufq_free(sc->buf_queue);
        kmem_free(sc, sizeof(*sc));
 }
 
 static struct raid_softc *
-raidget(int unit) {
+raidget(int unit, bool create) {
        struct raid_softc *sc;
        if (unit < 0) {
 #ifdef DIAGNOSTIC
@@ -376,6 +383,8 @@
                }
        }
        mutex_exit(&raid_lock);
+       if (!create)
+               return NULL;
        if ((sc = raidcreate(unit)) == NULL)
                return NULL;
        mutex_enter(&raid_lock);
@@ -395,34 +404,11 @@
 void
 raidattach(int num)
 {
-       mutex_init(&raid_lock, MUTEX_DEFAULT, IPL_NONE);
-       /* This is where all the initialization stuff gets done. */
-
-#if (RF_INCLUDE_PARITY_DECLUSTERING_DS > 0)
-       rf_init_mutex2(rf_sparet_wait_mutex, IPL_VM);
-       rf_init_cond2(rf_sparet_wait_cv, "sparetw");
-       rf_init_cond2(rf_sparet_resp_cv, "rfgst");
-
-       rf_sparet_wait_queue = rf_sparet_resp_queue = NULL;
-#endif
-
-       if (rf_BootRaidframe() == 0)
-               aprint_verbose("Kernelized RAIDframe activated\n");
-       else
-               panic("Serious error booting RAID!!");
-
-       if (config_cfattach_attach(raid_cd.cd_name, &raid_ca)) {
-               aprint_error("raidattach: config_cfattach_attach failed?\n");
-       }
-
-       raidautoconfigdone = false;
 
        /*
-        * Register a finalizer which will be used to auto-config RAID
-        * sets once all real hardware devices have been found.
+        * Device attachment and associated initialization now occurs
+        * as part of the module initialization.
         */
-       if (config_finalize_register(NULL, rf_autoconfig) != 0)
-               aprint_error("WARNING: unable to register RAIDframe finalizer\n");
 }
 
 int
@@ -606,7 +592,7 @@
        int     part, unit, omask, size;
 
        unit = raidunit(dev);
-       if ((rs = raidget(unit)) == NULL)
+       if ((rs = raidget(unit, false)) == NULL)
                return -1;
        if ((rs->sc_flags & RAIDF_INITED) == 0)
                return (-1);
@@ -643,7 +629,7 @@
        int     part, c, sparecol, j, scol, dumpto;
        int     error = 0;
 
-       if ((rs = raidget(unit)) == NULL)
+       if ((rs = raidget(unit, false)) == NULL)
                return ENXIO;
 
        raidPtr = &rs->sc_r;
@@ -656,7 +642,6 @@
            raidPtr->Layout.numParityCol != 1)
                return EINVAL;
 
-
        if ((error = raidlock(rs)) != 0)
                return error;
 
@@ -779,7 +764,7 @@
        int     part, pmask;
        int     error = 0;
 
-       if ((rs = raidget(unit)) == NULL)
+       if ((rs = raidget(unit, true)) == NULL)
                return ENXIO;
        if ((error = raidlock(rs)) != 0)
                return (error);
@@ -863,7 +848,7 @@
        int     error = 0;
        int     part;
 
-       if ((rs = raidget(unit)) == NULL)
+       if ((rs = raidget(unit, false)) == NULL)
                return ENXIO;
 
        if ((error = raidlock(rs)) != 0)
@@ -893,15 +878,31 @@
 
                rf_update_component_labels(&rs->sc_r,
                                                 RF_FINAL_COMPONENT_UPDATE);
-
-               /* If the kernel is shutting down, it will detach
-                * this RAID set soon enough.
+       }
+       if ((rs->sc_dkdev.dk_openmask == 0) &&
+           ((rs->sc_flags & RAIDF_SHUTDOWN) != 0)) {
+               /*
+                * Detach this raid unit
                 */
+               cfdata_t cf = NULL;
+               int retcode = 0;
+
+               if (rs->sc_dev != NULL) {
+                       cf = device_cfdata(rs->sc_dev);
+
+                       raidunlock(rs);
+                       retcode = config_detach(rs->sc_dev, DETACH_QUIET);
+                       if (retcode == 0)
+                               /* free the pseudo device attach bits */
+                               free(cf, M_RAIDFRAME);
+               } else {
+                       raidput(rs);
+               }
+               return retcode;
        }
 
        raidunlock(rs);
        return (0);
-
 }
 
 static void
@@ -912,7 +913,7 @@
        int     wlabel;
        struct raid_softc *rs;
 
-       if ((rs = raidget(unit)) == NULL) {
+       if ((rs = raidget(unit, false)) == NULL) {
                bp->b_error = ENXIO;
                goto done;
        }
@@ -982,7 +983,7 @@
        int     unit = raidunit(dev);
        struct raid_softc *rs;
 
-       if ((rs = raidget(unit)) == NULL)
+       if ((rs = raidget(unit, false)) == NULL)
                return ENXIO;
 
        if ((rs->sc_flags & RAIDF_INITED) == 0)
@@ -999,7 +1000,7 @@
        int     unit = raidunit(dev);
        struct raid_softc *rs;
 
-       if ((rs = raidget(unit)) == NULL)
+       if ((rs = raidget(unit, false)) == NULL)
                return ENXIO;
 
        if ((rs->sc_flags & RAIDF_INITED) == 0)
@@ -1036,6 +1037,9 @@
        disk_detach(&rs->sc_dkdev);
        disk_destroy(&rs->sc_dkdev);
 
+       /* Free the softc */
+       raidput(rs);
+
        aprint_normal_dev(rs->sc_dev, "detached\n");
 
        return 0;
@@ -1070,7 +1074,7 @@
        struct disklabel newlabel;
 #endif
 
-       if ((rs = raidget(unit)) == NULL)
+       if ((rs = raidget(unit, false)) == NULL)
                return ENXIO;
        raidPtr = &rs->sc_r;
 
@@ -1190,23 +1194,27 @@
                        RF_Free(k_cfg, sizeof(RF_Config_t));
                        db1_printf(("rf_ioctl: retcode=%d copyin.1\n",
                                retcode));



Home | Main Index | Thread Index | Old Index