WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH 1/2] Introduce a new 'connected' xendev op called whe

To: xen-devel@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-devel] [PATCH 1/2] Introduce a new 'connected' xendev op called when Connected.
From: John Haxby <john.haxby@xxxxxxxxxx>
Date: Wed, 7 Jul 2010 14:40:01 +0100
Cc: John Haxby <john.haxby@xxxxxxxxxx>
Delivery-date: Wed, 07 Jul 2010 06:43:24 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <1278510002-20735-1-git-send-email-john.haxby@xxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <1278510002-20735-1-git-send-email-john.haxby@xxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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>
---
 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