Loading kernel/cgroup/cgroup-v1.c +4 −23 Original line number Diff line number Diff line Loading @@ -193,25 +193,6 @@ struct cgroup_pidlist { struct delayed_work destroy_dwork; }; /* * The following two functions "fix" the issue where there are more pids * than kmalloc will give memory for; in such cases, we use vmalloc/vfree. * TODO: replace with a kernel-wide solution to this problem */ #define PIDLIST_TOO_LARGE(c) ((c) * sizeof(pid_t) > (PAGE_SIZE * 2)) static void *pidlist_allocate(int count) { if (PIDLIST_TOO_LARGE(count)) return vmalloc(array_size(count, sizeof(pid_t))); else return kmalloc_array(count, sizeof(pid_t), GFP_KERNEL); } static void pidlist_free(void *p) { kvfree(p); } /* * Used to destroy all pidlists lingering waiting for destroy timer. None * should be left afterwards. Loading Loading @@ -244,7 +225,7 @@ static void cgroup_pidlist_destroy_work_fn(struct work_struct *work) */ if (!delayed_work_pending(dwork)) { list_del(&l->links); pidlist_free(l->list); kvfree(l->list); put_pid_ns(l->key.ns); tofree = l; } Loading Loading @@ -365,7 +346,7 @@ static int pidlist_array_load(struct cgroup *cgrp, enum cgroup_filetype type, * show up until sometime later on. */ length = cgroup_task_count(cgrp); array = pidlist_allocate(length); array = kvmalloc_array(length, sizeof(pid_t), GFP_KERNEL); if (!array) return -ENOMEM; /* now, populate the array */ Loading @@ -390,12 +371,12 @@ static int pidlist_array_load(struct cgroup *cgrp, enum cgroup_filetype type, l = cgroup_pidlist_find_create(cgrp, type); if (!l) { pidlist_free(array); kvfree(array); return -ENOMEM; } /* store array, freeing old if necessary */ pidlist_free(l->list); kvfree(l->list); l->list = array; l->length = length; *lp = l; Loading Loading
kernel/cgroup/cgroup-v1.c +4 −23 Original line number Diff line number Diff line Loading @@ -193,25 +193,6 @@ struct cgroup_pidlist { struct delayed_work destroy_dwork; }; /* * The following two functions "fix" the issue where there are more pids * than kmalloc will give memory for; in such cases, we use vmalloc/vfree. * TODO: replace with a kernel-wide solution to this problem */ #define PIDLIST_TOO_LARGE(c) ((c) * sizeof(pid_t) > (PAGE_SIZE * 2)) static void *pidlist_allocate(int count) { if (PIDLIST_TOO_LARGE(count)) return vmalloc(array_size(count, sizeof(pid_t))); else return kmalloc_array(count, sizeof(pid_t), GFP_KERNEL); } static void pidlist_free(void *p) { kvfree(p); } /* * Used to destroy all pidlists lingering waiting for destroy timer. None * should be left afterwards. Loading Loading @@ -244,7 +225,7 @@ static void cgroup_pidlist_destroy_work_fn(struct work_struct *work) */ if (!delayed_work_pending(dwork)) { list_del(&l->links); pidlist_free(l->list); kvfree(l->list); put_pid_ns(l->key.ns); tofree = l; } Loading Loading @@ -365,7 +346,7 @@ static int pidlist_array_load(struct cgroup *cgrp, enum cgroup_filetype type, * show up until sometime later on. */ length = cgroup_task_count(cgrp); array = pidlist_allocate(length); array = kvmalloc_array(length, sizeof(pid_t), GFP_KERNEL); if (!array) return -ENOMEM; /* now, populate the array */ Loading @@ -390,12 +371,12 @@ static int pidlist_array_load(struct cgroup *cgrp, enum cgroup_filetype type, l = cgroup_pidlist_find_create(cgrp, type); if (!l) { pidlist_free(array); kvfree(array); return -ENOMEM; } /* store array, freeing old if necessary */ pidlist_free(l->list); kvfree(l->list); l->list = array; l->length = length; *lp = l; Loading