Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 05 Jul 2011 21:14:09 -0700
From:      Colin Percival <cperciva@freebsd.org>
To:        gibbs@freebsd.org,  "freebsd-xen@freebsd.org" <freebsd-xen@freebsd.org>
Subject:   Re: breakage in blkfront with ring_pages > 1
Message-ID:  <4E13E111.9070005@freebsd.org>
In-Reply-To: <4E13CB8F.8000009@freebsd.org>
References:  <4DF18EE5.5090704@freebsd.org> <4DF27EFF.5060005@FreeBSD.org>	<4E13B6E9.9070202@freebsd.org> <4E13C2A4.5040202@FreeBSD.org> <4E13CB8F.8000009@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------030903070809000902080104
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit

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

--------------030903070809000902080104
Content-Type: text/x-diff;
 name="blkfront.c.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="blkfront.c.patch"

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);

--------------030903070809000902080104--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4E13E111.9070005>