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

Re: [Xen-devel] [PATCH xm/xl enhancements for vptm 5/6] make devid a libxl type



On 09/25/2012 12:14 PM, Ian Campbell wrote:
> On Tue, 2012-09-25 at 17:00 +0100, Matthew Fioravante wrote:
>> On 09/25/2012 06:36 AM, Ian Campbell wrote:
>>> On Fri, 2012-09-21 at 20:20 +0100, Matthew Fioravante wrote:
>>>> This fixes a bug in libxl where device ids are not initialized properly.
>>>> The devid field for each device is set to be an integer type which are
>>>> always initialized to 0.
>>>>
>>>> This makes the xl DEV-attach commands always fail to add more than one
>>>> device, because each time the device id is initialized to 0, when it
>>>> should be initialized to -1, which in the code will trigger a search for
>>>> free id.
>>> Which of the DEV-attach commands can be used to add more than one
>>> device?
>> network-attach, block-attach, and also my vtpm-attach.
> Oh, you mean by being called repeatedly, not adding multiple devices in
> one go!
>
>>> Where is the code to do the search? I had a look in the disk and network
>>> cases and couldn't find it.
>> libxl.c
>>
>> void libxl__device_nic_add(
>>
>>     if (nic->devid == -1) {
>>         if (!(dompath = libxl__xs_get_dompath(gc, domid))) {
>>             rc = ERROR_FAIL;
>>             goto out_free;
>>         }
>>         if (!(l = libxl__xs_directory(gc, XBT_NULL,
>>                                      libxl__sprintf(gc, "%s/device/vif",
>> dompath), &nb))) {
>>             nic->devid = 0;
>>         } else {
>>             nic->devid = strtoul(l[nb - 1], NULL, 10) + 1;
>>         }
>>     }
> Not sure how I missed this.
>
>> Right now, nic-devid is 0 on attach.
> Is devid not a parameter to network-attach? It is to block-attach.
It might be, but if its not specified I think the logical thing to do is
to automatically choose the next available id.
>
>> So it always tries to use 0. When you do a network-attach twice,
>> the second time it trys and fails to create device/vif/0
> Your change to use -1 as thye default is certainly correct. I'm just
> trying to figure out why xl does things this way in the first place.
>
>>>> diff --git a/tools/ocaml/libs/xs/xs.mli b/tools/ocaml/libs/xs/xs.mli
>>>> --- a/tools/ocaml/libs/xs/xs.mli
>>>> +++ b/tools/ocaml/libs/xs/xs.mli
>>>> @@ -27,6 +27,7 @@ exception Failed_to_connect
>>>>  type perms = Xsraw.perms
>>>>  
>>>>  type domid = int
>>>> +type devid = int
>>> I can see why these were needed in the xl modules, but I don't see how
>>> this type can be required in the xenstore ones.
>> It shouldn't be required for xenstore or xc. The problem is they won't
>> compile without it because of the way the ocaml build system works. As
>> far as I understand it creates types for xl, xc, and xs from the
>> libxl_types.idl.
> No, only xl does this.
>
> The others are the libxc and xenstore bindings which are completely hand
> coded and there is no concept of a devid at those layers anyway. What
> error do you get if you omit the changes to those module?
Ok I must be crazy. I went back and removed them and tried to compile it
again and it works fine. I think I was forgetting to update both the
.mli and the .ml files. Anyway a new patch with the xc/xs removed is
attached.
>
>>  Either the build system needs to be changed, or devid
>> needs to be a type in all libraries, or we find some other way to fix
>> this initialization bug.
>>> Ian.
>>>
>>
>

Signed off by Matthew Fioravante matthew.fioravante@xxxxxxxxxx

---
* Rebased off of latest xen-unstable
* Fixed whitespace errors
* Removed devid from libxc and libxs

diff --git a/tools/libxl/gentest.py b/tools/libxl/gentest.py
--- a/tools/libxl/gentest.py
+++ b/tools/libxl/gentest.py
@@ -60,7 +60,7 @@ def gen_rand_init(ty, v, indent = "    ", parent = None):
                                         passby=idl.PASS_BY_REFERENCE))
     elif ty.typename in ["libxl_uuid", "libxl_mac", "libxl_hwcap"]:
         s += "rand_bytes((uint8_t *)%s, sizeof(*%s));\n" % (v,v)
-    elif ty.typename in ["libxl_domid"] or isinstance(ty, idl.Number):
+    elif ty.typename in ["libxl_domid", "libxl_devid"] or isinstance(ty, 
idl.Number):
         s += "%s = rand() %% (sizeof(%s)*8);\n" % \
              (ty.pass_arg(v, parent is None),
               ty.pass_arg(v, parent is None))
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -307,6 +307,7 @@ void libxl_cpuid_dispose(libxl_cpuid_policy_list 
*cpuid_list);
 #define LIBXL_PCI_FUNC_ALL (~0U)
 
 typedef uint32_t libxl_domid;
+typedef int libxl_devid;
 
 /*
  * Formatting Enumerations.
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -8,6 +8,7 @@ namespace("libxl_")
 libxl_defbool = Builtin("defbool", passby=PASS_BY_REFERENCE)
 
 libxl_domid = Builtin("domid", json_fn = "yajl_gen_integer", autogenerate_json 
= False)
+libxl_devid = Builtin("devid", json_fn = "yajl_gen_integer", autogenerate_json 
= False, signed = True, init_val="-1")
 libxl_uuid = Builtin("uuid", passby=PASS_BY_REFERENCE)
 libxl_mac = Builtin("mac", passby=PASS_BY_REFERENCE)
 libxl_bitmap = Builtin("bitmap", dispose_fn="libxl_bitmap_dispose", 
passby=PASS_BY_REFERENCE)
@@ -343,7 +344,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
 
 libxl_device_vfb = Struct("device_vfb", [
     ("backend_domid", libxl_domid),
-    ("devid",         integer),
+    ("devid",         libxl_devid),
     ("vnc",           libxl_vnc_info),
     ("sdl",           libxl_sdl_info),
     # set keyboard layout, default is en-us keyboard
@@ -352,7 +353,7 @@ libxl_device_vfb = Struct("device_vfb", [
 
 libxl_device_vkb = Struct("device_vkb", [
     ("backend_domid", libxl_domid),
-    ("devid", integer),
+    ("devid", libxl_devid),
     ])
 
 libxl_device_disk = Struct("device_disk", [
@@ -369,7 +370,7 @@ libxl_device_disk = Struct("device_disk", [
 
 libxl_device_nic = Struct("device_nic", [
     ("backend_domid", libxl_domid),
-    ("devid", integer),
+    ("devid", libxl_devid),
     ("mtu", integer),
     ("model", string),
     ("mac", libxl_mac),
@@ -399,7 +400,7 @@ libxl_diskinfo = Struct("diskinfo", [
     ("backend_id", uint32),
     ("frontend", string),
     ("frontend_id", uint32),
-    ("devid", integer),
+    ("devid", libxl_devid),
     ("state", integer),
     ("evtch", integer),
     ("rref", integer),
@@ -410,7 +411,7 @@ libxl_nicinfo = Struct("nicinfo", [
     ("backend_id", uint32),
     ("frontend", string),
     ("frontend_id", uint32),
-    ("devid", integer),
+    ("devid", libxl_devid),
     ("state", integer),
     ("evtch", integer),
     ("rref_tx", integer),
diff --git a/tools/ocaml/libs/xl/genwrap.py b/tools/ocaml/libs/xl/genwrap.py
--- a/tools/ocaml/libs/xl/genwrap.py
+++ b/tools/ocaml/libs/xl/genwrap.py
@@ -10,6 +10,7 @@ builtins = {
     "int":                  ("int",                    "%(c)s = 
Int_val(%(o)s)",            "Val_int(%(c)s)"  ),
     "char *":               ("string",                 "%(c)s = 
dup_String_val(gc, %(o)s)", "caml_copy_string(%(c)s)"),
     "libxl_domid":          ("domid",                  "%(c)s = 
Int_val(%(o)s)",            "Val_int(%(c)s)"  ),
+    "libxl_devid":          ("devid",                  "%(c)s = 
Int_val(%(o)s)",            "Val_int(%(c)s)"  ),
     "libxl_defbool":        ("bool option",            "%(c)s = 
Defbool_val(%(o)s)",        "Val_defbool(%(c)s)" ),
     "libxl_uuid":           ("int array",              "Uuid_val(gc, lg, 
&%(c)s, %(o)s)",   "Val_uuid(&%(c)s)"),
     "libxl_key_value_list": ("(string * string) list", None,                   
             None),
@@ -41,8 +42,8 @@ def stub_fn_name(ty, name):
     return "stub_xl_%s_%s" % (ty.rawname,name)
     
 def ocaml_type_of(ty):
-    if ty.rawname == "domid":
-        return "domid"
+    if ty.rawname in ["domid","devid"]:
+        return ty.rawname
     elif isinstance(ty,idl.UInt):
         if ty.width in [8, 16]:
             # handle as ints
diff --git a/tools/ocaml/libs/xl/xenlight.ml.in 
b/tools/ocaml/libs/xl/xenlight.ml.in
--- a/tools/ocaml/libs/xl/xenlight.ml.in
+++ b/tools/ocaml/libs/xl/xenlight.ml.in
@@ -16,6 +16,7 @@
 exception Error of string
 
 type domid = int
+type devid = int
 
 (* @@LIBXL_TYPES@@ *)
 
diff --git a/tools/ocaml/libs/xl/xenlight.mli.in 
b/tools/ocaml/libs/xl/xenlight.mli.in
--- a/tools/ocaml/libs/xl/xenlight.mli.in
+++ b/tools/ocaml/libs/xl/xenlight.mli.in
@@ -16,6 +16,7 @@
 exception Error of string
 
 type domid = int
+type devid = int
 
 (* @@LIBXL_TYPES@@ *)
 
diff --git a/tools/python/xen/lowlevel/xl/xl.c 
b/tools/python/xen/lowlevel/xl/xl.c
--- a/tools/python/xen/lowlevel/xl/xl.c
+++ b/tools/python/xen/lowlevel/xl/xl.c
@@ -281,6 +281,11 @@ int attrib__libxl_domid_set(PyObject *v, libxl_domid 
*domid) {
     return 0;
 }
 
+int attrib__libxl_devid_set(PyObject *v, libxl_devid *devid) {
+   *devid = PyInt_AsLong(v);
+   return 0;
+}
+
 int attrib__struct_in_addr_set(PyObject *v, struct in_addr *pptr)
 {
     PyErr_SetString(PyExc_NotImplementedError, "Setting in_addr");
@@ -342,6 +347,10 @@ PyObject *attrib__libxl_domid_get(libxl_domid *domid) {
     return PyInt_FromLong(*domid);
 }
 
+PyObject *attrib__libxl_devid_get(libxl_devid *devid) {
+    return PyInt_FromLong(*devid);
+}
+
 PyObject *attrib__struct_in_addr_get(struct in_addr *pptr)
 {
     PyErr_SetString(PyExc_NotImplementedError, "Getting in_addr");
-- 
1.7.4.4




Attachment: smime.p7s
Description: S/MIME Cryptographic Signature

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

 


Rackspace

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