Commit 148512e0 authored by Emil Condrea's avatar Emil Condrea Committed by Stefano Stabellini
Browse files

xen: Prepare xendev qtail to be shared with frontends



 * move xendevs qtail to xen_pvdev.c
 * change xen_be_get_xendev to use a new function: xen_pv_insert_xendev

Signed-off-by: default avatarEmil Condrea <emilcondrea@gmail.com>
Signed-off-by: default avatarStefano Stabellini <sstabellini@kernel.org>
Signed-off-by: default avatarQuan Xu <xuquan8@huawei.com>
Acked-by: default avatarAnthony PERARD <anthony.perard@citrix.com>
parent 31c17aa5
Loading
Loading
Loading
Loading
+1 −50
Original line number Diff line number Diff line
@@ -54,8 +54,6 @@ struct xs_dirs {
static QTAILQ_HEAD(xs_dirs_head, xs_dirs) xs_cleanup =
    QTAILQ_HEAD_INITIALIZER(xs_cleanup);

static QTAILQ_HEAD(XenDeviceHead, XenDevice) xendevs =
    QTAILQ_HEAD_INITIALIZER(xendevs);
static int debug;

static void xenstore_cleanup_dir(char *dir)
@@ -157,27 +155,6 @@ int xen_be_set_state(struct XenDevice *xendev, enum xenbus_state state)
    return 0;
}

/* ------------------------------------------------------------- */

struct XenDevice *xen_be_find_xendev(const char *type, int dom, int dev)
{
    struct XenDevice *xendev;

    QTAILQ_FOREACH(xendev, &xendevs, next) {
        if (xendev->dom != dom) {
            continue;
        }
        if (xendev->dev != dev) {
            continue;
        }
        if (strcmp(xendev->type, type) != 0) {
            continue;
        }
        return xendev;
    }
    return NULL;
}

/*
 * get xen backend device, allocate a new one if it doesn't exist.
 */
@@ -226,7 +203,7 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev,
        xendev->gnttabdev = NULL;
    }

    QTAILQ_INSERT_TAIL(&xendevs, xendev, next);
    xen_pv_insert_xendev(xendev);

    if (xendev->ops->alloc) {
        xendev->ops->alloc(xendev);
@@ -235,32 +212,6 @@ static struct XenDevice *xen_be_get_xendev(const char *type, int dom, int dev,
    return xendev;
}

/*
 * release xen backend device.
 */
static void xen_be_del_xendev(struct XenDevice *xendev)
{
    if (xendev->ops->free) {
        xendev->ops->free(xendev);
    }

    if (xendev->fe) {
        char token[XEN_BUFSIZE];
        snprintf(token, sizeof(token), "fe:%p", xendev);
        xs_unwatch(xenstore, xendev->fe, token);
        g_free(xendev->fe);
    }

    if (xendev->evtchndev != NULL) {
        xenevtchn_close(xendev->evtchndev);
    }
    if (xendev->gnttabdev != NULL) {
        xengnttab_close(xendev->gnttabdev);
    }

    QTAILQ_REMOVE(&xendevs, xendev, next);
    g_free(xendev);
}

/*
 * Sync internal data structures on xenstore updates.
+57 −0
Original line number Diff line number Diff line
@@ -22,7 +22,11 @@
#include "hw/xen/xen_backend.h"
#include "hw/xen/xen_pvdev.h"

/* private */
static int debug;
static QTAILQ_HEAD(XenDeviceHead, XenDevice) xendevs =
    QTAILQ_HEAD_INITIALIZER(xendevs);

/* ------------------------------------------------------------- */

int xenstore_write_str(const char *base, const char *node, const char *val)
@@ -206,3 +210,56 @@ int xen_be_send_notify(struct XenDevice *xendev)
{
    return xenevtchn_notify(xendev->evtchndev, xendev->local_port);
}

/* ------------------------------------------------------------- */

struct XenDevice *xen_be_find_xendev(const char *type, int dom, int dev)
{
    struct XenDevice *xendev;

    QTAILQ_FOREACH(xendev, &xendevs, next) {
        if (xendev->dom != dom) {
            continue;
        }
        if (xendev->dev != dev) {
            continue;
        }
        if (strcmp(xendev->type, type) != 0) {
            continue;
        }
        return xendev;
    }
    return NULL;
}

/*
 * release xen backend device.
 */
void xen_be_del_xendev(struct XenDevice *xendev)
{
    if (xendev->ops->free) {
        xendev->ops->free(xendev);
    }

    if (xendev->fe) {
        char token[XEN_BUFSIZE];
        snprintf(token, sizeof(token), "fe:%p", xendev);
        xs_unwatch(xenstore, xendev->fe, token);
        g_free(xendev->fe);
    }

    if (xendev->evtchndev != NULL) {
        xenevtchn_close(xendev->evtchndev);
    }
    if (xendev->gnttabdev != NULL) {
        xengnttab_close(xendev->gnttabdev);
    }

    QTAILQ_REMOVE(&xendevs, xendev, next);
    g_free(xendev);
}

void xen_pv_insert_xendev(struct XenDevice *xendev)
{
    QTAILQ_INSERT_TAIL(&xendevs, xendev, next);
}
+0 −1
Original line number Diff line number Diff line
@@ -27,7 +27,6 @@ int xenstore_read_fe_int(struct XenDevice *xendev, const char *node, int *ival);
int xenstore_read_fe_uint64(struct XenDevice *xendev, const char *node,
                            uint64_t *uval);

struct XenDevice *xen_be_find_xendev(const char *type, int dom, int dev);
void xen_be_check_state(struct XenDevice *xendev);

/* xen backend driver bits */
+4 −0
Original line number Diff line number Diff line
@@ -65,6 +65,10 @@ void xenstore_update(void *unused);
const char *xenbus_strstate(enum xenbus_state state);

void xen_be_evtchn_event(void *opaque);
void xen_pv_insert_xendev(struct XenDevice *xendev);
void xen_be_del_xendev(struct XenDevice *xendev);
struct XenDevice *xen_be_find_xendev(const char *type, int dom, int dev);

void xen_be_unbind_evtchn(struct XenDevice *xendev);
int xen_be_send_notify(struct XenDevice *xendev);