From: Zachary Amsden <zach@vmware.com>
To: Chris Wright <chrisw@osdl.org>, akpm@osdl.org
Cc: chrisl@vmware.com, davej@codemonkey.org.uk, hpa@zytor.com,
linux-kernel@vger.kernel.org, pavel@suse.cz, pratap@vmware.com,
Riley@Williams.Name
Subject: Re: [PATCH 1/1] i386 Encapsulate copying of pgd entries
Date: Sat, 06 Aug 2005 01:05:11 -0700 [thread overview]
Message-ID: <42F46F37.3040008@vmware.com> (raw)
In-Reply-To: <20050806011301.GD7991@shell0.pdx.osdl.net>
[-- Attachment #1: Type: text/plain, Size: 782 bytes --]
Chris Wright wrote:
>* zach@vmware.com (zach@vmware.com) wrote:
>
>
>>+ memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
>> if (PTRS_PER_PMD == 1)
>> spin_lock_irqsave(&pgd_lock, flags);
>>
>>- memcpy((pgd_t *)pgd + USER_PTRS_PER_PGD,
>>+ clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
>> swapper_pg_dir + USER_PTRS_PER_PGD,
>>- (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
>>-
>>+ KERNEL_PGD_PTRS);
>> if (PTRS_PER_PMD > 1)
>> return;
>>
>> pgd_list_add(pgd);
>> spin_unlock_irqrestore(&pgd_lock, flags);
>>- memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
>>
>>
>
>Why memset was never done on PAE?
>
>thanks,
>-chris
>
>
Update patch. Thanks for catching this. Tested PAE and non-PAE on
native hardware and in a virtual machine :)
Zach
[-- Attachment #2: pgd-clone-call --]
[-- Type: text/plain, Size: 3424 bytes --]
Add a clone operation for pgd updates.
This helps complete the encapsulation of updates to page tables (or pages
about to become page tables) into accessor functions rather than using
memcpy() to duplicate them. This is both generally good for consistency
and also necessary for running in a hypervisor which requires explicit
updates to page table entries.
The new function is:
clone_pgd_range(pgd_t *dst, pgd_t *src, int count);
dst - pointer to pgd range anwhere on a pgd page
src - ""
count - the number of pgds to copy.
dst and src can be on the same page, but the range must not overlap
and must not cross a page boundary.
Note that I ommitted using this call to copy pgd entries into the
software suspend page root, since this is not technically a live paging
structure, rather it is used on resume from suspend. CC'ing Pavel in case
he has any feedback on this.
Thanks to Chris Wright for noticing that this could be more optimal in
PAE compiles by eliminating the memset.
Signed-off-by: Zachary Amsden <zach@vmware.com>
Index: linux-2.6.13/arch/i386/mm/pgtable.c
===================================================================
--- linux-2.6.13.orig/arch/i386/mm/pgtable.c 2005-08-04 12:02:10.000000000 -0700
+++ linux-2.6.13/arch/i386/mm/pgtable.c 2005-08-06 00:43:51.000000000 -0700
@@ -207,19 +207,19 @@
{
unsigned long flags;
- if (PTRS_PER_PMD == 1)
+ if (PTRS_PER_PMD == 1) {
+ memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
spin_lock_irqsave(&pgd_lock, flags);
+ }
- memcpy((pgd_t *)pgd + USER_PTRS_PER_PGD,
+ clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
swapper_pg_dir + USER_PTRS_PER_PGD,
- (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
-
+ KERNEL_PGD_PTRS);
if (PTRS_PER_PMD > 1)
return;
pgd_list_add(pgd);
spin_unlock_irqrestore(&pgd_lock, flags);
- memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
}
/* never called when PTRS_PER_PMD > 1 */
Index: linux-2.6.13/arch/i386/kernel/smpboot.c
===================================================================
--- linux-2.6.13.orig/arch/i386/kernel/smpboot.c 2005-08-04 12:02:10.000000000 -0700
+++ linux-2.6.13/arch/i386/kernel/smpboot.c 2005-08-04 13:15:45.000000000 -0700
@@ -1017,8 +1017,8 @@
tsc_sync_disabled = 1;
/* init low mem mapping */
- memcpy(swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS,
- sizeof(swapper_pg_dir[0]) * KERNEL_PGD_PTRS);
+ clone_pgd_range(swapper_pg_dir, swapper_pg_dir + USER_PGD_PTRS,
+ KERNEL_PGD_PTRS);
flush_tlb_all();
schedule_work(&task);
wait_for_completion(&done);
Index: linux-2.6.13/include/asm-i386/pgtable.h
===================================================================
--- linux-2.6.13.orig/include/asm-i386/pgtable.h 2005-08-04 12:02:10.000000000 -0700
+++ linux-2.6.13/include/asm-i386/pgtable.h 2005-08-05 17:12:33.000000000 -0700
@@ -276,6 +276,21 @@
}
/*
+ * clone_pgd_range(pgd_t *dst, pgd_t *src, int count);
+ *
+ * dst - pointer to pgd range anwhere on a pgd page
+ * src - ""
+ * count - the number of pgds to copy.
+ *
+ * dst and src can be on the same page, but the range must not overlap,
+ * and must not cross a page boundary.
+ */
+static inline void clone_pgd_range(pgd_t *dst, pgd_t *src, int count)
+{
+ memcpy(dst, src, count * sizeof(pgd_t));
+}
+
+/*
* Macro to mark a page protection value as "uncacheable". On processors which do not support
* it, this is a no-op.
*/
next prev parent reply other threads:[~2005-08-06 8:11 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-08-06 0:26 [PATCH 1/1] i386 Encapsulate copying of pgd entries zach
2005-08-06 1:13 ` Chris Wright
2005-08-06 1:52 ` Zachary Amsden
2005-08-06 6:00 ` Zachary Amsden
2005-08-06 8:05 ` Zachary Amsden [this message]
2005-08-07 19:00 ` Pavel Machek
2005-08-07 19:20 ` Zachary Amsden
2005-08-07 19:37 ` Pavel Machek
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=42F46F37.3040008@vmware.com \
--to=zach@vmware.com \
--cc=Riley@Williams.Name \
--cc=akpm@osdl.org \
--cc=chrisl@vmware.com \
--cc=chrisw@osdl.org \
--cc=davej@codemonkey.org.uk \
--cc=hpa@zytor.com \
--cc=linux-kernel@vger.kernel.org \
--cc=pavel@suse.cz \
--cc=pratap@vmware.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