[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 12/14] vtd: use a bit field for root_entry
On 04.08.2020 15:42, Paul Durrant wrote: > --- a/xen/drivers/passthrough/vtd/iommu.h > +++ b/xen/drivers/passthrough/vtd/iommu.h > @@ -184,21 +184,28 @@ > #define dma_frcd_source_id(c) (c & 0xffff) > #define dma_frcd_page_addr(d) (d & (((u64)-1) << 12)) /* low 64 bit */ > > -/* > - * 0: Present > - * 1-11: Reserved > - * 12-63: Context Ptr (12 - (haw-1)) > - * 64-127: Reserved > - */ > struct root_entry { > - u64 val; > - u64 rsvd1; > + union { > + __uint128_t val; I couldn't find a use of this field, and I also can't foresee any. Could it be left out? > + struct { uint64_t lo, hi; }; > + struct { > + /* 0 - 63 */ > + uint64_t p:1; bool? > + uint64_t reserved0:11; > + uint64_t ctp:52; > + > + /* 64 - 127 */ > + uint64_t reserved1; > + }; > + }; > }; > -#define root_present(root) ((root).val & 1) > -#define set_root_present(root) do {(root).val |= 1;} while(0) > -#define get_context_addr(root) ((root).val & PAGE_MASK_4K) > -#define set_root_value(root, value) \ > - do {(root).val |= ((value) & PAGE_MASK_4K);} while(0) > + > +#define root_present(r) (r).p > +#define set_root_present(r) do { (r).p = 1; } while (0) And then "true" here? > +#define root_ctp(r) ((r).ctp << PAGE_SHIFT_4K) > +#define set_root_ctp(r, val) \ > + do { (r).ctp = ((val) >> PAGE_SHIFT_4K); } while (0) For documentation purposes, can the 2nd macro param be named maddr or some such? > --- a/xen/drivers/passthrough/vtd/x86/ats.c > +++ b/xen/drivers/passthrough/vtd/x86/ats.c > @@ -74,8 +74,8 @@ int ats_device(const struct pci_dev *pdev, const struct > acpi_drhd_unit *drhd) > static bool device_in_domain(const struct vtd_iommu *iommu, > const struct pci_dev *pdev, uint16_t did) > { > - struct root_entry *root_entry; > - struct context_entry *ctxt_entry = NULL; > + struct root_entry *root_entry, *root_entries = NULL; > + struct context_entry *context_entry, *context_entries = NULL; Just like root_entry, root_entries doesn't look to need an initializer. I'm unconvinced anyway that you now need two variables each: unmap_vtd_domain_page() does quite fine with the low 12 bits not all being zero, afaict. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |