[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v3 1/4] x86/hvm: stop passing explicit domid to hvm_create_ioreq_server()
Only in the legacy 'default server' case do we pass anything other than current->domain->domain_id, and in that case we pass the value of HVM_PARAM_DM_DOMAIN. The only known user of HVM_PARAM_DM_DOMAIN is qemu-trad, which always sets it to DOMID_SELF (ignoring the return value of xc_set_hvm_param) [1] and never reads it. This patch: - Disallows setting HVM_PARAM_DM_DOMAIN to anything other than DOMID_SELF and removes the call to hvm_set_dm_domain(). - Stops passing a domid to hvm_create_ioreq_server() - Changes hvm_create_ioreq_server() to always set current->domain->domain_id as the domid of the emulating domain - Removes the hvm_set_dm_domain() implementation since it is no longer needed. [1] http://xenbits.xen.org/gitweb/?p=qemu-xen-traditional.git;a=blob;f=hw/xen_machine_fv.c;#l299 Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx> Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx> --- Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> v2: - Remove use of HVM_PARAM_DM_DOMAIN from the ioreq server code --- xen/arch/x86/hvm/dm.c | 5 +-- xen/arch/x86/hvm/hvm.c | 11 +++--- xen/arch/x86/hvm/ioreq.c | 88 +++-------------------------------------- xen/include/asm-x86/hvm/ioreq.h | 7 +--- 4 files changed, 15 insertions(+), 96 deletions(-) diff --git a/xen/arch/x86/hvm/dm.c b/xen/arch/x86/hvm/dm.c index 7788577a73..96b0d13f2f 100644 --- a/xen/arch/x86/hvm/dm.c +++ b/xen/arch/x86/hvm/dm.c @@ -402,7 +402,6 @@ static int dm_op(const struct dmop_args *op_args) { case XEN_DMOP_create_ioreq_server: { - struct domain *curr_d = current->domain; struct xen_dm_op_create_ioreq_server *data = &op.u.create_ioreq_server; @@ -412,8 +411,8 @@ static int dm_op(const struct dmop_args *op_args) if ( data->pad[0] || data->pad[1] || data->pad[2] ) break; - rc = hvm_create_ioreq_server(d, curr_d->domain_id, false, - data->handle_bufioreq, &data->id); + rc = hvm_create_ioreq_server(d, false, data->handle_bufioreq, + &data->id); break; } diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index b3a6e1f740..5759c73dd4 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -4205,10 +4205,11 @@ static int hvmop_set_param( domctl_lock_release(); break; case HVM_PARAM_DM_DOMAIN: - if ( a.value == DOMID_SELF ) - a.value = curr_d->domain_id; + /* The only value this should ever be set to is DOMID_SELF */ + if ( a.value != DOMID_SELF ) + rc = -EINVAL; - rc = hvm_set_dm_domain(d, a.value); + a.value = curr_d->domain_id; break; case HVM_PARAM_ACPI_S_STATE: rc = 0; @@ -4449,9 +4450,7 @@ static int hvmop_get_param( */ if ( !d->creation_finished ) { - domid_t domid = d->arch.hvm_domain.params[HVM_PARAM_DM_DOMAIN]; - - rc = hvm_create_ioreq_server(d, domid, true, + rc = hvm_create_ioreq_server(d, true, HVM_IOREQSRV_BUFIOREQ_LEGACY, NULL); if ( rc != 0 && rc != -EEXIST ) goto out; diff --git a/xen/arch/x86/hvm/ioreq.c b/xen/arch/x86/hvm/ioreq.c index 7e66965bcd..2b9e5562dd 100644 --- a/xen/arch/x86/hvm/ioreq.c +++ b/xen/arch/x86/hvm/ioreq.c @@ -599,16 +599,15 @@ static void hvm_ioreq_server_disable(struct hvm_ioreq_server *s, } static int hvm_ioreq_server_init(struct hvm_ioreq_server *s, - struct domain *d, domid_t domid, - bool is_default, int bufioreq_handling, - ioservid_t id) + struct domain *d, bool is_default, + int bufioreq_handling, ioservid_t id) { struct vcpu *v; int rc; s->id = id; s->domain = d; - s->domid = domid; + s->domid = current->domain->domain_id; spin_lock_init(&s->lock); INIT_LIST_HEAD(&s->ioreq_vcpu_list); @@ -680,9 +679,8 @@ static ioservid_t next_ioservid(struct domain *d) return id; } -int hvm_create_ioreq_server(struct domain *d, domid_t domid, - bool is_default, int bufioreq_handling, - ioservid_t *id) +int hvm_create_ioreq_server(struct domain *d, bool is_default, + int bufioreq_handling, ioservid_t *id) { struct hvm_ioreq_server *s; int rc; @@ -702,7 +700,7 @@ int hvm_create_ioreq_server(struct domain *d, domid_t domid, if ( is_default && d->arch.hvm_domain.default_ioreq_server != NULL ) goto fail2; - rc = hvm_ioreq_server_init(s, d, domid, is_default, bufioreq_handling, + rc = hvm_ioreq_server_init(s, d, is_default, bufioreq_handling, next_ioservid(d)); if ( rc ) goto fail3; @@ -1089,80 +1087,6 @@ void hvm_destroy_all_ioreq_servers(struct domain *d) spin_unlock_recursive(&d->arch.hvm_domain.ioreq_server.lock); } -static int hvm_replace_event_channel(struct vcpu *v, domid_t remote_domid, - evtchn_port_t *p_port) -{ - int old_port, new_port; - - new_port = alloc_unbound_xen_event_channel(v->domain, v->vcpu_id, - remote_domid, NULL); - if ( new_port < 0 ) - return new_port; - - /* xchg() ensures that only we call free_xen_event_channel(). */ - old_port = xchg(p_port, new_port); - free_xen_event_channel(v->domain, old_port); - return 0; -} - -int hvm_set_dm_domain(struct domain *d, domid_t domid) -{ - struct hvm_ioreq_server *s; - int rc = 0; - - spin_lock_recursive(&d->arch.hvm_domain.ioreq_server.lock); - - /* - * Lack of ioreq server is not a failure. HVM_PARAM_DM_DOMAIN will - * still be set and thus, when the server is created, it will have - * the correct domid. - */ - s = d->arch.hvm_domain.default_ioreq_server; - if ( !s ) - goto done; - - domain_pause(d); - spin_lock(&s->lock); - - if ( s->domid != domid ) - { - struct hvm_ioreq_vcpu *sv; - - list_for_each_entry ( sv, - &s->ioreq_vcpu_list, - list_entry ) - { - struct vcpu *v = sv->vcpu; - - if ( v->vcpu_id == 0 ) - { - rc = hvm_replace_event_channel(v, domid, - &s->bufioreq_evtchn); - if ( rc ) - break; - - d->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_EVTCHN] = - s->bufioreq_evtchn; - } - - rc = hvm_replace_event_channel(v, domid, &sv->ioreq_evtchn); - if ( rc ) - break; - - hvm_update_ioreq_evtchn(s, sv); - } - - s->domid = domid; - } - - spin_unlock(&s->lock); - domain_unpause(d); - - done: - spin_unlock_recursive(&d->arch.hvm_domain.ioreq_server.lock); - return rc; -} - struct hvm_ioreq_server *hvm_select_ioreq_server(struct domain *d, ioreq_t *p) { diff --git a/xen/include/asm-x86/hvm/ioreq.h b/xen/include/asm-x86/hvm/ioreq.h index 1829fcf43e..1bd1a02f23 100644 --- a/xen/include/asm-x86/hvm/ioreq.h +++ b/xen/include/asm-x86/hvm/ioreq.h @@ -23,9 +23,8 @@ bool hvm_io_pending(struct vcpu *v); bool handle_hvm_io_completion(struct vcpu *v); bool is_ioreq_server_page(struct domain *d, const struct page_info *page); -int hvm_create_ioreq_server(struct domain *d, domid_t domid, - bool is_default, int bufioreq_handling, - ioservid_t *id); +int hvm_create_ioreq_server(struct domain *d, bool is_default, + int bufioreq_handling, ioservid_t *id); int hvm_destroy_ioreq_server(struct domain *d, ioservid_t id); int hvm_get_ioreq_server_info(struct domain *d, ioservid_t id, unsigned long *ioreq_gfn, @@ -46,8 +45,6 @@ int hvm_all_ioreq_servers_add_vcpu(struct domain *d, struct vcpu *v); void hvm_all_ioreq_servers_remove_vcpu(struct domain *d, struct vcpu *v); void hvm_destroy_all_ioreq_servers(struct domain *d); -int hvm_set_dm_domain(struct domain *d, domid_t domid); - struct hvm_ioreq_server *hvm_select_ioreq_server(struct domain *d, ioreq_t *p); int hvm_send_ioreq(struct hvm_ioreq_server *s, ioreq_t *proto_p, -- 2.11.0 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |