Current-Users archive

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

Re: arcmsr(4) - tester(s) needed



On Sun, 5 Jun 2011, Paul Goyette wrote:

As a follow-up to my commit yesterday[*], I've made some changes to the arcmsr(4) driver, to avoid (mis)using some fields in the sensors' data structures. Before I commit these changes, I would appreciate it if
someone with the requisite hardware could actually test the attached
patch!

[*] http://mail-index.netbsd.org/source-changes/2011/06/04/msg022865.html


If anyone is planning to test this for me, please use the revised patch attached to this Email. The earlier patch was incomplete and is likely to cause all sorts of problems.

Thanks!


-------------------------------------------------------------------------
| Paul Goyette     | PGP Key fingerprint:     | E-mail addresses:       |
| Customer Service | FA29 0E3B 35AF E8AE 6651 | paul at whooppee.com    |
| Network Engineer | 0786 F758 55DE 53BA 7731 | pgoyette at juniper.net |
| Kernel Developer |                          | pgoyette at netbsd.org  |
-------------------------------------------------------------------------
Index: arcmsr.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/arcmsr.c,v
retrieving revision 1.27
diff -u -p -r1.27 arcmsr.c
--- arcmsr.c    4 Jun 2011 13:25:56 -0000       1.27
+++ arcmsr.c    9 Jun 2011 12:20:17 -0000
@@ -1735,8 +1735,8 @@ arc_create_sensors(void *arg)
                kthread_exit(0);
 
        sc->sc_sme = sysmon_envsys_create();
-       slen = sizeof(envsys_data_t) * sc->sc_nsensors;
-       sc->sc_sensors = kmem_zalloc(slen, KM_SLEEP);
+       slen = sizeof(arc_edata_t) * sc->sc_nsensors;
+       sc->sc_arc_sensors = kmem_zalloc(slen, KM_SLEEP);
 
        /* Attach sensors for volumes and disks */
        for (i = 0; i < bi.bi_novol; i++) {
@@ -1745,44 +1745,47 @@ arc_create_sensors(void *arg)
                if (arc_bio_vol(sc, &bv) != 0)
                        goto bad;
 
-               sc->sc_sensors[count].units = ENVSYS_DRIVE;
-               sc->sc_sensors[count].flags = ENVSYS_FMONSTCHANGED;
+               sc->sc_arc_sensors[count].arc_sensor.units = ENVSYS_DRIVE;
+               sc->sc_arc_sensors[count].arc_sensor.flags =
+                   ENVSYS_FMONSTCHANGED;
 
                /* Skip passthrough volumes */          
                if (bv.bv_level == BIOC_SVOL_PASSTHRU)
                        continue;
 
                if (bv.bv_level == BIOC_SVOL_RAID10)
-                       snprintf(sc->sc_sensors[count].desc,
-                           sizeof(sc->sc_sensors[count].desc),
+                       snprintf(sc->sc_arc_sensors[count].arc_sensor.desc,
+                           sizeof(sc->sc_arc_sensors[count].arc_sensor.desc),
                            "RAID 1+0 volume%d (%s)", i, bv.bv_dev);
                else
-                       snprintf(sc->sc_sensors[count].desc,
-                           sizeof(sc->sc_sensors[count].desc),
+                       snprintf(sc->sc_arc_sensors[count].arc_sensor.desc,
+                           sizeof(sc->sc_arc_sensors[count].arc_sensor.desc),
                            "RAID %d volume%d (%s)", bv.bv_level, i,
                            bv.bv_dev);
 
-               sc->sc_sensors[count].value_max = i;
+               sc->sc_arc_sensors[count].arc_sensor.arc_volid = i;
 
                if (sysmon_envsys_sensor_attach(sc->sc_sme,
-                   &sc->sc_sensors[count]))
+                   &sc->sc_arc_sensors[count].arc_sensor))
                        goto bad;
 
                count++;
 
                /* Attach disk sensors for this volume */
                for (j = 0; j < bv.bv_nodisk; j++) {
-                       sc->sc_sensors[count].units = ENVSYS_DRIVE;
-                       sc->sc_sensors[count].flags = ENVSYS_FMONSTCHANGED;
+                       sc->sc_arc_sensors[count].arc_sensor.units =
+                           ENVSYS_DRIVE;
+                       sc->sc_arc_sensors[count].arc_sensor.flags =
+                           ENVSYS_FMONSTCHANGED;
 
-                       snprintf(sc->sc_sensors[count].desc,
-                           sizeof(sc->sc_sensors[count].desc),
+                       snprintf(sc->sc_arc_sensors[count].arc_sensor.desc,
+                           sizeof(sc->sc_arc_sensors[count].arc_sensor.desc),
                            "disk%d volume%d (%s)", j, i, bv.bv_dev);
-                       sc->sc_sensors[count].value_max = i;
-                       sc->sc_sensors[count].private = j + 10;
+                       sc->sc_arc_sensors[count].arc_volid = i;
+                       sc->sc_arc_sensors[count].arc_diskid = j + 10;
 
                        if (sysmon_envsys_sensor_attach(sc->sc_sme,
-                           &sc->sc_sensors[count]))
+                           &sc->sc_arc_sensors[count].arc_sensor))
                                goto bad;
 
                        count++;
@@ -1806,10 +1809,10 @@ arc_create_sensors(void *arg)
 
 bad:
        sysmon_envsys_destroy(sc->sc_sme);
-       kmem_free(sc->sc_sensors, slen);
+       kmem_free(sc->sc_arc_sensors, slen);
 
        sc->sc_sme = NULL;
-       sc->sc_sensors = NULL;
+       sc->sc_arc_sensors = NULL;
 
        kthread_exit(0);
 }
@@ -1820,13 +1823,14 @@ arc_refresh_sensors(struct sysmon_envsys
        struct arc_softc        *sc = sme->sme_cookie;
        struct bioc_vol         bv;
        struct bioc_disk        bd;
+       arc_edata_t             *arcdata = (arc_edata_t *)edata;
 
        /* sanity check */
        if (edata->units != ENVSYS_DRIVE)
                return;
 
        memset(&bv, 0, sizeof(bv));
-       bv.bv_volid = edata->value_max;
+       bv.bv_volid = arcdata->arc_volid;
 
        if (arc_bio_vol(sc, &bv)) {
                edata->value_cur = ENVSYS_DRIVE_EMPTY;
@@ -1835,10 +1839,10 @@ arc_refresh_sensors(struct sysmon_envsys
        }
 
        /* Current sensor is handling a disk volume member */
-       if (edata->private) {
+       if (arcdata->arc_diskid) {
                memset(&bd, 0, sizeof(bd));
-               bd.bd_volid = edata->value_max;
-               bd.bd_diskid = edata->private - 10;
+               bd.bd_volid = arcdata->arc_volid;
+               bd.bd_diskid = arcdata->arc_diskid - 10;
 
                if (arc_bio_disk_volume(sc, &bd)) {
                        edata->value_cur = ENVSYS_DRIVE_OFFLINE;
Index: arcmsrvar.h
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/arcmsrvar.h,v
retrieving revision 1.13
diff -u -p -r1.13 arcmsrvar.h
--- arcmsrvar.h 23 Sep 2008 22:22:41 -0000      1.13
+++ arcmsrvar.h 9 Jun 2011 12:20:17 -0000
@@ -407,6 +407,12 @@ struct arc_fw_sysinfo {
 struct arc_ccb;
 TAILQ_HEAD(arc_ccb_list, arc_ccb);
 
+typedef struct arc_edata {
+       envsys_data_t   arc_sensor;
+       int             arc_diskid;
+       int             arc_volid;
+} arc_edata_t;
+
 struct arc_softc {
        struct scsipi_channel   sc_chan;
        struct scsipi_adapter   sc_adapter;
@@ -434,7 +440,7 @@ struct arc_softc {
        krwlock_t               sc_rwlock;
 
        struct sysmon_envsys    *sc_sme;
-       envsys_data_t           *sc_sensors;
+       arc_edata_t             *sc_arc_sensors;
        int                     sc_nsensors;
 
        size_t                  sc_maxraidset;  /* max raid sets */


Home | Main Index | Thread Index | Old Index