xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Roger Pau Monne <roger.pau@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Cc: Stefano Stabellini <Stefano.Stabellini@eu.citrix.com>,
	"xen-devel@lists.xen.org" <xen-devel@lists.xen.org>
Subject: Re: [PATCH v10 07/19] libxl: convert libxl__device_disk_local_attach to an async op
Date: Mon, 23 Jul 2012 12:32:50 +0100	[thread overview]
Message-ID: <500D3662.2000807@citrix.com> (raw)
In-Reply-To: <20489.40301.406175.139605@mariner.uk.xensource.com>

Ian Jackson wrote:
> Roger Pau Monne writes ("[PATCH v10 07/19] libxl: convert libxl__device_disk_local_attach to an async op"):
>> This will be needed in future patches, when libxl__device_disk_add
>> becomes async also. Create a new status structure that defines the
>> local attach of a disk device and use it in
>> libxl__device_disk_local_attach.
>>
>> This is done in this patch to split the changes introduced when
>> libxl__device_disk_add becomes async.
> 
> Thanks for this.  See my other comment earlier today about the error
> handling.  The rest of my comments are below.  Very nearly there I
> think.
> 
> Thanks,
> Ian.
> 
>> @@ -2234,39 +2237,102 @@ char * libxl__device_disk_local_attach(libxl__gc *gc,
>>              goto out;
>>      }
>>      if (dev != NULL)
>> -        ret = strdup(dev);
>> -    return ret;
>> +        dls->diskpath = strdup(dev);
> 
> libxl__strdup, surely.  And I'm not sure I understand why this string
> can't be from the gc.  In any case the memory allocation strategy
> should be documented in the struct.  Eg:
> 
>> +struct libxl__disk_local_state {
> ...
>> +    /* filled by libxl__device_disk_local_initiate_attach */
>> +    char *diskpath;
> 
>   +    char *diskpath; /* from the gc */
> or
>   +    char *diskpath; /* non-0 whenever Attached, disposed by detach */
> or something.

I've changed diskpath to be allocated from the gc.

>> +void libxl__device_disk_local_initiate_detach(libxl__egc *egc,
>> +                                     libxl__disk_local_state *dls)
>>  {
> ...
>> +out:
>> +    if (dls->diskpath) {
>> +        free(dls->diskpath);
>> +        dls->diskpath = 0;
>> +    }
>> +    /*
>> +     * If there was an error in dls->rc, it means we have been called from
>> +     * a failed execution of libxl__device_disk_local_initiate_attach,
>> +     * so return the original error.
>> +     */
>> +    rc = dls->rc ? dls->rc : rc;
>> +    dls->callback(egc, dls, rc);
>> +    return;
> 
> This seems to occur twice.  Once here and once in
> local_device_detach_cb.  Clearly they should be unified, probably by
> dismembering local_device_detach_cb:

I'm calling local_device_detach_cb instead of the callback directly.

> ...
>> +static void local_device_detach_cb(libxl__egc *egc, libxl__ao_device *aodev)
>> +{
>> +    STATE_AO_GC(aodev->ao);
>> +    libxl__disk_local_state *dls = CONTAINER_OF(aodev, *dls, aodev);
>> +    int rc;
>> +
>> +    if (dls->diskpath) {
>> +        free(dls->diskpath);
>> +        dls->diskpath = 0;
>> +    }
>> +
>> +    if (aodev->rc) {
> ...
>> +    }
>> +
>> +out:
>> +    /*
>> +     * If there was an error in dls->rc, it means we have been called from
>> +     * a failed execution of libxl__device_disk_local_initiate_attach,
>> +     * so return the original error.
>> +     */
>> +    rc = dls->rc ? dls->rc : aodev->rc;
>> +    dls->callback(egc, dls, rc);
>> +    return;
> 
> 
>> diff --git a/tools/libxl/libxl_bootloader.c b/tools/libxl/libxl_bootloader.c
>> index 7ebc0df..4bcca3d 100644
>> --- a/tools/libxl/libxl_bootloader.c
>> +++ b/tools/libxl/libxl_bootloader.c
>> @@ -249,10 +245,32 @@ static void bootloader_setpaths(libxl__gc *gc, libxl__bootloader_state *bl)
> ...
>> +/* Callbacks */
>> +
>> +static void bootloader_finished_cb(libxl__egc *egc,
>> +                                   libxl__disk_local_state *dls,
>> +                                   int rc);
> 
> Wouldn't this be better named
>    bootloader_local_detached_cb
> or something ?  Because the function called when the bootloader
> finishes is bootloader_callback.

Yes, changed to bootloader_local_detached_cb.

>>  static void bootloader_callback(libxl__egc *egc, libxl__bootloader_state *bl,
>>                                  int rc)
>>  {
>>      bootloader_cleanup(egc, bl);
>> +
>> +    bl->dls.callback = bootloader_finished_cb;
>> +    libxl__device_disk_local_initiate_detach(egc, &bl->dls);
>> +}
> 
>> diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
>> index 4f3a232..ab590be 100644
> ...
>> +/*
>> + * Clears the internal error code, can be called multiple times, and
>> + * must be called before libxl__device_disk_local_initiate_attach.
>> + */
>> +static inline void libxl__device_disk_local_init(libxl__disk_local_state *dls)
> 
> "Clears the internal error code" should not be in interface
> documentation, since it refers to an implementation detail.
> 
> Perhaps you mean "Prepares a dls for use".  You should explicitly
> state which of the documented states it transitions between.  I guess
> "Undefined -> Idle" ?

Changed the comment, and added the state transition.

>> +/* Make a disk available in this (the control) domain. Always calls
>> + * dls->callback when finished.
>> + * State Idle -> Attaching
>> + *
>> + * The state on which the device is when in the callback depends
>> + * on the passed value of rc:
>> + * Attached if rc == 0
>> + * Idle if rc != 0
> 
> A nit: this would be slightly easier to read if there the two
> subordinate options were indented.
> 
> Also correct English would be "the state in which the device is" but
> really you mean the state of the dls, not of the device.  I would
> write:
>   + * The state of dls on entry to the callback depends on the value
>   + * of rc passed to the callback:
>   + *     rc == 0: Attached if rc == 0
>   + *     rc != 0: Idle
> 
>> +_hidden void libxl__device_disk_local_initiate_attach(libxl__egc *egc,
>> +                                                libxl__disk_local_state *dls);
>> +
>> +/* Disconnects a disk device form the control domain. If the passed
>> + * dls is not attached (or has already been detached),
>> + * libxl__device_disk_local_initiate_detach will just call the callback
>> + * directly.
>> + * State Idle/Attached -> Detaching
>> + *
>> + * The state on which the device is when in the callback is Idle.
> 
> Again, "in which", "dls" or reword as above.

I've addressed both comments.

>> @@ -2097,10 +2142,10 @@ struct libxl__bootloader_state {
>>      /* Should be zeroed by caller on entry.  Will be filled in by
>>       * bootloader machinery; represents the local attachment of the
>>       * disk for the benefit of the bootloader.  Must be detached by
>> -     * the caller using libxl__device_disk_local_detach, but only
>> +     * the caller using libxl__device_disk_local_initiate_detach, but only
>>       * after the domain's kernel and initramfs have been loaded into
>>       * memory and the file references disposed of. */
> 
> Is this last comment, which I wrote, wrong ?  That is, as previously
> discussed, is it legal to detach the disk before the kernel and
> initramfs have been loaded into the domain's memory ?
> 
> I think it probably is.  If so perhaps I should write a separate
> patch to fix it.

I didn't change this comment, but if you want I can do that in this
patch. The bootloader makes a copy of the kernel/initramfs to somewhere,
and that is what we load to the memory.

  reply	other threads:[~2012-07-23 11:32 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-07-20 14:12 [PATCH v10 01/19] execute hotplug scripts from libxl v10 Roger Pau Monne
2012-07-20 14:12 ` [PATCH v10 01/19] libxl: check backend state before setting it to "closing" Roger Pau Monne
2012-07-20 14:12 ` [PATCH v10 02/19] libxl: change ao_device_remove to ao_device Roger Pau Monne
2012-07-20 16:35   ` Ian Jackson
2012-07-20 14:12 ` [PATCH v10 03/19] libxl: move device model creation prototypes Roger Pau Monne
2012-07-20 14:12 ` [PATCH v10 04/19] libxl: convert libxl_domain_destroy to an async op Roger Pau Monne
2012-07-20 14:12 ` [PATCH v10 05/19] libxl: move bootloader data strucutres and prototypes Roger Pau Monne
2012-07-20 17:21   ` Ian Jackson
2012-07-20 14:12 ` [PATCH v10 06/19] libxl: refactor disk addition to take a helper Roger Pau Monne
2012-07-20 17:24   ` Ian Jackson
2012-07-20 14:12 ` [PATCH v10 07/19] libxl: convert libxl__device_disk_local_attach to an async op Roger Pau Monne
2012-07-20 18:03   ` Ian Jackson
2012-07-23 11:32     ` Roger Pau Monne [this message]
2012-07-20 14:12 ` [PATCH v10 08/19] libxl: rename vifs to nics Roger Pau Monne
2012-07-20 14:12 ` [PATCH v10 09/19] libxl: convert libxl_device_disk_add to an async op Roger Pau Monne
2012-07-20 18:04   ` Ian Jackson
2012-07-20 14:12 ` [PATCH v10 10/19] libxl: convert libxl_device_nic_add to an async operation Roger Pau Monne
2012-07-20 14:12 ` [PATCH v10 11/19] libxl: add option to choose who executes hotplug scripts Roger Pau Monne
2012-07-20 14:12 ` [PATCH v10 12/19] libxl: rename _IOEMU nic type to VIF_IOEMU Roger Pau Monne
2012-07-20 16:34   ` Ian Campbell
2012-07-20 16:39     ` Ian Campbell
2012-07-20 14:12 ` [PATCH v10 13/19] libxl: set correct nic type depending on the guest Roger Pau Monne
2012-07-20 18:06   ` Ian Jackson
2012-07-20 14:12 ` [PATCH v10 14/19] libxl: use libxl__xs_path_cleanup on device_destroy Roger Pau Monne
2012-07-20 15:38   ` Ian Campbell
2012-07-20 14:12 ` [PATCH v10 15/19] libxl: call hotplug scripts for disk devices from libxl Roger Pau Monne
2012-07-20 15:20   ` Ian Campbell
2012-07-20 14:12 ` [PATCH v10 16/19] libxl: call hotplug scripts for nic " Roger Pau Monne
2012-07-20 16:01   ` Ian Campbell
2012-07-20 16:12     ` Ian Campbell
2012-07-20 16:36     ` Ian Campbell
2012-07-23  9:22     ` Roger Pau Monne
2012-07-20 16:03   ` Ian Campbell
2012-07-20 14:12 ` [PATCH v10 17/19] libxl: convert libxl_device_vkb_add to an async operation Roger Pau Monne
2012-07-20 18:08   ` Ian Jackson
2012-07-23  8:58     ` Roger Pau Monne
2012-07-23  9:26       ` Ian Campbell
2012-07-23 11:44       ` Ian Jackson
2012-07-20 14:12 ` [PATCH v10 18/19] libxl: convert libxl_device_vfb_add " Roger Pau Monne
2012-07-20 18:11   ` Ian Jackson
2012-07-23 11:58     ` Roger Pau Monne
2012-07-20 14:12 ` [PATCH v10 19/19] xl: main_blockdetach don't call destroy if remove succeeds Roger Pau Monne
2012-07-20 14:55   ` Ian Campbell
2012-07-23 12:17 ` [PATCH v10 01/19] execute hotplug scripts from libxl v10 Ian Campbell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=500D3662.2000807@citrix.com \
    --to=roger.pau@citrix.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=Stefano.Stabellini@eu.citrix.com \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).