[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 4/4] xen/x86: Rework inclusion between struct pirq and struct hvm_pirq_dpci
On 13.01.2020 22:33, Julien Grall wrote: > --- a/xen/arch/x86/hvm/irq.c > +++ b/xen/arch/x86/hvm/irq.c > @@ -29,7 +29,8 @@ > > bool hvm_domain_use_pirq(const struct domain *d, const struct pirq *pirq) > { > - return is_hvm_domain(d) && pirq && pirq->arch.hvm.emuirq != IRQ_UNBOUND; > + return is_hvm_domain(d) && pirq && > + const_pirq_dpci(pirq)->emuirq != IRQ_UNBOUND; > } > > /* Must be called with hvm_domain->irq_lock hold */ > @@ -396,7 +397,7 @@ int hvm_inject_msi(struct domain *d, uint64_t addr, > uint32_t data) > struct pirq *info = pirq_info(d, pirq); > > /* if it is the first time, allocate the pirq */ > - if ( !info || info->arch.hvm.emuirq == IRQ_UNBOUND ) > + if ( !info || pirq_dpci(info)->emuirq == IRQ_UNBOUND ) > { > int rc; > > @@ -409,7 +410,7 @@ int hvm_inject_msi(struct domain *d, uint64_t addr, > uint32_t data) > if ( !info ) > return -EBUSY; > } > - else if ( info->arch.hvm.emuirq != IRQ_MSI_EMU ) > + else if ( pirq_dpci(info)->emuirq != IRQ_MSI_EMU ) > return -EINVAL; > send_guest_pirq(d, info); > return 0; All of these uses (and others further down) make pretty clear that the emuirq field doesn't belong in the structure you put it in - the 'd' in dpci stands for "direct" afaik, and the field is for a certain variant of emulation of interrupt delivery into guests, i.e. not really pass-through focused at all. > @@ -171,8 +172,26 @@ struct hvm_pirq_dpci { > struct hvm_gmsi_info gmsi; > struct timer timer; > struct list_head softirq_list; > + int emuirq; > + struct pirq pirq; > }; > > +#define pirq_dpci(p) \ > + ((p) ? container_of(p, struct hvm_pirq_dpci, pirq) : NULL) > +#define const_pirq_dpci(p) \ > + ((p) ? container_of(p, const struct hvm_pirq_dpci, pirq) : NULL) > + > +#define dpci_pirq(pd) (&(pd)->pirq) > + > +#define domain_pirq_to_emuirq(d, p) ({ \ > + struct pirq *__pi = pirq_info(d, p); \ > + __pi ? pirq_dpci(__pi)->emuirq : IRQ_UNBOUND; \ > +}) > +#define domain_emuirq_to_pirq(d, emuirq) ({ \ > + void *__ret = radix_tree_lookup(&(d)->arch.hvm.emuirq_pirq, emuirq);\ > + __ret ? radix_tree_ptr_to_int(__ret) : IRQ_UNBOUND; \ > +}) While for the latter you merely move the bogus double-leading- underscore macro local variable (which on this occasion I'd like to ask anyway to be changed), you actively introduce a new similar name space violation in the domain_pirq_to_emuirq(). > @@ -133,17 +132,10 @@ DECLARE_PER_CPU(unsigned int, irq_count); > > struct arch_pirq { > int irq; > - union { > - struct hvm_pirq { > - int emuirq; > - struct hvm_pirq_dpci dpci; > - } hvm; > - }; > + /* Is the PIRQ associated to an HVM domain? */ > + bool hvm; It looks like this field is needed for only arch_free_pirq_struct(). As it'll make a difference to struct pirq's size, can you not get away without it? All (perhaps indirect) callers of the function know the domain, after all. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |