From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Chen, Tiejun" Subject: Re: [v7][RFC][PATCH 06/13] hvmloader/ram: check if guest memory is out of reserved device memory maps Date: Tue, 11 Nov 2014 15:49:43 +0800 Message-ID: <5461BF97.1070709@intel.com> References: <1414136077-18599-1-git-send-email-tiejun.chen@intel.com> <5450BE27020000780004304A@mail.emea.novell.com> <5451AC56.7010303@intel.com> <54521100020000780004363A@mail.emea.novell.com> <545320F2.5030103@intel.com> <545354500200007800043D94@mail.emea.novell.com> <5457174C.8020400@intel.com> <5457515102000078000443B0@mail.emea.novell.com> <54574D8F.8060407@intel.com> <54575E2D0200007800044443@mail.emea.novell.com> <545767C4.7070806@intel.com> <5457787002000078000445C7@mail.emea.novell.com> <54576DF7.8060408@intel.com> <545784830200007800044627@mail.emea.novell.com> <54585EAA.20904@intel.com> <545894610200007800044A5B@mail.emea.novell.com> <545992A2.8070309@intel.com> <545A57AD02000078000C1037@mail.emea.novell.c om> <545B3F4A.5070808@intel.com> <545B562F02000078000453FB@mail.emea.novell.com> <545C9E97.4040800@intel.com> <545CB64E02000078000459CD@mail.emea.novell.com> <5461AD94.2070008@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <5461AD94.2070008@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jan Beulich Cc: yang.z.zhang@intel.com, kevin.tian@intel.com, tim@xen.org, xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org >>>>> --- 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. Thanks Tiejun