Skip to content

Commit

Permalink
tree wide: use kvfree() than conditional kfree()/vfree()
Browse files Browse the repository at this point in the history
There are many locations that do

  if (memory_was_allocated_by_vmalloc)
    vfree(ptr);
  else
    kfree(ptr);

but kvfree() can handle both kmalloc()ed memory and vmalloc()ed memory
using is_vmalloc_addr().  Unless callers have special reasons, we can
replace this branch with kvfree().  Please check and reply if you found
problems.

Signed-off-by: Tetsuo Handa <[email protected]>
Acked-by: Michal Hocko <[email protected]>
Acked-by: Jan Kara <[email protected]>
Acked-by: Russell King <[email protected]>
Reviewed-by: Andreas Dilger <[email protected]>
Acked-by: "Rafael J. Wysocki" <[email protected]>
Acked-by: David Rientjes <[email protected]>
Cc: "Luck, Tony" <[email protected]>
Cc: Oleg Drokin <[email protected]>
Cc: Boris Petkov <[email protected]>
Signed-off-by: Andrew Morton <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
  • Loading branch information
Tetsuo Handa authored and torvalds committed Jan 23, 2016
1 parent eab95db commit 1d5cfdb
Show file tree
Hide file tree
Showing 17 changed files with 36 additions and 103 deletions.
11 changes: 2 additions & 9 deletions arch/arm/mm/dma-mapping.c
Original file line number Diff line number Diff line change
Expand Up @@ -1200,18 +1200,14 @@ static struct page **__iommu_alloc_buffer(struct device *dev, size_t size,
while (i--)
if (pages[i])
__free_pages(pages[i], 0);
if (array_size <= PAGE_SIZE)
kfree(pages);
else
vfree(pages);
kvfree(pages);
return NULL;
}

static int __iommu_free_buffer(struct device *dev, struct page **pages,
size_t size, struct dma_attrs *attrs)
{
int count = size >> PAGE_SHIFT;
int array_size = count * sizeof(struct page *);
int i;

if (dma_get_attr(DMA_ATTR_FORCE_CONTIGUOUS, attrs)) {
Expand All @@ -1222,10 +1218,7 @@ static int __iommu_free_buffer(struct device *dev, struct page **pages,
__free_pages(pages[i], 0);
}

if (array_size <= PAGE_SIZE)
kfree(pages);
else
vfree(pages);
kvfree(pages);
return 0;
}

Expand Down
6 changes: 2 additions & 4 deletions drivers/acpi/apei/erst.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include <linux/hardirq.h>
#include <linux/pstore.h>
#include <linux/vmalloc.h>
#include <linux/mm.h> /* kvfree() */
#include <acpi/apei.h>

#include "apei-internal.h"
Expand Down Expand Up @@ -532,10 +533,7 @@ static int __erst_record_id_cache_add_one(void)
return -ENOMEM;
memcpy(new_entries, entries,
erst_record_id_cache.len * sizeof(entries[0]));
if (erst_record_id_cache.size < PAGE_SIZE)
kfree(entries);
else
vfree(entries);
kvfree(entries);
erst_record_id_cache.entries = entries = new_entries;
erst_record_id_cache.size = new_size;
}
Expand Down
26 changes: 7 additions & 19 deletions drivers/block/drbd/drbd_bitmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -364,12 +364,9 @@ static void bm_free_pages(struct page **pages, unsigned long number)
}
}

static void bm_vk_free(void *ptr, int v)
static inline void bm_vk_free(void *ptr)
{
if (v)
vfree(ptr);
else
kfree(ptr);
kvfree(ptr);
}

/*
Expand All @@ -379,7 +376,7 @@ static struct page **bm_realloc_pages(struct drbd_bitmap *b, unsigned long want)
{
struct page **old_pages = b->bm_pages;
struct page **new_pages, *page;
unsigned int i, bytes, vmalloced = 0;
unsigned int i, bytes;
unsigned long have = b->bm_number_of_pages;

BUG_ON(have == 0 && old_pages != NULL);
Expand All @@ -401,7 +398,6 @@ static struct page **bm_realloc_pages(struct drbd_bitmap *b, unsigned long want)
PAGE_KERNEL);
if (!new_pages)
return NULL;
vmalloced = 1;
}

if (want >= have) {
Expand All @@ -411,7 +407,7 @@ static struct page **bm_realloc_pages(struct drbd_bitmap *b, unsigned long want)
page = alloc_page(GFP_NOIO | __GFP_HIGHMEM);
if (!page) {
bm_free_pages(new_pages + have, i - have);
bm_vk_free(new_pages, vmalloced);
bm_vk_free(new_pages);
return NULL;
}
/* we want to know which page it is
Expand All @@ -427,11 +423,6 @@ static struct page **bm_realloc_pages(struct drbd_bitmap *b, unsigned long want)
*/
}

if (vmalloced)
b->bm_flags |= BM_P_VMALLOCED;
else
b->bm_flags &= ~BM_P_VMALLOCED;

return new_pages;
}

Expand Down Expand Up @@ -469,7 +460,7 @@ void drbd_bm_cleanup(struct drbd_device *device)
if (!expect(device->bitmap))
return;
bm_free_pages(device->bitmap->bm_pages, device->bitmap->bm_number_of_pages);
bm_vk_free(device->bitmap->bm_pages, (BM_P_VMALLOCED & device->bitmap->bm_flags));
bm_vk_free(device->bitmap->bm_pages);
kfree(device->bitmap);
device->bitmap = NULL;
}
Expand Down Expand Up @@ -643,7 +634,6 @@ int drbd_bm_resize(struct drbd_device *device, sector_t capacity, int set_new_bi
unsigned long want, have, onpages; /* number of pages */
struct page **npages, **opages = NULL;
int err = 0, growing;
int opages_vmalloced;

if (!expect(b))
return -ENOMEM;
Expand All @@ -656,8 +646,6 @@ int drbd_bm_resize(struct drbd_device *device, sector_t capacity, int set_new_bi
if (capacity == b->bm_dev_capacity)
goto out;

opages_vmalloced = (BM_P_VMALLOCED & b->bm_flags);

if (capacity == 0) {
spin_lock_irq(&b->bm_lock);
opages = b->bm_pages;
Expand All @@ -671,7 +659,7 @@ int drbd_bm_resize(struct drbd_device *device, sector_t capacity, int set_new_bi
b->bm_dev_capacity = 0;
spin_unlock_irq(&b->bm_lock);
bm_free_pages(opages, onpages);
bm_vk_free(opages, opages_vmalloced);
bm_vk_free(opages);
goto out;
}
bits = BM_SECT_TO_BIT(ALIGN(capacity, BM_SECT_PER_BIT));
Expand Down Expand Up @@ -744,7 +732,7 @@ int drbd_bm_resize(struct drbd_device *device, sector_t capacity, int set_new_bi

spin_unlock_irq(&b->bm_lock);
if (opages != npages)
bm_vk_free(opages, opages_vmalloced);
bm_vk_free(opages);
if (!growing)
b->bm_set = bm_count_bits(b);
drbd_info(device, "resync bitmap: bits=%lu words=%lu pages=%lu\n", bits, words, want);
Expand Down
3 changes: 0 additions & 3 deletions drivers/block/drbd/drbd_int.h
Original file line number Diff line number Diff line change
Expand Up @@ -536,9 +536,6 @@ struct drbd_bitmap; /* opaque for drbd_device */
/* definition of bits in bm_flags to be used in drbd_bm_lock
* and drbd_bitmap_io and friends. */
enum bm_flag {
/* do we need to kfree, or vfree bm_pages? */
BM_P_VMALLOCED = 0x10000, /* internal use only, will be masked out */

/* currently locked for bulk operation */
BM_LOCKED_MASK = 0xf,

Expand Down
15 changes: 3 additions & 12 deletions drivers/char/mspec.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,11 @@ struct vma_data {
spinlock_t lock; /* Serialize access to this structure. */
int count; /* Number of pages allocated. */
enum mspec_page_type type; /* Type of pages allocated. */
int flags; /* See VMD_xxx below. */
unsigned long vm_start; /* Original (unsplit) base. */
unsigned long vm_end; /* Original (unsplit) end. */
unsigned long maddr[0]; /* Array of MSPEC addresses. */
};

#define VMD_VMALLOCED 0x1 /* vmalloc'd rather than kmalloc'd */

/* used on shub2 to clear FOP cache in the HUB */
static unsigned long scratch_page[MAX_NUMNODES];
#define SH2_AMO_CACHE_ENTRIES 4
Expand Down Expand Up @@ -185,10 +182,7 @@ mspec_close(struct vm_area_struct *vma)
"failed to zero page %ld\n", my_page);
}

if (vdata->flags & VMD_VMALLOCED)
vfree(vdata);
else
kfree(vdata);
kvfree(vdata);
}

/*
Expand Down Expand Up @@ -256,7 +250,7 @@ mspec_mmap(struct file *file, struct vm_area_struct *vma,
enum mspec_page_type type)
{
struct vma_data *vdata;
int pages, vdata_size, flags = 0;
int pages, vdata_size;

if (vma->vm_pgoff != 0)
return -EINVAL;
Expand All @@ -271,16 +265,13 @@ mspec_mmap(struct file *file, struct vm_area_struct *vma,
vdata_size = sizeof(struct vma_data) + pages * sizeof(long);
if (vdata_size <= PAGE_SIZE)
vdata = kzalloc(vdata_size, GFP_KERNEL);
else {
else
vdata = vzalloc(vdata_size);
flags = VMD_VMALLOCED;
}
if (!vdata)
return -ENOMEM;

vdata->vm_start = vma->vm_start;
vdata->vm_end = vma->vm_end;
vdata->flags = flags;
vdata->type = type;
spin_lock_init(&vdata->lock);
atomic_set(&vdata->refcnt, 1);
Expand Down
5 changes: 1 addition & 4 deletions drivers/gpu/drm/drm_hashtab.c
Original file line number Diff line number Diff line change
Expand Up @@ -198,10 +198,7 @@ EXPORT_SYMBOL(drm_ht_remove_item);
void drm_ht_remove(struct drm_open_hash *ht)
{
if (ht->table) {
if ((PAGE_SIZE / sizeof(*ht->table)) >> ht->order)
kfree(ht->table);
else
vfree(ht->table);
kvfree(ht->table);
ht->table = NULL;
}
}
Expand Down
8 changes: 2 additions & 6 deletions drivers/staging/lustre/include/linux/libcfs/libcfs_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,16 +151,12 @@ do { \

#define LIBCFS_FREE(ptr, size) \
do { \
int s = (size); \
if (unlikely((ptr) == NULL)) { \
CERROR("LIBCFS: free NULL '" #ptr "' (%d bytes) at " \
"%s:%d\n", s, __FILE__, __LINE__); \
"%s:%d\n", (int)(size), __FILE__, __LINE__); \
break; \
} \
if (unlikely(s > LIBCFS_VMALLOC_SIZE)) \
vfree(ptr); \
else \
kfree(ptr); \
kvfree(ptr); \
} while (0)

/******************************************************************************/
Expand Down
3 changes: 1 addition & 2 deletions fs/coda/coda_linux.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,7 @@ void coda_sysctl_clean(void);
} while (0)


#define CODA_FREE(ptr,size) \
do { if (size < PAGE_SIZE) kfree((ptr)); else vfree((ptr)); } while (0)
#define CODA_FREE(ptr, size) kvfree((ptr))

/* inode to cnode access functions */

Expand Down
8 changes: 2 additions & 6 deletions fs/jffs2/build.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/mtd/mtd.h>
#include <linux/mm.h> /* kvfree() */
#include "nodelist.h"

static void jffs2_build_remove_unlinked_inode(struct jffs2_sb_info *,
Expand Down Expand Up @@ -383,12 +384,7 @@ int jffs2_do_mount_fs(struct jffs2_sb_info *c)
return 0;

out_free:
#ifndef __ECOS
if (jffs2_blocks_use_vmalloc(c))
vfree(c->blocks);
else
#endif
kfree(c->blocks);
kvfree(c->blocks);

return ret;
}
5 changes: 1 addition & 4 deletions fs/jffs2/fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -596,10 +596,7 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent)
out_root:
jffs2_free_ino_caches(c);
jffs2_free_raw_node_refs(c);
if (jffs2_blocks_use_vmalloc(c))
vfree(c->blocks);
else
kfree(c->blocks);
kvfree(c->blocks);
out_inohash:
jffs2_clear_xattr_subsystem(c);
kfree(c->inocache_list);
Expand Down
5 changes: 1 addition & 4 deletions fs/jffs2/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -331,10 +331,7 @@ static void jffs2_put_super (struct super_block *sb)

jffs2_free_ino_caches(c);
jffs2_free_raw_node_refs(c);
if (jffs2_blocks_use_vmalloc(c))
vfree(c->blocks);
else
kfree(c->blocks);
kvfree(c->blocks);
jffs2_flash_cleanup(c);
kfree(c->inocache_list);
jffs2_clear_xattr_subsystem(c);
Expand Down
7 changes: 1 addition & 6 deletions fs/udf/super.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,17 +279,12 @@ static void udf_sb_free_bitmap(struct udf_bitmap *bitmap)
{
int i;
int nr_groups = bitmap->s_nr_groups;
int size = sizeof(struct udf_bitmap) + (sizeof(struct buffer_head *) *
nr_groups);

for (i = 0; i < nr_groups; i++)
if (bitmap->s_block_bitmap[i])
brelse(bitmap->s_block_bitmap[i]);

if (size <= PAGE_SIZE)
kfree(bitmap);
else
vfree(bitmap);
kvfree(bitmap);
}

static void udf_free_partition(struct udf_part_map *map)
Expand Down
2 changes: 1 addition & 1 deletion ipc/sem.c
Original file line number Diff line number Diff line change
Expand Up @@ -1493,7 +1493,7 @@ static int semctl_main(struct ipc_namespace *ns, int semid, int semnum,
wake_up_sem_queue_do(&tasks);
out_free:
if (sem_io != fast_sem_io)
ipc_free(sem_io, sizeof(ushort)*nsems);
ipc_free(sem_io);
return err;
}

Expand Down
11 changes: 3 additions & 8 deletions ipc/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -414,17 +414,12 @@ void *ipc_alloc(int size)
/**
* ipc_free - free ipc space
* @ptr: pointer returned by ipc_alloc
* @size: size of block
*
* Free a block created with ipc_alloc(). The caller must know the size
* used in the allocation call.
* Free a block created with ipc_alloc().
*/
void ipc_free(void *ptr, int size)
void ipc_free(void *ptr)
{
if (size > PAGE_SIZE)
vfree(ptr);
else
kfree(ptr);
kvfree(ptr);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion ipc/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ int ipcperms(struct ipc_namespace *ns, struct kern_ipc_perm *ipcp, short flg);
* both function can sleep
*/
void *ipc_alloc(int size);
void ipc_free(void *ptr, int size);
void ipc_free(void *ptr);

/*
* For allocation that need to be freed by RCU.
Expand Down
Loading

0 comments on commit 1d5cfdb

Please sign in to comment.