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
[-- Attachment #1 --]
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
[-- Attachment #2 --]
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4E13E111.9070005>
