Author: asomers
Date: Thu Feb 13 20:32:05 2020
New Revision: 357876
URL: https://svnweb.freebsd.org/changeset/base/357876

Log:
  MFC r355431:
  
  gmultipath: add ATF tests
  
  Add ATF tests for most gmultipath operations. Add some dtrace probes too,
  primarily for configuration changes that happen in response to provider
  errors.
  
  PR:           178473
  Sponsored by: Axcient
  Differential Revision:        https://reviews.freebsd.org/D22235

Added:
  stable/12/tests/sys/geom/class/multipath/
     - copied from r355431, head/tests/sys/geom/class/multipath/
Modified:
  stable/12/etc/mtree/BSD.tests.dist
  stable/12/sys/geom/geom_subr.c
  stable/12/sys/geom/multipath/g_multipath.c
  stable/12/tests/sys/geom/class/Makefile
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/etc/mtree/BSD.tests.dist
==============================================================================
--- stable/12/etc/mtree/BSD.tests.dist  Thu Feb 13 20:23:55 2020        
(r357875)
+++ stable/12/etc/mtree/BSD.tests.dist  Thu Feb 13 20:32:05 2020        
(r357876)
@@ -744,6 +744,8 @@
                 ..
                 mirror
                 ..
+                multipath
+                ..
                 nop
                 ..
                 part

Modified: stable/12/sys/geom/geom_subr.c
==============================================================================
--- stable/12/sys/geom/geom_subr.c      Thu Feb 13 20:23:55 2020        
(r357875)
+++ stable/12/sys/geom/geom_subr.c      Thu Feb 13 20:32:05 2020        
(r357876)
@@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/mutex.h>
 #include <sys/errno.h>
 #include <sys/sbuf.h>
+#include <sys/sdt.h>
 #include <geom/geom.h>
 #include <geom/geom_int.h>
 #include <machine/stdarg.h>
@@ -64,6 +65,8 @@ __FBSDID("$FreeBSD$");
 #ifdef KDB
 #include <sys/kdb.h>
 #endif
+
+SDT_PROVIDER_DEFINE(geom);
 
 struct class_list_head g_classes = LIST_HEAD_INITIALIZER(g_classes);
 static struct g_tailq_head geoms = TAILQ_HEAD_INITIALIZER(geoms);

Modified: stable/12/sys/geom/multipath/g_multipath.c
==============================================================================
--- stable/12/sys/geom/multipath/g_multipath.c  Thu Feb 13 20:23:55 2020        
(r357875)
+++ stable/12/sys/geom/multipath/g_multipath.c  Thu Feb 13 20:32:05 2020        
(r357876)
@@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/mutex.h>
 #include <sys/bio.h>
 #include <sys/sbuf.h>
+#include <sys/sdt.h>
 #include <sys/sysctl.h>
 #include <sys/kthread.h>
 #include <sys/malloc.h>
@@ -61,6 +62,14 @@ static u_int g_multipath_exclusive = 1;
 SYSCTL_UINT(_kern_geom_multipath, OID_AUTO, exclusive, CTLFLAG_RW,
     &g_multipath_exclusive, 0, "Exclusively open providers");
 
+SDT_PROVIDER_DECLARE(geom);
+SDT_PROBE_DEFINE2(geom, multipath, config, restore, "char*", "char*");
+SDT_PROBE_DEFINE2(geom, multipath, config, remove, "char*", "char*");
+SDT_PROBE_DEFINE2(geom, multipath, config, disconnect, "char*", "char*");
+SDT_PROBE_DEFINE3(geom, multipath, config, fail, "char*", "char*", "int");
+SDT_PROBE_DEFINE2(geom, multipath, config, taste, "char*", "char*");
+SDT_PROBE_DEFINE2(geom, multipath, io, restart, "struct bio*", "struct bio*");
+
 static enum {
        GKT_NIL,
        GKT_RUN,
@@ -146,6 +155,8 @@ g_multipath_fault(struct g_consumer *cp, int cause)
                        printf("GEOM_MULTIPATH: "
                            "all paths in %s were marked FAIL, restore %s\n",
                            sc->sc_name, lcp->provider->name);
+                       SDT_PROBE2(geom, multipath, config, restore,
+                           sc->sc_name, lcp->provider->name);
                        lcp->index &= ~MP_FAIL;
                }
        }
@@ -217,6 +228,8 @@ g_mpd(void *arg, int flags __unused)
        if (cp->provider) {
                printf("GEOM_MULTIPATH: %s removed from %s\n",
                    cp->provider->name, gp->name);
+               SDT_PROBE2(geom, multipath, config, remove,
+                   gp->name, cp->provider->name);
                g_detach(cp);
        }
        g_destroy_consumer(cp);
@@ -234,6 +247,8 @@ g_multipath_orphan(struct g_consumer *cp)
        g_topology_assert();
        printf("GEOM_MULTIPATH: %s in %s was disconnected\n",
            cp->provider->name, cp->geom->name);
+       SDT_PROBE2(geom, multipath, config, disconnect,
+           cp->geom->name, cp->provider->name);
        sc = cp->geom->softc;
        cnt = (uintptr_t *)&cp->private;
        mtx_lock(&sc->sc_mtx);
@@ -411,6 +426,8 @@ g_multipath_done_error(struct bio *bp)
        if ((cp->index & MP_FAIL) == 0) {
                printf("GEOM_MULTIPATH: Error %d, %s in %s marked FAIL\n",
                    bp->bio_error, pp->name, sc->sc_name);
+               SDT_PROBE3(geom, multipath, config, fail,
+                   sc->sc_name, pp->name, bp->bio_error);
                g_multipath_fault(cp, MP_FAIL);
        }
        (*cnt)--;
@@ -426,6 +443,7 @@ g_multipath_done_error(struct bio *bp)
         */
        if (pbp->bio_children < (uintptr_t)pbp->bio_driver1) {
                pbp->bio_inbed++;
+               SDT_PROBE2(geom, multipath, io, restart, bp, pbp);
                g_destroy_bio(bp);
                g_multipath_start(pbp);
        } else {
@@ -831,6 +849,7 @@ g_multipath_taste(struct g_class *mp, struct g_provide
                return (NULL);
        if (g_multipath_debug)
                printf("MULTIPATH: %s/%s\n", md.md_name, md.md_uuid);
+       SDT_PROBE2(geom, multipath, config, taste, md.md_name, md.md_uuid);
 
        /*
         * Let's check if such a device already is present. We check against
@@ -1230,8 +1249,12 @@ g_multipath_ctl_fail(struct gctl_req *req, struct g_cl
                                name, sc->sc_name, fail ? "FAIL" : "OK");
                        if (fail) {
                                g_multipath_fault(cp, MP_FAIL);
+                               SDT_PROBE3(geom, multipath, config, fail,
+                                   sc->sc_name, cp->provider->name, 0);
                        } else {
                                cp->index &= ~MP_FAIL;
+                               SDT_PROBE2(geom, multipath, config, restore,
+                                   sc->sc_name, cp->provider->name);
                        }
                }
        }
@@ -1277,6 +1300,8 @@ g_multipath_ctl_remove(struct gctl_req *req, struct g_
                        found = 1;
                        printf("GEOM_MULTIPATH: removing %s from %s\n",
                            cp->provider->name, cp->geom->name);
+                       SDT_PROBE2(geom, multipath, config, remove,
+                           cp->geom->name, cp->provider->name);
                        sc->sc_ndisks--;
                        g_multipath_fault(cp, MP_LOST);
                        cnt = (uintptr_t *)&cp->private;

Modified: stable/12/tests/sys/geom/class/Makefile
==============================================================================
--- stable/12/tests/sys/geom/class/Makefile     Thu Feb 13 20:23:55 2020        
(r357875)
+++ stable/12/tests/sys/geom/class/Makefile     Thu Feb 13 20:32:05 2020        
(r357876)
@@ -8,6 +8,7 @@ TESTS_SUBDIRS+= concat
 TESTS_SUBDIRS+=        eli
 TESTS_SUBDIRS+=        gate
 TESTS_SUBDIRS+=        mirror
+TESTS_SUBDIRS+=        multipath
 TESTS_SUBDIRS+=        nop
 TESTS_SUBDIRS+=        part
 TESTS_SUBDIRS+=        raid3
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to