[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 1/2] Introduce a new 'connected' xendev op called when Connected.



CC'ing Gerd.

On Wed, 7 Jul 2010, John Haxby wrote:
> Rename the existing xendev 'connect' op to 'initialised' and introduce
> a new 'connected' op.  This new op, if defined, is called when the
> backend is connected.  Note that since there is no state transition this
> may be called more than once.
> 
> Signed-off-by: John Haxby <john.haxby@xxxxxxxxxx>

Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>

> ---
>  hw/xen_backend.c |   39 +++++++++++++++++++++++++++++++++------
>  hw/xen_backend.h |    3 ++-
>  hw/xen_console.c |    4 ++--
>  hw/xenfb.c       |    8 ++++----
>  4 files changed, 41 insertions(+), 13 deletions(-)
> 
> diff --git a/hw/xen_backend.c b/hw/xen_backend.c
> index 8c92739..afd0bf2 100644
> --- a/hw/xen_backend.c
> +++ b/hw/xen_backend.c
> @@ -401,13 +401,13 @@ static int xen_be_try_init(struct XenDevice *xendev)
>  }
>  
>  /*
> - * Try to connect xendev.  Depends on the frontend being ready
> + * Try to initialise xendev.  Depends on the frontend being ready
>   * for it (shared ring and evtchn info in xenstore, state being
>   * Initialised or Connected).
>   *
>   * Goes to Connected on success.
>   */
> -static int xen_be_try_connect(struct XenDevice *xendev)
> +static int xen_be_try_initialise(struct XenDevice *xendev)
>  {
>      int rc = 0;
>  
> @@ -421,10 +421,10 @@ static int xen_be_try_connect(struct XenDevice *xendev)
>       }
>      }
>  
> -    if (xendev->ops->connect)
> -     rc = xendev->ops->connect(xendev);
> +    if (xendev->ops->initialise)
> +     rc = xendev->ops->initialise(xendev);
>      if (rc != 0) {
> -     xen_be_printf(xendev, 0, "connect() failed\n");
> +     xen_be_printf(xendev, 0, "initialise() failed\n");
>       return rc;
>      }
>  
> @@ -433,6 +433,28 @@ static int xen_be_try_connect(struct XenDevice *xendev)
>  }
>  
>  /*
> + * Try to let xendev know that it is connected.  Depends on the
> + * frontend being Connected.  Note that this may be called more
> + * than once since the backend state is not modified.
> + */
> +static void xen_be_try_connected(struct XenDevice *xendev)
> +{
> +    if (!xendev->ops->connected)
> +     return;
> +
> +    if (xendev->fe_state != XenbusStateConnected) {
> +     if (xendev->ops->flags & DEVOPS_FLAG_IGNORE_STATE) {
> +         xen_be_printf(xendev, 2, "frontend not ready, ignoring\n");
> +     } else {
> +         xen_be_printf(xendev, 2, "frontend not ready (yet)\n");
> +         return;
> +     }
> +    }
> +
> +    xendev->ops->connected(xendev);
> +}
> +
> +/*
>   * Teardown connection.
>   *
>   * Goes to Closed when done.
> @@ -484,7 +506,12 @@ void xen_be_check_state(struct XenDevice *xendev)
>           rc = xen_be_try_init(xendev);
>           break;
>       case XenbusStateInitWait:
> -         rc = xen_be_try_connect(xendev);
> +         rc = xen_be_try_initialise(xendev);
> +         break;
> +     case XenbusStateConnected:
> +         /* xendev->be_state doesn't change */
> +         xen_be_try_connected(xendev);
> +         rc = -1;
>           break;
>          case XenbusStateClosed:
>              rc = xen_be_try_reset(xendev);
> diff --git a/hw/xen_backend.h b/hw/xen_backend.h
> index 672a857..7e89ef4 100644
> --- a/hw/xen_backend.h
> +++ b/hw/xen_backend.h
> @@ -19,7 +19,8 @@ struct XenDevOps {
>      uint32_t  flags;
>      void      (*alloc)(struct XenDevice *xendev);
>      int       (*init)(struct XenDevice *xendev);
> -    int       (*connect)(struct XenDevice *xendev);
> +    int       (*initialise)(struct XenDevice *xendev);
> +    void      (*connected)(struct XenDevice *xendev);
>      void      (*event)(struct XenDevice *xendev);
>      void      (*disconnect)(struct XenDevice *xendev);
>      int       (*free)(struct XenDevice *xendev);
> diff --git a/hw/xen_console.c b/hw/xen_console.c
> index f1c2f8b..a4e97ca 100644
> --- a/hw/xen_console.c
> +++ b/hw/xen_console.c
> @@ -209,7 +209,7 @@ static int con_init(struct XenDevice *xendev)
>      return 0;
>  }
>  
> -static int con_connect(struct XenDevice *xendev)
> +static int con_initialise(struct XenDevice *xendev)
>  {
>      struct XenConsole *con = container_of(xendev, struct XenConsole, xendev);
>      int limit;
> @@ -278,7 +278,7 @@ struct XenDevOps xen_console_ops = {
>      .size       = sizeof(struct XenConsole),
>      .flags      = DEVOPS_FLAG_IGNORE_STATE|DEVOPS_FLAG_NEED_GNTDEV,
>      .init       = con_init,
> -    .connect    = con_connect,
> +    .initialise = con_initialise,
>      .event      = con_event,
>      .disconnect = con_disconnect,
>  };
> diff --git a/hw/xenfb.c b/hw/xenfb.c
> index 97960ba..c96cfe6 100644
> --- a/hw/xenfb.c
> +++ b/hw/xenfb.c
> @@ -361,7 +361,7 @@ static int input_init(struct XenDevice *xendev)
>      return 0;
>  }
>  
> -static int input_connect(struct XenDevice *xendev)
> +static int input_initialise(struct XenDevice *xendev)
>  {
>      struct XenInput *in = container_of(xendev, struct XenInput, c.xendev);
>      int rc;
> @@ -863,7 +863,7 @@ static int fb_init(struct XenDevice *xendev)
>      return 0;
>  }
>  
> -static int fb_connect(struct XenDevice *xendev)
> +static int fb_initialise(struct XenDevice *xendev)
>  {
>      struct XenFB *fb = container_of(xendev, struct XenFB, c.xendev);
>      struct xenfb_page *fb_page;
> @@ -957,7 +957,7 @@ static void fb_event(struct XenDevice *xendev)
>  struct XenDevOps xen_kbdmouse_ops = {
>      .size       = sizeof(struct XenInput),
>      .init       = input_init,
> -    .connect    = input_connect,
> +    .initialise = input_initialise,
>      .disconnect = input_disconnect,
>      .event      = input_event,
>  };
> @@ -965,7 +965,7 @@ struct XenDevOps xen_kbdmouse_ops = {
>  struct XenDevOps xen_framebuffer_ops = {
>      .size       = sizeof(struct XenFB),
>      .init       = fb_init,
> -    .connect    = fb_connect,
> +    .initialise = fb_initialise,
>      .disconnect = fb_disconnect,
>      .event      = fb_event,
>      .frontend_changed = fb_frontend_changed,
> -- 
> 1.7.1
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.