mirror of https://gitee.com/openkylin/linux.git
ia64: perfmon: don't mark buffer pages as PG_reserved
In the old days, remap_pfn_range() required pages to be marked as PG_reserved, so they would e.g. never get swapped out. This was required for special mappings. Nowadays, this is fully handled via the VMA (VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP inside remap_pfn_range() to be precise). PG_reserved is no longer required but only a relic from the past. So only architecture specific MM handling might require it (e.g. to detect them as MMIO pages). As there are no architecture specific checks for PageReserved() apart from MCA handling in ia64code, this can go. Use simple vzalloc()/vfree() instead. Note that before calling vzalloc(), size has already been aligned to PAGE_SIZE, no need to align again. Link: http://lkml.kernel.org/r/20190114125903.24845-9-david@redhat.com Signed-off-by: David Hildenbrand <david@redhat.com> Cc: Tony Luck <tony.luck@intel.com> Cc: Fenghua Yu <fenghua.yu@intel.com> Cc: Oleg Nesterov <oleg@redhat.com> Cc: David Hildenbrand <david@redhat.com> Cc: David Howells <dhowells@redhat.com> Cc: Mike Rapoport <rppt@linux.vnet.ibm.com> Cc: Michal Hocko <mhocko@suse.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d9fa9d9517
commit
731351d1bd
|
@ -583,17 +583,6 @@ pfm_put_task(struct task_struct *task)
|
||||||
if (task != current) put_task_struct(task);
|
if (task != current) put_task_struct(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
|
||||||
pfm_reserve_page(unsigned long a)
|
|
||||||
{
|
|
||||||
SetPageReserved(vmalloc_to_page((void *)a));
|
|
||||||
}
|
|
||||||
static inline void
|
|
||||||
pfm_unreserve_page(unsigned long a)
|
|
||||||
{
|
|
||||||
ClearPageReserved(vmalloc_to_page((void*)a));
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline unsigned long
|
static inline unsigned long
|
||||||
pfm_protect_ctx_ctxsw(pfm_context_t *x)
|
pfm_protect_ctx_ctxsw(pfm_context_t *x)
|
||||||
{
|
{
|
||||||
|
@ -816,44 +805,6 @@ pfm_reset_msgq(pfm_context_t *ctx)
|
||||||
DPRINT(("ctx=%p msgq reset\n", ctx));
|
DPRINT(("ctx=%p msgq reset\n", ctx));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *
|
|
||||||
pfm_rvmalloc(unsigned long size)
|
|
||||||
{
|
|
||||||
void *mem;
|
|
||||||
unsigned long addr;
|
|
||||||
|
|
||||||
size = PAGE_ALIGN(size);
|
|
||||||
mem = vzalloc(size);
|
|
||||||
if (mem) {
|
|
||||||
//printk("perfmon: CPU%d pfm_rvmalloc(%ld)=%p\n", smp_processor_id(), size, mem);
|
|
||||||
addr = (unsigned long)mem;
|
|
||||||
while (size > 0) {
|
|
||||||
pfm_reserve_page(addr);
|
|
||||||
addr+=PAGE_SIZE;
|
|
||||||
size-=PAGE_SIZE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return mem;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
pfm_rvfree(void *mem, unsigned long size)
|
|
||||||
{
|
|
||||||
unsigned long addr;
|
|
||||||
|
|
||||||
if (mem) {
|
|
||||||
DPRINT(("freeing physical buffer @%p size=%lu\n", mem, size));
|
|
||||||
addr = (unsigned long) mem;
|
|
||||||
while ((long) size > 0) {
|
|
||||||
pfm_unreserve_page(addr);
|
|
||||||
addr+=PAGE_SIZE;
|
|
||||||
size-=PAGE_SIZE;
|
|
||||||
}
|
|
||||||
vfree(mem);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
static pfm_context_t *
|
static pfm_context_t *
|
||||||
pfm_context_alloc(int ctx_flags)
|
pfm_context_alloc(int ctx_flags)
|
||||||
{
|
{
|
||||||
|
@ -1498,7 +1449,7 @@ pfm_free_smpl_buffer(pfm_context_t *ctx)
|
||||||
/*
|
/*
|
||||||
* free the buffer
|
* free the buffer
|
||||||
*/
|
*/
|
||||||
pfm_rvfree(ctx->ctx_smpl_hdr, ctx->ctx_smpl_size);
|
vfree(ctx->ctx_smpl_hdr);
|
||||||
|
|
||||||
ctx->ctx_smpl_hdr = NULL;
|
ctx->ctx_smpl_hdr = NULL;
|
||||||
ctx->ctx_smpl_size = 0UL;
|
ctx->ctx_smpl_size = 0UL;
|
||||||
|
@ -2137,7 +2088,7 @@ pfm_close(struct inode *inode, struct file *filp)
|
||||||
* All memory free operations (especially for vmalloc'ed memory)
|
* All memory free operations (especially for vmalloc'ed memory)
|
||||||
* MUST be done with interrupts ENABLED.
|
* MUST be done with interrupts ENABLED.
|
||||||
*/
|
*/
|
||||||
if (smpl_buf_addr) pfm_rvfree(smpl_buf_addr, smpl_buf_size);
|
vfree(smpl_buf_addr);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* return the memory used by the context
|
* return the memory used by the context
|
||||||
|
@ -2266,10 +2217,8 @@ pfm_smpl_buffer_alloc(struct task_struct *task, struct file *filp, pfm_context_t
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We do the easy to undo allocations first.
|
* We do the easy to undo allocations first.
|
||||||
*
|
|
||||||
* pfm_rvmalloc(), clears the buffer, so there is no leak
|
|
||||||
*/
|
*/
|
||||||
smpl_buf = pfm_rvmalloc(size);
|
smpl_buf = vzalloc(size);
|
||||||
if (smpl_buf == NULL) {
|
if (smpl_buf == NULL) {
|
||||||
DPRINT(("Can't allocate sampling buffer\n"));
|
DPRINT(("Can't allocate sampling buffer\n"));
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -2346,7 +2295,7 @@ pfm_smpl_buffer_alloc(struct task_struct *task, struct file *filp, pfm_context_t
|
||||||
error:
|
error:
|
||||||
vm_area_free(vma);
|
vm_area_free(vma);
|
||||||
error_kmem:
|
error_kmem:
|
||||||
pfm_rvfree(smpl_buf, size);
|
vfree(smpl_buf);
|
||||||
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue