|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [v7][RFC][PATCH 06/13] hvmloader/ram: check if guest memory is out of reserved device memory maps
>>> On 11.11.14 at 08:49, <tiejun.chen@xxxxxxxxx> wrote:
>>>>>> --- a/xen/include/xen/iommu.h
>>>>>> +++ b/xen/include/xen/iommu.h
>>>>>> @@ -158,14 +158,14 @@ struct iommu_ops {
>>>>>> void (*crash_shutdown)(void);
>>>>>> void (*iotlb_flush)(struct domain *d, unsigned long gfn,
>>>>>> unsigned int page_count);
>>>>>> void (*iotlb_flush_all)(struct domain *d);
>>>>>> - int (*get_reserved_device_memory)(iommu_grdm_t *, void *);
>>>>>> + int (*get_reserved_device_memory)(iommu_grdm_t *, struct
>>>>>> domain *, void *);
>>>>>> void (*dump_p2m_table)(struct domain *d);
>>>>>> };
>>>>>>
>>>>>> void iommu_suspend(void);
>>>>>> void iommu_resume(void);
>>>>>> void iommu_crash_shutdown(void);
>>>>>> -int iommu_get_reserved_device_memory(iommu_grdm_t *, void *);
>>>>>> +int iommu_get_reserved_device_memory(iommu_grdm_t *, struct domain
>>>>>> *, void *);
>>>>>
>>>>> I don't see why these generic interfaces would need to change;
>>>>> the only thing that would seem to need changing is the callback
>>>>> function (and of course the context passed to it).
>>>>
>>>> I'm not 100% sure if we can call current->domain in all scenarios. If
>>>> you can help me confirm this I'd really like to remove this change :)
>>>> Now I assume this should be true as follows:
>>>
>>> Which is wrong, and not what I said. Instead you should pass the
>>> domain as part of the context that gets made available to the
>>> callback function.
>>
>> Okay I will try to go there.
>>
>
> Are you saying this change?
>
> @@ -898,14 +899,36 @@ int
> intel_iommu_get_reserved_device_memory(iommu_grdm_t *func, void *ctxt)
> {
> struct acpi_rmrr_unit *rmrr;
> int rc = 0;
> + int i, j;
> + u16 bdf, pt_bdf;
> + struct domain *d = ctxt->domain;
>
> - list_for_each_entry(rmrr, &acpi_rmrr_units, list)
> + for_each_rmrr_device ( rmrr, bdf, i )
> {
> - rc = func(PFN_DOWN(rmrr->base_address),
> - PFN_UP(rmrr->end_address) - PFN_DOWN(rmrr->base_address),
> - ctxt);
> - if ( rc )
> - break;
> + if ( d->arch.hvm_domain.pci_force )
> + {
> + rc = func(PFN_DOWN(rmrr->base_address),
> + PFN_UP(rmrr->end_address) -
> + PFN_DOWN(rmrr->base_address),
> + ctxt);
> + if ( rc )
> + break;
> + }
> + else
> + {
> + for ( j = 0; j < d->arch.hvm_domain.num_pcidevs; j++ )
> + {
>
> But,
>
> dmar.c: In function 'intel_iommu_get_reserved_device_memory'"
> dmar.c:904:28: error: dereferencing 'void *' pointer [-Werror]
> struct domain *d = ctxt->domain;
> ^
> dmar.c:904:28: error: request for member 'domain' in something not a
> structure or union
> cc1: all warnings being treated as errors
> make[6]: *** [dmar.o] Error 1
> make[6]: *** Waiting for unfinished jobs.
>
> Unless we move all check inside each callback functions.
That's what you should do imo, albeit I realize that the comparing
of the specific SBDFs will need additional consideration.
Jan
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |