2008-07-10 01:14:40

by Alexey Dobriyan

[permalink] [raw]
Subject: SL*B: drop kmem cache argument from constructor

Kmem cache passed to constructor is only needed for constructors that are
themselves multiplexeres. Nobody uses this "feature", nor does anybody uses
passed kmem cache in non-trivial way, so pass only pointer to object.

Non-trivial places are:
arch/powerpc/mm/init_64.c
arch/powerpc/mm/hugetlbpage.c

This is flag day, yes.

Signed-off-by: Alexey Dobriyan <[email protected]>
---

arch/arm/plat-s3c24xx/dma.c | 2 +-
arch/powerpc/kernel/rtas_flash.c | 2 +-
arch/powerpc/mm/hugetlbpage.c | 4 ++--
arch/powerpc/mm/init_64.c | 24 +++++++++---------------
arch/powerpc/platforms/cell/spufs/inode.c | 2 +-
arch/sh/mm/pmb.c | 2 +-
arch/xtensa/mm/init.c | 2 +-
drivers/usb/mon/mon_text.c | 4 ++--
fs/adfs/super.c | 2 +-
fs/affs/super.c | 2 +-
fs/afs/super.c | 4 ++--
fs/befs/linuxvfs.c | 2 +-
fs/bfs/inode.c | 2 +-
fs/block_dev.c | 2 +-
fs/buffer.c | 2 +-
fs/cifs/cifsfs.c | 2 +-
fs/coda/inode.c | 2 +-
fs/ecryptfs/main.c | 4 ++--
fs/efs/super.c | 2 +-
fs/ext2/super.c | 2 +-
fs/ext3/super.c | 2 +-
fs/ext4/super.c | 2 +-
fs/fat/cache.c | 2 +-
fs/fat/inode.c | 2 +-
fs/fuse/inode.c | 2 +-
fs/gfs2/main.c | 4 ++--
fs/hfs/super.c | 2 +-
fs/hfsplus/super.c | 2 +-
fs/hpfs/super.c | 2 +-
fs/hugetlbfs/inode.c | 2 +-
fs/inode.c | 2 +-
fs/isofs/inode.c | 2 +-
fs/jffs2/super.c | 2 +-
fs/jfs/jfs_metapage.c | 2 +-
fs/jfs/super.c | 2 +-
fs/locks.c | 2 +-
fs/minix/inode.c | 2 +-
fs/ncpfs/inode.c | 2 +-
fs/nfs/inode.c | 2 +-
fs/ntfs/super.c | 2 +-
fs/ocfs2/dlm/dlmfs.c | 3 +--
fs/ocfs2/super.c | 2 +-
fs/openpromfs/inode.c | 2 +-
fs/proc/inode.c | 2 +-
fs/qnx4/inode.c | 2 +-
fs/reiserfs/super.c | 2 +-
fs/romfs/inode.c | 2 +-
fs/smbfs/inode.c | 2 +-
fs/sysv/inode.c | 2 +-
fs/udf/super.c | 2 +-
fs/ufs/super.c | 2 +-
fs/xfs/linux-2.6/kmem.h | 2 +-
fs/xfs/linux-2.6/xfs_super.c | 1 -
include/linux/slab.h | 2 +-
include/linux/slub_def.h | 2 +-
ipc/mqueue.c | 2 +-
kernel/fork.c | 2 +-
lib/idr.c | 2 +-
lib/radix-tree.c | 2 +-
mm/rmap.c | 2 +-
mm/shmem.c | 2 +-
mm/slab.c | 7 +++----
mm/slob.c | 7 +++----
mm/slub.c | 13 ++++++-------
net/socket.c | 2 +-
net/sunrpc/rpc_pipe.c | 2 +-
66 files changed, 87 insertions(+), 98 deletions(-)

--- a/arch/arm/plat-s3c24xx/dma.c
+++ b/arch/arm/plat-s3c24xx/dma.c
@@ -1304,7 +1304,7 @@ struct sysdev_class dma_sysclass = {

/* kmem cache implementation */

-static void s3c2410_dma_cache_ctor(struct kmem_cache *c, void *p)
+static void s3c2410_dma_cache_ctor(void *p)
{
memset(p, 0, sizeof(struct s3c2410_dma_buf));
}
--- a/arch/powerpc/kernel/rtas_flash.c
+++ b/arch/powerpc/kernel/rtas_flash.c
@@ -286,7 +286,7 @@ static ssize_t rtas_flash_read(struct file *file, char __user *buf,
}

/* constructor for flash_block_cache */
-void rtas_block_ctor(struct kmem_cache *cache, void *ptr)
+void rtas_block_ctor(void *ptr)
{
memset(ptr, 0, RTAS_BLK_SIZE);
}
--- a/arch/powerpc/mm/hugetlbpage.c
+++ b/arch/powerpc/mm/hugetlbpage.c
@@ -595,9 +595,9 @@ static int __init hugepage_setup_sz(char *str)
}
__setup("hugepagesz=", hugepage_setup_sz);

-static void zero_ctor(struct kmem_cache *cache, void *addr)
+static void zero_ctor(void *addr)
{
- memset(addr, 0, kmem_cache_size(cache));
+ memset(addr, 0, HUGEPTE_TABLE_SIZE);
}

static int __init hugetlbpage_init(void)
--- a/arch/powerpc/mm/init_64.c
+++ b/arch/powerpc/mm/init_64.c
@@ -136,9 +136,14 @@ static int __init setup_kcore(void)
module_init(setup_kcore);
#endif

-static void zero_ctor(struct kmem_cache *cache, void *addr)
+static void pgd_ctor(void *addr)
{
- memset(addr, 0, kmem_cache_size(cache));
+ memset(addr, 0, PGD_TABLE_SIZE);
+}
+
+static void pmd_ctor(void *addr)
+{
+ memset(addr, 0, PMD_TABLE_SIZE);
}

static const unsigned int pgtable_cache_size[2] = {
@@ -163,19 +168,8 @@ struct kmem_cache *pgtable_cache[ARRAY_SIZE(pgtable_cache_size)];

void pgtable_cache_init(void)
{
- int i;
-
- for (i = 0; i < ARRAY_SIZE(pgtable_cache_size); i++) {
- int size = pgtable_cache_size[i];
- const char *name = pgtable_cache_name[i];
-
- pr_debug("Allocating page table cache %s (#%d) "
- "for size: %08x...\n", name, i, size);
- pgtable_cache[i] = kmem_cache_create(name,
- size, size,
- SLAB_PANIC,
- zero_ctor);
- }
+ pgtable_cache[0] = kmem_cache_create(pgtable_cache_name[0], PGD_TABLE_SIZE, PGD_TABLE_SIZE, SLAB_PANIC, pgd_ctor);
+ pgtable_cache[1] = kmem_cache_create(pgtable_cache_name[1], PMD_TABLE_SIZE, PMD_TABLE_SIZE, SLAB_PANIC, pmd_ctor);
}

#ifdef CONFIG_SPARSEMEM_VMEMMAP
--- a/arch/powerpc/platforms/cell/spufs/inode.c
+++ b/arch/powerpc/platforms/cell/spufs/inode.c
@@ -69,7 +69,7 @@ spufs_destroy_inode(struct inode *inode)
}

static void
-spufs_init_once(struct kmem_cache *cachep, void *p)
+spufs_init_once(void *p)
{
struct spufs_inode_info *ei = p;

--- a/arch/sh/mm/pmb.c
+++ b/arch/sh/mm/pmb.c
@@ -293,7 +293,7 @@ void pmb_unmap(unsigned long addr)
} while (pmbe);
}

-static void pmb_cache_ctor(struct kmem_cache *cachep, void *pmb)
+static void pmb_cache_ctor(void *pmb)
{
struct pmb_entry *pmbe = pmb;

--- a/arch/xtensa/mm/init.c
+++ b/arch/xtensa/mm/init.c
@@ -309,7 +309,7 @@ void show_mem(void)

struct kmem_cache *pgtable_cache __read_mostly;

-static void pgd_ctor(struct kmem_cache *cache, void* addr)
+static void pgd_ctor(void* addr)
{
pte_t* ptep = (pte_t*)addr;
int i;
--- a/drivers/usb/mon/mon_text.c
+++ b/drivers/usb/mon/mon_text.c
@@ -87,7 +87,7 @@ struct mon_reader_text {

static struct dentry *mon_dir; /* Usually /sys/kernel/debug/usbmon */

-static void mon_text_ctor(struct kmem_cache *, void *);
+static void mon_text_ctor(void *);

struct mon_text_ptr {
int cnt, limit;
@@ -720,7 +720,7 @@ void mon_text_del(struct mon_bus *mbus)
/*
* Slab interface: constructor.
*/
-static void mon_text_ctor(struct kmem_cache *slab, void *mem)
+static void mon_text_ctor(void *mem)
{
/*
* Nothing to initialize. No, really!
--- a/fs/adfs/super.c
+++ b/fs/adfs/super.c
@@ -249,7 +249,7 @@ static void adfs_destroy_inode(struct inode *inode)
kmem_cache_free(adfs_inode_cachep, ADFS_I(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct adfs_inode_info *ei = (struct adfs_inode_info *) foo;

--- a/fs/affs/super.c
+++ b/fs/affs/super.c
@@ -90,7 +90,7 @@ static void affs_destroy_inode(struct inode *inode)
kmem_cache_free(affs_inode_cachep, AFFS_I(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct affs_inode_info *ei = (struct affs_inode_info *) foo;

--- a/fs/afs/super.c
+++ b/fs/afs/super.c
@@ -27,7 +27,7 @@

#define AFS_FS_MAGIC 0x6B414653 /* 'kAFS' */

-static void afs_i_init_once(struct kmem_cache *cachep, void *foo);
+static void afs_i_init_once(void *foo);
static int afs_get_sb(struct file_system_type *fs_type,
int flags, const char *dev_name,
void *data, struct vfsmount *mnt);
@@ -449,7 +449,7 @@ static void afs_put_super(struct super_block *sb)
/*
* initialise an inode cache slab element prior to any use
*/
-static void afs_i_init_once(struct kmem_cache *cachep, void *_vnode)
+static void afs_i_init_once(void *_vnode)
{
struct afs_vnode *vnode = _vnode;

--- a/fs/befs/linuxvfs.c
+++ b/fs/befs/linuxvfs.c
@@ -289,7 +289,7 @@ befs_destroy_inode(struct inode *inode)
kmem_cache_free(befs_inode_cachep, BEFS_I(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct befs_inode_info *bi = (struct befs_inode_info *) foo;

--- a/fs/bfs/inode.c
+++ b/fs/bfs/inode.c
@@ -259,7 +259,7 @@ static void bfs_destroy_inode(struct inode *inode)
kmem_cache_free(bfs_inode_cachep, BFS_I(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct bfs_inode_info *bi = foo;

--- a/fs/block_dev.c
+++ b/fs/block_dev.c
@@ -271,7 +271,7 @@ static void bdev_destroy_inode(struct inode *inode)
kmem_cache_free(bdev_cachep, bdi);
}

-static void init_once(struct kmem_cache * cachep, void *foo)
+static void init_once(void *foo)
{
struct bdev_inode *ei = (struct bdev_inode *) foo;
struct block_device *bdev = &ei->bdev;
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -3259,7 +3259,7 @@ int bh_submit_read(struct buffer_head *bh)
EXPORT_SYMBOL(bh_submit_read);

static void
-init_buffer_head(struct kmem_cache *cachep, void *data)
+init_buffer_head(void *data)
{
struct buffer_head *bh = data;

--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -766,7 +766,7 @@ const struct file_operations cifs_dir_ops = {
};

static void
-cifs_init_once(struct kmem_cache *cachep, void *inode)
+cifs_init_once(void *inode)
{
struct cifsInodeInfo *cifsi = inode;

--- a/fs/coda/inode.c
+++ b/fs/coda/inode.c
@@ -58,7 +58,7 @@ static void coda_destroy_inode(struct inode *inode)
kmem_cache_free(coda_inode_cachep, ITOC(inode));
}

-static void init_once(struct kmem_cache * cachep, void *foo)
+static void init_once(void *foo)
{
struct coda_inode_info *ei = (struct coda_inode_info *) foo;

--- a/fs/ecryptfs/main.c
+++ b/fs/ecryptfs/main.c
@@ -605,7 +605,7 @@ static struct file_system_type ecryptfs_fs_type = {
* Initializes the ecryptfs_inode_info_cache when it is created
*/
static void
-inode_info_init_once(struct kmem_cache *cachep, void *vptr)
+inode_info_init_once(void *vptr)
{
struct ecryptfs_inode_info *ei = (struct ecryptfs_inode_info *)vptr;

@@ -616,7 +616,7 @@ static struct ecryptfs_cache_info {
struct kmem_cache **cache;
const char *name;
size_t size;
- void (*ctor)(struct kmem_cache *cache, void *obj);
+ void (*ctor)(void *obj);
} ecryptfs_cache_infos[] = {
{
.cache = &ecryptfs_auth_tok_list_item_cache,
--- a/fs/efs/super.c
+++ b/fs/efs/super.c
@@ -70,7 +70,7 @@ static void efs_destroy_inode(struct inode *inode)
kmem_cache_free(efs_inode_cachep, INODE_INFO(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct efs_inode_info *ei = (struct efs_inode_info *) foo;

--- a/fs/ext2/super.c
+++ b/fs/ext2/super.c
@@ -158,7 +158,7 @@ static void ext2_destroy_inode(struct inode *inode)
kmem_cache_free(ext2_inode_cachep, EXT2_I(inode));
}

-static void init_once(struct kmem_cache * cachep, void *foo)
+static void init_once(void *foo)
{
struct ext2_inode_info *ei = (struct ext2_inode_info *) foo;

--- a/fs/ext3/super.c
+++ b/fs/ext3/super.c
@@ -472,7 +472,7 @@ static void ext3_destroy_inode(struct inode *inode)
kmem_cache_free(ext3_inode_cachep, EXT3_I(inode));
}

-static void init_once(struct kmem_cache * cachep, void *foo)
+static void init_once(void *foo)
{
struct ext3_inode_info *ei = (struct ext3_inode_info *) foo;

--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -587,7 +587,7 @@ static void ext4_destroy_inode(struct inode *inode)
kmem_cache_free(ext4_inode_cachep, EXT4_I(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct ext4_inode_info *ei = (struct ext4_inode_info *) foo;

--- a/fs/fat/cache.c
+++ b/fs/fat/cache.c
@@ -36,7 +36,7 @@ static inline int fat_max_cache(struct inode *inode)

static struct kmem_cache *fat_cache_cachep;

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct fat_cache *cache = (struct fat_cache *)foo;

--- a/fs/fat/inode.c
+++ b/fs/fat/inode.c
@@ -496,7 +496,7 @@ static void fat_destroy_inode(struct inode *inode)
kmem_cache_free(fat_inode_cachep, MSDOS_I(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct msdos_inode_info *ei = (struct msdos_inode_info *)foo;

--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
@@ -781,7 +781,7 @@ static inline void unregister_fuseblk(void)
}
#endif

-static void fuse_inode_init_once(struct kmem_cache *cachep, void *foo)
+static void fuse_inode_init_once(void *foo)
{
struct inode * inode = foo;

--- a/fs/gfs2/main.c
+++ b/fs/gfs2/main.c
@@ -24,7 +24,7 @@
#include "util.h"
#include "glock.h"

-static void gfs2_init_inode_once(struct kmem_cache *cachep, void *foo)
+static void gfs2_init_inode_once(void *foo)
{
struct gfs2_inode *ip = foo;

@@ -33,7 +33,7 @@ static void gfs2_init_inode_once(struct kmem_cache *cachep, void *foo)
ip->i_alloc = NULL;
}

-static void gfs2_init_glock_once(struct kmem_cache *cachep, void *foo)
+static void gfs2_init_glock_once(void *foo)
{
struct gfs2_glock *gl = foo;

--- a/fs/hfs/super.c
+++ b/fs/hfs/super.c
@@ -432,7 +432,7 @@ static struct file_system_type hfs_fs_type = {
.fs_flags = FS_REQUIRES_DEV,
};

-static void hfs_init_once(struct kmem_cache *cachep, void *p)
+static void hfs_init_once(void *p)
{
struct hfs_inode_info *i = p;

--- a/fs/hfsplus/super.c
+++ b/fs/hfsplus/super.c
@@ -485,7 +485,7 @@ static struct file_system_type hfsplus_fs_type = {
.fs_flags = FS_REQUIRES_DEV,
};

-static void hfsplus_init_once(struct kmem_cache *cachep, void *p)
+static void hfsplus_init_once(void *p)
{
struct hfsplus_inode_info *i = p;

--- a/fs/hpfs/super.c
+++ b/fs/hpfs/super.c
@@ -173,7 +173,7 @@ static void hpfs_destroy_inode(struct inode *inode)
kmem_cache_free(hpfs_inode_cachep, hpfs_i(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct hpfs_inode_info *ei = (struct hpfs_inode_info *) foo;

--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -696,7 +696,7 @@ static const struct address_space_operations hugetlbfs_aops = {
};


-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct hugetlbfs_inode_info *ei = (struct hugetlbfs_inode_info *)foo;

--- a/fs/inode.c
+++ b/fs/inode.c
@@ -224,7 +224,7 @@ void inode_init_once(struct inode *inode)

EXPORT_SYMBOL(inode_init_once);

-static void init_once(struct kmem_cache * cachep, void *foo)
+static void init_once(void *foo)
{
struct inode * inode = (struct inode *) foo;

--- a/fs/isofs/inode.c
+++ b/fs/isofs/inode.c
@@ -73,7 +73,7 @@ static void isofs_destroy_inode(struct inode *inode)
kmem_cache_free(isofs_inode_cachep, ISOFS_I(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct iso_inode_info *ei = foo;

--- a/fs/jffs2/super.c
+++ b/fs/jffs2/super.c
@@ -44,7 +44,7 @@ static void jffs2_destroy_inode(struct inode *inode)
kmem_cache_free(jffs2_inode_cachep, JFFS2_INODE_INFO(inode));
}

-static void jffs2_i_init_once(struct kmem_cache *cachep, void *foo)
+static void jffs2_i_init_once(void *foo)
{
struct jffs2_inode_info *f = foo;

--- a/fs/jfs/jfs_metapage.c
+++ b/fs/jfs/jfs_metapage.c
@@ -180,7 +180,7 @@ static inline void remove_metapage(struct page *page, struct metapage *mp)

#endif

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct metapage *mp = (struct metapage *)foo;

--- a/fs/jfs/super.c
+++ b/fs/jfs/super.c
@@ -760,7 +760,7 @@ static struct file_system_type jfs_fs_type = {
.fs_flags = FS_REQUIRES_DEV,
};

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct jfs_inode_info *jfs_ip = (struct jfs_inode_info *) foo;

--- a/fs/locks.c
+++ b/fs/locks.c
@@ -201,7 +201,7 @@ EXPORT_SYMBOL(locks_init_lock);
* Initialises the fields of the file lock which are invariant for
* free file_locks.
*/
-static void init_once(struct kmem_cache *cache, void *foo)
+static void init_once(void *foo)
{
struct file_lock *lock = (struct file_lock *) foo;

--- a/fs/minix/inode.c
+++ b/fs/minix/inode.c
@@ -68,7 +68,7 @@ static void minix_destroy_inode(struct inode *inode)
kmem_cache_free(minix_inode_cachep, minix_i(inode));
}

-static void init_once(struct kmem_cache * cachep, void *foo)
+static void init_once(void *foo)
{
struct minix_inode_info *ei = (struct minix_inode_info *) foo;

--- a/fs/ncpfs/inode.c
+++ b/fs/ncpfs/inode.c
@@ -64,7 +64,7 @@ static void ncp_destroy_inode(struct inode *inode)
kmem_cache_free(ncp_inode_cachep, NCP_FINFO(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct ncp_inode_info *ei = (struct ncp_inode_info *) foo;

--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -1193,7 +1193,7 @@ static inline void nfs4_init_once(struct nfs_inode *nfsi)
#endif
}

-static void init_once(struct kmem_cache * cachep, void *foo)
+static void init_once(void *foo)
{
struct nfs_inode *nfsi = (struct nfs_inode *) foo;

--- a/fs/ntfs/super.c
+++ b/fs/ntfs/super.c
@@ -3080,7 +3080,7 @@ struct kmem_cache *ntfs_inode_cache;
struct kmem_cache *ntfs_big_inode_cache;

/* Init once constructor for the inode slab cache. */
-static void ntfs_big_inode_init_once(struct kmem_cache *cachep, void *foo)
+static void ntfs_big_inode_init_once(void *foo)
{
ntfs_inode *ni = (ntfs_inode *)foo;

--- a/fs/ocfs2/dlm/dlmfs.c
+++ b/fs/ocfs2/dlm/dlmfs.c
@@ -267,8 +267,7 @@ static ssize_t dlmfs_file_write(struct file *filp,
return writelen;
}

-static void dlmfs_init_once(struct kmem_cache *cachep,
- void *foo)
+static void dlmfs_init_once(void *foo)
{
struct dlmfs_inode_private *ip =
(struct dlmfs_inode_private *) foo;
--- a/fs/ocfs2/super.c
+++ b/fs/ocfs2/super.c
@@ -1118,7 +1118,7 @@ bail:
return status;
}

-static void ocfs2_inode_init_once(struct kmem_cache *cachep, void *data)
+static void ocfs2_inode_init_once(void *data)
{
struct ocfs2_inode_info *oi = data;

--- a/fs/openpromfs/inode.c
+++ b/fs/openpromfs/inode.c
@@ -430,7 +430,7 @@ static struct file_system_type openprom_fs_type = {
.kill_sb = kill_anon_super,
};

-static void op_inode_init_once(struct kmem_cache * cachep, void *data)
+static void op_inode_init_once(void *data)
{
struct op_inode_info *oi = (struct op_inode_info *) data;

--- a/fs/proc/inode.c
+++ b/fs/proc/inode.c
@@ -94,7 +94,7 @@ static void proc_destroy_inode(struct inode *inode)
kmem_cache_free(proc_inode_cachep, PROC_I(inode));
}

-static void init_once(struct kmem_cache * cachep, void *foo)
+static void init_once(void *foo)
{
struct proc_inode *ei = (struct proc_inode *) foo;

--- a/fs/qnx4/inode.c
+++ b/fs/qnx4/inode.c
@@ -553,7 +553,7 @@ static void qnx4_destroy_inode(struct inode *inode)
kmem_cache_free(qnx4_inode_cachep, qnx4_i(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct qnx4_inode_info *ei = (struct qnx4_inode_info *) foo;

--- a/fs/reiserfs/super.c
+++ b/fs/reiserfs/super.c
@@ -520,7 +520,7 @@ static void reiserfs_destroy_inode(struct inode *inode)
kmem_cache_free(reiserfs_inode_cachep, REISERFS_I(inode));
}

-static void init_once(struct kmem_cache * cachep, void *foo)
+static void init_once(void *foo)
{
struct reiserfs_inode_info *ei = (struct reiserfs_inode_info *)foo;

--- a/fs/romfs/inode.c
+++ b/fs/romfs/inode.c
@@ -577,7 +577,7 @@ static void romfs_destroy_inode(struct inode *inode)
kmem_cache_free(romfs_inode_cachep, ROMFS_I(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct romfs_inode_info *ei = foo;

--- a/fs/smbfs/inode.c
+++ b/fs/smbfs/inode.c
@@ -67,7 +67,7 @@ static void smb_destroy_inode(struct inode *inode)
kmem_cache_free(smb_inode_cachep, SMB_I(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct smb_inode_info *ei = (struct smb_inode_info *) foo;

--- a/fs/sysv/inode.c
+++ b/fs/sysv/inode.c
@@ -326,7 +326,7 @@ static void sysv_destroy_inode(struct inode *inode)
kmem_cache_free(sysv_inode_cachep, SYSV_I(inode));
}

-static void init_once(struct kmem_cache *cachep, void *p)
+static void init_once(void *p)
{
struct sysv_inode_info *si = (struct sysv_inode_info *)p;

--- a/fs/udf/super.c
+++ b/fs/udf/super.c
@@ -148,7 +148,7 @@ static void udf_destroy_inode(struct inode *inode)
kmem_cache_free(udf_inode_cachep, UDF_I(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct udf_inode_info *ei = (struct udf_inode_info *)foo;

--- a/fs/ufs/super.c
+++ b/fs/ufs/super.c
@@ -1301,7 +1301,7 @@ static void ufs_destroy_inode(struct inode *inode)
kmem_cache_free(ufs_inode_cachep, UFS_I(inode));
}

-static void init_once(struct kmem_cache * cachep, void *foo)
+static void init_once(void *foo)
{
struct ufs_inode_info *ei = (struct ufs_inode_info *) foo;

--- a/fs/xfs/linux-2.6/kmem.h
+++ b/fs/xfs/linux-2.6/kmem.h
@@ -79,7 +79,7 @@ kmem_zone_init(int size, char *zone_name)

static inline kmem_zone_t *
kmem_zone_init_flags(int size, char *zone_name, unsigned long flags,
- void (*construct)(kmem_zone_t *, void *))
+ void (*construct)(void *))
{
return kmem_cache_create(zone_name, size, 0, flags, construct);
}
--- a/fs/xfs/linux-2.6/xfs_super.c
+++ b/fs/xfs/linux-2.6/xfs_super.c
@@ -843,7 +843,6 @@ xfs_fs_destroy_inode(

STATIC void
xfs_fs_inode_init_once(
- kmem_zone_t *zonep,
void *vnode)
{
inode_init_once(vn_to_inode((bhv_vnode_t *)vnode));
--- a/include/linux/slab.h
+++ b/include/linux/slab.h
@@ -58,7 +58,7 @@ int slab_is_available(void);

struct kmem_cache *kmem_cache_create(const char *, size_t, size_t,
unsigned long,
- void (*)(struct kmem_cache *, void *));
+ void (*)(void *));
void kmem_cache_destroy(struct kmem_cache *);
int kmem_cache_shrink(struct kmem_cache *);
void kmem_cache_free(struct kmem_cache *, void *);
--- a/include/linux/slub_def.h
+++ b/include/linux/slub_def.h
@@ -85,7 +85,7 @@ struct kmem_cache {
struct kmem_cache_order_objects min;
gfp_t allocflags; /* gfp flags to use on each alloc */
int refcount; /* Refcount for slab cache destroy */
- void (*ctor)(struct kmem_cache *, void *);
+ void (*ctor)(void *);
int inuse; /* Offset to metadata */
int align; /* Alignment */
const char *name; /* Name (only for display!) */
--- a/ipc/mqueue.c
+++ b/ipc/mqueue.c
@@ -207,7 +207,7 @@ static int mqueue_get_sb(struct file_system_type *fs_type,
return get_sb_single(fs_type, flags, data, mqueue_fill_super, mnt);
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct mqueue_inode_info *p = (struct mqueue_inode_info *) foo;

--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -1403,7 +1403,7 @@ long do_fork(unsigned long clone_flags,
#define ARCH_MIN_MMSTRUCT_ALIGN 0
#endif

-static void sighand_ctor(struct kmem_cache *cachep, void *data)
+static void sighand_ctor(void *data)
{
struct sighand_struct *sighand = data;

--- a/lib/idr.c
+++ b/lib/idr.c
@@ -580,7 +580,7 @@ void *idr_replace(struct idr *idp, void *ptr, int id)
}
EXPORT_SYMBOL(idr_replace);

-static void idr_cache_ctor(struct kmem_cache *idr_layer_cache, void *idr_layer)
+static void idr_cache_ctor(void *idr_layer)
{
memset(idr_layer, 0, sizeof(struct idr_layer));
}
--- a/lib/radix-tree.c
+++ b/lib/radix-tree.c
@@ -1051,7 +1051,7 @@ int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag)
EXPORT_SYMBOL(radix_tree_tagged);

static void
-radix_tree_node_ctor(struct kmem_cache *cachep, void *node)
+radix_tree_node_ctor(void *node)
{
memset(node, 0, sizeof(struct radix_tree_node));
}
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -138,7 +138,7 @@ void anon_vma_unlink(struct vm_area_struct *vma)
anon_vma_free(anon_vma);
}

-static void anon_vma_ctor(struct kmem_cache *cachep, void *data)
+static void anon_vma_ctor(void *data)
{
struct anon_vma *anon_vma = data;

--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -2330,7 +2330,7 @@ static void shmem_destroy_inode(struct inode *inode)
kmem_cache_free(shmem_inode_cachep, SHMEM_I(inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct shmem_inode_info *p = (struct shmem_inode_info *) foo;

--- a/mm/slab.c
+++ b/mm/slab.c
@@ -406,7 +406,7 @@ struct kmem_cache {
unsigned int dflags; /* dynamic flags */

/* constructor func */
- void (*ctor)(struct kmem_cache *, void *);
+ void (*ctor)(void *);

/* 5) cache creation/removal */
const char *name;
@@ -2145,8 +2145,7 @@ static int __init_refok setup_cpu_cache(struct kmem_cache *cachep)
*/
struct kmem_cache *
kmem_cache_create (const char *name, size_t size, size_t align,
- unsigned long flags,
- void (*ctor)(struct kmem_cache *, void *))
+ unsigned long flags, void (*ctor)(void *))
{
size_t left_over, slab_size, ralign;
struct kmem_cache *cachep = NULL, *pc;
@@ -2677,7 +2676,7 @@ static void cache_init_objs(struct kmem_cache *cachep,
cachep->buffer_size / PAGE_SIZE, 0);
#else
if (cachep->ctor)
- cachep->ctor(cachep, objp);
+ cachep->ctor(objp);
#endif
slab_bufctl(slabp)[i] = i + 1;
}
--- a/mm/slob.c
+++ b/mm/slob.c
@@ -525,12 +525,11 @@ struct kmem_cache {
unsigned int size, align;
unsigned long flags;
const char *name;
- void (*ctor)(struct kmem_cache *, void *);
+ void (*ctor)(void *);
};

struct kmem_cache *kmem_cache_create(const char *name, size_t size,
- size_t align, unsigned long flags,
- void (*ctor)(struct kmem_cache *, void *))
+ size_t align, unsigned long flags, void (*ctor)(void *))
{
struct kmem_cache *c;

@@ -575,7 +574,7 @@ void *kmem_cache_alloc_node(struct kmem_cache *c, gfp_t flags, int node)
b = slob_new_page(flags, get_order(c->size), node);

if (c->ctor)
- c->ctor(c, b);
+ c->ctor(b);

return b;
}
--- a/mm/slub.c
+++ b/mm/slub.c
@@ -1045,7 +1045,7 @@ __setup("slub_debug", setup_slub_debug);

static unsigned long kmem_cache_flags(unsigned long objsize,
unsigned long flags, const char *name,
- void (*ctor)(struct kmem_cache *, void *))
+ void (*ctor)(void *))
{
/*
* Enable debugging if selected on the kernel commandline.
@@ -1073,7 +1073,7 @@ static inline int check_object(struct kmem_cache *s, struct page *page,
static inline void add_full(struct kmem_cache_node *n, struct page *page) {}
static inline unsigned long kmem_cache_flags(unsigned long objsize,
unsigned long flags, const char *name,
- void (*ctor)(struct kmem_cache *, void *))
+ void (*ctor)(void *))
{
return flags;
}
@@ -1136,7 +1136,7 @@ static void setup_object(struct kmem_cache *s, struct page *page,
{
setup_object_debug(s, page, object);
if (unlikely(s->ctor))
- s->ctor(s, object);
+ s->ctor(object);
}

static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node)
@@ -2324,7 +2324,7 @@ static int calculate_sizes(struct kmem_cache *s, int forced_order)
static int kmem_cache_open(struct kmem_cache *s, gfp_t gfpflags,
const char *name, size_t size,
size_t align, unsigned long flags,
- void (*ctor)(struct kmem_cache *, void *))
+ void (*ctor)(void *))
{
memset(s, 0, kmem_size);
s->name = name;
@@ -3079,7 +3079,7 @@ static int slab_unmergeable(struct kmem_cache *s)

static struct kmem_cache *find_mergeable(size_t size,
size_t align, unsigned long flags, const char *name,
- void (*ctor)(struct kmem_cache *, void *))
+ void (*ctor)(void *))
{
struct kmem_cache *s;

@@ -3119,8 +3119,7 @@ static struct kmem_cache *find_mergeable(size_t size,
}

struct kmem_cache *kmem_cache_create(const char *name, size_t size,
- size_t align, unsigned long flags,
- void (*ctor)(struct kmem_cache *, void *))
+ size_t align, unsigned long flags, void (*ctor)(void *))
{
struct kmem_cache *s;

--- a/net/socket.c
+++ b/net/socket.c
@@ -262,7 +262,7 @@ static void sock_destroy_inode(struct inode *inode)
container_of(inode, struct socket_alloc, vfs_inode));
}

-static void init_once(struct kmem_cache *cachep, void *foo)
+static void init_once(void *foo)
{
struct socket_alloc *ei = (struct socket_alloc *)foo;

--- a/net/sunrpc/rpc_pipe.c
+++ b/net/sunrpc/rpc_pipe.c
@@ -897,7 +897,7 @@ static struct file_system_type rpc_pipe_fs_type = {
};

static void
-init_once(struct kmem_cache * cachep, void *foo)
+init_once(void *foo)
{
struct rpc_inode *rpci = (struct rpc_inode *) foo;


2008-07-10 07:13:18

by Pekka Enberg

[permalink] [raw]
Subject: Re: SL*B: drop kmem cache argument from constructor

Hi Alexey,

[Fixing up Andrew's email address.]

On Thu, 2008-07-10 at 05:11 +0400, Alexey Dobriyan wrote:
> Kmem cache passed to constructor is only needed for constructors that are
> themselves multiplexeres. Nobody uses this "feature", nor does anybody uses
> passed kmem cache in non-trivial way, so pass only pointer to object.
>
> Non-trivial places are:
> arch/powerpc/mm/init_64.c
> arch/powerpc/mm/hugetlbpage.c
>
> This is flag day, yes.

Acked-by: Pekka Enberg <[email protected]>

However...

> --- a/arch/powerpc/mm/hugetlbpage.c
> +++ b/arch/powerpc/mm/hugetlbpage.c
> @@ -595,9 +595,9 @@ static int __init hugepage_setup_sz(char *str)
> }
> __setup("hugepagesz=", hugepage_setup_sz);
>
> -static void zero_ctor(struct kmem_cache *cache, void *addr)
> +static void zero_ctor(void *addr)
> {
> - memset(addr, 0, kmem_cache_size(cache));
> + memset(addr, 0, HUGEPTE_TABLE_SIZE);
> }
>
> static int __init hugetlbpage_init(void)
> --- a/arch/powerpc/mm/init_64.c
> +++ b/arch/powerpc/mm/init_64.c
> @@ -136,9 +136,14 @@ static int __init setup_kcore(void)
> module_init(setup_kcore);
> #endif
>
> -static void zero_ctor(struct kmem_cache *cache, void *addr)
> +static void pgd_ctor(void *addr)
> {
> - memset(addr, 0, kmem_cache_size(cache));
> + memset(addr, 0, PGD_TABLE_SIZE);
> +}
> +
> +static void pmd_ctor(void *addr)
> +{
> + memset(addr, 0, PMD_TABLE_SIZE);
> }
>
> static const unsigned int pgtable_cache_size[2] = {
> @@ -163,19 +168,8 @@ struct kmem_cache *pgtable_cache[ARRAY_SIZE(pgtable_cache_size)];
>
> void pgtable_cache_init(void)
> {
> - int i;
> -
> - for (i = 0; i < ARRAY_SIZE(pgtable_cache_size); i++) {
> - int size = pgtable_cache_size[i];
> - const char *name = pgtable_cache_name[i];
> -
> - pr_debug("Allocating page table cache %s (#%d) "
> - "for size: %08x...\n", name, i, size);
> - pgtable_cache[i] = kmem_cache_create(name,
> - size, size,
> - SLAB_PANIC,
> - zero_ctor);
> - }
> + pgtable_cache[0] = kmem_cache_create(pgtable_cache_name[0], PGD_TABLE_SIZE, PGD_TABLE_SIZE, SLAB_PANIC, pgd_ctor);
> + pgtable_cache[1] = kmem_cache_create(pgtable_cache_name[1], PMD_TABLE_SIZE, PMD_TABLE_SIZE, SLAB_PANIC, pmd_ctor);
> }

Can we please have these hunks merged first so that the final patch
which removes the 'cache' argument from the function signature has no
functional changes?

Pekka

2008-07-10 16:44:20

by Jon Tollefson

[permalink] [raw]
Subject: Re: SL*B: drop kmem cache argument from constructor

Alexey Dobriyan wrote:
> Kmem cache passed to constructor is only needed for constructors that are
> themselves multiplexeres. Nobody uses this "feature", nor does anybody uses
> passed kmem cache in non-trivial way, so pass only pointer to object.
>
> Non-trivial places are:
> arch/powerpc/mm/init_64.c
> arch/powerpc/mm/hugetlbpage.c
>
...<snip>...
> --- a/arch/powerpc/mm/hugetlbpage.c
> +++ b/arch/powerpc/mm/hugetlbpage.c
> @@ -595,9 +595,9 @@ static int __init hugepage_setup_sz(char *str)
> }
> __setup("hugepagesz=", hugepage_setup_sz);
>
> -static void zero_ctor(struct kmem_cache *cache, void *addr)
> +static void zero_ctor(void *addr)
> {
> - memset(addr, 0, kmem_cache_size(cache));
> + memset(addr, 0, HUGEPTE_TABLE_SIZE);
>
This isn't going to work with the multiple huge page size support. The
HUGEPTE_TABLE_SIZE macro now takes a parameter with of the mmu psize
index to indicate the size of page.

Jon

> }
>
> static int __init hugetlbpage_init(void)
> --- a/arch/powerpc/mm/init_64.c
> +++ b/arch/powerpc/mm/init_64.c
> @@ -136,9 +136,14 @@ static int __init setup_kcore(void)
> module_init(setup_kcore);
> #endif
>
> -static void zero_ctor(struct kmem_cache *cache, void *addr)
> +static void pgd_ctor(void *addr)
> {
> - memset(addr, 0, kmem_cache_size(cache));
> + memset(addr, 0, PGD_TABLE_SIZE);
> +}
> +
> +static void pmd_ctor(void *addr)
> +{
> + memset(addr, 0, PMD_TABLE_SIZE);
> }
>
> static const unsigned int pgtable_cache_size[2] = {
> @@ -163,19 +168,8 @@ struct kmem_cache *pgtable_cache[ARRAY_SIZE(pgtable_cache_size)];
>
> void pgtable_cache_init(void)
> {
> - int i;
> -
> - for (i = 0; i < ARRAY_SIZE(pgtable_cache_size); i++) {
> - int size = pgtable_cache_size[i];
> - const char *name = pgtable_cache_name[i];
> -
> - pr_debug("Allocating page table cache %s (#%d) "
> - "for size: %08x...\n", name, i, size);
> - pgtable_cache[i] = kmem_cache_create(name,
> - size, size,
> - SLAB_PANIC,
> - zero_ctor);
> - }
> + pgtable_cache[0] = kmem_cache_create(pgtable_cache_name[0], PGD_TABLE_SIZE, PGD_TABLE_SIZE, SLAB_PANIC, pgd_ctor);
> + pgtable_cache[1] = kmem_cache_create(pgtable_cache_name[1], PMD_TABLE_SIZE, PMD_TABLE_SIZE, SLAB_PANIC, pmd_ctor);
> }
>
> #ifdef CONFIG_SPARSEMEM_VMEMMAP
> --- a/arch/powerpc/platforms/cell/spufs/inode.c
> +++ b/arch/powerpc/platforms/cell/spufs/inode.c
> @@ -69,7 +69,7 @@ spufs_destroy_inode(struct inode *inode)
> }
>
> static void
> -spufs_init_once(struct kmem_cache *cachep, void *p)
> +spufs_init_once(void *p)
> {
> struct spufs_inode_info *ei = p;
>
> --- a/arch/sh/mm/pmb.c
> +++ b/arch/sh/mm/pmb.c
> @@ -293,7 +293,7 @@ void pmb_unmap(unsigned long addr)
> } while (pmbe);
> }
>
> -static void pmb_cache_ctor(struct kmem_cache *cachep, void *pmb)
> +static void pmb_cache_ctor(void *pmb)
> {
> struct pmb_entry *pmbe = pmb;
>
> --- a/arch/xtensa/mm/init.c
> +++ b/arch/xtensa/mm/init.c
> @@ -309,7 +309,7 @@ void show_mem(void)
>
> struct kmem_cache *pgtable_cache __read_mostly;
>
> -static void pgd_ctor(struct kmem_cache *cache, void* addr)
> +static void pgd_ctor(void* addr)
> {
> pte_t* ptep = (pte_t*)addr;
> int i;
> --- a/drivers/usb/mon/mon_text.c
> +++ b/drivers/usb/mon/mon_text.c
> @@ -87,7 +87,7 @@ struct mon_reader_text {
>
> static struct dentry *mon_dir; /* Usually /sys/kernel/debug/usbmon */
>
> -static void mon_text_ctor(struct kmem_cache *, void *);
> +static void mon_text_ctor(void *);
>
> struct mon_text_ptr {
> int cnt, limit;
> @@ -720,7 +720,7 @@ void mon_text_del(struct mon_bus *mbus)
> /*
> * Slab interface: constructor.
> */
> -static void mon_text_ctor(struct kmem_cache *slab, void *mem)
> +static void mon_text_ctor(void *mem)
> {
> /*
> * Nothing to initialize. No, really!
> --- a/fs/adfs/super.c
> +++ b/fs/adfs/super.c
> @@ -249,7 +249,7 @@ static void adfs_destroy_inode(struct inode *inode)
> kmem_cache_free(adfs_inode_cachep, ADFS_I(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct adfs_inode_info *ei = (struct adfs_inode_info *) foo;
>
> --- a/fs/affs/super.c
> +++ b/fs/affs/super.c
> @@ -90,7 +90,7 @@ static void affs_destroy_inode(struct inode *inode)
> kmem_cache_free(affs_inode_cachep, AFFS_I(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct affs_inode_info *ei = (struct affs_inode_info *) foo;
>
> --- a/fs/afs/super.c
> +++ b/fs/afs/super.c
> @@ -27,7 +27,7 @@
>
> #define AFS_FS_MAGIC 0x6B414653 /* 'kAFS' */
>
> -static void afs_i_init_once(struct kmem_cache *cachep, void *foo);
> +static void afs_i_init_once(void *foo);
> static int afs_get_sb(struct file_system_type *fs_type,
> int flags, const char *dev_name,
> void *data, struct vfsmount *mnt);
> @@ -449,7 +449,7 @@ static void afs_put_super(struct super_block *sb)
> /*
> * initialise an inode cache slab element prior to any use
> */
> -static void afs_i_init_once(struct kmem_cache *cachep, void *_vnode)
> +static void afs_i_init_once(void *_vnode)
> {
> struct afs_vnode *vnode = _vnode;
>
> --- a/fs/befs/linuxvfs.c
> +++ b/fs/befs/linuxvfs.c
> @@ -289,7 +289,7 @@ befs_destroy_inode(struct inode *inode)
> kmem_cache_free(befs_inode_cachep, BEFS_I(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct befs_inode_info *bi = (struct befs_inode_info *) foo;
>
> --- a/fs/bfs/inode.c
> +++ b/fs/bfs/inode.c
> @@ -259,7 +259,7 @@ static void bfs_destroy_inode(struct inode *inode)
> kmem_cache_free(bfs_inode_cachep, BFS_I(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct bfs_inode_info *bi = foo;
>
> --- a/fs/block_dev.c
> +++ b/fs/block_dev.c
> @@ -271,7 +271,7 @@ static void bdev_destroy_inode(struct inode *inode)
> kmem_cache_free(bdev_cachep, bdi);
> }
>
> -static void init_once(struct kmem_cache * cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct bdev_inode *ei = (struct bdev_inode *) foo;
> struct block_device *bdev = &ei->bdev;
> --- a/fs/buffer.c
> +++ b/fs/buffer.c
> @@ -3259,7 +3259,7 @@ int bh_submit_read(struct buffer_head *bh)
> EXPORT_SYMBOL(bh_submit_read);
>
> static void
> -init_buffer_head(struct kmem_cache *cachep, void *data)
> +init_buffer_head(void *data)
> {
> struct buffer_head *bh = data;
>
> --- a/fs/cifs/cifsfs.c
> +++ b/fs/cifs/cifsfs.c
> @@ -766,7 +766,7 @@ const struct file_operations cifs_dir_ops = {
> };
>
> static void
> -cifs_init_once(struct kmem_cache *cachep, void *inode)
> +cifs_init_once(void *inode)
> {
> struct cifsInodeInfo *cifsi = inode;
>
> --- a/fs/coda/inode.c
> +++ b/fs/coda/inode.c
> @@ -58,7 +58,7 @@ static void coda_destroy_inode(struct inode *inode)
> kmem_cache_free(coda_inode_cachep, ITOC(inode));
> }
>
> -static void init_once(struct kmem_cache * cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct coda_inode_info *ei = (struct coda_inode_info *) foo;
>
> --- a/fs/ecryptfs/main.c
> +++ b/fs/ecryptfs/main.c
> @@ -605,7 +605,7 @@ static struct file_system_type ecryptfs_fs_type = {
> * Initializes the ecryptfs_inode_info_cache when it is created
> */
> static void
> -inode_info_init_once(struct kmem_cache *cachep, void *vptr)
> +inode_info_init_once(void *vptr)
> {
> struct ecryptfs_inode_info *ei = (struct ecryptfs_inode_info *)vptr;
>
> @@ -616,7 +616,7 @@ static struct ecryptfs_cache_info {
> struct kmem_cache **cache;
> const char *name;
> size_t size;
> - void (*ctor)(struct kmem_cache *cache, void *obj);
> + void (*ctor)(void *obj);
> } ecryptfs_cache_infos[] = {
> {
> .cache = &ecryptfs_auth_tok_list_item_cache,
> --- a/fs/efs/super.c
> +++ b/fs/efs/super.c
> @@ -70,7 +70,7 @@ static void efs_destroy_inode(struct inode *inode)
> kmem_cache_free(efs_inode_cachep, INODE_INFO(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct efs_inode_info *ei = (struct efs_inode_info *) foo;
>
> --- a/fs/ext2/super.c
> +++ b/fs/ext2/super.c
> @@ -158,7 +158,7 @@ static void ext2_destroy_inode(struct inode *inode)
> kmem_cache_free(ext2_inode_cachep, EXT2_I(inode));
> }
>
> -static void init_once(struct kmem_cache * cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct ext2_inode_info *ei = (struct ext2_inode_info *) foo;
>
> --- a/fs/ext3/super.c
> +++ b/fs/ext3/super.c
> @@ -472,7 +472,7 @@ static void ext3_destroy_inode(struct inode *inode)
> kmem_cache_free(ext3_inode_cachep, EXT3_I(inode));
> }
>
> -static void init_once(struct kmem_cache * cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct ext3_inode_info *ei = (struct ext3_inode_info *) foo;
>
> --- a/fs/ext4/super.c
> +++ b/fs/ext4/super.c
> @@ -587,7 +587,7 @@ static void ext4_destroy_inode(struct inode *inode)
> kmem_cache_free(ext4_inode_cachep, EXT4_I(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct ext4_inode_info *ei = (struct ext4_inode_info *) foo;
>
> --- a/fs/fat/cache.c
> +++ b/fs/fat/cache.c
> @@ -36,7 +36,7 @@ static inline int fat_max_cache(struct inode *inode)
>
> static struct kmem_cache *fat_cache_cachep;
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct fat_cache *cache = (struct fat_cache *)foo;
>
> --- a/fs/fat/inode.c
> +++ b/fs/fat/inode.c
> @@ -496,7 +496,7 @@ static void fat_destroy_inode(struct inode *inode)
> kmem_cache_free(fat_inode_cachep, MSDOS_I(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct msdos_inode_info *ei = (struct msdos_inode_info *)foo;
>
> --- a/fs/fuse/inode.c
> +++ b/fs/fuse/inode.c
> @@ -781,7 +781,7 @@ static inline void unregister_fuseblk(void)
> }
> #endif
>
> -static void fuse_inode_init_once(struct kmem_cache *cachep, void *foo)
> +static void fuse_inode_init_once(void *foo)
> {
> struct inode * inode = foo;
>
> --- a/fs/gfs2/main.c
> +++ b/fs/gfs2/main.c
> @@ -24,7 +24,7 @@
> #include "util.h"
> #include "glock.h"
>
> -static void gfs2_init_inode_once(struct kmem_cache *cachep, void *foo)
> +static void gfs2_init_inode_once(void *foo)
> {
> struct gfs2_inode *ip = foo;
>
> @@ -33,7 +33,7 @@ static void gfs2_init_inode_once(struct kmem_cache *cachep, void *foo)
> ip->i_alloc = NULL;
> }
>
> -static void gfs2_init_glock_once(struct kmem_cache *cachep, void *foo)
> +static void gfs2_init_glock_once(void *foo)
> {
> struct gfs2_glock *gl = foo;
>
> --- a/fs/hfs/super.c
> +++ b/fs/hfs/super.c
> @@ -432,7 +432,7 @@ static struct file_system_type hfs_fs_type = {
> .fs_flags = FS_REQUIRES_DEV,
> };
>
> -static void hfs_init_once(struct kmem_cache *cachep, void *p)
> +static void hfs_init_once(void *p)
> {
> struct hfs_inode_info *i = p;
>
> --- a/fs/hfsplus/super.c
> +++ b/fs/hfsplus/super.c
> @@ -485,7 +485,7 @@ static struct file_system_type hfsplus_fs_type = {
> .fs_flags = FS_REQUIRES_DEV,
> };
>
> -static void hfsplus_init_once(struct kmem_cache *cachep, void *p)
> +static void hfsplus_init_once(void *p)
> {
> struct hfsplus_inode_info *i = p;
>
> --- a/fs/hpfs/super.c
> +++ b/fs/hpfs/super.c
> @@ -173,7 +173,7 @@ static void hpfs_destroy_inode(struct inode *inode)
> kmem_cache_free(hpfs_inode_cachep, hpfs_i(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct hpfs_inode_info *ei = (struct hpfs_inode_info *) foo;
>
> --- a/fs/hugetlbfs/inode.c
> +++ b/fs/hugetlbfs/inode.c
> @@ -696,7 +696,7 @@ static const struct address_space_operations hugetlbfs_aops = {
> };
>
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct hugetlbfs_inode_info *ei = (struct hugetlbfs_inode_info *)foo;
>
> --- a/fs/inode.c
> +++ b/fs/inode.c
> @@ -224,7 +224,7 @@ void inode_init_once(struct inode *inode)
>
> EXPORT_SYMBOL(inode_init_once);
>
> -static void init_once(struct kmem_cache * cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct inode * inode = (struct inode *) foo;
>
> --- a/fs/isofs/inode.c
> +++ b/fs/isofs/inode.c
> @@ -73,7 +73,7 @@ static void isofs_destroy_inode(struct inode *inode)
> kmem_cache_free(isofs_inode_cachep, ISOFS_I(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct iso_inode_info *ei = foo;
>
> --- a/fs/jffs2/super.c
> +++ b/fs/jffs2/super.c
> @@ -44,7 +44,7 @@ static void jffs2_destroy_inode(struct inode *inode)
> kmem_cache_free(jffs2_inode_cachep, JFFS2_INODE_INFO(inode));
> }
>
> -static void jffs2_i_init_once(struct kmem_cache *cachep, void *foo)
> +static void jffs2_i_init_once(void *foo)
> {
> struct jffs2_inode_info *f = foo;
>
> --- a/fs/jfs/jfs_metapage.c
> +++ b/fs/jfs/jfs_metapage.c
> @@ -180,7 +180,7 @@ static inline void remove_metapage(struct page *page, struct metapage *mp)
>
> #endif
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct metapage *mp = (struct metapage *)foo;
>
> --- a/fs/jfs/super.c
> +++ b/fs/jfs/super.c
> @@ -760,7 +760,7 @@ static struct file_system_type jfs_fs_type = {
> .fs_flags = FS_REQUIRES_DEV,
> };
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct jfs_inode_info *jfs_ip = (struct jfs_inode_info *) foo;
>
> --- a/fs/locks.c
> +++ b/fs/locks.c
> @@ -201,7 +201,7 @@ EXPORT_SYMBOL(locks_init_lock);
> * Initialises the fields of the file lock which are invariant for
> * free file_locks.
> */
> -static void init_once(struct kmem_cache *cache, void *foo)
> +static void init_once(void *foo)
> {
> struct file_lock *lock = (struct file_lock *) foo;
>
> --- a/fs/minix/inode.c
> +++ b/fs/minix/inode.c
> @@ -68,7 +68,7 @@ static void minix_destroy_inode(struct inode *inode)
> kmem_cache_free(minix_inode_cachep, minix_i(inode));
> }
>
> -static void init_once(struct kmem_cache * cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct minix_inode_info *ei = (struct minix_inode_info *) foo;
>
> --- a/fs/ncpfs/inode.c
> +++ b/fs/ncpfs/inode.c
> @@ -64,7 +64,7 @@ static void ncp_destroy_inode(struct inode *inode)
> kmem_cache_free(ncp_inode_cachep, NCP_FINFO(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct ncp_inode_info *ei = (struct ncp_inode_info *) foo;
>
> --- a/fs/nfs/inode.c
> +++ b/fs/nfs/inode.c
> @@ -1193,7 +1193,7 @@ static inline void nfs4_init_once(struct nfs_inode *nfsi)
> #endif
> }
>
> -static void init_once(struct kmem_cache * cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct nfs_inode *nfsi = (struct nfs_inode *) foo;
>
> --- a/fs/ntfs/super.c
> +++ b/fs/ntfs/super.c
> @@ -3080,7 +3080,7 @@ struct kmem_cache *ntfs_inode_cache;
> struct kmem_cache *ntfs_big_inode_cache;
>
> /* Init once constructor for the inode slab cache. */
> -static void ntfs_big_inode_init_once(struct kmem_cache *cachep, void *foo)
> +static void ntfs_big_inode_init_once(void *foo)
> {
> ntfs_inode *ni = (ntfs_inode *)foo;
>
> --- a/fs/ocfs2/dlm/dlmfs.c
> +++ b/fs/ocfs2/dlm/dlmfs.c
> @@ -267,8 +267,7 @@ static ssize_t dlmfs_file_write(struct file *filp,
> return writelen;
> }
>
> -static void dlmfs_init_once(struct kmem_cache *cachep,
> - void *foo)
> +static void dlmfs_init_once(void *foo)
> {
> struct dlmfs_inode_private *ip =
> (struct dlmfs_inode_private *) foo;
> --- a/fs/ocfs2/super.c
> +++ b/fs/ocfs2/super.c
> @@ -1118,7 +1118,7 @@ bail:
> return status;
> }
>
> -static void ocfs2_inode_init_once(struct kmem_cache *cachep, void *data)
> +static void ocfs2_inode_init_once(void *data)
> {
> struct ocfs2_inode_info *oi = data;
>
> --- a/fs/openpromfs/inode.c
> +++ b/fs/openpromfs/inode.c
> @@ -430,7 +430,7 @@ static struct file_system_type openprom_fs_type = {
> .kill_sb = kill_anon_super,
> };
>
> -static void op_inode_init_once(struct kmem_cache * cachep, void *data)
> +static void op_inode_init_once(void *data)
> {
> struct op_inode_info *oi = (struct op_inode_info *) data;
>
> --- a/fs/proc/inode.c
> +++ b/fs/proc/inode.c
> @@ -94,7 +94,7 @@ static void proc_destroy_inode(struct inode *inode)
> kmem_cache_free(proc_inode_cachep, PROC_I(inode));
> }
>
> -static void init_once(struct kmem_cache * cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct proc_inode *ei = (struct proc_inode *) foo;
>
> --- a/fs/qnx4/inode.c
> +++ b/fs/qnx4/inode.c
> @@ -553,7 +553,7 @@ static void qnx4_destroy_inode(struct inode *inode)
> kmem_cache_free(qnx4_inode_cachep, qnx4_i(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct qnx4_inode_info *ei = (struct qnx4_inode_info *) foo;
>
> --- a/fs/reiserfs/super.c
> +++ b/fs/reiserfs/super.c
> @@ -520,7 +520,7 @@ static void reiserfs_destroy_inode(struct inode *inode)
> kmem_cache_free(reiserfs_inode_cachep, REISERFS_I(inode));
> }
>
> -static void init_once(struct kmem_cache * cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct reiserfs_inode_info *ei = (struct reiserfs_inode_info *)foo;
>
> --- a/fs/romfs/inode.c
> +++ b/fs/romfs/inode.c
> @@ -577,7 +577,7 @@ static void romfs_destroy_inode(struct inode *inode)
> kmem_cache_free(romfs_inode_cachep, ROMFS_I(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct romfs_inode_info *ei = foo;
>
> --- a/fs/smbfs/inode.c
> +++ b/fs/smbfs/inode.c
> @@ -67,7 +67,7 @@ static void smb_destroy_inode(struct inode *inode)
> kmem_cache_free(smb_inode_cachep, SMB_I(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct smb_inode_info *ei = (struct smb_inode_info *) foo;
>
> --- a/fs/sysv/inode.c
> +++ b/fs/sysv/inode.c
> @@ -326,7 +326,7 @@ static void sysv_destroy_inode(struct inode *inode)
> kmem_cache_free(sysv_inode_cachep, SYSV_I(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *p)
> +static void init_once(void *p)
> {
> struct sysv_inode_info *si = (struct sysv_inode_info *)p;
>
> --- a/fs/udf/super.c
> +++ b/fs/udf/super.c
> @@ -148,7 +148,7 @@ static void udf_destroy_inode(struct inode *inode)
> kmem_cache_free(udf_inode_cachep, UDF_I(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct udf_inode_info *ei = (struct udf_inode_info *)foo;
>
> --- a/fs/ufs/super.c
> +++ b/fs/ufs/super.c
> @@ -1301,7 +1301,7 @@ static void ufs_destroy_inode(struct inode *inode)
> kmem_cache_free(ufs_inode_cachep, UFS_I(inode));
> }
>
> -static void init_once(struct kmem_cache * cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct ufs_inode_info *ei = (struct ufs_inode_info *) foo;
>
> --- a/fs/xfs/linux-2.6/kmem.h
> +++ b/fs/xfs/linux-2.6/kmem.h
> @@ -79,7 +79,7 @@ kmem_zone_init(int size, char *zone_name)
>
> static inline kmem_zone_t *
> kmem_zone_init_flags(int size, char *zone_name, unsigned long flags,
> - void (*construct)(kmem_zone_t *, void *))
> + void (*construct)(void *))
> {
> return kmem_cache_create(zone_name, size, 0, flags, construct);
> }
> --- a/fs/xfs/linux-2.6/xfs_super.c
> +++ b/fs/xfs/linux-2.6/xfs_super.c
> @@ -843,7 +843,6 @@ xfs_fs_destroy_inode(
>
> STATIC void
> xfs_fs_inode_init_once(
> - kmem_zone_t *zonep,
> void *vnode)
> {
> inode_init_once(vn_to_inode((bhv_vnode_t *)vnode));
> --- a/include/linux/slab.h
> +++ b/include/linux/slab.h
> @@ -58,7 +58,7 @@ int slab_is_available(void);
>
> struct kmem_cache *kmem_cache_create(const char *, size_t, size_t,
> unsigned long,
> - void (*)(struct kmem_cache *, void *));
> + void (*)(void *));
> void kmem_cache_destroy(struct kmem_cache *);
> int kmem_cache_shrink(struct kmem_cache *);
> void kmem_cache_free(struct kmem_cache *, void *);
> --- a/include/linux/slub_def.h
> +++ b/include/linux/slub_def.h
> @@ -85,7 +85,7 @@ struct kmem_cache {
> struct kmem_cache_order_objects min;
> gfp_t allocflags; /* gfp flags to use on each alloc */
> int refcount; /* Refcount for slab cache destroy */
> - void (*ctor)(struct kmem_cache *, void *);
> + void (*ctor)(void *);
> int inuse; /* Offset to metadata */
> int align; /* Alignment */
> const char *name; /* Name (only for display!) */
> --- a/ipc/mqueue.c
> +++ b/ipc/mqueue.c
> @@ -207,7 +207,7 @@ static int mqueue_get_sb(struct file_system_type *fs_type,
> return get_sb_single(fs_type, flags, data, mqueue_fill_super, mnt);
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct mqueue_inode_info *p = (struct mqueue_inode_info *) foo;
>
> --- a/kernel/fork.c
> +++ b/kernel/fork.c
> @@ -1403,7 +1403,7 @@ long do_fork(unsigned long clone_flags,
> #define ARCH_MIN_MMSTRUCT_ALIGN 0
> #endif
>
> -static void sighand_ctor(struct kmem_cache *cachep, void *data)
> +static void sighand_ctor(void *data)
> {
> struct sighand_struct *sighand = data;
>
> --- a/lib/idr.c
> +++ b/lib/idr.c
> @@ -580,7 +580,7 @@ void *idr_replace(struct idr *idp, void *ptr, int id)
> }
> EXPORT_SYMBOL(idr_replace);
>
> -static void idr_cache_ctor(struct kmem_cache *idr_layer_cache, void *idr_layer)
> +static void idr_cache_ctor(void *idr_layer)
> {
> memset(idr_layer, 0, sizeof(struct idr_layer));
> }
> --- a/lib/radix-tree.c
> +++ b/lib/radix-tree.c
> @@ -1051,7 +1051,7 @@ int radix_tree_tagged(struct radix_tree_root *root, unsigned int tag)
> EXPORT_SYMBOL(radix_tree_tagged);
>
> static void
> -radix_tree_node_ctor(struct kmem_cache *cachep, void *node)
> +radix_tree_node_ctor(void *node)
> {
> memset(node, 0, sizeof(struct radix_tree_node));
> }
> --- a/mm/rmap.c
> +++ b/mm/rmap.c
> @@ -138,7 +138,7 @@ void anon_vma_unlink(struct vm_area_struct *vma)
> anon_vma_free(anon_vma);
> }
>
> -static void anon_vma_ctor(struct kmem_cache *cachep, void *data)
> +static void anon_vma_ctor(void *data)
> {
> struct anon_vma *anon_vma = data;
>
> --- a/mm/shmem.c
> +++ b/mm/shmem.c
> @@ -2330,7 +2330,7 @@ static void shmem_destroy_inode(struct inode *inode)
> kmem_cache_free(shmem_inode_cachep, SHMEM_I(inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct shmem_inode_info *p = (struct shmem_inode_info *) foo;
>
> --- a/mm/slab.c
> +++ b/mm/slab.c
> @@ -406,7 +406,7 @@ struct kmem_cache {
> unsigned int dflags; /* dynamic flags */
>
> /* constructor func */
> - void (*ctor)(struct kmem_cache *, void *);
> + void (*ctor)(void *);
>
> /* 5) cache creation/removal */
> const char *name;
> @@ -2145,8 +2145,7 @@ static int __init_refok setup_cpu_cache(struct kmem_cache *cachep)
> */
> struct kmem_cache *
> kmem_cache_create (const char *name, size_t size, size_t align,
> - unsigned long flags,
> - void (*ctor)(struct kmem_cache *, void *))
> + unsigned long flags, void (*ctor)(void *))
> {
> size_t left_over, slab_size, ralign;
> struct kmem_cache *cachep = NULL, *pc;
> @@ -2677,7 +2676,7 @@ static void cache_init_objs(struct kmem_cache *cachep,
> cachep->buffer_size / PAGE_SIZE, 0);
> #else
> if (cachep->ctor)
> - cachep->ctor(cachep, objp);
> + cachep->ctor(objp);
> #endif
> slab_bufctl(slabp)[i] = i + 1;
> }
> --- a/mm/slob.c
> +++ b/mm/slob.c
> @@ -525,12 +525,11 @@ struct kmem_cache {
> unsigned int size, align;
> unsigned long flags;
> const char *name;
> - void (*ctor)(struct kmem_cache *, void *);
> + void (*ctor)(void *);
> };
>
> struct kmem_cache *kmem_cache_create(const char *name, size_t size,
> - size_t align, unsigned long flags,
> - void (*ctor)(struct kmem_cache *, void *))
> + size_t align, unsigned long flags, void (*ctor)(void *))
> {
> struct kmem_cache *c;
>
> @@ -575,7 +574,7 @@ void *kmem_cache_alloc_node(struct kmem_cache *c, gfp_t flags, int node)
> b = slob_new_page(flags, get_order(c->size), node);
>
> if (c->ctor)
> - c->ctor(c, b);
> + c->ctor(b);
>
> return b;
> }
> --- a/mm/slub.c
> +++ b/mm/slub.c
> @@ -1045,7 +1045,7 @@ __setup("slub_debug", setup_slub_debug);
>
> static unsigned long kmem_cache_flags(unsigned long objsize,
> unsigned long flags, const char *name,
> - void (*ctor)(struct kmem_cache *, void *))
> + void (*ctor)(void *))
> {
> /*
> * Enable debugging if selected on the kernel commandline.
> @@ -1073,7 +1073,7 @@ static inline int check_object(struct kmem_cache *s, struct page *page,
> static inline void add_full(struct kmem_cache_node *n, struct page *page) {}
> static inline unsigned long kmem_cache_flags(unsigned long objsize,
> unsigned long flags, const char *name,
> - void (*ctor)(struct kmem_cache *, void *))
> + void (*ctor)(void *))
> {
> return flags;
> }
> @@ -1136,7 +1136,7 @@ static void setup_object(struct kmem_cache *s, struct page *page,
> {
> setup_object_debug(s, page, object);
> if (unlikely(s->ctor))
> - s->ctor(s, object);
> + s->ctor(object);
> }
>
> static struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node)
> @@ -2324,7 +2324,7 @@ static int calculate_sizes(struct kmem_cache *s, int forced_order)
> static int kmem_cache_open(struct kmem_cache *s, gfp_t gfpflags,
> const char *name, size_t size,
> size_t align, unsigned long flags,
> - void (*ctor)(struct kmem_cache *, void *))
> + void (*ctor)(void *))
> {
> memset(s, 0, kmem_size);
> s->name = name;
> @@ -3079,7 +3079,7 @@ static int slab_unmergeable(struct kmem_cache *s)
>
> static struct kmem_cache *find_mergeable(size_t size,
> size_t align, unsigned long flags, const char *name,
> - void (*ctor)(struct kmem_cache *, void *))
> + void (*ctor)(void *))
> {
> struct kmem_cache *s;
>
> @@ -3119,8 +3119,7 @@ static struct kmem_cache *find_mergeable(size_t size,
> }
>
> struct kmem_cache *kmem_cache_create(const char *name, size_t size,
> - size_t align, unsigned long flags,
> - void (*ctor)(struct kmem_cache *, void *))
> + size_t align, unsigned long flags, void (*ctor)(void *))
> {
> struct kmem_cache *s;
>
> --- a/net/socket.c
> +++ b/net/socket.c
> @@ -262,7 +262,7 @@ static void sock_destroy_inode(struct inode *inode)
> container_of(inode, struct socket_alloc, vfs_inode));
> }
>
> -static void init_once(struct kmem_cache *cachep, void *foo)
> +static void init_once(void *foo)
> {
> struct socket_alloc *ei = (struct socket_alloc *)foo;
>
> --- a/net/sunrpc/rpc_pipe.c
> +++ b/net/sunrpc/rpc_pipe.c
> @@ -897,7 +897,7 @@ static struct file_system_type rpc_pipe_fs_type = {
> };
>
> static void
> -init_once(struct kmem_cache * cachep, void *foo)
> +init_once(void *foo)
> {
> struct rpc_inode *rpci = (struct rpc_inode *) foo;
>
>
> --
> To unsubscribe, send a message with 'unsubscribe linux-mm' in
> the body to [email protected]. For more info on Linux MM,
> see: http://www.linux-mm.org/ .
> Don't email: <a href=mailto:"[email protected]"> [email protected] </a>
>

2008-07-11 19:25:34

by Andrew Morton

[permalink] [raw]
Subject: Re: SL*B: drop kmem cache argument from constructor

On Thu, 10 Jul 2008 11:44:16 -0500 Jon Tollefson <[email protected]> wrote:

> Alexey Dobriyan wrote:
> > Kmem cache passed to constructor is only needed for constructors that are
> > themselves multiplexeres. Nobody uses this "feature", nor does anybody uses
> > passed kmem cache in non-trivial way, so pass only pointer to object.
> >
> > Non-trivial places are:
> > arch/powerpc/mm/init_64.c
> > arch/powerpc/mm/hugetlbpage.c
> >
> ...<snip>...
> > --- a/arch/powerpc/mm/hugetlbpage.c
> > +++ b/arch/powerpc/mm/hugetlbpage.c
> > @@ -595,9 +595,9 @@ static int __init hugepage_setup_sz(char *str)
> > }
> > __setup("hugepagesz=", hugepage_setup_sz);
> >
> > -static void zero_ctor(struct kmem_cache *cache, void *addr)
> > +static void zero_ctor(void *addr)
> > {
> > - memset(addr, 0, kmem_cache_size(cache));
> > + memset(addr, 0, HUGEPTE_TABLE_SIZE);
> >
> This isn't going to work with the multiple huge page size support. The
> HUGEPTE_TABLE_SIZE macro now takes a parameter with of the mmu psize
> index to indicate the size of page.
>

hrm. I suppose we could hold our noses and use ksize(), assuming that
we're ready to use ksize() at this stage in the object's lifetime.

Better would be to just use kmem_cache_zalloc()?

--- a/arch/powerpc/mm/hugetlbpage.c~slb-drop-kmem-cache-argument-from-constructor-fix
+++ a/arch/powerpc/mm/hugetlbpage.c
@@ -113,7 +113,7 @@ static inline pte_t *hugepte_offset(huge
static int __hugepte_alloc(struct mm_struct *mm, hugepd_t *hpdp,
unsigned long address, unsigned int psize)
{
- pte_t *new = kmem_cache_alloc(huge_pgtable_cache(psize),
+ pte_t *new = kmem_cache_zalloc(huge_pgtable_cache(psize),
GFP_KERNEL|__GFP_REPEAT);

if (! new)
@@ -730,11 +730,6 @@ static int __init hugepage_setup_sz(char
}
__setup("hugepagesz=", hugepage_setup_sz);

-static void zero_ctor(void *addr)
-{
- memset(addr, 0, HUGEPTE_TABLE_SIZE);
-}
-
static int __init hugetlbpage_init(void)
{
unsigned int psize;
@@ -756,7 +751,7 @@ static int __init hugetlbpage_init(void)
HUGEPTE_TABLE_SIZE(psize),
HUGEPTE_TABLE_SIZE(psize),
0,
- zero_ctor);
+ NULL);
if (!huge_pgtable_cache(psize))
panic("hugetlbpage_init(): could not create %s"\
"\n", HUGEPTE_CACHE_NAME(psize));
_


btw, Nick, what's with that dopey

huge_pgtable_cache(psize) = kmem_cache_create(...

trick? The result of a function call is not an lvalue, and writing a
macro which pretends to be a function and then using it in some manner
in which a function cannot be used is seven ways silly :(

2008-07-11 19:40:30

by Matt Mackall

[permalink] [raw]
Subject: Re: SL*B: drop kmem cache argument from constructor


On Fri, 2008-07-11 at 12:22 -0700, Andrew Morton wrote:
> On Thu, 10 Jul 2008 11:44:16 -0500 Jon Tollefson <[email protected]> wrote:
>
> > Alexey Dobriyan wrote:
> > > Kmem cache passed to constructor is only needed for constructors that are
> > > themselves multiplexeres. Nobody uses this "feature", nor does anybody uses
> > > passed kmem cache in non-trivial way, so pass only pointer to object.
> > >
> > > Non-trivial places are:
> > > arch/powerpc/mm/init_64.c
> > > arch/powerpc/mm/hugetlbpage.c
> > >
> > ...<snip>...
> > > --- a/arch/powerpc/mm/hugetlbpage.c
> > > +++ b/arch/powerpc/mm/hugetlbpage.c
> > > @@ -595,9 +595,9 @@ static int __init hugepage_setup_sz(char *str)
> > > }
> > > __setup("hugepagesz=", hugepage_setup_sz);
> > >
> > > -static void zero_ctor(struct kmem_cache *cache, void *addr)
> > > +static void zero_ctor(void *addr)
> > > {
> > > - memset(addr, 0, kmem_cache_size(cache));
> > > + memset(addr, 0, HUGEPTE_TABLE_SIZE);
> > >
> > This isn't going to work with the multiple huge page size support. The
> > HUGEPTE_TABLE_SIZE macro now takes a parameter with of the mmu psize
> > index to indicate the size of page.
> >
>
> hrm. I suppose we could hold our noses and use ksize(), assuming that
> we're ready to use ksize() at this stage in the object's lifetime.

ksize() on non-kmalloced objects is considered harmful. Doesn't work on SLOB.

> Better would be to just use kmem_cache_zalloc()?

I'd say so.

--
Mathematics is the supreme nostalgia of our time.

2008-07-11 21:41:01

by Jon Tollefson

[permalink] [raw]
Subject: Re: SL*B: drop kmem cache argument from constructor

Andrew Morton wrote:
> On Thu, 10 Jul 2008 11:44:16 -0500 Jon Tollefson <[email protected]> wrote:
>
>
>> Alexey Dobriyan wrote:
>>
>>> Kmem cache passed to constructor is only needed for constructors that are
>>> themselves multiplexeres. Nobody uses this "feature", nor does anybody uses
>>> passed kmem cache in non-trivial way, so pass only pointer to object.
>>>
>>> Non-trivial places are:
>>> arch/powerpc/mm/init_64.c
>>> arch/powerpc/mm/hugetlbpage.c
>>>
>>>
>> ...<snip>...
>>
>>> --- a/arch/powerpc/mm/hugetlbpage.c
>>> +++ b/arch/powerpc/mm/hugetlbpage.c
>>> @@ -595,9 +595,9 @@ static int __init hugepage_setup_sz(char *str)
>>> }
>>> __setup("hugepagesz=", hugepage_setup_sz);
>>>
>>> -static void zero_ctor(struct kmem_cache *cache, void *addr)
>>> +static void zero_ctor(void *addr)
>>> {
>>> - memset(addr, 0, kmem_cache_size(cache));
>>> + memset(addr, 0, HUGEPTE_TABLE_SIZE);
>>>
>>>
>> This isn't going to work with the multiple huge page size support. The
>> HUGEPTE_TABLE_SIZE macro now takes a parameter with of the mmu psize
>> index to indicate the size of page.
>>
>>
>
> hrm. I suppose we could hold our noses and use ksize(), assuming that
> we're ready to use ksize() at this stage in the object's lifetime.
>
> Better would be to just use kmem_cache_zalloc()?
>
> --- a/arch/powerpc/mm/hugetlbpage.c~slb-drop-kmem-cache-argument-from-constructor-fix
> +++ a/arch/powerpc/mm/hugetlbpage.c
> @@ -113,7 +113,7 @@ static inline pte_t *hugepte_offset(huge
> static int __hugepte_alloc(struct mm_struct *mm, hugepd_t *hpdp,
> unsigned long address, unsigned int psize)
> {
> - pte_t *new = kmem_cache_alloc(huge_pgtable_cache(psize),
> + pte_t *new = kmem_cache_zalloc(huge_pgtable_cache(psize),
> GFP_KERNEL|__GFP_REPEAT);
>
> if (! new)
> @@ -730,11 +730,6 @@ static int __init hugepage_setup_sz(char
> }
> __setup("hugepagesz=", hugepage_setup_sz);
>
> -static void zero_ctor(void *addr)
> -{
> - memset(addr, 0, HUGEPTE_TABLE_SIZE);
> -}
> -
> static int __init hugetlbpage_init(void)
> {
> unsigned int psize;
> @@ -756,7 +751,7 @@ static int __init hugetlbpage_init(void)
> HUGEPTE_TABLE_SIZE(psize),
> HUGEPTE_TABLE_SIZE(psize),
> 0,
> - zero_ctor);
> + NULL);
> if (!huge_pgtable_cache(psize))
> panic("hugetlbpage_init(): could not create %s"\
> "\n", HUGEPTE_CACHE_NAME(psize));
> _
>
>
> btw, Nick, what's with that dopey
>
> huge_pgtable_cache(psize) = kmem_cache_create(...
>
> trick? The result of a function call is not an lvalue, and writing a
> macro which pretends to be a function and then using it in some manner
> in which a function cannot be used is seven ways silly :(
>
That silliness came from me.
It came from my simplistic translation of the existing code to handle
multiple huge page sizes. I would agree it would be easier to read and
more straight forward to just have the indexed array directly on the
left side instead of a macro. I can send out a patch that makes that
change if desired.
Something such as

+#define HUGE_PGTABLE_INDEX(psize) (HUGEPTE_CACHE_NUM + psize - 1)

-huge_pgtable_cache(psize) = kmem_cache_create(...
+pgtable_cache[HUGE_PGTABLE_INDEX(psize)] = kmem_cache_create(...


or if there is a more accepted way of handling this situation I can
amend it differently.

Jon

2008-07-14 04:45:23

by Nick Piggin

[permalink] [raw]
Subject: Re: SL*B: drop kmem cache argument from constructor

On Saturday 12 July 2008 05:22, Andrew Morton wrote:
> On Thu, 10 Jul 2008 11:44:16 -0500 Jon Tollefson <[email protected]>
wrote:
> > Alexey Dobriyan wrote:
> > > Kmem cache passed to constructor is only needed for constructors that
> > > are themselves multiplexeres. Nobody uses this "feature", nor does
> > > anybody uses passed kmem cache in non-trivial way, so pass only pointer
> > > to object.
> > >
> > > Non-trivial places are:
> > > arch/powerpc/mm/init_64.c
> > > arch/powerpc/mm/hugetlbpage.c
> >
> > ...<snip>...
> >
> > > --- a/arch/powerpc/mm/hugetlbpage.c
> > > +++ b/arch/powerpc/mm/hugetlbpage.c
> > > @@ -595,9 +595,9 @@ static int __init hugepage_setup_sz(char *str)
> > > }
> > > __setup("hugepagesz=", hugepage_setup_sz);
> > >
> > > -static void zero_ctor(struct kmem_cache *cache, void *addr)
> > > +static void zero_ctor(void *addr)
> > > {
> > > - memset(addr, 0, kmem_cache_size(cache));
> > > + memset(addr, 0, HUGEPTE_TABLE_SIZE);
> >
> > This isn't going to work with the multiple huge page size support. The
> > HUGEPTE_TABLE_SIZE macro now takes a parameter with of the mmu psize
> > index to indicate the size of page.
>
> hrm. I suppose we could hold our noses and use ksize(), assuming that
> we're ready to use ksize() at this stage in the object's lifetime.
>
> Better would be to just use kmem_cache_zalloc()?

As this is hugepages we're talking about, probably yes. But note that
page tables are one of those things where we (I?) think constructors are
probably a good idea -- they tend to be very sparse.

2008-07-14 04:48:41

by Nick Piggin

[permalink] [raw]
Subject: Re: SL*B: drop kmem cache argument from constructor

On Saturday 12 July 2008 07:40, Jon Tollefson wrote:
> Andrew Morton wrote:

> > btw, Nick, what's with that dopey
> >
> > huge_pgtable_cache(psize) = kmem_cache_create(...
> >
> > trick? The result of a function call is not an lvalue, and writing a
> > macro which pretends to be a function and then using it in some manner
> > in which a function cannot be used is seven ways silly :(

I agree it isn't nice.


> That silliness came from me.
> It came from my simplistic translation of the existing code to handle
> multiple huge page sizes. I would agree it would be easier to read and
> more straight forward to just have the indexed array directly on the
> left side instead of a macro. I can send out a patch that makes that
> change if desired.
> Something such as
>
> +#define HUGE_PGTABLE_INDEX(psize) (HUGEPTE_CACHE_NUM + psize - 1)
>
> -huge_pgtable_cache(psize) = kmem_cache_create(...
> +pgtable_cache[HUGE_PGTABLE_INDEX(psize)] = kmem_cache_create(...
>
>
> or if there is a more accepted way of handling this situation I can
> amend it differently.

If it is a once off initialization (which it is), that's probably fine
like that. Otherwise, the convention is to have a set_huge_pgtable_cache
function as well. But whatever you prefer. Yes if you can send a patch,
that would be good, thanks.