From: Andrew Morton <akpm@linux-foundation.org>
To: Laura Abbott <lauraa@codeaurora.org>
Cc: Benjamin Gaignard <benjamin.gaignard@stericsson.com>,
Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>,
Linux Kernel Mailing List <linux-kernel@vger.kernel.org>,
"linux-arm-kernel@lists.infradead.org"
<linux-arm-kernel@lists.infradead.org>
Subject: Re: gen_pool_add broken with LPAE based systems
Date: Tue, 19 Mar 2013 16:00:14 -0700 [thread overview]
Message-ID: <20130319160014.caabf567b11b5aef65c0ac1d@linux-foundation.org> (raw)
In-Reply-To: <5148EB74.3020407@codeaurora.org>
On Tue, 19 Mar 2013 15:49:24 -0700 Laura Abbott <lauraa@codeaurora.org> wrote:
> On 3/19/2013 2:54 PM, Andrew Morton wrote:
> > On Thu, 14 Mar 2013 16:05:27 -0700 Laura Abbott <lauraa@codeaurora.org> wrote:
> >
> >> Hi,
> >>
> >> We use genalloc for managing certain pools of physical memory. genalloc
> >> currently uses unsigned long for virtual addresses and phys_addr_t for
> >> physical addresses. Our ARM LPAE systems have 64-bit physical addresses
> >> but unsigned long is still 32 bits. Using gen_pool_add breaks with
> >> addresses > 4G because gen_pool_add treats the address passed in as the
> >> virtual address. gen_pool allocates internally based on the 32 bit
> >> virtual address as well so everything is broken if we want to be able to
> >> manage the full address space after 4G. I see a couple of options:
> >
> > The above only makes sense if ARM LPAE has 64-bit (actually >= 33-bit)
> > virtual addresses. If so, I don't understand how ARM LPAE can work at
> > all - the core MM assumes that addresses-fit-in-ulongs in eleventy
> > trillion places.
> >
> > I think we need a better description of the problem, please.
> >
>
> Sorry, let me clarify. ARM LPAE still has 32 bit virtual addresses.
>
> Change 3c8f370ded3483b27f1218ff0051fcf0c7a2facd (lib/genalloc.c: add
> support for specifying the physical address) added support for using
> genalloc to know about both physical addresses and virtual addresses.
> Allocation in gen_pool is still based on the virtual address though.
>
> The problem is we've been using genalloc to allocate physical addresses,
> not virtual ones so allocating and returning an unsigned long breaks
> with sizeof(phys_addr_t) > sizeof(unsigned long). It looks like genalloc
> was added and extended with virtual addresses in mind but apart from the
> address size limitation right now it should be able to work just fine
> for physical addresses.
>
> There seem to be a few other clients scattered about who are using
> genalloc for physical addresses as well (although all are 32 bit systems
> right now)
I see. So genpool has never worked properly for this application?
> A better subject would be 'genalloc broken on LPAE systems when used to
> allocate physical addresses instead of virtual addresses'
I'd say "extend genpool so we can use physical addresses instead of
virtual addresses" ;)
> >> 1) Change gen_pool_add to use physical addresses and allocate based on
> >> physical addresses instead of virtual addresses
> >> 2) Change the virtual address to be a 64 bit type or something
> >> selectable to a 64 bit type.
> >> 3) Allow a flag per pool to select whether the allocator is virtual or
> >> physical and switch between those.
> >> 4) Split the APIs into virtual <-> physical and physical only and have
> >> separate types for each.
> >>
> >> Any of these suggestions seem reasonable or is there another option to
> >> consider?
> >
> > 2) sounds least intrusive but I can't think with my head spinning so fast.
I suppose using a bare u64 for `addr' would fix things up.
I think it's rather regrettable that genpool.c contains terms like
"addr", "phys" and "virt" at all. It's in lib/ and it's a
general-purpose container thing. It should know whether it's operating
on addresses or bananas or whatever. A better layering would be to
weed all that out of there, implement a truly general-purpose container
and then add convenience wrappers around that for each particular
application.
prev parent reply other threads:[~2013-03-19 23:00 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-14 23:05 Laura Abbott
2013-03-19 21:54 ` Andrew Morton
2013-03-19 22:49 ` Laura Abbott
2013-03-19 23:00 ` Andrew Morton [this message]
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=20130319160014.caabf567b11b5aef65c0ac1d@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=benjamin.gaignard@stericsson.com \
--cc=lauraa@codeaurora.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=plagnioj@jcrosoft.com \
/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®