|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v1 12/12] libxl: add device backend listener in order to launch backends
Roger Pau Monne writes ("[PATCH v1 12/12] libxl: add device backend listener in
order to launch backends"):
> Add the necessary logic in libxl to allow it to act as a listener for
> launching backends in a driver domain, replacing udev (like we already
> do on Dom0). This new functionality is acomplished by watching the
> domain backend path (/local/domain/<domid>/backend) and reacting to
> device creation/destruction.
>
> The way to launch this listener daemon is from xl, using the newly
> introduced "devd" command. The command will daemonize by default,
> using "xldevd.log" as it's logfile. Optionally the user can force the
> execution of the listener in the foreground by passing the "-F"
> option to the devd command.
>
> Current backends handled by this daemon include Qdisk, vbd and vif
> device types.
...
> I'm quite sure memory management is not done correctly, after each
> call to backend_watch_callback the garbage collector should free all
> the references, but I think this is not happening, and I would
> like someone with experience on libxl memory management (IanJ) to
> comment on possible ways to deal with that.
We discussed this on IRC:
11:57 <Diziet> You seem to be using the ao gc everywhere. I think if you're
going to make a never-ending ao you need to do something more
complicated. The ao gc's allocations aren't freed until the ao
completes, which of course will never happen here.
11:58 <Diziet> I would create a fresh gc out of whole cloth and free it
explicitly when you have finished processing the event.
11:59 <Diziet> Well when I say whole cloth, I mean using LIBXL_INIT_GC or
something.
11:59 <Diziet> I think you may need to make a kind of fake sub-ao.
12:00 <Diziet> For the benefit of libxl_blah_device_blah(ao) etc.
12:00 <Diziet> Does this make any kind of sense ? If not I can sketch it out
or something.
12:01 <royger> Diziet: can I actually have two different GC? I mean, ideally I
would like to allocate a GC at the start of each iteration, and
free it when we have finished processing the loop
12:12 <Diziet> Yes, you can do that.
12:12 <Diziet> Of course it'll get a bit more complex because there will be a
function (your watch event function) where you have two gcs and
have to use the right one each time.
12:13 <Diziet> Thinking about it I think we should have something like
libxl__nested_ao_create and libxl_nested_ao_free which
take an existing ao* and give you a new ao* with its own gc.
If you want me to write libxl__nested_ao_create for you I could do
that.
> + LIBXL_SLIST_FOREACH(ddev, &dguest->devices, next) {
> + if (memcmp(ddev->dev, dev, sizeof(*dev)) == 0)
> + return ddev;
I'm afraid that you can't memcmp a struct like this. structs are
allowed to have padding which may contain junk.
> +static void device_complete(libxl__egc *egc, libxl__ao_device *aodev)
> +{
> + STATE_AO_GC(aodev->ao);
> +
> + if (aodev->action == LIBXL__DEVICE_ACTION_REMOVE)
> + free(aodev->dev);
> +
> + LOG(DEBUG, "device %s %s %s",
> + libxl__device_backend_path(gc, aodev->dev),
> + libxl__device_action_to_string(aodev->action),
> + aodev->rc ? "failed" : "succeed");
AFAICT there is nothing here reporting success or failure to the
initiator in the toolstack domain. So you'll say "xl block-attach"
and it will appear to work but in fact there's an error in a logfile
in the driver domain.
At the very least this deserves something in the documentation.
> + case LIBXL__DEVICE_KIND_VBD:
> + case LIBXL__DEVICE_KIND_VIF:
> + if (dev->backend_kind == LIBXL__DEVICE_KIND_VBD) dguest->num_vbds--;
> + if (dev->backend_kind == LIBXL__DEVICE_KIND_VIF) dguest->num_vifs--;
Is it really safe to decrement these already ? What if something else
comes along in the meantime and makes num_devs 0 (below) and removes
everything while this operation is still running and liable to be
reentered on completion ?
> /*
> + * Function that drives the main loop that checks for device actions and
> + * launches the callbacks passed by the user.
> + */
I think this comment is confusing. I would say:
/*
* Turns the current process into a backend device service daemon
* for a driver domain.
*
* From a libxl API point of view, this starts a long-running
* operation. That operation consists of "being a driver domain"
* and never completes.
*/
or something. I might rename it to have "driver domain" or "backend"
in it somewhere.
Thanks,
Ian.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |