From: Jeremy Fitzhardinge <jeremy@goop.org>
To: Matt Mackall <mpm@selenic.com>
Cc: Chris Wright <chrisw@sous-sol.org>,
virtualization@lists.osdl.org, Matt Mackall <mpm@waste.org>,
Ingo Molnar <mingo@elte.hu>, Ian Pratt <ian.pratt@xensource.com>,
lkml <linux-kernel@vger.kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Christoph Lameter <clameter@sgi.com>
Subject: Re: [patch 20/20] Add apply_to_page_range() which applies a function to a pte range.
Date: Wed, 04 Apr 2007 23:52:57 -0700 [thread overview]
Message-ID: <46149CC9.2070903@goop.org> (raw)
In-Reply-To: <20070405044133.GE4892@waste.org>
Matt Mackall wrote:
>> +/*
>> + * Scan a region of virtual memory, filling in page tables as necessary
>> + * and calling a provided function on each leaf page table.
>> + */
>>
>
> But I'm not sure what the use case is that wants filling in the page
> table..? If both modes really make sense, perhaps a flag could unify
> these differences.
>
Well, two reasons:
One is the general one that if you're traversing ptes then they need to
exist to traverse them (for example, if you're creating new mappings).
Obviously if you want to just visit existing mappings, then
instantiating new pagetable is not the right thing to do (and I could
make use of this too).
The other is that there are various places in the Xen hypervisor API
where you pass in a reference to pte entry for the hypervisor to put
mappings into, and the rest of the pagetable needs to exist. The Xen
code uses the side-effect of apply_to_page_range() to create pagetable
for these calls.
>> +typedef int (*pte_fn_t)(pte_t *pte, struct page *pmd_page, unsigned long addr,
>> + void *data);
>>
>
> I'd gotten the impression that these sorts of typedefs were out of
> fashion.
>
In general yes, but for function pointers the syntax is so clumsy that I
think typedefs are OK.
>> +static int apply_to_pte_range(struct mm_struct *mm, pmd_t *pmd,
>> + unsigned long addr, unsigned long end,
>> + pte_fn_t fn, void *data)
>> +{
>> + pte_t *pte;
>> + int err;
>> + struct page *pmd_page;
>> + spinlock_t *ptl;
>> +
>> + pte = (mm == &init_mm) ?
>> + pte_alloc_kernel(pmd, addr) :
>> + pte_alloc_map_lock(mm, pmd, addr, &ptl);
>> + if (!pte)
>> + return -ENOMEM;
>>
>
> Seems a bit awkward to pass mm all the way down the tree just for this
> quirk. Which is a bit awkward as it means that whether or not a lock
> is held in the callback is context dependent.
>
Well, it would need mm for just pte_alloc_map_lock() anyway.
> smaps, clear_ref, and my pagemap code all use the callback at the
> pmd_range level, which a) localizes the pte-level locking concerns
> with the user b) amortizes the indirection overhead and c)
> (unfortunately) makes the user a bit more complex.
>
> We should try to measure whether (b) actually makes a difference.
>
I'll need to look closely at your code again. It would be nice to have
one pagewalker.
J
next prev parent reply other threads:[~2007-04-05 6:52 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-04-04 19:11 [patch 00/20] paravirt_ops updates Jeremy Fitzhardinge
2007-04-04 19:11 ` [patch 01/20] update MAINTAINERS Jeremy Fitzhardinge
2007-04-04 19:11 ` [patch 02/20] Remove CONFIG_DEBUG_PARAVIRT Jeremy Fitzhardinge
2007-04-04 19:11 ` [patch 03/20] use paravirt_nop to consistently mark no-op operations Jeremy Fitzhardinge
2007-04-04 19:11 ` [patch 04/20] Add pagetable accessors to pack and unpack pagetable entries Jeremy Fitzhardinge
2007-04-04 19:11 ` [patch 05/20] Hooks to set up initial pagetable Jeremy Fitzhardinge
2007-04-04 19:11 ` [patch 06/20] Allocate a fixmap slot Jeremy Fitzhardinge
2007-04-04 19:11 ` [patch 07/20] Allow paravirt backend to choose kernel PMD sharing Jeremy Fitzhardinge
2007-04-05 0:30 ` Christoph Lameter
2007-04-05 0:43 ` Jeremy Fitzhardinge
2007-04-05 1:29 ` Chris Wright
2007-04-06 23:41 ` Andrew Morton
2007-04-07 0:02 ` Jeremy Fitzhardinge
2007-04-07 0:28 ` Andrew Morton
2007-04-07 0:40 ` Jeremy Fitzhardinge
2007-04-07 1:21 ` Andrew Morton
2007-04-07 5:47 ` Jeremy Fitzhardinge
2007-04-09 2:36 ` William Lee Irwin III
2007-04-04 19:11 ` [patch 08/20] add hooks to intercept mm creation and destruction Jeremy Fitzhardinge
2007-04-04 19:12 ` [patch 09/20] rename struct paravirt_patch to paravirt_patch_site for clarity Jeremy Fitzhardinge
2007-04-06 23:18 ` Andrew Morton
2007-04-06 23:24 ` Jeremy Fitzhardinge
2007-04-04 19:12 ` [patch 10/20] Use patch site IDs computed from offset in paravirt_ops structure Jeremy Fitzhardinge
2007-04-04 19:12 ` [patch 11/20] Fix patch site clobbers to include return register Jeremy Fitzhardinge
2007-04-04 19:12 ` [patch 12/20] Consistently wrap paravirt ops callsites to make them patchable Jeremy Fitzhardinge
2007-04-04 19:12 ` [patch 13/20] Document asm-i386/paravirt.h Jeremy Fitzhardinge
2007-04-04 19:12 ` [patch 14/20] add common patching machinery Jeremy Fitzhardinge
2007-04-04 19:12 ` [patch 15/20] add flush_tlb_others paravirt_op Jeremy Fitzhardinge
2007-04-04 19:12 ` [patch 16/20] revert map_pt_hook Jeremy Fitzhardinge
2007-04-04 19:12 ` [patch 17/20] add kmap_atomic_pte for mapping highpte pages Jeremy Fitzhardinge
2007-04-04 19:12 ` [patch 18/20] clean up tsc-based sched_clock Jeremy Fitzhardinge
2007-04-06 23:22 ` Andrew Morton
2007-04-06 23:27 ` Jeremy Fitzhardinge
2007-04-06 23:45 ` Andrew Morton
2007-04-06 23:40 ` Jeremy Fitzhardinge
2007-04-04 19:12 ` [patch 19/20] Add a sched_clock paravirt_op Jeremy Fitzhardinge
2007-04-04 19:12 ` [patch 20/20] Add apply_to_page_range() which applies a function to a pte range Jeremy Fitzhardinge
2007-04-05 4:41 ` Matt Mackall
2007-04-05 6:52 ` Jeremy Fitzhardinge [this message]
2007-04-17 20:56 ` Matt Mackall
2007-04-19 19:44 ` Jeremy Fitzhardinge
2007-04-19 19:59 ` Matt Mackall
2007-04-19 21:37 ` Jeremy Fitzhardinge
2007-04-19 21:30 ` Matt Mackall
2007-04-19 22:30 ` Jeremy Fitzhardinge
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=46149CC9.2070903@goop.org \
--to=jeremy@goop.org \
--cc=akpm@linux-foundation.org \
--cc=chrisw@sous-sol.org \
--cc=clameter@sgi.com \
--cc=ian.pratt@xensource.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@elte.hu \
--cc=mpm@selenic.com \
--cc=mpm@waste.org \
--cc=virtualization@lists.osdl.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).