From: George Dunlap <George.Dunlap@eu.citrix.com>
To: George Dunlap <george.dunlap@citrix.com>
Cc: "xen devel" <xen-devel@lists.xensource.com>, 张鹏飞 <zpfalpc23@gmail.com>
Subject: Re: Re: changeset 22526:7a5ee3800417
Date: Thu, 10 Mar 2011 09:43:11 +0000 [thread overview]
Message-ID: <AANLkTi=GXwfVhNQ0sKpAWKaokXhsuUVwWMLtu3AkSGyU@mail.gmail.com> (raw)
In-Reply-To: <AANLkTim3irnxhk1PjgyHRdOD2-grtv-KA7L4xX3XYzO_@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 2813 bytes --]
Oops, forgot to attach the patch...
-George
On Thu, Mar 10, 2011 at 9:41 AM, George Dunlap
<George.Dunlap@eu.citrix.com> wrote:
> Peng fei,
>
> Can you (1) test this patch, and (2) make sure I've romanized your
> name properly?
>
> Thanks,
> -George
>
> On Wed, Mar 9, 2011 at 1:59 PM, George Dunlap
> <George.Dunlap@eu.citrix.com> wrote:
>> Peng fei,
>>
>> I just noticed this patch has a bug -- it doesn't set new_entry.mfn if
>> the new mfn is the same as the one already in ept_entry! Standby for
>> a new one...
>>
>> -George
>>
>> On Mon, Mar 7, 2011 at 4:41 PM, George Dunlap
>> <George.Dunlap@eu.citrix.com> wrote:
>>> Peng fei,
>>>
>>> Can you test the attached patch (to xen-unstable)? I don't have
>>> EPT-enabled hardware handy...
>>>
>>> -George
>>>
>>> On Mon, Mar 7, 2011 at 4:20 PM, George Dunlap <george.dunlap@citrix.com> wrote:
>>>> Hmm, yeah, that's obviously not right! Let me take a look...
>>>>
>>>> -George
>>>>
>>>> On Mon, 2011-03-07 at 09:55 +0000, 张鹏飞 wrote:
>>>>> Hi,
>>>>> Recently, I did a research on the p2m and EPT,and did apply your
>>>>> patch(22526) to the source code of mine. But there is one place
>>>>> confused me:
>>>>>
>>>>>
>>>>>
>>>>> ept_entry = table + index;
>>>>> 1.91
>>>>> 1.92 - ept_entry->emt = epte_get_entry_emt(d, gfn, mfn, &ipat, direct_mmio);
>>>>> 1.93 - ept_entry->ipat = ipat;
>>>>> 1.94 - ept_entry->sp = i ? 1 : 0;
>>>>> 1.95 - ept_entry->avail1 = p2mt;
>>>>> 1.96 - ept_entry->avail2 = 0;
>>>>> 1.97 + new_entry.emt = epte_get_entry_emt(d, gfn, mfn, &ipat, direct_mmio);
>>>>> 1.98 + new_entry.ipat = ipat;
>>>>> 1.99 + new_entry.sp = i ? 1 : 0;
>>>>> 1.100 + new_entry.avail1 = p2mt;
>>>>> 1.101 + new_entry.avail2 = 0;
>>>>> 1.102
>>>>> 1.103 - if ( ept_entry->mfn == mfn_x(mfn) )
>>>>> 1.104 + if ( new_entry.mfn == mfn_x(mfn) )
>>>>> 1.105 need_modify_vtd_table = 0;
>>>>> 1.106 else /* the caller should take care of the previous page */
>>>>> 1.107 - ept_entry->mfn = mfn_x(mfn);
>>>>> 1.108 + new_entry.mfn = mfn_x(mfn);
>>>>>
>>>>> I think, The new_entry.mfn is used without assigned any value. Maybe there was something else I did not think of.
>>>>> Thank you for your kindness!
>>>>>
>>>>> http://xenbits.xen.org/xen-unstable.hg/rev/7a5ee3800417
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Xen-devel mailing list
>>>> Xen-devel@lists.xensource.com
>>>> http://lists.xensource.com/xen-devel
>>>>
>>>
>>
>
[-- Attachment #2: ept-use-existing-entry.diff --]
[-- Type: text/plain, Size: 2289 bytes --]
ept: Fix bug in changeset 22526:7a5ee3800417
This fixes a bug in changeset 22526:7a5ee3800417, where the wrong
value is read when deciding whether to flush the VTd tables. The
effect is minor: in situations where the p2m entry is changed but the
mfn is the same, the VTd tables will be unnecessarily flushed.
old_entry is left untouched in the second case, since having a present
old_entry will cause the an unnecessary check to be taken at the end
of the function.
Spotted-by: Zhang, Peng Fei <zpfalpc23@gmail.com>
Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
diff -r f071d8e9f744 xen/arch/x86/mm/hap/p2m-ept.c
--- a/xen/arch/x86/mm/hap/p2m-ept.c Tue Mar 08 10:23:52 2011 +0000
+++ b/xen/arch/x86/mm/hap/p2m-ept.c Wed Mar 09 16:58:51 2011 +0000
@@ -374,7 +374,9 @@
needs_sync = 0;
/* If we're replacing a non-leaf entry with a leaf entry (1GiB or 2MiB),
- * the intermediate tables will be freed below after the ept flush */
+ * the intermediate tables will be freed below after the ept flush
+ *
+ * Read-then-write is OK because we hold the p2m lock. */
old_entry = *ept_entry;
if ( mfn_valid(mfn_x(mfn)) || direct_mmio || p2m_is_paged(p2mt) ||
@@ -390,10 +392,10 @@
new_entry.access = p2ma;
new_entry.rsvd2_snp = (iommu_enabled && iommu_snoop);
- if ( new_entry.mfn == mfn_x(mfn) )
+ new_entry.mfn = mfn_x(mfn);
+
+ if ( old_entry.mfn == new_entry.mfn )
need_modify_vtd_table = 0;
- else
- new_entry.mfn = mfn_x(mfn);
ept_p2m_type_to_flags(&new_entry, p2mt, p2ma);
}
@@ -438,10 +440,12 @@
new_entry.access = p2ma;
new_entry.rsvd2_snp = (iommu_enabled && iommu_snoop);
- if ( new_entry.mfn == mfn_x(mfn) )
+ /* the caller should take care of the previous page */
+ new_entry.mfn = mfn_x(mfn);
+
+ /* Safe to read-then-write because we hold the p2m lock */
+ if ( ept_entry->mfn == new_entry.mfn )
need_modify_vtd_table = 0;
- else /* the caller should take care of the previous page */
- new_entry.mfn = mfn_x(mfn);
ept_p2m_type_to_flags(&new_entry, p2mt, p2ma);
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
next prev parent reply other threads:[~2011-03-10 9:43 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <AANLkTimqNJWRWzSj1BYPP5T7GAhSK_=70T9dq5CW94iB@mail.gmail.com>
2011-03-07 16:20 ` changeset 22526:7a5ee3800417 George Dunlap
2011-03-07 16:41 ` George Dunlap
2011-03-07 16:48 ` Tim Deegan
2011-03-07 16:57 ` George Dunlap
2011-03-09 8:44 ` Tim Deegan
2011-03-09 13:57 ` George Dunlap
2011-03-09 13:59 ` George Dunlap
2011-03-10 9:41 ` George Dunlap
2011-03-10 9:43 ` George Dunlap [this message]
2011-03-10 12:49 ` 答复: [Xen-devel] " zpfalpc23
2011-03-16 10:27 ` zpfalpc23
2011-03-17 12:01 ` 答复: " George Dunlap
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='AANLkTi=GXwfVhNQ0sKpAWKaokXhsuUVwWMLtu3AkSGyU@mail.gmail.com' \
--to=george.dunlap@eu.citrix.com \
--cc=george.dunlap@citrix.com \
--cc=xen-devel@lists.xensource.com \
--cc=zpfalpc23@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).