All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: "Dr. David Alan Gilbert (git)" <dgilbert@redhat.com>
Cc: agraf@suse.de, stefanb@linux.vnet.ibm.com, quintela@redhat.com,
	mdroth@linux.vnet.ibm.com, qemu-devel@nongnu.org,
	aliguori@amazon.com, afaerber@suse.de
Subject: Re: [Qemu-devel] [RFC PATCH v2 01/16] Visitor: Add methods for migration format use
Date: Wed, 7 May 2014 12:50:37 +0300	[thread overview]
Message-ID: <20140507095037.GA12259@redhat.com> (raw)
In-Reply-To: <1398271069-22057-2-git-send-email-dgilbert@redhat.com>

On Wed, Apr 23, 2014 at 05:37:34PM +0100, Dr. David Alan Gilbert (git) wrote:
> From: "Dr. David Alan Gilbert" <dgilbert@redhat.com>
> 
> array types
>     From  https://lists.gnu.org/archive/html/qemu-devel/2011-09/msg02465.html
> 
> str256 type
>     For the upto 256byte strings QEMU commonly uses for IDs
> 
> buffer type
>     For a blob of data that the caller wants to deliver whole (e.g.
>     a page of RAM or block of disk)
> 
> Load/save flags to let a user perform pre-save/post-load checking
> 
> An accessor to get the underlying QEMUFile* (for compatibility)
> 
> compat-sequences
>     Provide enough information for a visitor providing compatibility
> with the old format to generate it's byte stream, while allowing a new
> visitor to do something sensible.
> 
> destroy
>     Allows the caller to destroy a visitor without knowing what type of
>     visitor it is.
> 
> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
> ---
>  include/qapi/visitor-impl.h | 23 +++++++++++++
>  include/qapi/visitor.h      | 51 +++++++++++++++++++++++++++++
>  qapi/qapi-visit-core.c      | 80 +++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 154 insertions(+)
> 
> diff --git a/include/qapi/visitor-impl.h b/include/qapi/visitor-impl.h
> index f3fa420..10cdbf7 100644
> --- a/include/qapi/visitor-impl.h
> +++ b/include/qapi/visitor-impl.h
> @@ -15,6 +15,9 @@
>  #include "qapi/error.h"
>  #include "qapi/visitor.h"
>  
> +#define VISITOR_SAVING (1<<0)
> +#define VISITOR_LOADING (1<<1)
> +
>  struct Visitor
>  {
>      /* Must be set */
> @@ -29,6 +32,10 @@ struct Visitor
>      void (*start_list)(Visitor *v, const char *name, Error **errp);
>      GenericList *(*next_list)(Visitor *v, GenericList **list, Error **errp);
>      void (*end_list)(Visitor *v, Error **errp);
> +    void (*start_array)(Visitor *v, void **obj, const char *name,
> +                        size_t elem_count, size_t elem_size, Error **errp);
> +    void (*next_array)(Visitor *v, Error **errp);
> +    void (*end_array)(Visitor *v, Error **errp);
>  
>      void (*type_enum)(Visitor *v, int *obj, const char *strings[],
>                        const char *kind, const char *name, Error **errp);
> @@ -38,6 +45,7 @@ struct Visitor
>      void (*type_int)(Visitor *v, int64_t *obj, const char *name, Error **errp);
>      void (*type_bool)(Visitor *v, bool *obj, const char *name, Error **errp);
>      void (*type_str)(Visitor *v, char **obj, const char *name, Error **errp);
> +    void (*type_str256)(Visitor *v, char *obj, const char *name, Error **errp);
>      void (*type_number)(Visitor *v, double *obj, const char *name,
>                          Error **errp);
>  
> @@ -49,6 +57,8 @@ struct Visitor
>      void (*start_handle)(Visitor *v, void **obj, const char *kind,
>                           const char *name, Error **errp);
>      void (*end_handle)(Visitor *v, Error **errp);
> +    void (*type_buffer)(Visitor *v, void *data, size_t len, bool async,
> +                        const char *name, Error **errp);
>      void (*type_uint8)(Visitor *v, uint8_t *obj, const char *name, Error **errp);
>      void (*type_uint16)(Visitor *v, uint16_t *obj, const char *name, Error **errp);
>      void (*type_uint32)(Visitor *v, uint32_t *obj, const char *name, Error **errp);
> @@ -59,6 +69,19 @@ struct Visitor
>      void (*type_int64)(Visitor *v, int64_t *obj, const char *name, Error **errp);
>      /* visit_type_size() falls back to (*type_uint64)() if type_size is unset */
>      void (*type_size)(Visitor *v, uint64_t *obj, const char *name, Error **errp);
> +
> +    void (*destroy)(Visitor *v, Error **errp);
> +
> +    void (*start_sequence_compat)(Visitor *v, const char *name,
> +                                  Visit_seq_compat_mode compat_mode,
> +                                  void *opaque, Error **errp);
> +    void (*end_sequence_compat)(Visitor *v, const char *name,
> +                                Visit_seq_compat_mode compat_mode,
> +                                Error **errp);
> +
> +    QEMUFile* (*get_qemufile)(Visitor *v);
> +
> +    uint64_t flags;
>  };
>  
>  void input_type_enum(Visitor *v, int *obj, const char *strings[],
> diff --git a/include/qapi/visitor.h b/include/qapi/visitor.h
> index 29da211..70c20df 100644
> --- a/include/qapi/visitor.h
> +++ b/include/qapi/visitor.h
> @@ -39,11 +39,22 @@ void visit_end_implicit_struct(Visitor *v, Error **errp);
>  void visit_start_list(Visitor *v, const char *name, Error **errp);
>  GenericList *visit_next_list(Visitor *v, GenericList **list, Error **errp);
>  void visit_end_list(Visitor *v, Error **errp);
> +void visit_start_array(Visitor *v, void **obj, const char *name,
> +                       size_t elem_count, size_t elem_size, Error **errp);
> +void visit_next_array(Visitor *v, Error **errp);
> +void visit_end_array(Visitor *v, Error **errp);
> +
>  void visit_start_optional(Visitor *v, bool *present, const char *name,
>                            Error **errp);
>  void visit_end_optional(Visitor *v, Error **errp);
>  void visit_get_next_type(Visitor *v, int *obj, const int *qtypes,
>                           const char *name, Error **errp);
> +/* Blocks of guest memory,disk or otherwise opaque data that there is a lot
> + * of and must be handled efficiently. 'async' true if the write can happen
> + * 'later'
> + */
> +void visit_type_buffer(Visitor *v, void *data, size_t len, bool async,
> +                       const char *name, Error **errp);
>  void visit_type_enum(Visitor *v, int *obj, const char *strings[],
>                       const char *kind, const char *name, Error **errp);
>  void visit_type_int(Visitor *v, int64_t *obj, const char *name, Error **errp);
> @@ -58,6 +69,46 @@ void visit_type_int64(Visitor *v, int64_t *obj, const char *name, Error **errp);
>  void visit_type_size(Visitor *v, uint64_t *obj, const char *name, Error **errp);
>  void visit_type_bool(Visitor *v, bool *obj, const char *name, Error **errp);
>  void visit_type_str(Visitor *v, char **obj, const char *name, Error **errp);
> +/* A string no more than 256 (including term) characters in length */
> +void visit_type_str256(Visitor *v, char *obj, const char *name, Error **errp);
>  void visit_type_number(Visitor *v, double *obj, const char *name, Error **errp);
> +void visit_destroy(Visitor *v, Error **errp);
> +
> +/* Type of visitor, used where actions have to be taken when (de)serializing */
> +bool visitor_loading(Visitor *v);
> +bool visitor_saving(Visitor *v);
> +
> +typedef enum {
> +    VISIT_SEQ_COMPAT_BYTE0TERM,      /* list terminated with a 0 byte */
> +    VISIT_SEQ_COMPAT_FILE,           /* The top level file object */
> +    VISIT_SEQ_COMPAT_SUBSECLIST,     /* list terminated by
> +                                        historical complexity */
> +    VISIT_SEQ_COMPAT_SUBSECTION,     /* One subsection */
> +    VISIT_SEQ_COMPAT_SECTION_HEADER, /* SECTION_FULL/START, header + name */
> +    VISIT_SEQ_COMPAT_SECTION_MIN,    /* SECTION_PART/END - minimal header */
> +    VISIT_SEQ_COMPAT_RAMSECLIST,     /* list terminated by int64 bit
> +                                        RAM_SAVE_FLAG_EOS */
> +    VISIT_SEQ_COMPAT_RAMSECENTRY,    /* Entry in RAM Sec list */
> +    VISIT_SEQ_COMPAT_VMSTATE,        /* One VMState */
> +    VISIT_SEQ_COMPAT_BLOB            /* A binary old-format blob */
> +} Visit_seq_compat_mode;

VisitorSeqCompatMode

We have visit_ for functions but Visitor for types ...

> +
> +/* Start a sequence of items (which may be of unknown length and unknown
> + * mix of some subset of types), specify a compatibility mode that's only
> + * used by an implementation trying to match the existing binary migration
> + * format.
> + * opaque is compat_mode specific
> + */
> +void visit_start_sequence_compat(Visitor *v, const char *name,
> +                                 Visit_seq_compat_mode compat_mode,
> +                                 void *opaque,
> +                                 Error **errp);
> +/* Use visit_get_next_type for each entry including the first */
> +void visit_end_sequence_compat(Visitor *v, const char *name,
> +                                 Visit_seq_compat_mode compat_mode,
> +                                 Error **errp);
> +
> +/* Don't Use! - lets us move forward until we can get rid of all file uses */
> +QEMUFile *visitor_get_qemufile(Visitor *v);
>  
>  #endif
> diff --git a/qapi/qapi-visit-core.c b/qapi/qapi-visit-core.c
> index 6451a21..2d20fde 100644
> --- a/qapi/qapi-visit-core.c
> +++ b/qapi/qapi-visit-core.c
> @@ -84,6 +84,28 @@ void visit_end_list(Visitor *v, Error **errp)
>      v->end_list(v, errp);
>  }
>  
> +void visit_start_array(Visitor *v, void **obj, const char *name,
> +                       size_t elem_count, size_t elem_size, Error **errp)
> +{
> +    if (!error_is_set(errp)) {
> +        v->start_array(v, obj, name, elem_count, elem_size, errp);
> +    }
> +}
> +
> +void visit_next_array(Visitor *v, Error **errp)
> +{
> +    if (!error_is_set(errp)) {
> +        v->next_array(v, errp);
> +    }
> +}
> +
> +void visit_end_array(Visitor *v, Error **errp)
> +{
> +    if (!error_is_set(errp)) {
> +        v->end_array(v, errp);
> +    }
> +}
> +
>  void visit_start_optional(Visitor *v, bool *present, const char *name,
>                            Error **errp)
>  {
> @@ -107,6 +129,14 @@ void visit_get_next_type(Visitor *v, int *obj, const int *qtypes,
>      }
>  }
>  
> +void visit_type_buffer(Visitor *v, void *data, size_t len, bool async,
> +                       const char *name, Error **errp)
> +{
> +    if (!error_is_set(errp)) {
> +        v->type_buffer(v, data, len, async, name, errp);
> +    }
> +}
> +
>  void visit_type_enum(Visitor *v, int *obj, const char *strings[],
>                       const char *kind, const char *name, Error **errp)
>  {
> @@ -291,6 +321,13 @@ void visit_type_str(Visitor *v, char **obj, const char *name, Error **errp)
>      }
>  }
>  
> +void visit_type_str256(Visitor *v, char *obj, const char *name, Error **errp)
> +{
> +    if (!error_is_set(errp)) {
> +        v->type_str256(v, obj, name, errp);
> +    }
> +}
> +
>  void visit_type_number(Visitor *v, double *obj, const char *name, Error **errp)
>  {
>      if (!error_is_set(errp)) {
> @@ -347,3 +384,46 @@ void input_type_enum(Visitor *v, int *obj, const char *strings[],
>      g_free(enum_str);
>      *obj = value;
>  }
> +
> +void visit_destroy(Visitor *v, Error **errp)
> +{
> +    v->destroy(v, errp);
> +}
> +
> +void visit_start_sequence_compat(Visitor *v, const char *name,
> +                                 Visit_seq_compat_mode compat_mode,
> +                                 void *opaque, Error **errp)
> +{
> +    if (error_is_set(errp)) {
> +        return;
> +    }
> +
> +    v->start_sequence_compat(v, name, compat_mode, opaque, errp);
> +}
> +
> +void visit_end_sequence_compat(Visitor *v, const char *name,
> +                                 Visit_seq_compat_mode compat_mode,
> +                               Error **errp)
> +{
> +    if (error_is_set(errp)) {
> +        return;
> +    }
> +
> +    v->end_sequence_compat(v, name, compat_mode, errp);
> +}
> +
> +QEMUFile *visitor_get_qemufile(Visitor *v)
> +{
> +    return v->get_qemufile(v);
> +}
> +
> +bool visitor_loading(Visitor *v)
> +{
> +    return v->flags & VISITOR_LOADING;
> +}
> +
> +bool visitor_saving(Visitor *v)
> +{
> +    return v->flags & VISITOR_SAVING;
> +}
> +
> -- 
> 1.9.0

  parent reply	other threads:[~2014-05-07  9:52 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1398271069-22057-1-git-send-email-dgilbert@redhat.com>
     [not found] ` <1398271069-22057-6-git-send-email-dgilbert@redhat.com>
2014-05-07  9:47   ` [Qemu-devel] [RFC PATCH v2 05/16] Header/constant/types fixes for visitors Michael S. Tsirkin
2014-05-07 10:33     ` Dr. David Alan Gilbert
     [not found] ` <1398271069-22057-2-git-send-email-dgilbert@redhat.com>
2014-05-07  9:50   ` Michael S. Tsirkin [this message]
2014-05-07 10:23     ` [Qemu-devel] [RFC PATCH v2 01/16] Visitor: Add methods for migration format use Dr. David Alan Gilbert
2014-05-07 10:32       ` Michael S. Tsirkin
     [not found] ` <5357EF56.4010703@redhat.com>
     [not found]   ` <20140423171622.GG2516@work-vm>
     [not found]     ` <87sip3dvsj.fsf@blackfin.pond.sub.org>
     [not found]       ` <20140424082059.GB2459@work-vm>
     [not found]         ` <20140424082923.GA31845@redhat.com>
     [not found]           ` <87wqeduc0d.fsf@blackfin.pond.sub.org>
2014-05-06 18:58             ` [Qemu-devel] [RFC PATCH v2 00/16] visitor+BER migration format Dr. David Alan Gilbert
2014-05-06 20:26               ` Michael S. Tsirkin
2014-05-07  5:49                 ` Markus Armbruster
2014-05-07  9:22                   ` Dr. David Alan Gilbert
     [not found]     ` <5357FCA9.8040801@redhat.com>
     [not found]       ` <20140423175410.GA28308@redhat.com>
     [not found]         ` <53580D27.2080507@redhat.com>
2014-05-07  9:57           ` Michael S. Tsirkin
     [not found] ` <1398271069-22057-16-git-send-email-dgilbert@redhat.com>
2014-05-07 10:02   ` [Qemu-devel] [RFC PATCH v2 15/16] Wire in BER visitors Michael S. Tsirkin
2014-05-07 10:08     ` Dr. David Alan Gilbert

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=20140507095037.GA12259@redhat.com \
    --to=mst@redhat.com \
    --cc=afaerber@suse.de \
    --cc=agraf@suse.de \
    --cc=aliguori@amazon.com \
    --cc=dgilbert@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=stefanb@linux.vnet.ibm.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.