|
[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 12.08.2020 15:13, Durrant, Paul wrote:
>> -----Original Message-----
>> From: Jan Beulich <jbeulich@xxxxxxxx>
>> Sent: 06 August 2020 13:34
>>
>> 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.
We've gone the suggested route for earlier struct conversions on
the AMD side, so I think we should follow suit here. See e.g.
struct amd_iommu_dte or union amd_iommu_control.
>>> --- 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.
There are quite a few existing callers passing a not-page-aligned
address into unmap_domain_page(). I don't see why having one more
instance would cause any kind of issue.
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |