diff mbox

[1/3] mm: introduce follow_pte()

Message ID 1241430874-12667-1-git-send-email-hannes@cmpxchg.org (mailing list archive)
State Not Applicable
Headers show

Commit Message

Johannes Weiner May 4, 2009, 9:54 a.m. UTC
A generic readonly page table lookup helper to map an address space
and an address from it to a pte.

Signed-off-by: Johannes Weiner <hannes@cmpxchg.org>
---
 mm/memory.c |   37 +++++++++++++++++++++++++++++++++++++
 1 files changed, 37 insertions(+), 0 deletions(-)

Comments

Andrew Morton May 5, 2009, 7:24 p.m. UTC | #1
On Mon,  4 May 2009 11:54:32 +0200
Johannes Weiner <hannes@cmpxchg.org> wrote:

> A generic readonly page table lookup helper to map an address space
> and an address from it to a pte.

umm, OK.

Is there actually some point to these three patches?  If so, what is it?
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Johannes Weiner May 5, 2009, 8:38 p.m. UTC | #2
On Tue, May 05, 2009 at 12:24:42PM -0700, Andrew Morton wrote:
> On Mon,  4 May 2009 11:54:32 +0200
> Johannes Weiner <hannes@cmpxchg.org> wrote:
> 
> > A generic readonly page table lookup helper to map an address space
> > and an address from it to a pte.
> 
> umm, OK.
> 
> Is there actually some point to these three patches?  If so, what is it?

Magnus needs to check for physical contiguity of a VMAs backing pages
to support zero-copy exportation of video data to userspace.

This series implements follow_pfn() so he can walk the VMA backing
pages and ensure their PFNs are in linear order.

[ This patch can be collapsed with 2/3, I just thought it would be
  easier to read the diffs when having them separate. ]

1/3 and 2/3: factor out the page table walk from follow_phys() into
follow_pte().

3/3: implement follow_pfn() on top of follow_pte().
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Andrew Morton May 5, 2009, 9:05 p.m. UTC | #3
On Tue, 5 May 2009 22:38:07 +0200
Johannes Weiner <hannes@cmpxchg.org> wrote:

> On Tue, May 05, 2009 at 12:24:42PM -0700, Andrew Morton wrote:
> > On Mon,  4 May 2009 11:54:32 +0200
> > Johannes Weiner <hannes@cmpxchg.org> wrote:
> > 
> > > A generic readonly page table lookup helper to map an address space
> > > and an address from it to a pte.
> > 
> > umm, OK.
> > 
> > Is there actually some point to these three patches?  If so, what is it?
> 
> Magnus needs to check for physical contiguity of a VMAs backing pages
> to support zero-copy exportation of video data to userspace.
> 
> This series implements follow_pfn() so he can walk the VMA backing
> pages and ensure their PFNs are in linear order.
> 
> [ This patch can be collapsed with 2/3, I just thought it would be
>   easier to read the diffs when having them separate. ]
> 
> 1/3 and 2/3: factor out the page table walk from follow_phys() into
> follow_pte().
> 
> 3/3: implement follow_pfn() on top of follow_pte().

So we could bundle these patches with Magnus's patchset, or we could
consider these three patches as a cleanup or something.

Given that 3/3 introduces an unused function, I'm inclined to sit tight
and await Magnus's work.

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Johannes Weiner May 5, 2009, 9:21 p.m. UTC | #4
On Tue, May 05, 2009 at 02:05:17PM -0700, Andrew Morton wrote:
> On Tue, 5 May 2009 22:38:07 +0200
> Johannes Weiner <hannes@cmpxchg.org> wrote:
> 
> > On Tue, May 05, 2009 at 12:24:42PM -0700, Andrew Morton wrote:
> > > On Mon,  4 May 2009 11:54:32 +0200
> > > Johannes Weiner <hannes@cmpxchg.org> wrote:
> > > 
> > > > A generic readonly page table lookup helper to map an address space
> > > > and an address from it to a pte.
> > > 
> > > umm, OK.
> > > 
> > > Is there actually some point to these three patches?  If so, what is it?
> > 
> > Magnus needs to check for physical contiguity of a VMAs backing pages
> > to support zero-copy exportation of video data to userspace.
> > 
> > This series implements follow_pfn() so he can walk the VMA backing
> > pages and ensure their PFNs are in linear order.
> > 
> > [ This patch can be collapsed with 2/3, I just thought it would be
> >   easier to read the diffs when having them separate. ]
> > 
> > 1/3 and 2/3: factor out the page table walk from follow_phys() into
> > follow_pte().
> > 
> > 3/3: implement follow_pfn() on top of follow_pte().
> 
> So we could bundle these patches with Magnus's patchset, or we could
> consider these three patches as a cleanup or something.
>
> Given that 3/3 introduces an unused function, I'm inclined to sit tight
> and await Magnus's work.

Yeah, I didn't see the video guys responding on Magnus' patch yet, so
let's wait for them.

Magnus, the actual conversion of your code should be trivial, could
you respin it on top of these three patches using follow_pfn() then?

	Thanks, Hannes
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Magnus Damm May 8, 2009, 8:51 a.m. UTC | #5
On Wed, May 6, 2009 at 6:21 AM, Johannes Weiner <hannes@cmpxchg.org> wrote:
> On Tue, May 05, 2009 at 02:05:17PM -0700, Andrew Morton wrote:
>> On Tue, 5 May 2009 22:38:07 +0200
>> Johannes Weiner <hannes@cmpxchg.org> wrote:
>> > On Tue, May 05, 2009 at 12:24:42PM -0700, Andrew Morton wrote:
>> > > On Mon,  4 May 2009 11:54:32 +0200
>> > > Johannes Weiner <hannes@cmpxchg.org> wrote:
>> > >
>> > > > A generic readonly page table lookup helper to map an address space
>> > > > and an address from it to a pte.
>> > >
>> > > umm, OK.
>> > >
>> > > Is there actually some point to these three patches?  If so, what is it?
>> >
>> > Magnus needs to check for physical contiguity of a VMAs backing pages
>> > to support zero-copy exportation of video data to userspace.
>> >
>> > This series implements follow_pfn() so he can walk the VMA backing
>> > pages and ensure their PFNs are in linear order.
>> >
>> > [ This patch can be collapsed with 2/3, I just thought it would be
>> >   easier to read the diffs when having them separate. ]
>> >
>> > 1/3 and 2/3: factor out the page table walk from follow_phys() into
>> > follow_pte().
>> >
>> > 3/3: implement follow_pfn() on top of follow_pte().
>>
>> So we could bundle these patches with Magnus's patchset, or we could
>> consider these three patches as a cleanup or something.
>>
>> Given that 3/3 introduces an unused function, I'm inclined to sit tight
>> and await Magnus's work.
>
> Yeah, I didn't see the video guys responding on Magnus' patch yet, so
> let's wait for them.
>
> Magnus, the actual conversion of your code should be trivial, could
> you respin it on top of these three patches using follow_pfn() then?

So I tested the patches in -mm (1/3, 2/3, 3/3) together with the zero
copy patch and everything seems fine. Feel free to add acks from me,
least for patch 1/3 and 3/3 - i know too little about the generic case
to say anything about 2/3.

Acked-by: Magnus Damm <damm@igel.co.jp>

I'll send V3 of my zero copy patch in a little while. Thanks a lot for the help!

Cheers,

/ magnus
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/mm/memory.c b/mm/memory.c
index cf6873e..a621319 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -3009,6 +3009,43 @@  int in_gate_area_no_task(unsigned long addr)
 
 #endif	/* __HAVE_ARCH_GATE_AREA */
 
+static int follow_pte(struct mm_struct *mm, unsigned long address,
+		pte_t **ptepp, spinlock_t **ptlp)
+{
+	pgd_t *pgd;
+	pud_t *pud;
+	pmd_t *pmd;
+	pte_t *ptep;
+
+	pgd = pgd_offset(mm, address);
+	if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd)))
+		goto out;
+
+	pud = pud_offset(pgd, address);
+	if (pud_none(*pud) || unlikely(pud_bad(*pud)))
+		goto out;
+
+	pmd = pmd_offset(pud, address);
+	if (pmd_none(*pmd) || unlikely(pmd_bad(*pmd)))
+		goto out;
+
+	/* We cannot handle huge page PFN maps. Luckily they don't exist. */
+	if (pmd_huge(*pmd))
+		goto out;
+
+	ptep = pte_offset_map_lock(mm, pmd, address, ptlp);
+	if (!ptep)
+		goto out;
+	if (!pte_present(*ptep))
+		goto unlock;
+	*ptepp = ptep;
+	return 0;
+unlock:
+	pte_unmap_unlock(ptep, *ptlp);
+out:
+	return -EINVAL;
+}
+
 #ifdef CONFIG_HAVE_IOREMAP_PROT
 int follow_phys(struct vm_area_struct *vma,
 		unsigned long address, unsigned int flags,