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: Emil Condrea <emilcondrea@gmail.com>
Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
Signed-off-by: Quan Xu <xuquan8@huawei.com>
Acked-by: Anthony PERARD <anthony.perard@citrix.com>
This commit is contained in:
Emil Condrea 2016-10-25 08:50:12 +03:00 committed by Stefano Stabellini
parent 31c17aa5c3
commit 148512e062
4 changed files with 62 additions and 51 deletions

View File

@ -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.

View File

@ -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);
}

View File

@ -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 */

View File

@ -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);