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, 18 Nov 2014 16:16:11 +0800 Message-ID: <546B004B.6050603@intel.com> References: <1414136077-18599-1-git-send-email-tiejun.chen@intel.com> <545784830200007800044627@mail.emea.novell.com> <54585EAA.20904@intel.com> <545894610200007800044A5B@mail.emea.novell.com> <545992A2.8070309@intel.com> <545A57AD02000078000C1037@mail.emea.novell.com> <545B3F4A.5070808@intel.com> <545B562F02000078000453FB@mail.emea.novell.com> <545C9E97.4040800@intel.com> <545CB64E02000078000459CD@mail.emea.novell.com> <5461AD94.2070008@intel.com> <5461BF97.1070709@intel.com> <5461DED50200007800046520@mail.emea.novell.com> <5461DFAF020000780004652B@mail.emea.novell.com> <5461DA23.6020105@intel.com> <5462CE68.6010709@intel.com> <54632EA80200007800046AE5@mail.emea.novell.com> <5469AA77.2070602@intel.com> <5469D68D0200007800048515@mail.emea.novell.com> <5469D749.2040807@intel.com> <5469E74302000078000485B0@mail.emea.novell.com> <5469DCD7.4030701@intel.com> <5469EF5D0200007800048609@mail.emea.novell.com> <546AB82D.5080305@intel.com> <546B0AF00200007800048A69@mail.emea.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <546B0AF00200007800048A69@mail.emea.novell.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 On 2014/11/18 16:01, Jan Beulich wrote: >>>> On 18.11.14 at 04:08, wrote: >> Here I tried to implement what you want. Note just pick two key >> fragments since others have no big deal. >> >> #1: >> >> @@ -898,14 +898,25 @@ int >> intel_iommu_get_reserved_device_memory(iommu_grdm_t *func, void *ctxt) >> { >> struct acpi_rmrr_unit *rmrr; >> int rc = 0; >> + unsigned int i; >> + u32 id; >> + u16 bdf; >> >> list_for_each_entry(rmrr, &acpi_rmrr_units, list) >> { >> - rc = func(PFN_DOWN(rmrr->base_address), >> - PFN_UP(rmrr->end_address) - PFN_DOWN(rmrr->base_address), >> - ctxt); >> - if ( rc ) >> - break; >> + for (i = 0; (bdf = rmrr->scope.devices[i]) && >> + i < rmrr->scope.devices_cnt && !rc; i++) >> + { >> + id = PCI_SBDF(rmrr->segment, bdf); >> + rc = func(PFN_DOWN(rmrr->base_address), >> + PFN_UP(rmrr->end_address) - >> + PFN_DOWN(rmrr->base_address), >> + id, >> + ctxt); >> + if ( rc < 0 ) >> + return rc; >> + } >> + rc = 0; > > Getting close - the main issue is that (as previously mentioned) you > should avoid open-coding for_each_rmrr_device(). It also doesn't Sorry, are you saying these lines? >> + for (i = 0; (bdf = rmrr->scope.devices[i]) && >> + i < rmrr->scope.devices_cnt && !rc; i++) So without lookuping devices[i], how can we call func() for each sbdf as you mentioned? > look like you really need the local variable 'id'. Okay, I can pass PCI_SBDF(rmrr->segment, bdf) directly. Thanks Tiejun