|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 REPOST 09/12] x86/hvm/ioreq: simplify code and use consistent naming
On Tue, Aug 22, 2017 at 03:51:03PM +0100, Paul Durrant wrote:
> This patch re-works much of the IOREQ server initialization and teardown
> code:
>
> - The hvm_map/unmap_ioreq_gfn() functions are expanded to call through
> to hvm_alloc/free_ioreq_gfn() rather than expecting them to be called
> separately by outer functions.
> - Several functions now test the validity of the hvm_ioreq_page gfn value
> to determine whether they need to act. This means can be safely called
> for the bufioreq page even when it is not used.
> - hvm_add/remove_ioreq_gfn() simply return in the case of the default
> IOREQ server so callers no longer need to test before calling.
> - hvm_ioreq_server_setup_pages() is renamed to hvm_ioreq_server_map_pages()
> to mirror the existing hvm_ioreq_server_unmap_pages().
>
> All of this significantly shortens the code.
>
> Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
> ---
> Cc: Jan Beulich <jbeulich@xxxxxxxx>
> Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> xen/arch/x86/hvm/ioreq.c | 181
> ++++++++++++++++++-----------------------------
> 1 file changed, 69 insertions(+), 112 deletions(-)
>
> diff --git a/xen/arch/x86/hvm/ioreq.c b/xen/arch/x86/hvm/ioreq.c
> index 5737082238..edfb394c59 100644
> --- a/xen/arch/x86/hvm/ioreq.c
> +++ b/xen/arch/x86/hvm/ioreq.c
> @@ -181,63 +181,76 @@ bool handle_hvm_io_completion(struct vcpu *v)
> return true;
> }
>
> -static int hvm_alloc_ioreq_gfn(struct domain *d, unsigned long *gfn)
> +static unsigned long hvm_alloc_ioreq_gfn(struct hvm_ioreq_server *s)
gfn_t as the return type instead? I see that you are moving it, so I
won't insist (I assume there's also some other refactoring involved in
making this return gfn_t). I see there are also further uses of
unsigned long to store gfns, I'm not going to point those out.
> {
> + struct domain *d = s->domain;
> unsigned int i;
> - int rc;
>
> - rc = -ENOMEM;
> + ASSERT(!s->is_default);
> +
> for ( i = 0; i < sizeof(d->arch.hvm_domain.ioreq_gfn.mask) * 8; i++ )
> {
> if ( test_and_clear_bit(i, &d->arch.hvm_domain.ioreq_gfn.mask) )
> {
The braces are not strictly needed anymore, but that's a question of
taste.
> - *gfn = d->arch.hvm_domain.ioreq_gfn.base + i;
> - rc = 0;
> - break;
> + return d->arch.hvm_domain.ioreq_gfn.base + i;
> }
> }
>
> - return rc;
> + return gfn_x(INVALID_GFN);
> }
>
> -static void hvm_free_ioreq_gfn(struct domain *d, unsigned long gfn)
> +static void hvm_free_ioreq_gfn(struct hvm_ioreq_server *s,
> + unsigned long gfn)
> {
> + struct domain *d = s->domain;
> unsigned int i = gfn - d->arch.hvm_domain.ioreq_gfn.base;
>
> - if ( gfn != gfn_x(INVALID_GFN) )
> - set_bit(i, &d->arch.hvm_domain.ioreq_gfn.mask);
> + ASSERT(!s->is_default);
I would maybe add a gfn != gfn_x(INVALID_GFN) in the ASSERT.
> +
> + set_bit(i, &d->arch.hvm_domain.ioreq_gfn.mask);
> }
>
> -static void hvm_unmap_ioreq_page(struct hvm_ioreq_server *s, bool buf)
> +static void hvm_unmap_ioreq_gfn(struct hvm_ioreq_server *s, bool buf)
I'm not sure if you need the buf parameter, it seems in all cases you
want to unmap everything when calling hvm_unmap_ioreq_gfn? (same
applies to hvm_remove_ioreq_gfn and hvm_add_ioreq_gfn)
> static int hvm_ioreq_server_map_pages(struct hvm_ioreq_server *s,
> - unsigned long ioreq_gfn,
> - unsigned long bufioreq_gfn)
> -{
> - int rc;
> -
> - rc = hvm_map_ioreq_page(s, false, ioreq_gfn);
> - if ( rc )
> - return rc;
> -
> - if ( bufioreq_gfn != gfn_x(INVALID_GFN) )
> - rc = hvm_map_ioreq_page(s, true, bufioreq_gfn);
> -
> - if ( rc )
> - hvm_unmap_ioreq_page(s, false);
> -
> - return rc;
> -}
> -
> -static int hvm_ioreq_server_setup_pages(struct hvm_ioreq_server *s,
> - bool handle_bufioreq)
> + bool handle_bufioreq)
> {
> - struct domain *d = s->domain;
> - unsigned long ioreq_gfn = gfn_x(INVALID_GFN);
> - unsigned long bufioreq_gfn = gfn_x(INVALID_GFN);
> - int rc;
> -
> - if ( s->is_default )
> - {
> - /*
> - * The default ioreq server must handle buffered ioreqs, for
> - * backwards compatibility.
> - */
> - ASSERT(handle_bufioreq);
> - return hvm_ioreq_server_map_pages(s,
> - d->arch.hvm_domain.params[HVM_PARAM_IOREQ_PFN],
> - d->arch.hvm_domain.params[HVM_PARAM_BUFIOREQ_PFN]);
> - }
> + int rc = -ENOMEM;
No need to set rc, you are just overwriting it in the next line.
Roger.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |