Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
Please login to access the resource
SUSE:SLE-12-SP1:GA
xen.4507
552d2966-x86-vMSI-X-add-valid-bits-for-read-acc...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 552d2966-x86-vMSI-X-add-valid-bits-for-read-acceleration.patch of Package xen.4507
# Commit df9f5676b3711c95127d44e871ad7ca38d6ed28a # Date 2015-04-14 16:51:18 +0200 # Author Jan Beulich <jbeulich@suse.com> # Committer Jan Beulich <jbeulich@suse.com> 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. Also use DECLARE_BITMAP() in a related field declaration instead of open coding it. Signed-off-by: Jan Beulich <jbeulich@suse.com> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com> --- a/xen/arch/x86/hvm/vmsi.c +++ b/xen/arch/x86/hvm/vmsi.c @@ -163,11 +163,14 @@ struct msixtbl_entry struct pci_dev *pdev; unsigned long gtable; /* gpa of msix table */ unsigned long table_len; - 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 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; }; @@ -242,9 +245,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 @@ -290,6 +294,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;
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor