From: Minchan Kim <minchan.kim@gmail.com>
To: Nicolas Pitre <nico@cam.org>
Cc: Minchan Kim <minchan.kim@gmail.com>,
lkml <linux-kernel@vger.kernel.org>,
linux-mm@kvack.org,
Russell King - ARM Linux <linux@arm.linux.org.uk>
Subject: Re: [RFC] atomic highmem kmap page pinning
Date: Thu, 5 Mar 2009 13:20:54 +0900 [thread overview]
Message-ID: <20090305132054.888396da.minchan.kim@barrios-desktop> (raw)
In-Reply-To: <alpine.LFD.2.00.0903042129140.5511@xanadu.home>
On Wed, 04 Mar 2009 21:37:43 -0500 (EST)
Nicolas Pitre <nico@cam.org> wrote:
> On Thu, 5 Mar 2009, Minchan Kim wrote:
>
> > I thought kmap and dma_map_page usage was following.
> >
> > kmap(page);
> > ...
> > dma_map_page(...)
> > invalidate_cache_line
> >
> > kunmap(page);
> >
> > In this case, how do pkmap_count value for the page passed to dma_map_page become 1 ?
> > The caller have to make sure to complete dma_map_page before kunmap.
>
>
> The caller doesn't have to call kmap() on pages it intends to use for
> DMA.
Thanks for pointing me.
Russel also explained that.
Sorry for my misunderstanding.
I want to add your changelog in git log.
---
- dma_map_page(..., DMA_FROM_DEVICE) is called on a highmem page.
--> - vaddr = page_address(page) is non null. In this case
it is likely that the page has valid cache lines
associated with vaddr. Remember that the cache is VIVT.
--> - for (i = vaddr; i < vaddr + PAGE_SIZE; i += 32)
invalidate_cache_line(i);
*** preemption occurs in the middle of the loop above ***
- kmap_high() is called for a different page.
--> - last_pkmap_nr wraps to zero and flush_all_zero_pkmaps()
is called. The pkmap_count value for the page passed
to dma_map_page() above happens to be 1, so it is
unmapped. But prior to that, flush_cache_kmaps()
cleared the cache for it. So far so good.
- A fresh pkmap entry is assigned for this kmap request.
The Murphy law says it will eventually happen to use
the same vaddr as the one which used to belong to the
other page being processed by dma_map_page() in the
preempted thread above.
- The caller of kmap_high() start dirtying the cache using the
new virtual mapping for its page.
*** the first thread is rescheduled ***
- The for loop is resumed, but now cached data
belonging to a different physical page is
being discarded!
---
> > Do I miss something ?
>
> See above.
>
> > > > As far as I understand, To make irq_disable to prevent this problem is
> > > > rather big cost.
> > >
> > > How big? Could you please elaborate on the significance of this cost?
> >
> > I don't have a number. It depends on you for submitting this patch.
>
> My assertion is that the cost is negligible. This is why I'm asking you
> why you think this is a big cost.
Of course, I am not sure whether it's big cost or not.
But I thought it already is used in many fs, driver.
so, whether it's big cost depends on workload type .
However, This patch is needed for VIVT and no coherent cache.
Is right ?
If it is right, it will add unnessary overhead in other architecture
which don't have this problem.
I think it's not desirable although it is small cost.
If we have a other method which avoids unnessary overhead, It would be better.
Unfortunately, I don't have any way to solve this, now.
Let us wait for other server guys's opinion. :)
> Nicolas
--
Kinds Regards
Minchan Kim
--
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:[~2009-03-05 4:22 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-03-04 5:58 Nicolas Pitre
2009-03-04 7:39 ` Andrew Morton
2009-03-04 8:14 ` Minchan Kim
2009-03-04 17:26 ` Nicolas Pitre
2009-03-04 23:07 ` Minchan Kim
2009-03-04 23:46 ` Russell King - ARM Linux
2009-03-05 0:25 ` Minchan Kim
2009-03-05 0:30 ` Minchan Kim
2009-03-05 2:37 ` Nicolas Pitre
2009-03-05 4:20 ` Minchan Kim [this message]
2009-03-05 4:57 ` Nicolas Pitre
2009-03-05 22:23 ` Minchan Kim
2009-03-05 22:59 ` Russell King - ARM Linux
2009-03-05 23:14 ` Minchan Kim
2009-03-07 22:28 ` Nicolas Pitre
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=20090305132054.888396da.minchan.kim@barrios-desktop \
--to=minchan.kim@gmail.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux@arm.linux.org.uk \
--cc=nico@cam.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