Module Name:    src
Committed By:   jdolecek
Date:           Fri Apr 10 10:30:10 UTC 2020

Modified Files:
        src/sys/arch/xen/xen: xbd_xenbus.c

Log Message:
implement DIOCGCACHE - assume if CACHE_FLUSH is supported, write cache
is enabled

convert the sc_cache_flush flag to a feature bit field, and recognize
also barrier and persistent features; print the recognized features
on boot, and remove the warning on DIOCCACHESYNC


To generate a diff of this commit:
cvs rdiff -u -r1.97 -r1.98 src/sys/arch/xen/xen/xbd_xenbus.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/xen/xen/xbd_xenbus.c
diff -u src/sys/arch/xen/xen/xbd_xenbus.c:1.97 src/sys/arch/xen/xen/xbd_xenbus.c:1.98
--- src/sys/arch/xen/xen/xbd_xenbus.c:1.97	Tue Apr  7 11:47:06 2020
+++ src/sys/arch/xen/xen/xbd_xenbus.c	Fri Apr 10 10:30:10 2020
@@ -1,4 +1,4 @@
-/*      $NetBSD: xbd_xenbus.c,v 1.97 2020/04/07 11:47:06 jdolecek Exp $      */
+/*      $NetBSD: xbd_xenbus.c,v 1.98 2020/04/10 10:30:10 jdolecek Exp $      */
 
 /*
  * Copyright (c) 2006 Manuel Bouyer.
@@ -50,7 +50,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: xbd_xenbus.c,v 1.97 2020/04/07 11:47:06 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: xbd_xenbus.c,v 1.98 2020/04/10 10:30:10 jdolecek Exp $");
 
 #include "opt_xen.h"
 
@@ -150,7 +150,12 @@ struct xbd_xenbus_softc {
 	uint64_t sc_xbdsize; /* size of disk in DEV_BSIZE */
 	u_long sc_info; /* VDISK_* */
 	u_long sc_handle; /* from backend */
-	int sc_cache_flush; /* backend supports BLKIF_OP_FLUSH_DISKCACHE */
+	int sc_features;
+#define BLKIF_FEATURE_CACHE_FLUSH	0x1
+#define BLKIF_FEATURE_BARRIER		0x2
+#define BLKIF_FEATURE_PERSISTENT	0x4
+#define BLKIF_FEATURE_BITS		\
+	"\20\1CACHE-FLUSH\2BARRIER\3PERSISTENT"
 	struct evcnt sc_cnt_map_unalign;
 };
 
@@ -509,7 +514,7 @@ xbd_backend_changed(void *arg, XenbusSta
 	struct xbd_xenbus_softc *sc = device_private((device_t)arg);
 	struct disk_geom *dg;
 
-	char buf[9];
+	char buf[32];
 	int s;
 	DPRINTF(("%s: new backend state %d\n",
 	    device_xname(sc->sc_dksc.sc_dev), new_state));
@@ -569,6 +574,9 @@ xbd_backend_changed(void *arg, XenbusSta
 		aprint_normal_dev(sc->sc_dksc.sc_dev,
 				"%s, %d bytes/sect x %" PRIu64 " sectors\n",
 				buf, (int)dg->dg_secsize, sc->sc_xbdsize);
+		snprintb(buf, sizeof(buf), BLKIF_FEATURE_BITS,
+		    sc->sc_features);
+		aprint_normal_dev(sc->sc_dksc.sc_dev, "features %s\n", buf);
 
 		/* Discover wedges on this disk. */
 		dkwedge_discover(&sc->sc_dksc.sc_dkdev);
@@ -588,7 +596,7 @@ xbd_connect(struct xbd_xenbus_softc *sc)
 {
 	int err;
 	unsigned long long sectors;
-	u_long cache_flush;
+	u_long val;
 
 	err = xenbus_read_ul(NULL,
 	    sc->sc_xbusd->xbusd_path, "virtual-device", &sc->sc_handle, 10);
@@ -618,13 +626,25 @@ xbd_connect(struct xbd_xenbus_softc *sc)
 		    sc->sc_xbusd->xbusd_otherend);
 
 	err = xenbus_read_ul(NULL, sc->sc_xbusd->xbusd_otherend,
-	    "feature-flush-cache", &cache_flush, 10);
+	    "feature-flush-cache", &val, 10);
 	if (err)
-		cache_flush = 0;
-	if (cache_flush > 0)
-		sc->sc_cache_flush = 1;
-	else
-		sc->sc_cache_flush = 0;
+		val = 0;
+	if (val > 0)
+		sc->sc_features |= BLKIF_FEATURE_CACHE_FLUSH;
+
+	err = xenbus_read_ul(NULL, sc->sc_xbusd->xbusd_otherend,
+	    "feature-barrier", &val, 10);
+	if (err)
+		val = 0;
+	if (val > 0)
+		sc->sc_features |= BLKIF_FEATURE_BARRIER;
+
+	err = xenbus_read_ul(NULL, sc->sc_xbusd->xbusd_otherend,
+	    "feature-persistent", &val, 10);
+	if (err)
+		val = 0;
+	if (val > 0)
+		sc->sc_features |= BLKIF_FEATURE_PERSISTENT;
 
 	xenbus_switch_state(sc->sc_xbusd, NULL, XenbusStateConnected);
 }
@@ -834,16 +854,22 @@ xbdioctl(dev_t dev, u_long cmd, void *da
 	case DIOCSSTRATEGY:
 		error = EOPNOTSUPP;
 		break;
+	case DIOCGCACHE:
+	    {
+		/*
+		 * Assume there is read & write cache if cache-flush is
+		 * supported.
+		 */
+		int *bitsp = (int *)data;
+		*bitsp = 0;
+		if (sc->sc_features & BLKIF_FEATURE_CACHE_FLUSH)
+			*bitsp |= DKCACHE_WRITE;
+		error = 0;
+		break;
+	    }
 	case DIOCCACHESYNC:
-		if (sc->sc_cache_flush <= 0) {
-			if (sc->sc_cache_flush == 0) {
-				aprint_verbose_dev(sc->sc_dksc.sc_dev,
-				    "WARNING: cache flush not supported "
-				    "by backend\n");
-				sc->sc_cache_flush = -1;
-			}
+		if ((sc->sc_features & BLKIF_FEATURE_CACHE_FLUSH) == 0)
 			return EOPNOTSUPP;
-		}
 
 		s = splbio(); /* XXXSMP */
 

Reply via email to