[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [Patch RFC 03/13] vt-d: Track the Device-TLB invalidation status in an invalidation table.



>> >>> On 29.09.2015 at 17:24 <JBeulich@xxxxxxxx> wrote:
> >>> On 16.09.15 at 15:23, <quan.xu@xxxxxxxxx> wrote:
> > @@ -139,6 +140,7 @@ static int queue_invalidate_wait(struct iommu *iommu,
> >      unsigned long flags;
> >      u64 entry_base;
> >      struct qinval_entry *qinval_entry, *qinval_entries;
> > +    struct domain *d;
> >
> >      spin_lock_irqsave(&iommu->register_lock, flags);
> >      index = qinval_next_index(iommu); @@ -152,9 +154,22 @@ static int
> > queue_invalidate_wait(struct iommu *iommu,
> >      qinval_entry->q.inv_wait_dsc.lo.sw = sw;
> >      qinval_entry->q.inv_wait_dsc.lo.fn = fn;
> >      qinval_entry->q.inv_wait_dsc.lo.res_1 = 0;
> > -    qinval_entry->q.inv_wait_dsc.lo.sdata = QINVAL_STAT_DONE;
> >      qinval_entry->q.inv_wait_dsc.hi.res_1 = 0;
> > -    qinval_entry->q.inv_wait_dsc.hi.saddr = virt_to_maddr(&poll_slot) >> 2;
> > +
> > +    if ( iflag )
> > +    {
> > +        d = rcu_lock_domain_by_id(iommu->domid_map[device_id]);
> > +        if ( d == NULL )
> > +            return -ENODATA;
> > +
> > +        qinval_entry->q.inv_wait_dsc.lo.sdata = ++ qi_table_data(d);
> 
> Stray blank following the ++.
> 

I will modify it in next version.

> > +        qinval_entry->q.inv_wait_dsc.hi.saddr = virt_to_maddr(
> > +
> &qi_table_pollslot(d)) >> 2;
> > +        rcu_unlock_domain(d);
> 
> If you don't hold a reference to the domain, what prevents it from going away,
> struct domain getting freed, and the write to the poll slot corrupting data 
> if the
> memory gets re-used? Plus, if you obtain a domain reference at the time you
> enter it into domid_map[], you wouldn't have to be worried about failure above
> (i.e. you could simply ASSERT() success of rcu_lock_domain_by_id()).
> 
> Considering the implementation of rcu_lock_domain_by_id() I also wonder
> whether it wouldn't be more efficient to make domid_map[] an array of struct
> domain pointers.
> 
Good catch!!
Patch #11 can prevents it from going away.
patch 11: 
##
If the Device-TLB flush is still not completed, schedule and wait on a 
waitqueue until the Device-TLB flush is 
Completed, before schedule RCU asynchronous completion of domain destroy.
##


And,
 If it has got domain by rcu_lock_domain_by_id(), the domain structure is 
protected by RCU lock from rcu_lock_domain_by_id() to rcu_lock_domain_by_id().




> > +    } else {
> 
> Coding style.
> 

I will modify it in next version.



> > --- a/xen/include/xen/hvm/iommu.h
> > +++ b/xen/include/xen/hvm/iommu.h
> > @@ -23,6 +23,21 @@
> >  #include <xen/list.h>
> >  #include <asm/hvm/iommu.h>
> >
> > +/*
> > + * Status Address and Data: Status address and data is used by
> > +hardware to perform
> > + * wait descriptor completion status write when the Status Write(SW) field 
> > is
> Set.
> > + *
> > + * Track the Device-TLB invalidation status in an invalidation table.
> > +Update
> > + * invalidation table's count of in-flight Device-TLB invalidation
> > +request and
> > + * assign the address of global polling parameter per domain in the
> > +Status Address
> > + * of each invalidation wait descriptor, when submit Device-TLB
> > +invalidation
> > + * requests.
> > + */
> > +struct qi_talbe {
> > +    u64 qi_table_poll_slot;
> 
> Why is this a 64-bit field when the respective write stores 32 bits only?
> 
Yes, it should be u32. It is a DWORD.
Invalidation Wait Descriptor's Status Address[63:2] would be very likely to 
mislead me.


> Also the qi_table_ prefixes seem rather pointless.
> 

I will modify it in next version.



Quan

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.