On 07/05/11 19:42, Colin Percival wrote:
> On 07/05/11 19:04, Justin T. Gibbs wrote:
>>  On 7/5/11 7:14 PM, Colin Percival wrote:
>>> Maybe the right option is to have a loader tunable dev.xn.linuxback to
>>> control which version of the protocol is used?
>>
>> What a mess.
> 
> Yep.  Mess or not, shall I go ahead with having a loader tunable control this,
> or can you think of a better solution?

Does anyone object to the attached patch?  It keeps the differing behaviour to
a minimum -- we MUST set ring-ref with a FreeBSD blkback, and we MUST NOT set
it with a linux blkback -- but otherwise errs in the direction of setting more
variables than are needed, to maximize the possibility of a future blkback
being compatible with both blkback_is_linux=0 and blkback_is_linux=1.

-- 
Colin Percival
Security Officer, FreeBSD | freebsd.org | The power to serve
Founder / author, Tarsnap | tarsnap.com | Online backups for the truly paranoid
Index: sys/dev/xen/blkfront/blkfront.c
===================================================================
--- sys/dev/xen/blkfront/blkfront.c	(revision 223815)
+++ sys/dev/xen/blkfront/blkfront.c	(working copy)
@@ -616,7 +616,16 @@
 	if (setup_blkring(sc) != 0)
 		return;
 
+	/* Different backends use different names for this variable. */
 	error = xs_printf(XST_NIL, node_path,
+			 "num-ring-pages","%u", sc->ring_pages);
+	if (error) {
+		xenbus_dev_fatal(sc->xb_dev, error,
+				 "writing %s/num-ring-pages",
+				 node_path);
+		return;
+	}
+	error = xs_printf(XST_NIL, node_path,
 			 "ring-pages","%u", sc->ring_pages);
 	if (error) {
 		xenbus_dev_fatal(sc->xb_dev, error,
@@ -673,6 +682,9 @@
 	xenbus_set_state(sc->xb_dev, XenbusStateInitialised);
 }
 
+static int blkback_is_linux = 0;
+TUNABLE_INT("dev.xbd.blkback_is_linux", &blkback_is_linux);
+
 static int 
 setup_blkring(struct xb_softc *sc)
 {
@@ -702,14 +714,16 @@
 			return (error);
 		}
 	}
-	error = xs_printf(XST_NIL, xenbus_get_node(sc->xb_dev),
-			  "ring-ref","%u", sc->ring_ref[0]);
-	if (error) {
-		xenbus_dev_fatal(sc->xb_dev, error, "writing %s/ring-ref",
-				 xenbus_get_node(sc->xb_dev));
-		return (error);
+	if (!blkback_is_linux || sc->ring_pages == 1) {
+		error = xs_printf(XST_NIL, xenbus_get_node(sc->xb_dev),
+				  "ring-ref","%u", sc->ring_ref[0]);
+		if (error) {
+			xenbus_dev_fatal(sc->xb_dev, error, "writing %s/ring-ref",
+					 xenbus_get_node(sc->xb_dev));
+			return (error);
+		}
 	}
-	for (i = 1; i < sc->ring_pages; i++) {
+	for (i = 0; i < sc->ring_pages; i++) {
 		char ring_ref_name[]= "ring_refXX";
 
 		snprintf(ring_ref_name, sizeof(ring_ref_name), "ring-ref%u", i);
_______________________________________________
freebsd-xen@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-xen
To unsubscribe, send any mail to "freebsd-xen-unsubscr...@freebsd.org"

Reply via email to