From: Don Morris <don.morris@hp.com>
To: Andrea Arcangeli <aarcange@redhat.com>
Cc: linux-mm@kvack.org
Subject: Re: AutoNUMA15
Date: Thu, 31 May 2012 11:52:50 -0700 [thread overview]
Message-ID: <4FC7BE02.7070400@hp.com> (raw)
In-Reply-To: <20120601000415.GR21339@redhat.com>
On 05/31/2012 05:04 PM, Andrea Arcangeli wrote:
> On Fri, Jun 01, 2012 at 12:54:06AM +0200, Andrea Arcangeli wrote:
>> I'll push a fix in the origin/autonuma branch as soon as I figure it
>> out...
>
> 7f9729f89000-7f9729faa000 rw-p 00000000 00:00 0
> 7f9729faa000-7f9729fea000 rw-s 000c0000 00:15 15364 /dev/mem
>
> addr:00007f9729fc5000 vm_flags:08000875 anon_vma: (null)
> mapping:ffff880430025410 index:b8
>
> The reason for the false positive, was that there are multiple vmas in
> the same pmd range, and I was passing the single vma belonging to the
> page fault address, for all ptes in that pmd.
>
> The vma is only used for that check, this is why it was harmless.
>
> The vma found during page fault would have been valid for the pmd huge
> numa fixup and the pte numa fixup, but not for the less granular pmd
> numa fixup (not huge).
>
> This also explains why echo 0 >/sys/kernel/mm/autonuma/knuma_scand/pmd
> avoided the warnings.
>
> Can you test the below? I'll push the fix in the origin/autonuma branch.
Makes sense -- and the patch works as expected. No spurious warnings
or odd behaviors.
Thanks,
Don
>
> Thanks!
>
> ---
> include/linux/autonuma.h | 4 ++--
> mm/autonuma.c | 19 +++++++++++++++++--
> mm/memory.c | 5 ++---
> 3 files changed, 21 insertions(+), 7 deletions(-)
>
> diff --git a/include/linux/autonuma.h b/include/linux/autonuma.h
> index b0a8d87..67af86a 100644
> --- a/include/linux/autonuma.h
> +++ b/include/linux/autonuma.h
> @@ -46,8 +46,8 @@ static inline void autonuma_free_page(struct page *page) {}
>
> extern pte_t __pte_numa_fixup(struct mm_struct *mm, struct vm_area_struct *vma,
> unsigned long addr, pte_t pte, pte_t *ptep);
> -extern void __pmd_numa_fixup(struct mm_struct *mm, struct vm_area_struct *vma,
> - unsigned long addr, pmd_t *pmd);
> +extern void __pmd_numa_fixup(struct mm_struct *mm, unsigned long addr,
> + pmd_t *pmd);
> extern void numa_hinting_fault(struct page *page, int numpages);
>
> #endif /* _LINUX_AUTONUMA_H */
> diff --git a/mm/autonuma.c b/mm/autonuma.c
> index d37647a..ca4c189 100644
> --- a/mm/autonuma.c
> +++ b/mm/autonuma.c
> @@ -349,14 +349,16 @@ pte_t __pte_numa_fixup(struct mm_struct *mm, struct vm_area_struct *vma,
> return pte;
> }
>
> -void __pmd_numa_fixup(struct mm_struct *mm, struct vm_area_struct *vma,
> +void __pmd_numa_fixup(struct mm_struct *mm,
> unsigned long addr, pmd_t *pmdp)
> {
> pmd_t pmd;
> pte_t *pte;
> unsigned long _addr = addr & PMD_MASK;
> + unsigned long offset;
> spinlock_t *ptl;
> bool numa = false;
> + struct vm_area_struct *vma;
>
> spin_lock(&mm->page_table_lock);
> pmd = *pmdp;
> @@ -369,12 +371,25 @@ void __pmd_numa_fixup(struct mm_struct *mm, struct vm_area_struct *vma,
> if (!numa)
> return;
>
> + vma = find_vma(mm, _addr);
> + /* we're in a page fault so some vma must be in the range */
> + BUG_ON(!vma);
> + BUG_ON(vma->vm_start >= _addr + PMD_SIZE);
> + offset = max(_addr, vma->vm_start) & ~PMD_MASK;
> + VM_BUG_ON(offset >= PMD_SIZE);
> pte = pte_offset_map_lock(mm, pmdp, _addr, &ptl);
> - for (addr = _addr; addr < _addr + PMD_SIZE; pte++, addr += PAGE_SIZE) {
> + pte += offset >> PAGE_SHIFT;
> + for (addr = _addr + offset; addr < _addr + PMD_SIZE; pte++, addr += PAGE_SIZE) {
> pte_t pteval = *pte;
> struct page * page;
> if (!pte_present(pteval))
> continue;
> + if (addr >= vma->vm_end) {
> + vma = find_vma(mm, addr);
> + /* there's a pte present so there must be a vma */
> + BUG_ON(!vma);
> + BUG_ON(addr < vma->vm_start);
> + }
> if (pte_numa(pteval)) {
> pteval = pte_mknotnuma(pteval);
> set_pte_at(mm, addr, pte, pteval);
> diff --git a/mm/memory.c b/mm/memory.c
> index f46cf8a..bbf10c7 100644
> --- a/mm/memory.c
> +++ b/mm/memory.c
> @@ -3409,11 +3409,10 @@ static inline pte_t pte_numa_fixup(struct mm_struct *mm,
> }
>
> static inline void pmd_numa_fixup(struct mm_struct *mm,
> - struct vm_area_struct *vma,
> unsigned long addr, pmd_t *pmd)
> {
> if (pmd_numa(*pmd))
> - __pmd_numa_fixup(mm, vma, addr, pmd);
> + __pmd_numa_fixup(mm, addr, pmd);
> }
>
> static inline pmd_t huge_pmd_numa_fixup(struct mm_struct *mm,
> @@ -3552,7 +3551,7 @@ retry:
> }
> }
>
> - pmd_numa_fixup(mm, vma, address, pmd);
> + pmd_numa_fixup(mm, address, pmd);
>
> /*
> * Use __pte_alloc instead of pte_alloc_map, because we can't
> .
>
--
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/ .
Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2012-06-01 1:53 UTC|newest]
Thread overview: 116+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-25 17:02 [PATCH 00/35] AutoNUMA alpha14 Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 01/35] mm: add unlikely to the mm allocation failure check Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 02/35] autonuma: make set_pmd_at always available Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 03/35] xen: document Xen is using an unused bit for the pagetables Andrea Arcangeli
2012-05-25 20:26 ` Konrad Rzeszutek Wilk
2012-05-26 15:59 ` Andrea Arcangeli
2012-05-29 14:10 ` Konrad Rzeszutek Wilk
2012-05-29 16:01 ` Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 04/35] autonuma: define _PAGE_NUMA_PTE and _PAGE_NUMA_PMD Andrea Arcangeli
2012-05-30 18:22 ` Konrad Rzeszutek Wilk
2012-05-30 18:34 ` Andrea Arcangeli
2012-05-30 20:01 ` Konrad Rzeszutek Wilk
2012-06-05 17:13 ` Andrea Arcangeli
2012-06-05 17:17 ` Konrad Rzeszutek Wilk
2012-06-05 17:40 ` Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 05/35] autonuma: x86 pte_numa() and pmd_numa() Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 06/35] autonuma: generic " Andrea Arcangeli
2012-05-30 20:23 ` Konrad Rzeszutek Wilk
2012-05-25 17:02 ` [PATCH 07/35] autonuma: teach gup_fast about pte_numa Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 08/35] autonuma: introduce kthread_bind_node() Andrea Arcangeli
2012-05-29 12:49 ` Peter Zijlstra
2012-05-29 16:11 ` Andrea Arcangeli
2012-05-29 17:04 ` Peter Zijlstra
2012-05-29 17:44 ` Andrea Arcangeli
2012-05-29 17:48 ` Peter Zijlstra
2012-05-29 18:15 ` Andrea Arcangeli
2012-05-30 20:26 ` Konrad Rzeszutek Wilk
2012-05-25 17:02 ` [PATCH 09/35] autonuma: mm_autonuma and sched_autonuma data structures Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 10/35] autonuma: define the autonuma flags Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 11/35] autonuma: core autonuma.h header Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 12/35] autonuma: CPU follow memory algorithm Andrea Arcangeli
2012-05-29 13:00 ` Peter Zijlstra
2012-05-29 13:54 ` Rik van Riel
2012-05-29 13:10 ` Peter Zijlstra
2012-06-22 17:36 ` Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 13/35] autonuma: add page structure fields Andrea Arcangeli
2012-05-29 13:16 ` Peter Zijlstra
2012-05-29 13:56 ` Rik van Riel
2012-05-29 14:54 ` Peter Zijlstra
2012-05-30 8:25 ` KOSAKI Motohiro
2012-05-30 9:06 ` Peter Zijlstra
2012-05-30 9:41 ` KOSAKI Motohiro
2012-05-30 9:55 ` Peter Zijlstra
2012-05-30 13:49 ` Andrea Arcangeli
2012-05-31 18:18 ` Peter Zijlstra
2012-06-05 14:51 ` Andrea Arcangeli
2012-06-19 18:06 ` Andrea Arcangeli
2012-05-29 16:38 ` Andrea Arcangeli
2012-05-29 16:46 ` Rik van Riel
2012-05-29 16:56 ` Peter Zijlstra
2012-05-29 18:35 ` Andrea Arcangeli
2012-05-29 17:38 ` Linus Torvalds
2012-05-29 18:09 ` Andrea Arcangeli
2012-05-29 20:42 ` Rik van Riel
2012-05-25 17:02 ` [PATCH 14/35] autonuma: knuma_migrated per NUMA node queues Andrea Arcangeli
2012-05-29 13:51 ` Peter Zijlstra
2012-05-30 0:14 ` Andrea Arcangeli
2012-05-30 18:19 ` Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 15/35] autonuma: init knuma_migrated queues Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 16/35] autonuma: autonuma_enter/exit Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 17/35] autonuma: call autonuma_setup_new_exec() Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 18/35] autonuma: alloc/free/init sched_autonuma Andrea Arcangeli
2012-05-30 20:55 ` Konrad Rzeszutek Wilk
2012-05-25 17:02 ` [PATCH 19/35] autonuma: alloc/free/init mm_autonuma Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 20/35] autonuma: avoid CFS select_task_rq_fair to return -1 Andrea Arcangeli
2012-05-29 14:02 ` Peter Zijlstra
2012-05-25 17:02 ` [PATCH 21/35] autonuma: teach CFS about autonuma affinity Andrea Arcangeli
2012-05-29 16:05 ` Peter Zijlstra
2012-05-25 17:02 ` [PATCH 22/35] autonuma: sched_set_autonuma_need_balance Andrea Arcangeli
2012-05-29 16:12 ` Peter Zijlstra
2012-05-29 17:33 ` Andrea Arcangeli
2012-05-29 17:43 ` Peter Zijlstra
2012-05-29 18:24 ` Andrea Arcangeli
2012-05-29 22:21 ` Peter Zijlstra
2012-05-25 17:02 ` [PATCH 23/35] autonuma: core Andrea Arcangeli
2012-05-29 11:45 ` Kirill A. Shutemov
2012-05-30 0:03 ` Andrea Arcangeli
2012-05-29 16:27 ` Peter Zijlstra
2012-05-25 17:02 ` [PATCH 24/35] autonuma: follow_page check for pte_numa/pmd_numa Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 25/35] autonuma: default mempolicy follow AutoNUMA Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 26/35] autonuma: call autonuma_split_huge_page() Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 27/35] autonuma: make khugepaged pte_numa aware Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 28/35] autonuma: retain page last_nid information in khugepaged Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 29/35] autonuma: numa hinting page faults entry points Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 30/35] autonuma: reset autonuma page data when pages are freed Andrea Arcangeli
2012-05-29 16:30 ` Peter Zijlstra
2012-05-29 16:49 ` Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 31/35] autonuma: initialize page structure fields Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 32/35] autonuma: link mm/autonuma.o and kernel/sched/numa.o Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 33/35] autonuma: add CONFIG_AUTONUMA and CONFIG_AUTONUMA_DEFAULT_ENABLED Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 34/35] autonuma: boost khugepaged scanning rate Andrea Arcangeli
2012-05-25 17:02 ` [PATCH 35/35] autonuma: page_autonuma Andrea Arcangeli
2012-05-29 16:44 ` Peter Zijlstra
2012-05-29 17:14 ` Andrea Arcangeli
2012-05-26 17:28 ` [PATCH 00/35] AutoNUMA alpha14 Rik van Riel
2012-05-26 20:42 ` Linus Torvalds
2012-05-29 15:53 ` Christoph Lameter
2012-05-29 16:08 ` Andrea Arcangeli
2012-05-30 14:46 ` Peter Zijlstra
2012-05-30 15:30 ` Ingo Molnar
2012-05-29 13:36 ` Kirill A. Shutemov
2012-05-29 15:43 ` Petr Holasek
2012-05-31 18:08 ` AutoNUMA15 Andrea Arcangeli
2012-05-31 20:01 ` AutoNUMA15 Don Morris
2012-05-31 22:54 ` AutoNUMA15 Andrea Arcangeli
2012-06-01 0:04 ` AutoNUMA15 Andrea Arcangeli
2012-05-31 18:52 ` Don Morris [this message]
2012-06-07 2:30 ` AutoNUMA15 Zhouping Liu
2012-06-21 7:29 ` AutoNUMA15 Alex Shi
2012-06-21 14:55 ` AutoNUMA15 Andrea Arcangeli
2012-06-26 7:52 ` AutoNUMA15 Alex Shi
2012-06-26 12:03 ` AutoNUMA15 Andrea Arcangeli
2012-07-12 2:36 ` AutoNUMA15 Alex Shi
2012-05-29 17:15 ` [PATCH 00/35] AutoNUMA alpha14 Andrea Arcangeli
2012-06-01 22:41 ` Mauricio Faria de Oliveira
2012-06-22 17:57 ` Andrea Arcangeli
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=4FC7BE02.7070400@hp.com \
--to=don.morris@hp.com \
--cc=aarcange@redhat.com \
--cc=linux-mm@kvack.org \
/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).