[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] xen-usb.c/usbif.h: fix ARM64 build issue



On 19/10/16 11:22, Wei Liu wrote:
> On Wed, Oct 19, 2016 at 11:09:21AM +0200, Juergen Gross wrote:
>> On 19/10/16 10:50, Wei Liu wrote:
>>> On Tue, Oct 18, 2016 at 12:09:55PM -0700, Stefano Stabellini wrote:
>>>> Hi all,
>>>>
>>>> While I was investigating the recent libxl ARM64 build issue, I found
>>>> another ARM64 build problem. This one is in QEMU:
>>>>
>>>>
>>>>   CC    hw/usb/xen-usb.o
>>>> hw/usb/xen-usb.c: In function ‘usbback_gnttab_map’:
>>>> hw/usb/xen-usb.c:163:56: error: ‘PAGE_SIZE’ undeclared (first use in this 
>>>> function)
>>>>              (unsigned)usbback_req->req.seg[i].length > PAGE_SIZE) {
>>>>                                                         ^
>>>> hw/usb/xen-usb.c:163:56: note: each undeclared identifier is reported only 
>>>> once for each function it appears in
>>>> In file included from hw/usb/xen-usb.c:36:0:
>>>> hw/usb/xen-usb.c: In function ‘usbback_alloc’:
>>>> /users/stefanos/xen/tools/../tools/include/xen/io/usbif.h:229:56: error: 
>>>> ‘PAGE_SIZE’ undeclared (first use in this function)
>>>>  #define USB_URB_RING_SIZE __CONST_RING_SIZE(usbif_urb, PAGE_SIZE)
>>>>                                                         ^
>>>> /users/stefanos/xen/tools/../tools/include/xen/io/ring.h:45:23: note: in 
>>>> definition of macro ‘__RD32’
>>>>  #define __RD32(_x) (((_x) & 0xffff0000) ? __RD16((_x)>>16)<<16 : 
>>>> __RD16(_x))
>>>>                        ^
>>>> /users/stefanos/xen/tools/../tools/include/xen/io/usbif.h:229:27: note: in 
>>>> expansion of macro ‘__CONST_RING_SIZE’
>>>>  #define USB_URB_RING_SIZE __CONST_RING_SIZE(usbif_urb, PAGE_SIZE)
>>>>                            ^
>>>> hw/usb/xen-usb.c:1029:51: note: in expansion of macro ‘USB_URB_RING_SIZE’
>>>>      max_grants = USBIF_MAX_SEGMENTS_PER_REQUEST * USB_URB_RING_SIZE + 2;
>>>>                                                    ^
>>>> make: *** [hw/usb/xen-usb.o] Error 1
>>>>
>>>>
>>>> It is caused by PAGE_SIZE being utilized in
>>>> xen/include/public/io/usbif.h, but undefined on ARM64 (in userspace).
>>>> QEMU includes xen/include/public/io/usbif.h directly, therefore
>>>> hw/usb/xen-usb.c doesn't build.
>>>>
>>>> I don't think we should be using "PAGE_SIZE" in public/io/usbif.h, but
>>>> that file is present in too many Xen releases to ignore now. So I am
>>>> going to work around the issue in QEMU.
>>>>
>>>
>>> Actually it was introduced in 4.7.
>>>
>>>> ---
>>>>
>>>> xen-usb.c does not build on ARM64 because it includes xen/io/usbif.h
>>>> which uses PAGE_SIZE without defining it. The header file has been
>>>> shipped with too many Xen releases to be able to solve the problem at
>>>> the source.
>>>>
>>>> This patch define PAGE_SIZE as XC_PAGE_SIZE when undefined.
>>>>
>>>> Signed-off-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
>>>>
>>>> diff --git a/hw/usb/xen-usb.c b/hw/usb/xen-usb.c
>>>> index 174d715..ca9df87 100644
>>>> --- a/hw/usb/xen-usb.c
>>>> +++ b/hw/usb/xen-usb.c
>>>> @@ -34,6 +34,11 @@
>>>>  #include "qapi/qmp/qstring.h"
>>>>  
>>>>  #include <xen/io/ring.h>
>>>> +
>>>> +/* xen/io/usbif.h references PAGE_SIZE without defining it */
>>>> +#ifndef PAGE_SIZE
>>>> +#define PAGE_SIZE XC_PAGE_SIZE
>>>> +#endif
>>>>  #include <xen/io/usbif.h>
>>>
>>>
>>> Can we just change the macro to
>>>
>>>   #define USB_CONN_RING_SIZE(pg_size) __CONST_RING_SIZE(usbif_conn, 
>>> (pg_size)
>>>
>>> ?
>>
>> Not easily. On x86 qemu builds just fine and modifying the macro to take
>> a parameter would break the build.
>>
>> We could do something like:
>>
>> #define USB_CONN_RING_SZ(pgsz) __CONST_RING_SIZE(usbif_conn, (pgsz)
>> #ifdef PAGE_SIZE
>> #define USB_CONN_RING_SIZE USB_CONN_RING_SZ(PAGE_SIZE)
>> #endif
>>
>> And then modify qemu to use USB_CONN_RING_SZ()
>>
> 
> This would also be problematic I'm afraid.  One's build could break
> randomly depending on the order of header files inclusion. I think it
> would even be harder to debug such bug than the existing one.
> 
> Inspired by Andrew on IRC. I think we can do:
> 
> /* Backward-compatible macro, use _SIZE2 variant in new code instead */
> #define USB_CONN_RING_SIZE __CONST_RING_SIZE(usbif_conn, 4096)
> 
> #define USB_CONN_RING_SIZE2(pgsize) __CONST_RING_SIZE(usbif_conn, (pgsize))
> 
> The assumption is that all existing implementations of the said protocol
> use 4k page size. Juergen, do you think this would work?

In theory, yes. I'd still prefer using PAGE_SIZE if it is defined.

What about:

#ifdef PAGE_SIZE
#define USB_RING_PAGE_SIZE PAGE_SIZE
#else
#define USB_RING_PAGE_SIZE 4096
#endif
#define USB_CONN_RING_SIZE __CONST_RING_SIZE(usbif_conn, USB_RING_PAGE_SIZE)
#define USB_CONN_RING_SIZE2(pgsize) __CONST_RING_SIZE(usbif_conn, (pgsize))


Juergen

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.