Author: scottl
Date: Fri Aug  9 01:09:02 2013
New Revision: 254116
URL: http://svnweb.freebsd.org/changeset/base/254116

Log:
  Sometimes a device misbehaves so badly that it disrupts the entire system.
  Add a tunable that allows such a device to be excluded from the driver.
  The id parameter is the target id that the driver assigns to a given device.
  
  dev.mps.X.exclude_ids=<id>,<id>
  
  Obtained from:        Netflix
  MFC after:    3 days

Modified:
  head/sys/dev/mps/mps.c
  head/sys/dev/mps/mps_sas.c
  head/sys/dev/mps/mps_sas.h
  head/sys/dev/mps/mps_sas_lsi.c
  head/sys/dev/mps/mpsvar.h

Modified: head/sys/dev/mps/mps.c
==============================================================================
--- head/sys/dev/mps/mps.c      Fri Aug  9 01:04:44 2013        (r254115)
+++ head/sys/dev/mps/mps.c      Fri Aug  9 01:09:02 2013        (r254116)
@@ -1371,6 +1371,11 @@ mps_get_tunables(struct mps_softc *sc)
        snprintf(tmpstr, sizeof(tmpstr), "dev.mps.%d.max_chains",
            device_get_unit(sc->mps_dev));
        TUNABLE_INT_FETCH(tmpstr, &sc->max_chains);
+
+       bzero(sc->exclude_ids, sizeof(sc->exclude_ids));
+       snprintf(tmpstr, sizeof(tmpstr), "dev.mps.%d.exclude_ids",
+           device_get_unit(sc->mps_dev));
+       TUNABLE_STR_FETCH(tmpstr, sc->exclude_ids, sizeof(sc->exclude_ids));
 }
 
 static void

Modified: head/sys/dev/mps/mps_sas.c
==============================================================================
--- head/sys/dev/mps/mps_sas.c  Fri Aug  9 01:04:44 2013        (r254115)
+++ head/sys/dev/mps/mps_sas.c  Fri Aug  9 01:09:02 2013        (r254116)
@@ -3553,3 +3553,20 @@ mpssas_portenable_complete(struct mps_so
        xpt_release_simq(sassc->sim, 1);
 }
 
+int
+mpssas_check_id(struct mpssas_softc *sassc, int id)
+{
+       struct mps_softc *sc = sassc->sc;
+       char *ids;
+       char *name;
+
+       ids = &sc->exclude_ids[0];
+       while((name = strsep(&ids, ",")) != NULL) {
+               if (name[0] == '\0')
+                       continue;
+               if (strtol(name, NULL, 0) == (long)id)
+                       return (1);
+       }
+
+       return (0);
+}

Modified: head/sys/dev/mps/mps_sas.h
==============================================================================
--- head/sys/dev/mps/mps_sas.h  Fri Aug  9 01:04:44 2013        (r254115)
+++ head/sys/dev/mps/mps_sas.h  Fri Aug  9 01:09:02 2013        (r254116)
@@ -158,3 +158,4 @@ void mpssas_startup_decrement(struct mps
 struct mps_command * mpssas_alloc_tm(struct mps_softc *sc);
 void mpssas_free_tm(struct mps_softc *sc, struct mps_command *tm);
 void mpssas_firmware_event_work(void *arg, int pending);
+int mpssas_check_id(struct mpssas_softc *sassc, int id);

Modified: head/sys/dev/mps/mps_sas_lsi.c
==============================================================================
--- head/sys/dev/mps/mps_sas_lsi.c      Fri Aug  9 01:04:44 2013        
(r254115)
+++ head/sys/dev/mps/mps_sas_lsi.c      Fri Aug  9 01:09:02 2013        
(r254116)
@@ -669,6 +669,13 @@ mpssas_add_device(struct mps_softc *sc, 
                error = ENXIO;
                goto out;
        }
+
+       if (mpssas_check_id(sassc, id) != 0) {
+               device_printf(sc->mps_dev, "Excluding target id %d\n", id);
+               error = ENXIO;
+               goto out;
+       }
+
        mps_dprint(sc, MPS_MAPPING, "SAS Address from SAS device page0 = %jx\n",
            sas_address);
        targ = &sassc->targets[id];

Modified: head/sys/dev/mps/mpsvar.h
==============================================================================
--- head/sys/dev/mps/mpsvar.h   Fri Aug  9 01:04:44 2013        (r254115)
+++ head/sys/dev/mps/mpsvar.h   Fri Aug  9 01:09:02 2013        (r254116)
@@ -414,6 +414,8 @@ struct mps_softc {
        uint16_t                        DD_block_exponent;
        uint64_t                        DD_max_lba;
        struct mps_column_map           DD_column_map[MPS_MAX_DISKS_IN_VOL];
+
+       char                            exclude_ids[80];
 };
 
 struct mps_config_params {
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to