kern/189788: [patch] add kern.geom.disk.%s.activity_led to attach a LED to display disk activity

Keith White kwhite at uottawa.ca
Wed May 14 00:00:01 UTC 2014


>Number:         189788
>Category:       kern
>Synopsis:       [patch] add kern.geom.disk.%s.activity_led to attach a LED to display disk activity
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Wed May 14 00:00:00 UTC 2014
>Closed-Date:
>Last-Modified:
>Originator:     Keith White
>Release:        FreeBSD 11
>Organization:
Faculty of Engineering, University of Ottawa
>Environment:
FreeBSD beaglebone 11.0-CURRENT FreeBSD 11.0-CURRENT #12 r265947M: Tue May 13 07:50:40 EDT 2014     root at beaglebone:/usr/obj/usr/src/sys/BEAGLEBONE-LOCAL  arm
>Description:
In embedded platforms (Beaglebone Black in particular) there are uncommitted LEDs that might be useful to have display "disk" activity.  The attached patch adds a kern.geom.disk.%s.activity_led SYSCTL that could be used for this purpose.

Apply the attached patch.

Add the following to your KERNCONF:

  options         GEOM_DISK_ACTIVITY_LED  # blinky lights for GEOM disk access

Add the following to /boot/loader.conf on that platform to have blinky lights for SD/MMC access:

  kern.geom.disk.mmcsd0.activity_led="led2"
  kern.geom.disk.mmcsd1.activity_led="led1"

To have the LEDs default on, and go off for any activity, prefix the LED name with bang:

  kern.geom.disk.mmcsd0.activity_led="!led2"
  kern.geom.disk.mmcsd1.activity_led="!led1"

>How-To-Repeat:
NA
>Fix:
See above.

Patch attached with submission follows:

Index: sys/conf/options
===================================================================
--- sys/conf/options	(revision 265947)
+++ sys/conf/options	(working copy)
@@ -97,6 +97,7 @@
 GEOM_BSD	opt_geom.h
 GEOM_CACHE	opt_geom.h
 GEOM_CONCAT	opt_geom.h
+GEOM_DISK_ACTIVITY_LED	opt_geom.h
 GEOM_ELI	opt_geom.h
 GEOM_FOX	opt_geom.h
 GEOM_GATE	opt_geom.h
Index: sys/geom/geom_disk.c
===================================================================
--- sys/geom/geom_disk.c	(revision 265947)
+++ sys/geom/geom_disk.c	(working copy)
@@ -57,6 +57,21 @@
 #include <geom/geom_int.h>
 
 #include <dev/led/led.h>
+#ifdef GEOM_DISK_ACTIVITY_LED
+#define ACTIVITY_LED_SET(set, negset) do { \
+	if (sc->activity_led[0] != 0) { \
+		if (sc->activity_led[0] != '!') \
+			led_set(sc->activity_led, (set)); \
+		else \
+			led_set(sc->activity_led+1, (negset)); \
+	} \
+} while (0)
+#define ACTIVITY_LED_ON		ACTIVITY_LED_SET("1", "0")
+#define ACTIVITY_LED_OFF	ACTIVITY_LED_SET("0", "1")
+#else
+#define	ACTIVITY_LED_ON
+#define	ACTIVITY_LED_OFF
+#endif
 
 struct g_disk_softc {
 	struct mtx		 done_mtx;
@@ -66,6 +81,9 @@
 	char			led[64];
 	uint32_t		state;
 	struct mtx		 start_mtx;
+#ifdef GEOM_DISK_ACTIVITY_LED
+	char			activity_led[64];
+#endif
 };
 
 static g_access_t g_disk_access;
@@ -233,6 +251,7 @@
 	} else
 		mtx_unlock(&sc->done_mtx);
 	g_destroy_bio(bp);
+	ACTIVITY_LED_OFF;
 }
 
 static void
@@ -250,6 +269,7 @@
 		mtx_lock(&sc->done_mtx);
 		devstat_end_transaction_bio_bt(sc->dp->d_devstat, bp, &now);
 		mtx_unlock(&sc->done_mtx);
+		ACTIVITY_LED_OFF;
 	}
 	g_io_deliver(bp, bp->bio_error);
 }
@@ -306,6 +326,7 @@
 			devstat_start_transaction_bio(dp->d_devstat, bp);
 			mtx_unlock(&sc->start_mtx);
 			dp->d_strategy(bp);
+			ACTIVITY_LED_ON;
 			break;
 		}
 		off = 0;
@@ -315,6 +336,7 @@
 			error = ENOMEM;
 			break;
 		}
+		ACTIVITY_LED_ON;
 		do {
 			bp2->bio_offset += off;
 			bp2->bio_length -= off;
@@ -565,6 +587,15 @@
 		    SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, "led",
 		    CTLFLAG_RW | CTLFLAG_TUN, sc->led, sizeof(sc->led),
 		    "LED name");
+#ifdef GEOM_DISK_ACTIVITY_LED
+		snprintf(tmpstr, sizeof(tmpstr),
+		    "kern.geom.disk.%s.activity_led", gp->name);
+		TUNABLE_STR_FETCH(tmpstr, sc->activity_led, sizeof(sc->activity_led));
+		SYSCTL_ADD_STRING(&sc->sysctl_ctx,
+		    SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, "activity_led",
+		    CTLFLAG_RW | CTLFLAG_TUN, sc->activity_led, sizeof(sc->activity_led),
+		    "(!)Activity LED name");
+#endif
 	}
 	pp->private = sc;
 	dp->d_geom = gp;


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list