mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull VFS updates from Al Viro,
Misc cleanups all over the place, mainly wrt /proc interfaces (switch
create_proc_entry to proc_create(), get rid of the deprecated
create_proc_read_entry() in favor of using proc_create_data() and
seq_file etc).
7kloc removed.
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: (204 commits)
don't bother with deferred freeing of fdtables
proc: Move non-public stuff from linux/proc_fs.h to fs/proc/internal.h
proc: Make the PROC_I() and PDE() macros internal to procfs
proc: Supply a function to remove a proc entry by PDE
take cgroup_open() and cpuset_open() to fs/proc/base.c
ppc: Clean up scanlog
ppc: Clean up rtas_flash driver somewhat
hostap: proc: Use remove_proc_subtree()
drm: proc: Use remove_proc_subtree()
drm: proc: Use minor->index to label things, not PDE->name
drm: Constify drm_proc_list[]
zoran: Don't print proc_dir_entry data in debug
reiserfs: Don't access the proc_dir_entry in r_open(), r_start() r_show()
proc: Supply an accessor for getting the data from a PDE's parent
airo: Use remove_proc_subtree()
rtl8192u: Don't need to save device proc dir PDE
rtl8187se: Use a dir under /proc/net/r8180/
proc: Add proc_mkdir_data()
proc: Move some bits from linux/proc_fs.h to linux/{of.h,signal.h,tty.h}
proc: Move PDE_NET() to fs/proc/proc_net.c
...
This commit is contained in:
commit
20b4fb4852
385 changed files with 7396 additions and 14540 deletions
45
mm/vmalloc.c
45
mm/vmalloc.c
|
|
@ -27,10 +27,30 @@
|
|||
#include <linux/pfn.h>
|
||||
#include <linux/kmemleak.h>
|
||||
#include <linux/atomic.h>
|
||||
#include <linux/llist.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/shmparam.h>
|
||||
|
||||
struct vfree_deferred {
|
||||
struct llist_head list;
|
||||
struct work_struct wq;
|
||||
};
|
||||
static DEFINE_PER_CPU(struct vfree_deferred, vfree_deferred);
|
||||
|
||||
static void __vunmap(const void *, int);
|
||||
|
||||
static void free_work(struct work_struct *w)
|
||||
{
|
||||
struct vfree_deferred *p = container_of(w, struct vfree_deferred, wq);
|
||||
struct llist_node *llnode = llist_del_all(&p->list);
|
||||
while (llnode) {
|
||||
void *p = llnode;
|
||||
llnode = llist_next(llnode);
|
||||
__vunmap(p, 1);
|
||||
}
|
||||
}
|
||||
|
||||
/*** Page table manipulation functions ***/
|
||||
|
||||
static void vunmap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end)
|
||||
|
|
@ -1175,10 +1195,14 @@ void __init vmalloc_init(void)
|
|||
|
||||
for_each_possible_cpu(i) {
|
||||
struct vmap_block_queue *vbq;
|
||||
struct vfree_deferred *p;
|
||||
|
||||
vbq = &per_cpu(vmap_block_queue, i);
|
||||
spin_lock_init(&vbq->lock);
|
||||
INIT_LIST_HEAD(&vbq->free);
|
||||
p = &per_cpu(vfree_deferred, i);
|
||||
init_llist_head(&p->list);
|
||||
INIT_WORK(&p->wq, free_work);
|
||||
}
|
||||
|
||||
/* Import existing vmlist entries. */
|
||||
|
|
@ -1486,7 +1510,7 @@ static void __vunmap(const void *addr, int deallocate_pages)
|
|||
kfree(area);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* vfree - release memory allocated by vmalloc()
|
||||
* @addr: memory base address
|
||||
|
|
@ -1495,15 +1519,25 @@ static void __vunmap(const void *addr, int deallocate_pages)
|
|||
* obtained from vmalloc(), vmalloc_32() or __vmalloc(). If @addr is
|
||||
* NULL, no operation is performed.
|
||||
*
|
||||
* Must not be called in interrupt context.
|
||||
* Must not be called in NMI context (strictly speaking, only if we don't
|
||||
* have CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG, but making the calling
|
||||
* conventions for vfree() arch-depenedent would be a really bad idea)
|
||||
*
|
||||
*/
|
||||
void vfree(const void *addr)
|
||||
{
|
||||
BUG_ON(in_interrupt());
|
||||
BUG_ON(in_nmi());
|
||||
|
||||
kmemleak_free(addr);
|
||||
|
||||
__vunmap(addr, 1);
|
||||
if (!addr)
|
||||
return;
|
||||
if (unlikely(in_interrupt())) {
|
||||
struct vfree_deferred *p = &__get_cpu_var(vfree_deferred);
|
||||
llist_add((struct llist_node *)addr, &p->list);
|
||||
schedule_work(&p->wq);
|
||||
} else
|
||||
__vunmap(addr, 1);
|
||||
}
|
||||
EXPORT_SYMBOL(vfree);
|
||||
|
||||
|
|
@ -1520,7 +1554,8 @@ void vunmap(const void *addr)
|
|||
{
|
||||
BUG_ON(in_interrupt());
|
||||
might_sleep();
|
||||
__vunmap(addr, 0);
|
||||
if (addr)
|
||||
__vunmap(addr, 0);
|
||||
}
|
||||
EXPORT_SYMBOL(vunmap);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue