sh: wire up vmallocinfo support in ioremap() implementations.

This wires up the caller information for the ioremap VMA, which allows
for more helpful caller tracking via /proc/vmallocinfo. Follows the x86
and powerpc changes of the same nature.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
Paul Mundt 2009-12-14 14:23:41 +09:00
parent 1232d88a47
commit bf3cdeda90
3 changed files with 16 additions and 10 deletions

View File

@ -233,10 +233,16 @@ unsigned long long poke_real_address_q(unsigned long long addr,
* doesn't exist, so everything must go through page tables. * doesn't exist, so everything must go through page tables.
*/ */
#ifdef CONFIG_MMU #ifdef CONFIG_MMU
void __iomem *__ioremap(unsigned long offset, unsigned long size, void __iomem *__ioremap_caller(unsigned long offset, unsigned long size,
unsigned long flags); unsigned long flags, void *caller);
void __iounmap(void __iomem *addr); void __iounmap(void __iomem *addr);
static inline void __iomem *
__ioremap(unsigned long offset, unsigned long size, unsigned long flags)
{
return __ioremap_caller(offset, size, flags, __builtin_return_address(0));
}
static inline void __iomem * static inline void __iomem *
__ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags) __ioremap_mode(unsigned long offset, unsigned long size, unsigned long flags)
{ {

View File

@ -33,10 +33,10 @@
* have to convert them into an offset in a page-aligned mapping, but the * have to convert them into an offset in a page-aligned mapping, but the
* caller shouldn't need to know that small detail. * caller shouldn't need to know that small detail.
*/ */
void __iomem *__ioremap(unsigned long phys_addr, unsigned long size, void __iomem *__ioremap_caller(unsigned long phys_addr, unsigned long size,
unsigned long flags) unsigned long flags, void *caller)
{ {
struct vm_struct * area; struct vm_struct *area;
unsigned long offset, last_addr, addr, orig_addr; unsigned long offset, last_addr, addr, orig_addr;
pgprot_t pgprot; pgprot_t pgprot;
@ -67,7 +67,7 @@ void __iomem *__ioremap(unsigned long phys_addr, unsigned long size,
/* /*
* Ok, go for it.. * Ok, go for it..
*/ */
area = get_vm_area(size, VM_IOREMAP); area = get_vm_area_caller(size, VM_IOREMAP, caller);
if (!area) if (!area)
return NULL; return NULL;
area->phys_addr = phys_addr; area->phys_addr = phys_addr;
@ -103,7 +103,7 @@ void __iomem *__ioremap(unsigned long phys_addr, unsigned long size,
return (void __iomem *)(offset + (char *)orig_addr); return (void __iomem *)(offset + (char *)orig_addr);
} }
EXPORT_SYMBOL(__ioremap); EXPORT_SYMBOL(__ioremap_caller);
void __iounmap(void __iomem *addr) void __iounmap(void __iomem *addr)
{ {

View File

@ -258,15 +258,15 @@ static void shmedia_unmapioaddr(unsigned long vaddr)
pte_clear(&init_mm, vaddr, ptep); pte_clear(&init_mm, vaddr, ptep);
} }
void __iomem *__ioremap(unsigned long offset, unsigned long size, void __iomem *__ioremap_caller(unsigned long offset, unsigned long size,
unsigned long flags) unsigned long flags, void *caller)
{ {
char name[14]; char name[14];
sprintf(name, "phys_%08x", (u32)offset); sprintf(name, "phys_%08x", (u32)offset);
return shmedia_alloc_io(offset, size, name, flags); return shmedia_alloc_io(offset, size, name, flags);
} }
EXPORT_SYMBOL(__ioremap); EXPORT_SYMBOL(__ioremap_caller);
void __iounmap(void __iomem *virtual) void __iounmap(void __iomem *virtual)
{ {