All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ian Campbell <ian.campbell@citrix.com>
To: Ian Jackson <Ian.Jackson@eu.citrix.com>
Cc: wei.liu2@citrix.com, wency@cn.fujitsu.com,
	andrew.cooper3@citrix.com, yunhong.jiang@intel.com,
	eddie.dong@intel.com, xen-devel@lists.xen.org,
	guijianfeng@cn.fujitsu.com, rshriram@cs.ubc.ca,
	Yang Hongyang <yanghy@cn.fujitsu.com>
Subject: Re: [PATCH v4 --for 4.6 COLOPre 24/25] tools/libxl: move remus state into a seperate structure
Date: Thu, 16 Jul 2015 12:19:38 +0100	[thread overview]
Message-ID: <1437045578.32371.181.camel@citrix.com> (raw)
In-Reply-To: <21927.37130.353202.598696@mariner.uk.xensource.com>

On Thu, 2015-07-16 at 12:10 +0100, Ian Jackson wrote:
> Ian Campbell writes ("Re: [Xen-devel] [PATCH v4 --for 4.6 COLOPre 24/25] tools/libxl: move remus state into a seperate structure"):
> > On Wed, 2015-07-15 at 21:50 +0800, Yang Hongyang wrote:
> > > Yes, checkpoint device is an abstract layer, used by both Remus & colo,
> > > in the abstract layer, we do not aware of remus or colo, in Remus or colo,
> > > we can use container of cds to retrive Remus/colo state.
> > 
> > This is because the cds callbacks receive a
> > libxl__checkpoint_devices_state * but are specific to either Remus of
> > Colo?
> > 
> > I think the usual way to solve that would be for the callback to take a
> > void *data "closure" field, which is registered along with the callbacks
> > and passed to all callbacks, or in this case perhaps you can get away
> > with just including it in the cds itself.
> > 
> > Ian, what do you think?
> 
> This is rather an unusual situation.  Normally there are two patterns:
> 
> 
> 1.
> 
> Things like:
> 
>   static void device_disk_add(libxl__egc *egc, uint32_t domid,
>                            libxl_device_disk *disk,
>                            libxl__ao_device *aodev,
>                            char *get_vdev(libxl__gc *, void *,
>                                           xs_transaction_t),
>                            void *get_vdev_user)
> 
> and similar patterns in much code in libxl and elsewhere.  This is the
> normal case.  (It is of course essential to use this when there are
> multiple call sites, so the void* data pointer might vary.)
> 
> 
> 2.
> 
> Things like (NB not very like real code):
> 
>   struct libxl_some_operation_state {
>     libxl_inner_generic_operation_state igos;
> 
>   void someop_innerop_make_happen(libxl_some_operation_state *sos) {
>     sos->igos.callback = someop_innerop_done;
> 
>   void someop_innerop_done(libxl_inner_generic_operation_state *igos) {
>     sos = CONTAINER_OF(igos);
> 
> Here the callback someop_innerop_done can be sure that CONTAINER_OF is
> correct because the callback is set up only in one place where it is
> obvious that the igos is part of a sos.
> 
> IMO this is an exception to  the usual rule that you have to accompany
> the function pointer with a void*.  The exception is justified because
> it is very easy to see that  the code is correct.  And, if any mistake
> is made, the setup is unconditional, so it will _always_ get the wrong
> container and go wrong (which will hopefully be spotted in testing).
> 
> 
> 
> In this particular situation the plumbing that relates a particular
> callback to the remus or colo state is rather more complicated.  I
> don't think it will be as obvious that the appropriate CONTAINER_OF is
> being used, let alone obvious that this it's always the same.
> 
> OTOH for any particular callback the context pointer is supposed to be
> a particular CONTAINER_OF.  It would be nice to write this in the
> code.
> 
> I think in this case the best answer would be:
> 
>   struct libxl__checkpoint_devices_state {
>       void (*postsuspend)(libxl__egc *egc, libxl__remus_device *dev);

ITYM s/libxl__remus_device/libxl__checkpoint_devices_state here?

If so then this is pretty much what I meant by "in this case perhaps you
can get away with just including it in the cds itself", but more clearly
explained.

>       void *callbacks_context;
> 
> and in the callback
> 
>   void libxl__remus_devices_postsuspend(libxl__egc *egc,
>                                 libxl__check_devices_state *cds)
>   {
>       libxl__remus_state *rs = cds->callbacks_context;
>       assert(cds = &rs->cds);
> 
> or some such.
> 
> 
> Thanks,
> Ian.

  reply	other threads:[~2015-07-16 11:19 UTC|newest]

Thread overview: 101+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-15  7:45 [PATCH v4 --for 4.6 COLOPre 00/25] Prerequisite patches for COLO Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 01/25] tools/libxl: rename libxl__domain_suspend to libxl__domain_save Yang Hongyang
2015-07-15 11:16   ` Ian Campbell
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 02/25] tools/libxl: move domain suspend code into libxl_dom_suspend.c Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 03/25] tools/libxl: move domain resume " Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 04/25] tools/libxl: rename remus checkpoint callbacks Yang Hongyang
2015-07-15 11:17   ` Ian Campbell
2015-07-16  1:43     ` Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 05/25] libxl/remus: introduce libxl__remus_setup Yang Hongyang
2015-07-15 11:26   ` Ian Campbell
2015-07-16  5:32     ` Yang Hongyang
2015-07-16 10:40       ` Ian Campbell
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 06/25] libxl/remus: introduce libxl__remus_teardown Yang Hongyang
2015-07-15 11:59   ` Ian Campbell
2015-07-16  1:43     ` Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 07/25] libxl/remus: init checkpoint_callback in Remus checkpoint callback Yang Hongyang
2015-07-15 12:02   ` Ian Campbell
2015-07-15 12:35     ` Yang Hongyang
2015-07-16 10:32       ` Ian Campbell
2015-07-16 11:00         ` Yang Hongyang
2015-07-16 11:16           ` Ian Campbell
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 08/25] tools/libxl: move remus code into libxl_remus.c Yang Hongyang
2015-07-15 12:05   ` Ian Campbell
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 09/25] tools/libxl: move save/restore code into libxl_dom_save.c Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 10/25] libxl/save: Refactor libxl__domain_suspend_state Yang Hongyang
2015-07-15 12:10   ` Ian Campbell
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 11/25] tools/libxc: support to resume uncooperative HVM guests Yang Hongyang
2015-07-15 12:26   ` Ian Campbell
2015-07-16  5:57     ` Yang Hongyang
2015-07-16 15:40       ` Ian Jackson
2015-07-16 16:15         ` Yang Hongyang
2015-07-16 16:27           ` Ian Jackson
2015-12-15  2:05             ` Wen Congyang
2016-01-04 16:33               ` Ian Jackson
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 12/25] tools/libxl: introduce enum type libxl_checkpointed_stream Yang Hongyang
2015-07-15 12:34   ` Ian Campbell
2015-07-15 13:58     ` Yang Hongyang
2015-07-16 10:34       ` Ian Campbell
2015-07-16 10:47         ` Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 13/25] migration/save: pass checkpointed_stream from libxl to libxc Yang Hongyang
2015-07-15 12:38   ` Ian Campbell
2015-07-16  6:05     ` Yang Hongyang
2015-07-16 10:47       ` Ian Campbell
2015-07-16 16:13       ` Wei Liu
2015-07-16 16:21         ` Yang Hongyang
2015-07-16 16:39           ` Wei Liu
2015-07-16 16:10   ` Wei Liu
2015-07-16 16:24     ` Yang Hongyang
2015-07-16 16:37       ` Wei Liu
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 14/25] tools/libxl: introduce libxl__domain_restore_device_model to load qemu state Yang Hongyang
2015-07-15 12:45   ` Ian Campbell
2015-07-15 13:42     ` Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 15/25] tools/libxl: check QEMU state before resume dm Yang Hongyang
2015-07-15 12:48   ` Ian Campbell
2015-07-15 12:54     ` Ian Campbell
2015-07-15 13:00       ` Wei Liu
2015-07-15 13:48         ` Ian Campbell
2015-07-15 13:49     ` Ian Campbell
2015-07-16 14:43   ` Wei Liu
2015-07-16 15:43     ` Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 16/25] tools/libxl: Update libxl_domain_unpause() to support qemu-xen Yang Hongyang
2015-07-15 12:50   ` Ian Campbell
2015-07-16  3:49     ` Yang Hongyang
2015-07-16 10:39       ` Ian Campbell
2015-07-16 10:51         ` Yang Hongyang
2015-07-16 16:26   ` Wei Liu
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 17/25] tools/libxl: introduce libxl__domain_common_switch_qemu_logdirty() Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 18/25] tools/libxl: export logdirty_init Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 19/25] tools/libxl: Add back channel to allow migration target send data back Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 20/25] tools/libx{l, c}: add back channel to libxc Yang Hongyang
2015-07-15 13:13   ` Ian Campbell
2015-07-16  6:29     ` Yang Hongyang
2015-07-16 11:01       ` Ian Campbell
2015-07-15 13:21   ` Andrew Cooper
2015-07-16  6:07     ` Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 21/25] tools/libxl: rename remus device to checkpoint device Yang Hongyang
2015-07-15 13:15   ` Ian Campbell
2015-07-15 13:34     ` Yang Hongyang
2015-07-16  9:26       ` Andrew Cooper
2015-07-16  9:29         ` Yang Hongyang
2015-07-15 13:32   ` Ian Campbell
2015-07-15 13:38     ` Yang Hongyang
2015-07-16  9:23     ` Yang Hongyang
2015-07-16  9:31       ` Ian Campbell
2015-07-16  9:36         ` Yang Hongyang
2015-07-16 10:14           ` Ian Campbell
2015-07-16 10:22             ` Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 22/25] tools/libxl: adjust the indentation Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 23/25] tools/libxl: store remus_ops in checkpoint device state Yang Hongyang
2015-07-15 13:21   ` Ian Campbell
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 24/25] tools/libxl: move remus state into a seperate structure Yang Hongyang
2015-07-15 13:28   ` Ian Campbell
2015-07-15 13:50     ` Yang Hongyang
2015-07-16 10:37       ` Ian Campbell
2015-07-16 11:10         ` Ian Jackson
2015-07-16 11:19           ` Ian Campbell [this message]
2015-07-15 15:08   ` Ian Jackson
2015-07-15 15:18     ` Yang Hongyang
2015-07-15  7:45 ` [PATCH v4 --for 4.6 COLOPre 25/25] tools/libxl: seperate device init/cleanup from checkpoint device layer Yang Hongyang
2015-07-15 13:37   ` Ian Campbell
2015-07-16  1:37 ` [PATCH v4 --for 4.6 COLOPre 00/25] Prerequisite patches for COLO Yang Hongyang

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=1437045578.32371.181.camel@citrix.com \
    --to=ian.campbell@citrix.com \
    --cc=Ian.Jackson@eu.citrix.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=eddie.dong@intel.com \
    --cc=guijianfeng@cn.fujitsu.com \
    --cc=rshriram@cs.ubc.ca \
    --cc=wei.liu2@citrix.com \
    --cc=wency@cn.fujitsu.com \
    --cc=xen-devel@lists.xen.org \
    --cc=yanghy@cn.fujitsu.com \
    --cc=yunhong.jiang@intel.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.