* Re: [PATCH] Make PFN_PHYS return a properly-formed physical address
[not found] ` <20080807145648.ab3dfa90.akpm@linux-foundation.org>
@ 2008-08-07 22:10 ` Jeremy Fitzhardinge
2008-08-07 23:27 ` Andrew Morton
0 siblings, 1 reply; 14+ messages in thread
From: Jeremy Fitzhardinge @ 2008-08-07 22:10 UTC (permalink / raw)
To: Andrew Morton; +Cc: ehabkost, x86, Linux Kernel Mailing List
Andrew Morton wrote:
> On Thu, 07 Aug 2008 14:38:08 -0700
> Jeremy Fitzhardinge <jeremy@goop.org> wrote:
>
>
>> PFN_PHYS, as its name suggests, turns a pfn into a physical address.
>> However, it is a macro which just operates on its argument without
>> modifying its type. pfns are typed unsigned long, but an unsigned
>> long may not be long enough to hold a physical address (32-bit systems
>> with more than 32 bits of physcial address). This means that the
>> resulting address could be truncated if it doesn't fit within an
>> unsigned long. This isn't generally a problem because most users end
>> up using it for "low" memory, but there's no reason why PFN_PHYS
>> couldn't be used for any possible pfn.
>>
>
> Please copy a mailing list on patches. So you can get your titties
> toasted off ;)
>
Oops. Forgot.
>> Fortunately, resource_size_t is the right size, and has approximately
>> the right meaning. It's 64-bits on platforms where that's
>> appropriate, but 32-bits where the extra bits are not needed.
>>
>
> aww maaan. Hack or what?
>
I don't know. Is it? It's what linux/ioport.h:struct resource uses to
hold "start" and "end", which presumably means its intended to hold
arbitrary physical addresses.
>> #define PFN_ALIGN(x) (((unsigned long)(x) + (PAGE_SIZE - 1)) & PAGE_MASK)
>> #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
>> #define PFN_DOWN(x) ((x) >> PAGE_SHIFT)
>> -#define PFN_PHYS(x) ((x) << PAGE_SHIFT)
>> +#define PFN_PHYS(x) ((resource_size_t)(x) << PAGE_SHIFT)
>>
>
> Busted on PAE with CONFIG_RESOURCES_64BIT=n, surely?
>
Not an option:
config X86_PAE
def_bool n
prompt "PAE (Physical Address Extension) Support"
depends on X86_32 && !HIGHMEM4G
select RESOURCES_64BIT
And if you don't enable RESOURCES_64BIT, then I guess it's reasonable
for PFN_PHYS to discount the possibility of high pages?
> Can we please do this properly, whatever that is? Even a dumb
> always-return-u64 would be better?
>
I had that originally, but someone (hpa?) suggested resource_size_t.
The sad thing is that most users don't really care; they're either
64-bit anyway, or immediately truncate the result to 32-bit.
"Properly" would be to define a phys_addr_t which can always represent a
physical address. We have one in x86-land, but I hesitate to add it for
everyone else.
>> printk("initrd extends beyond end of memory "
>> - "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
>> + "(0x%08lx > 0x%08llx)\ndisabling initrd\n",
>> INITRD_START + INITRD_SIZE,
>> PFN_PHYS(max_low_pfn));
>>
>
> that'll generate a compile warning if m32r can set CONFIG_RESOURCES_64BIT=n.
>
(u64) cast, I guess.
J
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] Make PFN_PHYS return a properly-formed physical address
2008-08-07 22:10 ` [PATCH] Make PFN_PHYS return a properly-formed physical address Jeremy Fitzhardinge
@ 2008-08-07 23:27 ` Andrew Morton
2008-08-07 23:45 ` Jeremy Fitzhardinge
0 siblings, 1 reply; 14+ messages in thread
From: Andrew Morton @ 2008-08-07 23:27 UTC (permalink / raw)
To: Jeremy Fitzhardinge; +Cc: ehabkost, x86, linux-kernel
On Thu, 07 Aug 2008 15:10:11 -0700
Jeremy Fitzhardinge <jeremy@goop.org> wrote:
> Andrew Morton wrote:
> > On Thu, 07 Aug 2008 14:38:08 -0700
> > Jeremy Fitzhardinge <jeremy@goop.org> wrote:
> >
> >
> >> PFN_PHYS, as its name suggests, turns a pfn into a physical address.
> >> However, it is a macro which just operates on its argument without
> >> modifying its type. pfns are typed unsigned long, but an unsigned
> >> long may not be long enough to hold a physical address (32-bit systems
> >> with more than 32 bits of physcial address). This means that the
> >> resulting address could be truncated if it doesn't fit within an
> >> unsigned long. This isn't generally a problem because most users end
> >> up using it for "low" memory, but there's no reason why PFN_PHYS
> >> couldn't be used for any possible pfn.
> >>
> >
> > Please copy a mailing list on patches. So you can get your titties
> > toasted off ;)
> >
>
> Oops. Forgot.
>
> >> Fortunately, resource_size_t is the right size, and has approximately
> >> the right meaning. It's 64-bits on platforms where that's
> >> appropriate, but 32-bits where the extra bits are not needed.
> >>
> >
> > aww maaan. Hack or what?
> >
>
> I don't know. Is it? It's what linux/ioport.h:struct resource uses to
> hold "start" and "end", which presumably means its intended to hold
> arbitrary physical addresses.
Yes, but resource_size_t is for IO addressing, not for memory addressing.
Lots of X86_32 machines can happily support 32-bit physical addresses
for IO while needing >32 bit addresses for physical memory.
> >> #define PFN_ALIGN(x) (((unsigned long)(x) + (PAGE_SIZE - 1)) & PAGE_MASK)
> >> #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
> >> #define PFN_DOWN(x) ((x) >> PAGE_SHIFT)
> >> -#define PFN_PHYS(x) ((x) << PAGE_SHIFT)
> >> +#define PFN_PHYS(x) ((resource_size_t)(x) << PAGE_SHIFT)
> >>
> >
> > Busted on PAE with CONFIG_RESOURCES_64BIT=n, surely?
> >
>
> Not an option:
>
> config X86_PAE
> def_bool n
> prompt "PAE (Physical Address Extension) Support"
> depends on X86_32 && !HIGHMEM4G
> select RESOURCES_64BIT
>
err, OK, that was a bit arbitrary of us.
Oh well, scrub the above assertion.
Then again, do all architectures disallow 32-bit resource_size_t on
64-bit? And there's ppc32's CONFIG_HIGHMEM option to think about.
> And if you don't enable RESOURCES_64BIT, then I guess it's reasonable
> for PFN_PHYS to discount the possibility of high pages?
>
> > Can we please do this properly, whatever that is? Even a dumb
> > always-return-u64 would be better?
> >
>
> I had that originally, but someone (hpa?) suggested resource_size_t.
> The sad thing is that most users don't really care; they're either
> 64-bit anyway, or immediately truncate the result to 32-bit.
>
> "Properly" would be to define a phys_addr_t which can always represent a
> physical address. We have one in x86-land, but I hesitate to add it for
> everyone else.
hm. It is a distinct and singular concept - it makes sense to have a
specific type to represet "a physical address for memory".
> >> printk("initrd extends beyond end of memory "
> >> - "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
> >> + "(0x%08lx > 0x%08llx)\ndisabling initrd\n",
> >> INITRD_START + INITRD_SIZE,
> >> PFN_PHYS(max_low_pfn));
> >>
> >
> > that'll generate a compile warning if m32r can set CONFIG_RESOURCES_64BIT=n.
> >
>
> (u64) cast, I guess.
>
nope ;) We don't know what type u64 has - some architectures use
`unsigned long' (we might fix this soon).
For now, a full cast to `unsigned long long' is needed.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] Make PFN_PHYS return a properly-formed physical address
2008-08-07 23:27 ` Andrew Morton
@ 2008-08-07 23:45 ` Jeremy Fitzhardinge
2008-08-08 0:06 ` Andrew Morton
0 siblings, 1 reply; 14+ messages in thread
From: Jeremy Fitzhardinge @ 2008-08-07 23:45 UTC (permalink / raw)
To: Andrew Morton; +Cc: ehabkost, x86, linux-kernel
Andrew Morton wrote:
> Yes, but resource_size_t is for IO addressing, not for memory addressing.
>
> Lots of X86_32 machines can happily support 32-bit physical addresses
> for IO while needing >32 bit addresses for physical memory.
>
Really? The resource tree treats normal memory as just another
resource. Is it expected that you could have usable memory not
represented by /proc/iomem?
Hm, looks like memory hotplug assumes that resource_size_t is always
64-bits, but the e820->resource conversion simply skips over-large
addresses.
>>>> #define PFN_ALIGN(x) (((unsigned long)(x) + (PAGE_SIZE - 1)) & PAGE_MASK)
>>>> #define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
>>>> #define PFN_DOWN(x) ((x) >> PAGE_SHIFT)
>>>> -#define PFN_PHYS(x) ((x) << PAGE_SHIFT)
>>>> +#define PFN_PHYS(x) ((resource_size_t)(x) << PAGE_SHIFT)
>>>>
>>>>
>>> Busted on PAE with CONFIG_RESOURCES_64BIT=n, surely?
>>>
>>>
>> Not an option:
>>
>> config X86_PAE
>> def_bool n
>> prompt "PAE (Physical Address Extension) Support"
>> depends on X86_32 && !HIGHMEM4G
>> select RESOURCES_64BIT
>>
>>
>
> err, OK, that was a bit arbitrary of us.
>
> Oh well, scrub the above assertion.
>
> Then again, do all architectures disallow 32-bit resource_size_t on
> 64-bit? And there's ppc32's CONFIG_HIGHMEM option to think about.
>
x86 and ppc were the only archs to touch it; they otherwise use the
default of "default 64BIT".
I didn't look at the ppc use case. I wasn't terribly concerned about
current users of PFN_PHYS, because it presumably works OK for them.
>> "Properly" would be to define a phys_addr_t which can always represent a
>> physical address. We have one in x86-land, but I hesitate to add it for
>> everyone else.
>>
>
> hm. It is a distinct and singular concept - it makes sense to have a
> specific type to represet "a physical address for memory".
>
Yes. We had to be particularly careful with it on x86 because of all
the problems it's caused, but it is a generally useful thing to be able
to talk about.
Shall we go with just using plain u64 (or unsigned long long if we want
a really consistent type) in the meantime, and then waffle about
introducing a new type everywhere?
Or we could redefine resource_size_t to be big enough to refer to any
resource, including all memory. It's close to being that anyway.
> nope ;) We don't know what type u64 has - some architectures use
> `unsigned long' (we might fix this soon).
>
> For now, a full cast to `unsigned long long' is needed.
>
Yep.
J
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] Make PFN_PHYS return a properly-formed physical address
2008-08-07 23:45 ` Jeremy Fitzhardinge
@ 2008-08-08 0:06 ` Andrew Morton
2008-08-08 0:16 ` Jeremy Fitzhardinge
` (2 more replies)
0 siblings, 3 replies; 14+ messages in thread
From: Andrew Morton @ 2008-08-08 0:06 UTC (permalink / raw)
To: Jeremy Fitzhardinge; +Cc: ehabkost, x86, linux-kernel
On Thu, 07 Aug 2008 16:45:12 -0700
Jeremy Fitzhardinge <jeremy@goop.org> wrote:
> Shall we go with just using plain u64 (or unsigned long long if we want
> a really consistent type) in the meantime, and then waffle about
> introducing a new type everywhere?
>
> Or we could redefine resource_size_t to be big enough to refer to any
> resource, including all memory. It's close to being that anyway.
We could do
typedef resource_size_t jeremy_thing_t;
for now and worry about it later if the need arises, perhaps.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH] Make PFN_PHYS return a properly-formed physical address
2008-08-08 0:06 ` Andrew Morton
@ 2008-08-08 0:16 ` Jeremy Fitzhardinge
2008-08-11 19:38 ` [PATCH 1/2] add phys_addr_t for holding physical addresses Jeremy Fitzhardinge
2008-08-11 19:38 ` [PATCH 2/2] make PFN_PHYS explicitly return phys_addr_t Jeremy Fitzhardinge
2 siblings, 0 replies; 14+ messages in thread
From: Jeremy Fitzhardinge @ 2008-08-08 0:16 UTC (permalink / raw)
To: Andrew Morton; +Cc: ehabkost, x86, linux-kernel
Andrew Morton wrote:
> On Thu, 07 Aug 2008 16:45:12 -0700
> Jeremy Fitzhardinge <jeremy@goop.org> wrote:
>
>
>> Shall we go with just using plain u64 (or unsigned long long if we want
>> a really consistent type) in the meantime, and then waffle about
>> introducing a new type everywhere?
>>
>> Or we could redefine resource_size_t to be big enough to refer to any
>> resource, including all memory. It's close to being that anyway.
>>
>
> We could do
>
> typedef resource_size_t jeremy_thing_t;
>
> for now and worry about it later if the need arises, perhaps.
>
OK, I'll revise and repost.
Hm, curiously, the two arches which care most about this issue (x86 and
powerpc) already have phys_addr_t...
I guess we don't want CONFIG_ARCH_HAVE_PHYS_ADDR_T...
J
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 1/2] add phys_addr_t for holding physical addresses
2008-08-08 0:06 ` Andrew Morton
2008-08-08 0:16 ` Jeremy Fitzhardinge
@ 2008-08-11 19:38 ` Jeremy Fitzhardinge
2008-08-11 21:58 ` Benjamin Herrenschmidt
2008-08-11 19:38 ` [PATCH 2/2] make PFN_PHYS explicitly return phys_addr_t Jeremy Fitzhardinge
2 siblings, 1 reply; 14+ messages in thread
From: Jeremy Fitzhardinge @ 2008-08-11 19:38 UTC (permalink / raw)
To: Andrew Morton
Cc: ehabkost, x86, linux-kernel, Benjamin Herrenschmidt,
Paul Mackerras
Add a kernel-wide "phys_addr_t" which is guaranteed to be able to hold
any physical address. By default it equals the word size of the
architecture, but a 32-bit architecture can set ARCH_PHYS_ADDR_T_64BIT
if it needs a 64-bit phys_addr_t.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
diff -r 4909b40dbdc5 arch/powerpc/Kconfig
--- a/arch/powerpc/Kconfig Fri Aug 08 13:40:52 2008 -0700
+++ b/arch/powerpc/Kconfig Mon Aug 11 10:32:52 2008 -0700
@@ -21,6 +21,9 @@
config PPC_MERGE
def_bool y
+
+config ARCH_PHYS_ADDR_T_64BIT
+ def_bool PPC64 || PHYS_64BIT
config MMU
bool
diff -r 4909b40dbdc5 arch/x86/Kconfig
--- a/arch/x86/Kconfig Fri Aug 08 13:40:52 2008 -0700
+++ b/arch/x86/Kconfig Mon Aug 11 10:32:53 2008 -0700
@@ -1002,6 +1002,9 @@
has the cost of more pagetable lookup overhead, and also
consumes more pagetable space per process.
+config ARCH_PHYS_ADDR_T_64BIT
+ def_bool X86_64 || X86_PAE
+
# Common NUMA Features
config NUMA
bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)"
diff -r 4909b40dbdc5 include/asm-powerpc/types.h
--- a/include/asm-powerpc/types.h Fri Aug 08 13:40:52 2008 -0700
+++ b/include/asm-powerpc/types.h Mon Aug 11 10:32:53 2008 -0700
@@ -48,13 +48,6 @@
typedef __vector128 vector128;
-/* Physical address used by some IO functions */
-#if defined(CONFIG_PPC64) || defined(CONFIG_PHYS_64BIT)
-typedef u64 phys_addr_t;
-#else
-typedef u32 phys_addr_t;
-#endif
-
#ifdef __powerpc64__
typedef u64 dma_addr_t;
#else
diff -r 4909b40dbdc5 include/asm-x86/page_32.h
--- a/include/asm-x86/page_32.h Fri Aug 08 13:40:52 2008 -0700
+++ b/include/asm-x86/page_32.h Mon Aug 11 10:32:53 2008 -0700
@@ -33,7 +33,6 @@
typedef u64 pudval_t;
typedef u64 pgdval_t;
typedef u64 pgprotval_t;
-typedef u64 phys_addr_t;
typedef union {
struct {
@@ -54,7 +53,6 @@
typedef unsigned long pudval_t;
typedef unsigned long pgdval_t;
typedef unsigned long pgprotval_t;
-typedef unsigned long phys_addr_t;
typedef union {
pteval_t pte;
diff -r 4909b40dbdc5 include/asm-x86/page_64.h
--- a/include/asm-x86/page_64.h Fri Aug 08 13:40:52 2008 -0700
+++ b/include/asm-x86/page_64.h Mon Aug 11 10:32:53 2008 -0700
@@ -79,7 +79,6 @@
typedef unsigned long pudval_t;
typedef unsigned long pgdval_t;
typedef unsigned long pgprotval_t;
-typedef unsigned long phys_addr_t;
typedef struct page *pgtable_t;
diff -r 4909b40dbdc5 include/linux/types.h
--- a/include/linux/types.h Fri Aug 08 13:40:52 2008 -0700
+++ b/include/linux/types.h Mon Aug 11 10:32:53 2008 -0700
@@ -197,6 +197,12 @@
typedef u32 resource_size_t;
#endif
+#ifdef CONFIG_PHYS_ADDR_T_64BIT
+typedef u64 phys_addr_t;
+#else
+typedef u32 phys_addr_t;
+#endif
+
struct ustat {
__kernel_daddr_t f_tfree;
__kernel_ino_t f_tinode;
diff -r 4909b40dbdc5 mm/Kconfig
--- a/mm/Kconfig Fri Aug 08 13:40:52 2008 -0700
+++ b/mm/Kconfig Mon Aug 11 10:32:53 2008 -0700
@@ -190,6 +190,9 @@
help
This option allows memory and IO resources to be 64 bit.
+config PHYS_ADDR_T_64BIT
+ def_bool 64BIT || ARCH_PHYS_ADDR_T_64BIT
+
config ZONE_DMA_FLAG
int
default "0" if !ZONE_DMA
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH 2/2] make PFN_PHYS explicitly return phys_addr_t
2008-08-08 0:06 ` Andrew Morton
2008-08-08 0:16 ` Jeremy Fitzhardinge
2008-08-11 19:38 ` [PATCH 1/2] add phys_addr_t for holding physical addresses Jeremy Fitzhardinge
@ 2008-08-11 19:38 ` Jeremy Fitzhardinge
2 siblings, 0 replies; 14+ messages in thread
From: Jeremy Fitzhardinge @ 2008-08-11 19:38 UTC (permalink / raw)
To: Andrew Morton; +Cc: ehabkost, x86, linux-kernel
PFN_PHYS, as its name suggests, turns a pfn into a physical address.
However, it is a macro which just operates on its argument without
modifying its type. pfns are typed unsigned long, but an unsigned
long may not be long enough to hold a physical address (32-bit systems
with more than 32 bits of physcial address).
Make sure we cast to phys_addr_t to return a complete result.
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Cc: Eduardo Habkost <ehabkost@redhat.com>
---
arch/m32r/mm/discontig.c | 2 +-
include/asm-x86/xen/page.h | 4 ++--
include/linux/pfn.h | 6 +++++-
3 files changed, 8 insertions(+), 4 deletions(-)
diff -r 6b03eb6361dd arch/m32r/mm/discontig.c
--- a/arch/m32r/mm/discontig.c Mon Aug 11 11:19:24 2008 -0700
+++ b/arch/m32r/mm/discontig.c Mon Aug 11 11:20:07 2008 -0700
@@ -112,9 +112,9 @@
initrd_start, INITRD_SIZE);
} else {
printk("initrd extends beyond end of memory "
- "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
+ "(0x%08lx > 0x%08llx)\ndisabling initrd\n",
INITRD_START + INITRD_SIZE,
- PFN_PHYS(max_low_pfn));
+ (unsigned long long)PFN_PHYS(max_low_pfn));
initrd_start = 0;
}
diff -r 6b03eb6361dd include/asm-x86/xen/page.h
--- a/include/asm-x86/xen/page.h Mon Aug 11 11:19:24 2008 -0700
+++ b/include/asm-x86/xen/page.h Mon Aug 11 11:20:07 2008 -0700
@@ -76,13 +76,13 @@
static inline xmaddr_t phys_to_machine(xpaddr_t phys)
{
unsigned offset = phys.paddr & ~PAGE_MASK;
- return XMADDR(PFN_PHYS((u64)pfn_to_mfn(PFN_DOWN(phys.paddr))) | offset);
+ return XMADDR(PFN_PHYS(pfn_to_mfn(PFN_DOWN(phys.paddr))) | offset);
}
static inline xpaddr_t machine_to_phys(xmaddr_t machine)
{
unsigned offset = machine.maddr & ~PAGE_MASK;
- return XPADDR(PFN_PHYS((u64)mfn_to_pfn(PFN_DOWN(machine.maddr))) | offset);
+ return XPADDR(PFN_PHYS(mfn_to_pfn(PFN_DOWN(machine.maddr))) | offset);
}
/*
diff -r 6b03eb6361dd include/linux/pfn.h
--- a/include/linux/pfn.h Mon Aug 11 11:19:24 2008 -0700
+++ b/include/linux/pfn.h Mon Aug 11 11:20:07 2008 -0700
@@ -1,9 +1,13 @@
#ifndef _LINUX_PFN_H_
#define _LINUX_PFN_H_
+
+#ifndef __ASSEMBLY__
+#include <linux/types.h>
+#endif
#define PFN_ALIGN(x) (((unsigned long)(x) + (PAGE_SIZE - 1)) & PAGE_MASK)
#define PFN_UP(x) (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
#define PFN_DOWN(x) ((x) >> PAGE_SHIFT)
-#define PFN_PHYS(x) ((x) << PAGE_SHIFT)
+#define PFN_PHYS(x) ((phys_addr_t)(x) << PAGE_SHIFT)
#endif
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] add phys_addr_t for holding physical addresses
2008-08-11 19:38 ` [PATCH 1/2] add phys_addr_t for holding physical addresses Jeremy Fitzhardinge
@ 2008-08-11 21:58 ` Benjamin Herrenschmidt
2008-08-11 22:15 ` Jeremy Fitzhardinge
0 siblings, 1 reply; 14+ messages in thread
From: Benjamin Herrenschmidt @ 2008-08-11 21:58 UTC (permalink / raw)
To: Jeremy Fitzhardinge
Cc: Andrew Morton, ehabkost, x86, linux-kernel, Paul Mackerras
On Mon, 2008-08-11 at 12:38 -0700, Jeremy Fitzhardinge wrote:
> Add a kernel-wide "phys_addr_t" which is guaranteed to be able to hold
> any physical address. By default it equals the word size of the
> architecture, but a 32-bit architecture can set ARCH_PHYS_ADDR_T_64BIT
> if it needs a 64-bit phys_addr_t.
I've been wondering for some time why can't we make phys_addr_t and
resource_size_t the same thing... I don't like having two ARCH_* thing
especially since I believe the one for resources is already what we
want.
Ben.
> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
> Cc: Paul Mackerras <paulus@samba.org>
> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
> diff -r 4909b40dbdc5 arch/powerpc/Kconfig
> --- a/arch/powerpc/Kconfig Fri Aug 08 13:40:52 2008 -0700
> +++ b/arch/powerpc/Kconfig Mon Aug 11 10:32:52 2008 -0700
> @@ -21,6 +21,9 @@
>
> config PPC_MERGE
> def_bool y
> +
> +config ARCH_PHYS_ADDR_T_64BIT
> + def_bool PPC64 || PHYS_64BIT
>
> config MMU
> bool
> diff -r 4909b40dbdc5 arch/x86/Kconfig
> --- a/arch/x86/Kconfig Fri Aug 08 13:40:52 2008 -0700
> +++ b/arch/x86/Kconfig Mon Aug 11 10:32:53 2008 -0700
> @@ -1002,6 +1002,9 @@
> has the cost of more pagetable lookup overhead, and also
> consumes more pagetable space per process.
>
> +config ARCH_PHYS_ADDR_T_64BIT
> + def_bool X86_64 || X86_PAE
> +
> # Common NUMA Features
> config NUMA
> bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)"
> diff -r 4909b40dbdc5 include/asm-powerpc/types.h
> --- a/include/asm-powerpc/types.h Fri Aug 08 13:40:52 2008 -0700
> +++ b/include/asm-powerpc/types.h Mon Aug 11 10:32:53 2008 -0700
> @@ -48,13 +48,6 @@
>
> typedef __vector128 vector128;
>
> -/* Physical address used by some IO functions */
> -#if defined(CONFIG_PPC64) || defined(CONFIG_PHYS_64BIT)
> -typedef u64 phys_addr_t;
> -#else
> -typedef u32 phys_addr_t;
> -#endif
> -
> #ifdef __powerpc64__
> typedef u64 dma_addr_t;
> #else
> diff -r 4909b40dbdc5 include/asm-x86/page_32.h
> --- a/include/asm-x86/page_32.h Fri Aug 08 13:40:52 2008 -0700
> +++ b/include/asm-x86/page_32.h Mon Aug 11 10:32:53 2008 -0700
> @@ -33,7 +33,6 @@
> typedef u64 pudval_t;
> typedef u64 pgdval_t;
> typedef u64 pgprotval_t;
> -typedef u64 phys_addr_t;
>
> typedef union {
> struct {
> @@ -54,7 +53,6 @@
> typedef unsigned long pudval_t;
> typedef unsigned long pgdval_t;
> typedef unsigned long pgprotval_t;
> -typedef unsigned long phys_addr_t;
>
> typedef union {
> pteval_t pte;
> diff -r 4909b40dbdc5 include/asm-x86/page_64.h
> --- a/include/asm-x86/page_64.h Fri Aug 08 13:40:52 2008 -0700
> +++ b/include/asm-x86/page_64.h Mon Aug 11 10:32:53 2008 -0700
> @@ -79,7 +79,6 @@
> typedef unsigned long pudval_t;
> typedef unsigned long pgdval_t;
> typedef unsigned long pgprotval_t;
> -typedef unsigned long phys_addr_t;
>
> typedef struct page *pgtable_t;
>
> diff -r 4909b40dbdc5 include/linux/types.h
> --- a/include/linux/types.h Fri Aug 08 13:40:52 2008 -0700
> +++ b/include/linux/types.h Mon Aug 11 10:32:53 2008 -0700
> @@ -197,6 +197,12 @@
> typedef u32 resource_size_t;
> #endif
>
> +#ifdef CONFIG_PHYS_ADDR_T_64BIT
> +typedef u64 phys_addr_t;
> +#else
> +typedef u32 phys_addr_t;
> +#endif
> +
> struct ustat {
> __kernel_daddr_t f_tfree;
> __kernel_ino_t f_tinode;
> diff -r 4909b40dbdc5 mm/Kconfig
> --- a/mm/Kconfig Fri Aug 08 13:40:52 2008 -0700
> +++ b/mm/Kconfig Mon Aug 11 10:32:53 2008 -0700
> @@ -190,6 +190,9 @@
> help
> This option allows memory and IO resources to be 64 bit.
>
> +config PHYS_ADDR_T_64BIT
> + def_bool 64BIT || ARCH_PHYS_ADDR_T_64BIT
> +
> config ZONE_DMA_FLAG
> int
> default "0" if !ZONE_DMA
>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] add phys_addr_t for holding physical addresses
2008-08-11 21:58 ` Benjamin Herrenschmidt
@ 2008-08-11 22:15 ` Jeremy Fitzhardinge
2008-08-11 22:32 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 14+ messages in thread
From: Jeremy Fitzhardinge @ 2008-08-11 22:15 UTC (permalink / raw)
To: benh; +Cc: Andrew Morton, ehabkost, x86, linux-kernel, Paul Mackerras
Benjamin Herrenschmidt wrote:
> On Mon, 2008-08-11 at 12:38 -0700, Jeremy Fitzhardinge wrote:
>
>> Add a kernel-wide "phys_addr_t" which is guaranteed to be able to hold
>> any physical address. By default it equals the word size of the
>> architecture, but a 32-bit architecture can set ARCH_PHYS_ADDR_T_64BIT
>> if it needs a 64-bit phys_addr_t.
>>
>
> I've been wondering for some time why can't we make phys_addr_t and
> resource_size_t the same thing... I don't like having two ARCH_* thing
> especially since I believe the one for resources is already what we
> want.
>
I made the same argument, but Andrew thinks they're conceptually
distinct. It is theoretically possible you might have a system with >4G
memory, but all io resources < 4G, so you'd have resource_size_t
32-bits, while having 64-bit physical addresses. You can configure such
a thing, but I don't know if it's 1) useful or 2) used.
J
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] add phys_addr_t for holding physical addresses
2008-08-11 22:15 ` Jeremy Fitzhardinge
@ 2008-08-11 22:32 ` Benjamin Herrenschmidt
2008-08-11 22:50 ` Jeremy Fitzhardinge
0 siblings, 1 reply; 14+ messages in thread
From: Benjamin Herrenschmidt @ 2008-08-11 22:32 UTC (permalink / raw)
To: Jeremy Fitzhardinge
Cc: Andrew Morton, ehabkost, x86, linux-kernel, Paul Mackerras
On Mon, 2008-08-11 at 15:15 -0700, Jeremy Fitzhardinge wrote:
> Benjamin Herrenschmidt wrote:
> > On Mon, 2008-08-11 at 12:38 -0700, Jeremy Fitzhardinge wrote:
> >
> >> Add a kernel-wide "phys_addr_t" which is guaranteed to be able to hold
> >> any physical address. By default it equals the word size of the
> >> architecture, but a 32-bit architecture can set ARCH_PHYS_ADDR_T_64BIT
> >> if it needs a 64-bit phys_addr_t.
> >>
> >
> > I've been wondering for some time why can't we make phys_addr_t and
> > resource_size_t the same thing... I don't like having two ARCH_* thing
> > especially since I believe the one for resources is already what we
> > want.
> >
>
> I made the same argument, but Andrew thinks they're conceptually
> distinct. It is theoretically possible you might have a system with >4G
> memory, but all io resources < 4G, so you'd have resource_size_t
> 32-bits, while having 64-bit physical addresses. You can configure such
> a thing, but I don't know if it's 1) useful or 2) used.
Are we sure resource_size_t is -never- used to represent memory ? I
though it was on some platforms....
Ben.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] add phys_addr_t for holding physical addresses
2008-08-11 22:32 ` Benjamin Herrenschmidt
@ 2008-08-11 22:50 ` Jeremy Fitzhardinge
2008-08-11 22:53 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 14+ messages in thread
From: Jeremy Fitzhardinge @ 2008-08-11 22:50 UTC (permalink / raw)
To: benh; +Cc: Andrew Morton, ehabkost, x86, linux-kernel, Paul Mackerras
Benjamin Herrenschmidt wrote:
> Are we sure resource_size_t is -never- used to represent memory ? I
> though it was on some platforms....
On x86 it's optionally used to put memory in the resource tree, but if
the memory is larger than can be held in resource_size_t it simply skips
it. Don't know about elsewhere.
J
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] add phys_addr_t for holding physical addresses
2008-08-11 22:50 ` Jeremy Fitzhardinge
@ 2008-08-11 22:53 ` Benjamin Herrenschmidt
2008-08-11 23:02 ` Jeremy Fitzhardinge
0 siblings, 1 reply; 14+ messages in thread
From: Benjamin Herrenschmidt @ 2008-08-11 22:53 UTC (permalink / raw)
To: Jeremy Fitzhardinge
Cc: Andrew Morton, ehabkost, x86, linux-kernel, Paul Mackerras
On Mon, 2008-08-11 at 15:50 -0700, Jeremy Fitzhardinge wrote:
> Benjamin Herrenschmidt wrote:
> > Are we sure resource_size_t is -never- used to represent memory ? I
> > though it was on some platforms....
>
> On x86 it's optionally used to put memory in the resource tree, but if
> the memory is larger than can be held in resource_size_t it simply skips
> it. Don't know about elsewhere.
That sounds like a good enough reason to not separate the two concepts..
Ben.
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] add phys_addr_t for holding physical addresses
2008-08-11 22:53 ` Benjamin Herrenschmidt
@ 2008-08-11 23:02 ` Jeremy Fitzhardinge
2008-08-11 23:17 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 14+ messages in thread
From: Jeremy Fitzhardinge @ 2008-08-11 23:02 UTC (permalink / raw)
To: benh; +Cc: Andrew Morton, ehabkost, x86, linux-kernel, Paul Mackerras
Benjamin Herrenschmidt wrote:
> On Mon, 2008-08-11 at 15:50 -0700, Jeremy Fitzhardinge wrote:
>
>> Benjamin Herrenschmidt wrote:
>>
>>> Are we sure resource_size_t is -never- used to represent memory ? I
>>> though it was on some platforms....
>>>
>> On x86 it's optionally used to put memory in the resource tree, but if
>> the memory is larger than can be held in resource_size_t it simply skips
>> it. Don't know about elsewhere.
>>
>
> That sounds like a good enough reason to not separate the two concepts..
The resource_size_t situation is obscure. I'd be happy to just remove
its config, use my patch and typedef phys_addr_t resource_size_t.
J
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH 1/2] add phys_addr_t for holding physical addresses
2008-08-11 23:02 ` Jeremy Fitzhardinge
@ 2008-08-11 23:17 ` Benjamin Herrenschmidt
0 siblings, 0 replies; 14+ messages in thread
From: Benjamin Herrenschmidt @ 2008-08-11 23:17 UTC (permalink / raw)
To: Jeremy Fitzhardinge
Cc: Andrew Morton, ehabkost, x86, linux-kernel, Paul Mackerras
> The resource_size_t situation is obscure. I'd be happy to just remove
> its config, use my patch and typedef phys_addr_t resource_size_t.
I have no objection there as far as powerpc is concerned.
Ben.
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2008-08-11 23:19 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <489B6B40.5050705@goop.org>
[not found] ` <20080807145648.ab3dfa90.akpm@linux-foundation.org>
2008-08-07 22:10 ` [PATCH] Make PFN_PHYS return a properly-formed physical address Jeremy Fitzhardinge
2008-08-07 23:27 ` Andrew Morton
2008-08-07 23:45 ` Jeremy Fitzhardinge
2008-08-08 0:06 ` Andrew Morton
2008-08-08 0:16 ` Jeremy Fitzhardinge
2008-08-11 19:38 ` [PATCH 1/2] add phys_addr_t for holding physical addresses Jeremy Fitzhardinge
2008-08-11 21:58 ` Benjamin Herrenschmidt
2008-08-11 22:15 ` Jeremy Fitzhardinge
2008-08-11 22:32 ` Benjamin Herrenschmidt
2008-08-11 22:50 ` Jeremy Fitzhardinge
2008-08-11 22:53 ` Benjamin Herrenschmidt
2008-08-11 23:02 ` Jeremy Fitzhardinge
2008-08-11 23:17 ` Benjamin Herrenschmidt
2008-08-11 19:38 ` [PATCH 2/2] make PFN_PHYS explicitly return phys_addr_t Jeremy Fitzhardinge
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox