From: Hugh Dickins <hugh@veritas.com>
To: Christoph Lameter <clameter@sgi.com>
Cc: Russell King <rmk+lkml@arm.linux.org.uk>,
Linus Torvalds <torvalds@linux-foundation.org>,
Nicolas Ferre <nicolas.ferre@rfo.atmel.com>,
ARM Linux Mailing List <linux-arm-kernel@lists.arm.linux.org.uk>,
Linux Kernel list <linux-kernel@vger.kernel.org>,
Marc Pignat <marc.pignat@hevs.ch>,
Andrew Victor <andrew@sanpeople.com>,
Pierre Ossman <drzeus@drzeus.cx>,
Andrew Morton <akpm@linux-foundation.org>
Subject: Re: Oops in a driver while using SLUB as a SLAB allocator
Date: Mon, 25 Jun 2007 18:23:27 +0100 (BST) [thread overview]
Message-ID: <Pine.LNX.4.64.0706251804420.7592@blonde.wat.veritas.com> (raw)
In-Reply-To: <Pine.LNX.4.64.0706250952490.8320@schroedinger.engr.sgi.com>
On Mon, 25 Jun 2007, Christoph Lameter wrote:
> On Mon, 25 Jun 2007, Hugh Dickins wrote:
>
> > > In many situations the page struct passed to flush_dcache_page is
> > > simply used to calculate the virtual address. So its mostly harmless.
> > > Trouble starts when page attributes like the mapping is used.
> >
> > Mostly harmless indeed. I don't understand why you insist on trying
> > to complicate the situation. flush_dcache_page is only expected to
> > do something on pages mapped into userspace (correct me if I'm wrong
> > there), it's expected to do nothing on kmalloc'ed pages. It's
> > been working that way for years, and will continue to work that way
> > with slub, providing either page_mapping or flush_dcache_page checks
> > PageSlab to avoid oopsing on page->mapping.
>
> It is definitely intended to work. Otherwise we would not have code
> like this:
>
> christoph@fly:~/linux-2.6$ find . -name "*.c" | xargs grep "flush_dcache_page"|grep virt
> ./drivers/scsi/scsi_tgt_if.c: flush_dcache_page(virt_to_page(ev));
> ./drivers/scsi/scsi_tgt_if.c: flush_dcache_page(virt_to_page(ev));
I didn't claim that flush_dcache_page(virt_to_page(virt)) is not expected
to work. I claim that flush_dcache_page is expected to be a noop rather
than an oops on a kmalloced page.
> > 2.6.22-rc6 has page_mapping making that check: we could argue about
> > which is the better site for it, there are good arguments both ways
> > (page_mapping is the correct place, flush_dcache_page is the more
> > efficient place), I suggest we leave it as is.
>
> Ok. I think your patch is fine as a quick fix for 2.6.22. I am a bit
> uneasy with that given that its in such a broadly used function while its
> only use is to enable flush_dcache_page to work. But we need the general
> issue taken care of after 2.6.22.
What general issue?
>
> > > A kmalloc slab object (even 64 byte) may be crossing a page boundary
> > > with a ARCH_KMALLOC_MINALIGN of 4 or 8. So I think that
> > > flush_dcache_range *must* be used rather than flush_dcache_page.
> >
> > Why???? All we require of flush_dcache_page is that it not oops on
> > the first page in the range: we don't need to change over to
> > flush_dcache_range for that.
>
> As explained about: There are corner cases in which it does not work. You
> seem to assume that flush_dcache_page can become a no op. That may not be
> true on platforms that need explicit cache flushing for a DMA engine to
> access a data structure. The above listed use suggests that the caller
> expects flushing to occur correctly.
The scsi_tgt_if.c use you show above? That's not dealing with
kmalloced pages, is it? True, the pages it is dealing with don't
have page->mapping set, so those architectures which use page->mapping
to find what to do in their flush_dcache_page, won't do anything there
in their flush_dcache_page. Whether that's a bug or not, I wouldn't
pretend to know; but it's nothing to do with the present discussion.
Please see Documentation/cachetlb.txt: flush_dcache_page is about
pagecache pages mapped into userspace. We don't use kmalloc for those,
but we do sometimes need to flush_dcache_page in places which commonly
deal with pagecache pages, but sometimes handle kmalloc'ed buffers too.
Luckily we don't have to deal with buffers in which the first page is
kmalloced and the next comes from pagecache.
Hugh
next prev parent reply other threads:[~2007-06-25 17:24 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-06-21 9:30 Nicolas Ferre
2007-06-21 14:54 ` Marc Pignat
2007-06-21 14:57 ` Marc Pignat
2007-06-21 15:54 ` Nicolas Ferre
2007-06-22 6:28 ` [PATCH] mmc-atmel : fix kunmap wrong usage Marc Pignat
2007-06-22 12:00 ` Hugh Dickins
2007-06-22 13:34 ` Nicolas Ferre
2007-06-22 13:46 ` Hugh Dickins
2007-06-22 14:21 ` Marc Pignat
2007-06-22 14:58 ` Marc Pignat
2007-06-22 19:00 ` Jens Axboe
2007-06-22 9:09 ` Oops in a driver while using SLUB as a SLAB allocator Nicolas Ferre
2007-06-21 22:27 ` Hugh Dickins
2007-06-22 1:01 ` Christoph Lameter
2007-06-22 4:26 ` Hugh Dickins
2007-06-22 5:13 ` Christoph Lameter
2007-06-22 7:00 ` Russell King
2007-06-22 1:36 ` Christoph Lameter
2007-06-22 4:40 ` Hugh Dickins
2007-06-22 5:10 ` Christoph Lameter
2007-06-22 5:37 ` Hugh Dickins
2007-06-22 16:40 ` Linus Torvalds
2007-06-22 17:26 ` Christoph Lameter
2007-06-22 17:41 ` Christoph Lameter
2007-06-22 18:39 ` Hugh Dickins
2007-06-22 18:51 ` Christoph Lameter
2007-06-22 19:01 ` Hugh Dickins
2007-06-22 19:11 ` Christoph Lameter
2007-06-22 20:21 ` Hugh Dickins
2007-06-22 22:54 ` Christoph Lameter
2007-06-22 20:15 ` Christoph Lameter
2007-06-23 10:40 ` Oleg Verych
2007-06-24 8:38 ` Russell King
2007-06-24 10:24 ` Hugh Dickins
2007-06-24 10:51 ` Russell King
2007-06-25 0:25 ` Hugh Dickins
2007-06-25 13:55 ` Nicolas Ferre
2007-06-25 14:07 ` Christoph Lameter
2007-06-25 16:42 ` Hugh Dickins
2007-06-25 17:00 ` Christoph Lameter
2007-06-25 17:23 ` Hugh Dickins [this message]
2007-06-25 18:23 ` Christoph Lameter
2007-06-25 18:43 ` Hugh Dickins
2007-06-25 18:50 ` Christoph Lameter
2007-06-25 19:04 ` Hugh Dickins
2007-06-26 18:09 ` Christoph Lameter
2007-06-22 20:18 ` Russell King
2007-06-22 1:41 ` Christoph Lameter
2007-06-22 4:46 ` Hugh Dickins
2007-06-22 5:31 ` Christoph Lameter
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=Pine.LNX.4.64.0706251804420.7592@blonde.wat.veritas.com \
--to=hugh@veritas.com \
--cc=akpm@linux-foundation.org \
--cc=andrew@sanpeople.com \
--cc=clameter@sgi.com \
--cc=drzeus@drzeus.cx \
--cc=linux-arm-kernel@lists.arm.linux.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=marc.pignat@hevs.ch \
--cc=nicolas.ferre@rfo.atmel.com \
--cc=rmk+lkml@arm.linux.org.uk \
--cc=torvalds@linux-foundation.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
all inboxes | Powered by JetHome®