mirror of https://gitee.com/openkylin/qemu.git
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:
parent
31c17aa5c3
commit
148512e062
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue