|
[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
> -----Original Message-----
> From: Jan Beulich <jbeulich@xxxxxxxx>
> Sent: 06 August 2020 13:34
> To: Paul Durrant <paul@xxxxxxx>
> Cc: xen-devel@xxxxxxxxxxxxxxxxxxxx; Durrant, Paul <pdurrant@xxxxxxxxxxxx>;
> Kevin Tian
> <kevin.tian@xxxxxxxxx>
> Subject: RE: [EXTERNAL] [PATCH v4 12/14] vtd: use a bit field for root_entry
>
> CAUTION: This email originated from outside of the organization. Do not click
> links or open
> attachments unless you can confirm the sender and know the content is safe.
>
>
>
> 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?
Yes, probably.
>
> > + struct { uint64_t lo, hi; };
> > + struct {
> > + /* 0 - 63 */
> > + uint64_t p:1;
>
> bool?
>
I'd prefer not to. One of the points of using a bit field (at least from my
PoV) is that it makes referring back to the spec. much easier, by using
uint64_t types consistently and hence using bit widths that can be
straightforwardly summed to give the bit offsets stated in the spec.
> > + 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?
>
Sure.
> > --- 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.
Not passing a page aligned address into something that unmaps a page seems a
little bit fragile though, e.g. if someone happened to add a check in future.
I'll see if I can drop the initializer though.
Paul
>
> Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |