powerpc: Wire up /proc/vmallocinfo to our ioremap()

This adds the necessary bits and pieces to powerpc implementation of
ioremap to benefit from caller tracking in /proc/vmallocinfo, at least
for ioremap's done after mem init as the older ones aren't tracked.
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent 16962e7c
...@@ -632,6 +632,9 @@ static inline void iosync(void) ...@@ -632,6 +632,9 @@ static inline void iosync(void)
* ioremap_flags and cannot be hooked (but can be used by a hook on one * ioremap_flags and cannot be hooked (but can be used by a hook on one
* of the previous ones) * of the previous ones)
* *
* * __ioremap_caller is the same as above but takes an explicit caller
* reference rather than using __builtin_return_address(0)
*
* * __iounmap, is the low level implementation used by iounmap and cannot * * __iounmap, is the low level implementation used by iounmap and cannot
* be hooked (but can be used by a hook on iounmap) * be hooked (but can be used by a hook on iounmap)
* *
...@@ -646,6 +649,9 @@ extern void iounmap(volatile void __iomem *addr); ...@@ -646,6 +649,9 @@ extern void iounmap(volatile void __iomem *addr);
extern void __iomem *__ioremap(phys_addr_t, unsigned long size, extern void __iomem *__ioremap(phys_addr_t, unsigned long size,
unsigned long flags); unsigned long flags);
extern void __iomem *__ioremap_caller(phys_addr_t, unsigned long size,
unsigned long flags, void *caller);
extern void __iounmap(volatile void __iomem *addr); extern void __iounmap(volatile void __iomem *addr);
extern void __iomem * __ioremap_at(phys_addr_t pa, void *ea, extern void __iomem * __ioremap_at(phys_addr_t pa, void *ea,
......
...@@ -90,7 +90,7 @@ struct machdep_calls { ...@@ -90,7 +90,7 @@ struct machdep_calls {
void (*tce_flush)(struct iommu_table *tbl); void (*tce_flush)(struct iommu_table *tbl);
void __iomem * (*ioremap)(phys_addr_t addr, unsigned long size, void __iomem * (*ioremap)(phys_addr_t addr, unsigned long size,
unsigned long flags); unsigned long flags, void *caller);
void (*iounmap)(volatile void __iomem *token); void (*iounmap)(volatile void __iomem *token);
#ifdef CONFIG_PM #ifdef CONFIG_PM
......
...@@ -129,7 +129,8 @@ pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address) ...@@ -129,7 +129,8 @@ pgtable_t pte_alloc_one(struct mm_struct *mm, unsigned long address)
void __iomem * void __iomem *
ioremap(phys_addr_t addr, unsigned long size) ioremap(phys_addr_t addr, unsigned long size)
{ {
return __ioremap(addr, size, _PAGE_NO_CACHE | _PAGE_GUARDED); return __ioremap_caller(addr, size, _PAGE_NO_CACHE | _PAGE_GUARDED,
__builtin_return_address(0));
} }
EXPORT_SYMBOL(ioremap); EXPORT_SYMBOL(ioremap);
...@@ -143,12 +144,19 @@ ioremap_flags(phys_addr_t addr, unsigned long size, unsigned long flags) ...@@ -143,12 +144,19 @@ ioremap_flags(phys_addr_t addr, unsigned long size, unsigned long flags)
/* we don't want to let _PAGE_USER and _PAGE_EXEC leak out */ /* we don't want to let _PAGE_USER and _PAGE_EXEC leak out */
flags &= ~(_PAGE_USER | _PAGE_EXEC | _PAGE_HWEXEC); flags &= ~(_PAGE_USER | _PAGE_EXEC | _PAGE_HWEXEC);
return __ioremap(addr, size, flags); return __ioremap_caller(addr, size, flags, __builtin_return_address(0));
} }
EXPORT_SYMBOL(ioremap_flags); EXPORT_SYMBOL(ioremap_flags);
void __iomem * void __iomem *
__ioremap(phys_addr_t addr, unsigned long size, unsigned long flags) __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags)
{
return __ioremap_caller(addr, size, flags, __builtin_return_address(0));
}
void __iomem *
__ioremap_caller(phys_addr_t addr, unsigned long size, unsigned long flags,
void *caller)
{ {
unsigned long v, i; unsigned long v, i;
phys_addr_t p; phys_addr_t p;
...@@ -212,7 +220,7 @@ __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags) ...@@ -212,7 +220,7 @@ __ioremap(phys_addr_t addr, unsigned long size, unsigned long flags)
if (mem_init_done) { if (mem_init_done) {
struct vm_struct *area; struct vm_struct *area;
area = get_vm_area(size, VM_IOREMAP); area = get_vm_area_caller(size, VM_IOREMAP, caller);
if (area == 0) if (area == 0)
return NULL; return NULL;
v = (unsigned long) area->addr; v = (unsigned long) area->addr;
......
...@@ -144,8 +144,8 @@ void __iounmap_at(void *ea, unsigned long size) ...@@ -144,8 +144,8 @@ void __iounmap_at(void *ea, unsigned long size)
unmap_kernel_range((unsigned long)ea, size); unmap_kernel_range((unsigned long)ea, size);
} }
void __iomem * __ioremap(phys_addr_t addr, unsigned long size, void __iomem * __ioremap_caller(phys_addr_t addr, unsigned long size,
unsigned long flags) unsigned long flags, void *caller)
{ {
phys_addr_t paligned; phys_addr_t paligned;
void __iomem *ret; void __iomem *ret;
...@@ -168,8 +168,9 @@ void __iomem * __ioremap(phys_addr_t addr, unsigned long size, ...@@ -168,8 +168,9 @@ void __iomem * __ioremap(phys_addr_t addr, unsigned long size,
if (mem_init_done) { if (mem_init_done) {
struct vm_struct *area; struct vm_struct *area;
area = __get_vm_area(size, VM_IOREMAP, area = __get_vm_area_caller(size, VM_IOREMAP,
ioremap_bot, IOREMAP_END); ioremap_bot, IOREMAP_END,
caller);
if (area == NULL) if (area == NULL)
return NULL; return NULL;
ret = __ioremap_at(paligned, area->addr, size, flags); ret = __ioremap_at(paligned, area->addr, size, flags);
...@@ -186,19 +187,27 @@ void __iomem * __ioremap(phys_addr_t addr, unsigned long size, ...@@ -186,19 +187,27 @@ void __iomem * __ioremap(phys_addr_t addr, unsigned long size,
return ret; return ret;
} }
void __iomem * __ioremap(phys_addr_t addr, unsigned long size,
unsigned long flags)
{
return __ioremap_caller(addr, size, flags, __builtin_return_address(0));
}
void __iomem * ioremap(phys_addr_t addr, unsigned long size) void __iomem * ioremap(phys_addr_t addr, unsigned long size)
{ {
unsigned long flags = _PAGE_NO_CACHE | _PAGE_GUARDED; unsigned long flags = _PAGE_NO_CACHE | _PAGE_GUARDED;
void *caller = __builtin_return_address(0);
if (ppc_md.ioremap) if (ppc_md.ioremap)
return ppc_md.ioremap(addr, size, flags); return ppc_md.ioremap(addr, size, flags, caller);
return __ioremap(addr, size, flags); return __ioremap_caller(addr, size, flags, caller);
} }
void __iomem * ioremap_flags(phys_addr_t addr, unsigned long size, void __iomem * ioremap_flags(phys_addr_t addr, unsigned long size,
unsigned long flags) unsigned long flags)
{ {
void *caller = __builtin_return_address(0);
/* writeable implies dirty for kernel addresses */ /* writeable implies dirty for kernel addresses */
if (flags & _PAGE_RW) if (flags & _PAGE_RW)
flags |= _PAGE_DIRTY; flags |= _PAGE_DIRTY;
...@@ -207,8 +216,8 @@ void __iomem * ioremap_flags(phys_addr_t addr, unsigned long size, ...@@ -207,8 +216,8 @@ void __iomem * ioremap_flags(phys_addr_t addr, unsigned long size,
flags &= ~(_PAGE_USER | _PAGE_EXEC); flags &= ~(_PAGE_USER | _PAGE_EXEC);
if (ppc_md.ioremap) if (ppc_md.ioremap)
return ppc_md.ioremap(addr, size, flags); return ppc_md.ioremap(addr, size, flags, caller);
return __ioremap(addr, size, flags); return __ioremap_caller(addr, size, flags, caller);
} }
......
...@@ -131,10 +131,10 @@ static const struct ppc_pci_io __devinitconst iowa_pci_io = { ...@@ -131,10 +131,10 @@ static const struct ppc_pci_io __devinitconst iowa_pci_io = {
}; };
static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size, static void __iomem *iowa_ioremap(phys_addr_t addr, unsigned long size,
unsigned long flags) unsigned long flags, void *caller)
{ {
struct iowa_bus *bus; struct iowa_bus *bus;
void __iomem *res = __ioremap(addr, size, flags); void __iomem *res = __ioremap_caller(addr, size, flags, caller);
int busno; int busno;
bus = iowa_pci_find(0, (unsigned long)addr); bus = iowa_pci_find(0, (unsigned long)addr);
......
...@@ -617,7 +617,7 @@ static void iseries_dedicated_idle(void) ...@@ -617,7 +617,7 @@ static void iseries_dedicated_idle(void)
} }
static void __iomem *iseries_ioremap(phys_addr_t address, unsigned long size, static void __iomem *iseries_ioremap(phys_addr_t address, unsigned long size,
unsigned long flags) unsigned long flags, void *caller)
{ {
return (void __iomem *)address; return (void __iomem *)address;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment