From: Linus Torvalds <torvalds@linux-foundation.org>
To: Rik van Riel <riel@redhat.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>,
Andrea Arcangeli <aarcange@redhat.com>,
Mel Gorman <mgorman@suse.de>,
Johannes Weiner <hannes@cmpxchg.org>,
Thomas Gleixner <tglx@linutronix.de>,
Andrew Morton <akpm@linux-foundation.org>,
linux-kernel@vger.kernel.org, linux-mm@kvack.org,
Ingo Molnar <mingo@kernel.org>
Subject: Re: [PATCH 05/31] x86/mm: Reduce tlb flushes from ptep_set_access_flags()
Date: Thu, 25 Oct 2012 19:56:48 -0700 [thread overview]
Message-ID: <CA+55aFwcj=nh1RUmEXUk6W3XwfbdQdQofkkCstbLGVo1EoKryA@mail.gmail.com> (raw)
In-Reply-To: <5089F5B5.1050206@redhat.com>
On Thu, Oct 25, 2012 at 7:30 PM, Rik van Riel <riel@redhat.com> wrote:
>>
>> LOOK at the code, for chrissake. Just look at it. And if you don't see
>> why the above is stupid and retarded, you damn well shouldn't be
>> touching VM code.
>
> I agree it is pretty ugly. However, the above patch
> did get rid of a gigantic performance regression with
> Peter's code.
Rik, *LOOK* at the code like I asked you to, instead of making excuses for it.
I'm not necessarily arguing with what the code tries to do. I'm
arguing with the fact that the code is pure and utter *garbage*.
It has two major (and I mean *MAJOR*) problems, both of which
individually should make you ashamed for ever posting that piece of
shit:
The obvious-without-even-understanding-semantics problem:
- it's humongously stupidly written. It calculates that
'flush_remote' flag WHETHER IT GETS USED OR NOT.
Christ. I can kind of expect stuff like that in driver code etc,
but in VM routines?
Yes, the compiler may be smart enough to actually fix up the
idiocy. That doesn't make it less stupid.
The more-subtle-but-fundamental-problem:
- regardless of how stupidly written it is on a very superficial
level, it's even more stupid in a much more fundamental way.
That whole routine is explicitly written to be opportunistic. It is
*documented* to only set the access flags, so comparing anything else
is stupid, wouldn't you say?
Documented where? It's actually explicitly documented in the
pgtable-generic.c file which has the generic implementation of that
thing. But it's implicitly documented both in the name of the function
(do take another look) *and* in the actual implementation of the
function.
Look at the code: it doesn't even always update the page tables AT ALL
(and no, the return value does *not* reflect whether it updated it or
not!)
Also, notice how we update the pte entry with a simple
*ptep = entry;
statement, not with the usual expensive page table updates? The only
thing that makes this safe is that we *only* do it with the exact same
page frame number (anything else would be disastrously buggy on 32-bit
PAE, for example). And we only ever do it with the dirty bit always
set, because otherwise we might be silently dropping a concurrent
hardware update of the dirty bit of the previous pte value on another
CPU.
The latter requirement is why the x86 code does
if (changed && dirty) {
while the generic code checks just "If (changed)" (and then uses the
much more expensive set_pte_at() that has the proper dirty-bit
guarantees, and generates atomic accesses, not to mention various
virtualization crap).
In other words, everything that was added by that patch is PURE AND
UTTER SHIT. And THAT is what I'm objecting to.
Guess what? If you want to optimize the function to not do remote TLB
flushes, then just do that! None of the garbage. Just change the
flush_tlb_page(vma, address);
line to
__flush_tlb_one(address);
and it should damn well work. Because everything I see about
"flush_remote" looks just wrong, wrong, wrong.
And if there really is some reason for that whole flush_remote
braindamage, then we have much bigger problems, namely the fact that
we've broken the documented semantics of that function, and we're
doing various other things that are completely and utterly invalid
unless the above semantics hold.
So that patch should be burned, and possibly used as an example of
horribly crappy code for later generations. At no point should it be
applied.
Linus
--
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/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2012-10-26 2:57 UTC|newest]
Thread overview: 135+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-25 12:16 [PATCH 00/31] numa/core patches Peter Zijlstra
2012-10-25 12:16 ` [PATCH 01/31] sched, numa, mm: Make find_busiest_queue() a method Peter Zijlstra
2012-10-25 12:16 ` [PATCH 02/31] sched, numa, mm: Describe the NUMA scheduling problem formally Peter Zijlstra
2012-11-01 9:56 ` Mel Gorman
2012-11-01 13:13 ` Rik van Riel
2012-10-25 12:16 ` [PATCH 03/31] mm/thp: Preserve pgprot across huge page split Peter Zijlstra
2012-11-01 10:22 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 04/31] x86/mm: Introduce pte_accessible() Peter Zijlstra
2012-10-25 20:10 ` Linus Torvalds
2012-10-26 6:24 ` [PATCH 04/31, v2] " Ingo Molnar
2012-11-01 10:42 ` [PATCH 04/31] " Mel Gorman
2012-10-25 12:16 ` [PATCH 05/31] x86/mm: Reduce tlb flushes from ptep_set_access_flags() Peter Zijlstra
2012-10-25 20:17 ` Linus Torvalds
2012-10-26 2:30 ` Rik van Riel
2012-10-26 2:56 ` Linus Torvalds [this message]
2012-10-26 3:57 ` Rik van Riel
2012-10-26 4:23 ` Linus Torvalds
2012-10-26 6:42 ` Ingo Molnar
2012-10-26 12:34 ` Michel Lespinasse
2012-10-26 12:48 ` Andi Kleen
2012-10-26 13:16 ` Rik van Riel
2012-10-26 13:26 ` Ingo Molnar
2012-10-26 13:28 ` Ingo Molnar
2012-10-26 18:44 ` [PATCH 1/3] x86/mm: only do a local TLB flush in ptep_set_access_flags() Rik van Riel
2012-10-26 18:49 ` Linus Torvalds
2012-10-26 19:16 ` Rik van Riel
2012-10-26 19:18 ` Linus Torvalds
2012-10-26 19:21 ` Rik van Riel
2012-10-29 15:23 ` Rik van Riel
2012-12-21 9:57 ` trailing flush_tlb_fix_spurious_fault in handle_pte_fault (was Re: [PATCH 1/3] x86/mm: only do a local TLB flush in ptep_set_access_flags()) Vineet Gupta
2012-10-26 18:45 ` [PATCH 2/3] x86,mm: drop TLB flush from ptep_set_access_flags Rik van Riel
2012-10-26 21:12 ` Alan Cox
2012-10-27 3:49 ` Rik van Riel
2012-10-27 10:29 ` Ingo Molnar
2012-10-27 13:40 ` Rik van Riel
2012-10-29 16:57 ` Borislav Petkov
2012-10-29 17:06 ` Linus Torvalds
2012-11-17 14:50 ` Borislav Petkov
2012-11-17 14:56 ` Linus Torvalds
2012-11-17 15:17 ` Borislav Petkov
2012-11-17 15:24 ` Rik van Riel
2012-11-17 21:53 ` Shentino
2012-11-18 15:29 ` Michel Lespinasse
2012-10-26 18:46 ` [PATCH 3/3] mm,generic: only flush the local TLB in ptep_set_access_flags Rik van Riel
2012-10-26 18:48 ` Linus Torvalds
2012-10-26 18:53 ` Linus Torvalds
2012-10-26 18:57 ` Rik van Riel
2012-10-26 19:16 ` Linus Torvalds
2012-10-26 19:33 ` [PATCH -v2 " Rik van Riel
2012-10-26 13:23 ` [PATCH 05/31] x86/mm: Reduce tlb flushes from ptep_set_access_flags() Michel Lespinasse
2012-10-26 17:01 ` Linus Torvalds
2012-10-26 17:54 ` Rik van Riel
2012-10-26 18:02 ` Linus Torvalds
2012-10-26 18:14 ` Rik van Riel
2012-10-26 18:41 ` Linus Torvalds
2012-10-25 12:16 ` [PATCH 06/31] mm: Only flush the TLB when clearing an accessible pte Peter Zijlstra
2012-10-25 12:16 ` [PATCH 07/31] sched, numa, mm, s390/thp: Implement pmd_pgprot() for s390 Peter Zijlstra
2012-11-01 10:49 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 08/31] sched, numa, mm, MIPS/thp: Add pmd_pgprot() implementation Peter Zijlstra
2012-10-25 12:16 ` [PATCH 09/31] mm/pgprot: Move the pgprot_modify() fallback definition to mm.h Peter Zijlstra
2012-10-25 12:16 ` [PATCH 10/31] mm/mpol: Remove NUMA_INTERLEAVE_HIT Peter Zijlstra
2012-10-25 20:58 ` Andi Kleen
2012-10-26 7:59 ` Ingo Molnar
2012-10-25 12:16 ` [PATCH 11/31] mm/mpol: Make MPOL_LOCAL a real policy Peter Zijlstra
2012-11-01 10:58 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 12/31] mm/mpol: Add MPOL_MF_NOOP Peter Zijlstra
2012-11-01 11:10 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 13/31] mm/mpol: Check for misplaced page Peter Zijlstra
2012-10-25 12:16 ` [PATCH 14/31] mm/mpol: Create special PROT_NONE infrastructure Peter Zijlstra
2012-11-01 11:51 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 15/31] mm/mpol: Add MPOL_MF_LAZY Peter Zijlstra
2012-11-01 12:01 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 16/31] numa, mm: Support NUMA hinting page faults from gup/gup_fast Peter Zijlstra
2012-10-25 12:16 ` [PATCH 17/31] mm/migrate: Introduce migrate_misplaced_page() Peter Zijlstra
2012-11-01 12:20 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 18/31] mm/mpol: Use special PROT_NONE to migrate pages Peter Zijlstra
2012-10-25 12:16 ` [PATCH 19/31] sched, numa, mm: Introduce tsk_home_node() Peter Zijlstra
2012-11-01 13:48 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 20/31] sched, numa, mm/mpol: Make mempolicy home-node aware Peter Zijlstra
2012-11-01 13:58 ` Mel Gorman
2012-11-01 14:10 ` Don Morris
2012-10-25 12:16 ` [PATCH 21/31] sched, numa, mm: Introduce sched_feat_numa() Peter Zijlstra
2012-11-01 14:00 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 22/31] sched, numa, mm: Implement THP migration Peter Zijlstra
2012-11-01 14:16 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 23/31] sched, numa, mm: Implement home-node awareness Peter Zijlstra
2012-11-01 15:06 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 24/31] sched, numa, mm: Introduce last_nid in the pageframe Peter Zijlstra
2012-11-01 15:17 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 25/31] sched, numa, mm/mpol: Add_MPOL_F_HOME Peter Zijlstra
2012-10-25 12:16 ` [PATCH 26/31] sched, numa, mm: Add fault driven placement and migration policy Peter Zijlstra
2012-10-25 20:53 ` Linus Torvalds
2012-10-26 7:15 ` Ingo Molnar
2012-10-26 13:50 ` Ingo Molnar
2012-10-26 14:11 ` Peter Zijlstra
2012-10-26 14:14 ` Ingo Molnar
2012-10-26 16:47 ` Linus Torvalds
2012-10-30 19:23 ` Rik van Riel
2012-11-01 15:40 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 27/31] sched, numa, mm: Add credits for NUMA placement Peter Zijlstra
2012-10-25 12:16 ` [PATCH 28/31] sched, numa, mm: Implement constant, per task Working Set Sampling (WSS) rate Peter Zijlstra
2012-11-01 15:48 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 29/31] sched, numa, mm: Add NUMA_MIGRATION feature flag Peter Zijlstra
2012-10-25 12:16 ` [PATCH 30/31] sched, numa, mm: Implement slow start for working set sampling Peter Zijlstra
2012-11-01 15:52 ` Mel Gorman
2012-10-25 12:16 ` [PATCH 31/31] sched, numa, mm: Add memcg support to do_huge_pmd_numa_page() Peter Zijlstra
2012-10-26 9:07 ` [PATCH 00/31] numa/core patches Zhouping Liu
2012-10-26 9:08 ` Peter Zijlstra
2012-10-26 9:20 ` Ingo Molnar
2012-10-26 9:41 ` Zhouping Liu
2012-10-26 10:20 ` Zhouping Liu
2012-10-26 10:24 ` Ingo Molnar
2012-10-28 17:56 ` Johannes Weiner
2012-10-29 2:44 ` Zhouping Liu
2012-10-29 6:50 ` [PATCH] sched, numa, mm: Add memcg support to do_huge_pmd_numa_page() Ingo Molnar
2012-10-29 8:24 ` Johannes Weiner
2012-10-29 8:36 ` Zhouping Liu
2012-10-29 11:15 ` Ingo Molnar
2012-10-30 6:29 ` [PATCH 00/31] numa/core patches Zhouping Liu
2012-10-31 0:48 ` Johannes Weiner
2012-10-31 7:26 ` Hugh Dickins
2012-10-31 13:15 ` Zhouping Liu
2012-10-31 17:31 ` Hugh Dickins
2012-11-01 13:41 ` Hugh Dickins
2012-11-02 3:23 ` Zhouping Liu
2012-11-02 23:06 ` Hugh Dickins
2012-10-30 12:20 ` Mel Gorman
2012-10-30 15:28 ` Andrew Morton
2012-10-30 16:59 ` Mel Gorman
2012-11-03 11:04 ` Alex Shi
2012-11-03 12:21 ` Mel Gorman
2012-11-10 2:47 ` Alex Shi
2012-11-12 9:50 ` Mel Gorman
2012-11-09 8:51 ` Rik van Riel
2012-11-05 17:11 ` Srikar Dronamraju
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='CA+55aFwcj=nh1RUmEXUk6W3XwfbdQdQofkkCstbLGVo1EoKryA@mail.gmail.com' \
--to=torvalds@linux-foundation.org \
--cc=a.p.zijlstra@chello.nl \
--cc=aarcange@redhat.com \
--cc=akpm@linux-foundation.org \
--cc=hannes@cmpxchg.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mgorman@suse.de \
--cc=mingo@kernel.org \
--cc=riel@redhat.com \
--cc=tglx@linutronix.de \
/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