Magellan Linux

Annotation of /trunk/kernel26-xen/patches-2.6.25-r1/1045-2.6.25-xen-blkif-protocol-fallback-hack.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 609 - (hide annotations) (download)
Fri May 23 17:35:37 2008 UTC (16 years ago) by niro
File size: 7787 byte(s)
-using opensuse xen patchset, updated kernel configs

1 niro 609 Subject: 32-on-64 blkif protocol negotiation fallback for old guests.
2     From: kraxel@suse.de
3     References: 244055
4     Patch-mainline: never.
5    
6     See the comment below. Oh well.
7    
8     ---
9     drivers/xen/blkback/xenbus.c | 10 +--
10     drivers/xen/blktap/xenbus.c | 10 +--
11     drivers/xen/core/Makefile | 2
12     drivers/xen/core/domctl.c | 133 +++++++++++++++++++++++++++++++++++++++++++
13     drivers/xen/core/domctl.h | 2
14     5 files changed, 148 insertions(+), 9 deletions(-)
15    
16     Index: head-2007-10-15/drivers/xen/blkback/xenbus.c
17     ===================================================================
18     --- head-2007-10-15.orig/drivers/xen/blkback/xenbus.c 2007-10-22 10:49:56.000000000 +0200
19     +++ head-2007-10-15/drivers/xen/blkback/xenbus.c 2007-10-22 10:50:20.000000000 +0200
20     @@ -21,6 +21,7 @@
21     #include <linux/module.h>
22     #include <linux/kthread.h>
23     #include "common.h"
24     +#include "../core/domctl.h"
25    
26     #undef DPRINTK
27     #define DPRINTK(fmt, args...) \
28     @@ -457,7 +458,6 @@ again:
29     xenbus_transaction_end(xbt, 1);
30     }
31    
32     -
33     static int connect_ring(struct backend_info *be)
34     {
35     struct xenbus_device *dev = be->dev;
36     @@ -480,8 +480,10 @@ static int connect_ring(struct backend_i
37     be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE;
38     err = xenbus_gather(XBT_NIL, dev->otherend, "protocol",
39     "%63s", protocol, NULL);
40     - if (err)
41     - strcpy(protocol, "unspecified, assuming native");
42     + if (err) {
43     + strcpy(protocol, "unspecified");
44     + be->blkif->blk_protocol = xen_guest_blkif_protocol(be->blkif->domid);
45     + }
46     else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_NATIVE))
47     be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE;
48     else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_X86_32))
49     Index: head-2007-10-15/drivers/xen/blktap/xenbus.c
50     ===================================================================
51     --- head-2007-10-15.orig/drivers/xen/blktap/xenbus.c 2007-10-22 10:50:02.000000000 +0200
52     +++ head-2007-10-15/drivers/xen/blktap/xenbus.c 2007-10-22 10:50:15.000000000 +0200
53     @@ -39,6 +39,7 @@
54     #include <linux/kthread.h>
55     #include <xen/xenbus.h>
56     #include "common.h"
57     +#include "../core/domctl.h"
58    
59    
60     struct backend_info
61     @@ -401,7 +402,6 @@ static void connect(struct backend_info
62     return;
63     }
64    
65     -
66     static int connect_ring(struct backend_info *be)
67     {
68     struct xenbus_device *dev = be->dev;
69     @@ -424,8 +424,10 @@ static int connect_ring(struct backend_i
70     be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE;
71     err = xenbus_gather(XBT_NIL, dev->otherend, "protocol",
72     "%63s", protocol, NULL);
73     - if (err)
74     - strcpy(protocol, "unspecified, assuming native");
75     + if (err) {
76     + strcpy(protocol, "unspecified");
77     + be->blkif->blk_protocol = xen_guest_blkif_protocol(be->blkif->domid);
78     + }
79     else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_NATIVE))
80     be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE;
81     else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_X86_32))
82     Index: head-2007-10-15/drivers/xen/core/Makefile
83     ===================================================================
84     --- head-2007-10-15.orig/drivers/xen/core/Makefile 2007-10-22 10:47:58.000000000 +0200
85     +++ head-2007-10-15/drivers/xen/core/Makefile 2007-10-18 16:58:11.000000000 +0200
86     @@ -2,7 +2,7 @@
87     # Makefile for the linux kernel.
88     #
89    
90     -obj-y := evtchn.o gnttab.o features.o reboot.o machine_reboot.o firmware.o
91     +obj-y := evtchn.o gnttab.o features.o reboot.o machine_reboot.o firmware.o domctl.o
92    
93     obj-$(CONFIG_PROC_FS) += xen_proc.o
94     obj-$(CONFIG_SYS_HYPERVISOR) += hypervisor_sysfs.o
95     Index: head-2007-10-15/drivers/xen/core/domctl.c
96     ===================================================================
97     --- /dev/null 1970-01-01 00:00:00.000000000 +0000
98     +++ head-2007-10-15/drivers/xen/core/domctl.c 2007-10-18 16:58:11.000000000 +0200
99     @@ -0,0 +1,133 @@
100     +/*
101     + * !!! dirty hack alert !!!
102     + *
103     + * Problem: old guests kernels don't have a "protocol" node
104     + * in the frontend xenstore directory, so mixing
105     + * 32 and 64bit domains doesn't work.
106     + *
107     + * Upstream plans to solve this in the tools, by letting them
108     + * create a protocol node. Which certainly makes sense.
109     + * But it isn't trivial and isn't done yet. Too bad.
110     + *
111     + * So for the time being we use the get_address_size domctl
112     + * hypercall for a pretty good guess. Not nice as the domctl
113     + * hypercall isn't supposed to be used by the kernel. Because
114     + * we don't want to have dependencies between dom0 kernel and
115     + * xen kernel versions. Now we have one. Ouch.
116     + */
117     +
118     +#include <linux/kernel.h>
119     +#include <linux/module.h>
120     +#include <asm/hypervisor.h>
121     +#include <xen/blkif.h>
122     +
123     +#include "domctl.h"
124     +
125     +/* stuff copied from xen/interface/domctl.h, which we can't
126     + * include directly for the reasons outlined above .... */
127     +
128     +#define XEN_DOMCTL_set_address_size 35
129     +#define XEN_DOMCTL_get_address_size 36
130     +typedef struct xen_domctl_address_size {
131     + uint32_t size;
132     +} xen_domctl_address_size_t;
133     +
134     +#define native_address_size (sizeof(unsigned long)*8)
135     +
136     +/* v4: sles10 sp1: xen 3.0.4 + 32-on-64 patches */
137     +struct xen_domctl_v4 {
138     + uint32_t cmd;
139     + uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */
140     + domid_t domain;
141     + union {
142     + /* left out lots of other struct xen_domctl_foobar */
143     + struct xen_domctl_address_size address_size;
144     + uint64_t dummy_align;
145     + uint8_t dummy_pad[128];
146     + } u;
147     +};
148     +
149     +/* v5: upstream: xen 3.0.5 */
150     +typedef __attribute__((aligned(8))) uint64_t uint64_aligned_t;
151     +struct xen_domctl_v5 {
152     + uint32_t cmd;
153     + uint32_t interface_version;
154     + domid_t domain;
155     + union {
156     + struct xen_domctl_address_size address_size;
157     + uint64_aligned_t dummy_align;
158     + uint8_t dummy_pad[128];
159     + } u;
160     +};
161     +
162     +/* The actual code comes here */
163     +
164     +static int xen_guest_address_size_v4(int domid)
165     +{
166     + struct xen_domctl_v4 domctl;
167     + int rc;
168     +
169     + memset(&domctl, 0, sizeof(domctl));
170     + domctl.cmd = XEN_DOMCTL_get_address_size;
171     + domctl.interface_version = 4;
172     + domctl.domain = domid;
173     + if (0 != (rc = _hypercall1(int, domctl, &domctl)))
174     + return rc;
175     + return domctl.u.address_size.size;
176     +}
177     +
178     +static int xen_guest_address_size_v5(int domid)
179     +{
180     + struct xen_domctl_v5 domctl;
181     + int rc;
182     +
183     + memset(&domctl, 0, sizeof(domctl));
184     + domctl.cmd = XEN_DOMCTL_get_address_size;
185     + domctl.interface_version = 5;
186     + domctl.domain = domid;
187     + if (0 != (rc = _hypercall1(int, domctl, &domctl)))
188     + return rc;
189     + return domctl.u.address_size.size;
190     +}
191     +
192     +int xen_guest_address_size(int domid)
193     +{
194     + int ret;
195     +
196     + ret = xen_guest_address_size_v4(domid);
197     + if (ret == 32 || ret == 64) {
198     + printk("%s: v4 domctl worked ok: %d\n", __FUNCTION__, ret);
199     + goto done;
200     + }
201     +
202     + ret = xen_guest_address_size_v5(domid);
203     + if (ret == 32 || ret == 64) {
204     + printk("%s: v5 domctl worked ok: %d\n", __FUNCTION__, ret);
205     + goto done;
206     + }
207     +
208     + ret = native_address_size;
209     + printk("%s: v4,v5 domctls failed, assuming native: %d\n",
210     + __FUNCTION__, ret);
211     +
212     + done:
213     + return ret;
214     +}
215     +EXPORT_SYMBOL_GPL(xen_guest_address_size);
216     +
217     +int xen_guest_blkif_protocol(int domid)
218     +{
219     + int address_size;
220     +
221     + address_size = xen_guest_address_size(domid);
222     + printk(KERN_DEBUG "%s: domain %d: got address size %d\n",
223     + __FUNCTION__, domid, address_size);
224     + if (address_size == native_address_size)
225     + return BLKIF_PROTOCOL_NATIVE;
226     + if (address_size == 32)
227     + return BLKIF_PROTOCOL_X86_32;
228     + if (address_size == 64)
229     + return BLKIF_PROTOCOL_X86_64;
230     + return BLKIF_PROTOCOL_NATIVE;
231     +}
232     +EXPORT_SYMBOL_GPL(xen_guest_blkif_protocol);
233     Index: head-2007-10-15/drivers/xen/core/domctl.h
234     ===================================================================
235     --- /dev/null 1970-01-01 00:00:00.000000000 +0000
236     +++ head-2007-10-15/drivers/xen/core/domctl.h 2007-10-18 16:58:11.000000000 +0200
237     @@ -0,0 +1,2 @@
238     +int xen_guest_address_size(int domid);
239     +int xen_guest_blkif_protocol(int domid);