[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/2] x86/vMSI-X: add valid bits for read acceleration
On Fri, Mar 20, 2015 at 04:27:57PM +0000, Jan Beulich wrote: > Again because Xen doesn't get to see all guest writes, it shouldn't > serve reads from its cache before having seen a write to the respective > address. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> > > --- a/xen/arch/x86/hvm/vmsi.c > +++ b/xen/arch/x86/hvm/vmsi.c > @@ -153,12 +153,15 @@ struct msixtbl_entry > /* TODO: resolve the potential race by destruction of pdev */ > struct pci_dev *pdev; > unsigned long gtable; /* gpa of msix table */ > - unsigned long table_flags[BITS_TO_LONGS(MAX_MSIX_TABLE_ENTRIES)]; > + DECLARE_BITMAP(table_flags, MAX_MSIX_TABLE_ENTRIES); That seems unrelated to this patch? Perhaps mention the cleanup part in the commit. > #define MAX_MSIX_ACC_ENTRIES 3 > unsigned int table_len; > struct { > uint32_t msi_ad[3]; /* Shadow of address low, high and data */ > } gentries[MAX_MSIX_ACC_ENTRIES]; > + DECLARE_BITMAP(acc_valid, 3 * MAX_MSIX_ACC_ENTRIES); > +#define acc_bit(what, ent, slot, idx) \ > + what##_bit((slot) * 3 + (idx), (ent)->acc_valid) > struct rcu_head rcu; > }; > > @@ -233,9 +236,10 @@ static int msixtbl_read( > if ( offset != PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET ) > { > nr_entry = (address - entry->gtable) / PCI_MSIX_ENTRY_SIZE; > - if ( nr_entry >= MAX_MSIX_ACC_ENTRIES ) > - goto out; > index = offset / sizeof(uint32_t); > + if ( nr_entry >= MAX_MSIX_ACC_ENTRIES || > + !acc_bit(test, entry, nr_entry, index) ) > + goto out; > *pval = entry->gentries[nr_entry].msi_ad[index]; > } > else > @@ -281,6 +285,7 @@ static int msixtbl_write(struct vcpu *v, > { > index = offset / sizeof(uint32_t); > entry->gentries[nr_entry].msi_ad[index] = val; > + acc_bit(set, entry, nr_entry, index); > } > set_bit(nr_entry, &entry->table_flags); > goto out; > > > > x86/vMSI-X: add valid bits for read acceleration > > Again because Xen doesn't get to see all guest writes, it shouldn't > serve reads from its cache before having seen a write to the respective > address. > > Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx> > > --- a/xen/arch/x86/hvm/vmsi.c > +++ b/xen/arch/x86/hvm/vmsi.c > @@ -153,12 +153,15 @@ struct msixtbl_entry > /* TODO: resolve the potential race by destruction of pdev */ > struct pci_dev *pdev; > unsigned long gtable; /* gpa of msix table */ > - unsigned long table_flags[BITS_TO_LONGS(MAX_MSIX_TABLE_ENTRIES)]; > + DECLARE_BITMAP(table_flags, MAX_MSIX_TABLE_ENTRIES); > #define MAX_MSIX_ACC_ENTRIES 3 > unsigned int table_len; > struct { > uint32_t msi_ad[3]; /* Shadow of address low, high and data */ > } gentries[MAX_MSIX_ACC_ENTRIES]; > + DECLARE_BITMAP(acc_valid, 3 * MAX_MSIX_ACC_ENTRIES); > +#define acc_bit(what, ent, slot, idx) \ > + what##_bit((slot) * 3 + (idx), (ent)->acc_valid) > struct rcu_head rcu; > }; > > @@ -233,9 +236,10 @@ static int msixtbl_read( > if ( offset != PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET ) > { > nr_entry = (address - entry->gtable) / PCI_MSIX_ENTRY_SIZE; > - if ( nr_entry >= MAX_MSIX_ACC_ENTRIES ) > - goto out; > index = offset / sizeof(uint32_t); > + if ( nr_entry >= MAX_MSIX_ACC_ENTRIES || > + !acc_bit(test, entry, nr_entry, index) ) > + goto out; > *pval = entry->gentries[nr_entry].msi_ad[index]; > } > else > @@ -281,6 +285,7 @@ static int msixtbl_write(struct vcpu *v, > { > index = offset / sizeof(uint32_t); > entry->gentries[nr_entry].msi_ad[index] = val; > + acc_bit(set, entry, nr_entry, index); > } > set_bit(nr_entry, &entry->table_flags); > goto out; > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |