|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V2 2/2] xenbus: defer xenbus frontend resume if xenstored is not running
On 08/05/13 15:50, Jan Beulich wrote:
>>>> On 08.05.13 at 16:32, Aurelien Chartier <aurelien.chartier@xxxxxxxxxx>
>>>> wrote:
>> --- a/drivers/xen/xenbus/xenbus_probe.h
>> +++ b/drivers/xen/xenbus/xenbus_probe.h
>> @@ -47,6 +47,11 @@ struct xen_bus_type {
>> struct bus_type bus;
>> };
>>
>> +struct xenbus_resume_work {
>> + struct work_struct w;
>> + struct device *dev;
>> +};
>> +
> I don't think this structure needs to be in a header - it's being used
> in a single source file only.
>
>> --- a/drivers/xen/xenbus/xenbus_probe_frontend.c
>> +++ b/drivers/xen/xenbus/xenbus_probe_frontend.c
>> @@ -28,6 +28,7 @@
>> #include "xenbus_comms.h"
>> #include "xenbus_probe.h"
>>
>> +static struct workqueue_struct *xenbus_frontend_resume_wq;
>>
>> /* device/<type>/<id> => <type>-<id> */
>> static int frontend_bus_id(char bus_id[XEN_BUS_ID_SIZE], const char
>> *nodename)
>> @@ -89,9 +90,38 @@ static void backend_changed(struct xenbus_watch *watch,
>> xenbus_otherend_changed(watch, vec, len, 1);
>> }
>>
>> +static void xenbus_frontend_delayed_resume(struct work_struct *w)
>> +{
>> + struct xenbus_resume_work *resume_work = (struct xenbus_resume_work *)
>> w;
> container_of()
>
>> +
>> + xenbus_dev_resume(dev);
> Does this build at all? I don't see where "dev" is being declared/
> initialized?
I messed up my config file and ended up with CONFIG_XEN_XENBUS_FRONTEND
wiped out, so I did not catch this one. Sorry for that, it was meant to
be resume_work->dev.
>
>> +
>> + kfree(w);
> kfree(resume_work) - otherwise you have a hidden dependency
> on "w" being the first member of struct xenbus_resume_work.
>
>> +}
>> +
>> +static int xenbus_frontend_dev_resume(struct device *dev)
>> +{
>> + /*
>> + * If xenstored is running in that domain, we cannot access the backend
>> + * state at the moment, so we need to defer xenbus_dev_resume
>> + */
>> + if (xen_store_domain == XS_LOCAL) {
>> + struct xenbus_resume_work *work =
>> + kmalloc(sizeof(struct xenbus_resume), GFP_KERNEL);
> Missing NULL return check (don't know what you should do in that
> case). Perhaps dynamic allocation is the wrong approach here, and
> you want to rather add a new field to struct xenbus_device (which
> gets populated only for frontend devices, and - if possible - only
> when xen_store_domain == XS_LOCAL.
>
> Also - GFP_KERNEL really suitable here?
Adding a new field for xenbus_device for that purpose seemed too much
for me, but it is probably a cleaner solution in the end.
I don't really see a way to avoid having that field for backend devices.
We can have a #ifdef CONFIG_XEN_XENBUS_FRONTEND, but that won't prevent
domains with both frontend and backend to have that field set in all
xenbus devices.
>
>> +
>> + INIT_WORK((struct work_struct *) work,
>> xenbus_frontend_delayed_resume);
> &work->w (without any cast).
>
>> + resume_work->dev = dev;
>> + queue_work(xenbus_frontend_resume_wq, (struct work_struct *)
>> work)
> Again.
Thanks for the review. I will fix the errors in my next patch series.
Aurelien.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |