[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 2/2] ioreq-server: Support scatter page forwarding
>>> On 22.08.14 at 21:18, <wei.ye@xxxxxxxxx> wrote: Independent of my earlier and Paul's recent question regarding the need for all this code, a couple of mechanical comments: > @@ -744,6 +750,98 @@ static void hvm_ioreq_server_remove_all_vcpus(struct > hvm_ioreq_server *s) > spin_unlock(&s->lock); > } > > +static struct pglist_hash_table *hvm_ioreq_server_lookup_pglist_hash_table( > + struct pglist_hash_table *pglist_ht, uint64_t gpfn) > +{ > + unsigned int index = pglist_hash(gpfn); > + struct pglist_hash_table *entry; > + > + for ( entry = &pglist_ht[index]; entry != NULL; entry = entry->next ) > + if ( entry->gpfn != PGLIST_INVALID_GPFN && entry->gpfn == gpfn ) Please write efficient code: By making sure up front that gpfn isn't PGLIST_INVALID_GPFN, the left side of the && (executed on every loop iteration) can be dropped. > +static int hvm_map_pages_to_ioreq_server(struct domain *d, ioservid_t id, > + uint16_t set, uint16_t nr_pages, Pointless uses of uint16_t. The first one is bool_t, the second unsigned int. > + uint64_t *gpfn) And this one would conventionally by unsigned long * or xen_pfn_t *. > +{ > + struct hvm_ioreq_server *s; > + int rc; > + unsigned int i; > + p2m_type_t ot, nt; > + > + if ( set ) > + { > + ot = p2m_ram_rw; > + nt = p2m_mmio_write_dm; > + } > + else > + { > + ot = p2m_mmio_write_dm; > + nt = p2m_ram_rw; > + } > + > + spin_lock(&d->arch.hvm_domain.ioreq_server.lock); > + > + rc = -ENOENT; > + list_for_each_entry ( s, > + &d->arch.hvm_domain.ioreq_server.list, > + list_entry ) > + { > + if ( s != d->arch.hvm_domain.default_ioreq_server && > + s->id == id ) > + { > + spin_lock(&s->pglist_hash_lock); > + > + for ( i = 0; i < nr_pages; i++ ) Up to 64k iterations without preemption is already quite a lot. Did you measure how much worst case input would take to process? (Note that I raised this question before without you addressing it.) > --- a/xen/include/public/hvm/hvm_op.h > +++ b/xen/include/public/hvm/hvm_op.h > @@ -367,6 +367,18 @@ struct xen_hvm_set_ioreq_server_state { > typedef struct xen_hvm_set_ioreq_server_state > xen_hvm_set_ioreq_server_state_t; > DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_ioreq_server_state_t); > > +#define HVMOP_map_pages_to_ioreq_server 23 > +#define XEN_IOREQSVR_MAX_MAP_BATCH 128 > +struct xen_hvm_map_pages_to_ioreq_server { > + domid_t domid; /* IN - domain to be serviced */ > + ioservid_t id; /* IN - server id */ > + uint16_t set; /* IN - 1: map pages, 0: unmap pages */ The comment doesn't match the implementation. > + uint16_t nr_pages; /* IN - page count */ > + uint64_t page_list[XEN_IOREQSVR_MAX_MAP_BATCH]; /* IN - gpfn list */ Ah, so the iteration limit above really is XEN_IOREQSVR_MAX_MAP_BATCH. That's fine then, except that you need to bound check the input value before iterating. However I wonder whether you really want to bake such a fixed limit into the hypercall. Using a handle here and limiting the count to a (currently) sane maximum in the implementation would then allow for bumping the count in the future. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |