From: Andrew Morton <akpm@digeo.com>
To: William Lee Irwin III <wli@holomorphy.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: mremap() pte allocation atomicity error
Date: Fri, 27 Sep 2002 23:10:04 -0700 [thread overview]
Message-ID: <3D9547BC.432C018@digeo.com> (raw)
In-Reply-To: 20020928060450.GW3530@holomorphy.com
William Lee Irwin III wrote:
>
> On Fri, Sep 27, 2002 at 10:54:54PM -0700, Andrew Morton wrote:
> > A simple fix would be to drop the atomic kmap of the source pte
> > and take it again after the alloc_one_pte_map() call.
> > Can you think of a more efficient way?
>
> Not one that isn't highly invasive, no. This is what I had in mind
> for the easy fix.
>
OK. kmap_atomics are pretty darn quick, but it might be better
to take a peek to see if the pgd and pmd are present, and only
drop the kmap if not.
Care to eyeball this? I haven't tested it yet.
mm/mremap.c | 25 +++++++++++++++++++++++++
1 files changed, 25 insertions(+)
--- 2.5.39/mm/mremap.c~move_one_page_fix Fri Sep 27 22:59:04 2002
+++ 2.5.39-akpm/mm/mremap.c Fri Sep 27 23:05:16 2002
@@ -53,6 +53,20 @@ end:
return pte;
}
+static inline int page_table_present(struct mm_struct *mm, unsigned long addr)
+{
+ pgd_t *pgd;
+ pmd_t *pmd;
+
+ pgd = pgd_offset(mm, addr);
+ if (pgd_none(*pgd))
+ return 0;
+ pmd = pmd_offset(pgd, addr);
+ if (pmd == NULL)
+ return 0;
+ return 1;
+}
+
static inline pte_t *alloc_one_pte_map(struct mm_struct *mm, unsigned long addr)
{
pmd_t * pmd;
@@ -98,7 +112,18 @@ static int move_one_page(struct vm_area_
spin_lock(&mm->page_table_lock);
src = get_one_pte_map_nested(mm, old_addr);
if (src) {
+ /*
+ * Look to see whether alloc_one_pte_map needs to perform a
+ * memory allocation. If it does then we need to drop the
+ * atomic kmap
+ */
+ if (!page_table_present(mm, new_addr)) {
+ pte_unmap_nested(src);
+ src = NULL;
+ }
dst = alloc_one_pte_map(mm, new_addr);
+ if (src == NULL)
+ src = get_one_pte_map_nested(mm, old_addr);
error = copy_one_pte(mm, src, dst);
pte_unmap_nested(src);
pte_unmap(dst);
.
WARNING: multiple messages have this Message-ID (diff)
From: Andrew Morton <akpm@digeo.com>
To: William Lee Irwin III <wli@holomorphy.com>
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org
Subject: Re: mremap() pte allocation atomicity error
Date: Fri, 27 Sep 2002 23:10:04 -0700 [thread overview]
Message-ID: <3D9547BC.432C018@digeo.com> (raw)
In-Reply-To: 20020928060450.GW3530@holomorphy.com
William Lee Irwin III wrote:
>
> On Fri, Sep 27, 2002 at 10:54:54PM -0700, Andrew Morton wrote:
> > A simple fix would be to drop the atomic kmap of the source pte
> > and take it again after the alloc_one_pte_map() call.
> > Can you think of a more efficient way?
>
> Not one that isn't highly invasive, no. This is what I had in mind
> for the easy fix.
>
OK. kmap_atomics are pretty darn quick, but it might be better
to take a peek to see if the pgd and pmd are present, and only
drop the kmap if not.
Care to eyeball this? I haven't tested it yet.
mm/mremap.c | 25 +++++++++++++++++++++++++
1 files changed, 25 insertions(+)
--- 2.5.39/mm/mremap.c~move_one_page_fix Fri Sep 27 22:59:04 2002
+++ 2.5.39-akpm/mm/mremap.c Fri Sep 27 23:05:16 2002
@@ -53,6 +53,20 @@ end:
return pte;
}
+static inline int page_table_present(struct mm_struct *mm, unsigned long addr)
+{
+ pgd_t *pgd;
+ pmd_t *pmd;
+
+ pgd = pgd_offset(mm, addr);
+ if (pgd_none(*pgd))
+ return 0;
+ pmd = pmd_offset(pgd, addr);
+ if (pmd == NULL)
+ return 0;
+ return 1;
+}
+
static inline pte_t *alloc_one_pte_map(struct mm_struct *mm, unsigned long addr)
{
pmd_t * pmd;
@@ -98,7 +112,18 @@ static int move_one_page(struct vm_area_
spin_lock(&mm->page_table_lock);
src = get_one_pte_map_nested(mm, old_addr);
if (src) {
+ /*
+ * Look to see whether alloc_one_pte_map needs to perform a
+ * memory allocation. If it does then we need to drop the
+ * atomic kmap
+ */
+ if (!page_table_present(mm, new_addr)) {
+ pte_unmap_nested(src);
+ src = NULL;
+ }
dst = alloc_one_pte_map(mm, new_addr);
+ if (src == NULL)
+ src = get_one_pte_map_nested(mm, old_addr);
error = copy_one_pte(mm, src, dst);
pte_unmap_nested(src);
pte_unmap(dst);
.
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/
next prev parent reply other threads:[~2002-09-28 6:04 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-09-28 5:28 mremap() pte allocation atomicity error William Lee Irwin III
2002-09-28 5:28 ` William Lee Irwin III
2002-09-28 5:54 ` Andrew Morton
2002-09-28 5:54 ` Andrew Morton
2002-09-28 6:04 ` William Lee Irwin III
2002-09-28 6:04 ` William Lee Irwin III
2002-09-28 6:10 ` Andrew Morton [this message]
2002-09-28 6:10 ` Andrew Morton
2002-10-07 8:58 ` mremap() pte allocation atomicity error (2.5.40 too) Miquel van Smoorenburg
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=3D9547BC.432C018@digeo.com \
--to=akpm@digeo.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=wli@holomorphy.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.