Loading fs/super.c +2 −10 Original line number Diff line number Diff line Loading @@ -34,7 +34,6 @@ #include <linux/cleancache.h> #include <linux/fsnotify.h> #include <linux/lockdep.h> #include <linux/list_lru.h> #include "internal.h" Loading Loading @@ -171,12 +170,8 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags) INIT_HLIST_NODE(&s->s_instances); INIT_HLIST_BL_HEAD(&s->s_anon); INIT_LIST_HEAD(&s->s_inodes); if (list_lru_init(&s->s_dentry_lru)) goto err_out; if (list_lru_init(&s->s_inode_lru)) goto err_out_dentry_lru; INIT_LIST_HEAD(&s->s_dentry_lru); INIT_LIST_HEAD(&s->s_inode_lru); spin_lock_init(&s->s_inode_lru_lock); INIT_LIST_HEAD(&s->s_mounts); init_rwsem(&s->s_umount); Loading Loading @@ -215,9 +210,6 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags) } out: return s; err_out_dentry_lru: list_lru_destroy(&s->s_dentry_lru); err_out: security_sb_free(s); destroy_sb_writers(s); Loading fs/xfs/xfs_buf.c +0 −7 Original line number Diff line number Diff line Loading @@ -1586,7 +1586,6 @@ xfs_free_buftarg( struct xfs_mount *mp, struct xfs_buftarg *btp) { list_lru_destroy(&btp->bt_lru); unregister_shrinker(&btp->bt_shrinker); if (mp->m_flags & XFS_MOUNT_BARRIER) Loading Loading @@ -1661,12 +1660,6 @@ xfs_alloc_buftarg( if (!btp->bt_bdi) goto error; if (xfs_setsize_buftarg_early(btp, bdev)) goto error; if (list_lru_init(&btp->bt_lru)) goto error; INIT_LIST_HEAD(&btp->bt_lru); spin_lock_init(&btp->bt_lru_lock); if (xfs_setsize_buftarg_early(btp, bdev)) Loading fs/xfs/xfs_qm.c +0 −11 Original line number Diff line number Diff line Loading @@ -648,18 +648,11 @@ xfs_qm_init_quotainfo( qinf = mp->m_quotainfo = kmem_zalloc(sizeof(xfs_quotainfo_t), KM_SLEEP); if ((error = list_lru_init(&qinf->qi_lru))) { kmem_free(qinf); mp->m_quotainfo = NULL; return error; } /* * See if quotainodes are setup, and if not, allocate them, * and change the superblock accordingly. */ if ((error = xfs_qm_init_quotainos(mp))) { list_lru_destroy(&qinf->qi_lru); kmem_free(qinf); mp->m_quotainfo = NULL; return error; Loading @@ -669,13 +662,10 @@ xfs_qm_init_quotainfo( INIT_RADIX_TREE(&qinf->qi_gquota_tree, GFP_NOFS); mutex_init(&qinf->qi_tree_lock); <<<<<<< HEAD INIT_LIST_HEAD(&qinf->qi_lru_list); qinf->qi_lru_count = 0; mutex_init(&qinf->qi_lru_lock); ======= >>>>>>> 5ca302c8e502 (list_lru: dynamically adjust node arrays) /* mutex used to serialize quotaoffs */ mutex_init(&qinf->qi_quotaofflock); Loading Loading @@ -761,7 +751,6 @@ xfs_qm_destroy_quotainfo( qi = mp->m_quotainfo; ASSERT(qi != NULL); list_lru_destroy(&qi->qi_lru); unregister_shrinker(&qi->qi_shrinker); if (qi->qi_uquotaip) { Loading include/linux/list_lru.h +11 −2 Original line number Diff line number Diff line Loading @@ -27,11 +27,20 @@ struct list_lru_node { } ____cacheline_aligned_in_smp; struct list_lru { struct list_lru_node *node; /* * Because we use a fixed-size array, this struct can be very big if * MAX_NUMNODES is big. If this becomes a problem this is fixable by * turning this into a pointer and dynamically allocating this to * nr_node_ids. This quantity is firwmare-provided, and still would * provide room for all nodes at the cost of a pointer lookup and an * extra allocation. Because that allocation will most likely come from * a different slab cache than the main structure holding this * structure, we may very well fail. */ struct list_lru_node node[MAX_NUMNODES]; nodemask_t active_nodes; }; void list_lru_destroy(struct list_lru *lru); int list_lru_init(struct list_lru *lru); /** Loading mm/list_lru.c +1 −13 Original line number Diff line number Diff line Loading @@ -8,7 +8,6 @@ #include <linux/module.h> #include <linux/mm.h> #include <linux/list_lru.h> #include <linux/slab.h> bool list_lru_add(struct list_lru *lru, struct list_head *item) { Loading Loading @@ -159,14 +158,9 @@ unsigned long list_lru_dispose_all(struct list_lru *lru, int list_lru_init(struct list_lru *lru) { int i; size_t size = sizeof(*lru->node) * nr_node_ids; lru->node = kzalloc(size, GFP_KERNEL); if (!lru->node) return -ENOMEM; nodes_clear(lru->active_nodes); for (i = 0; i < nr_node_ids; i++) { for (i = 0; i < MAX_NUMNODES; i++) { spin_lock_init(&lru->node[i].lock); INIT_LIST_HEAD(&lru->node[i].list); lru->node[i].nr_items = 0; Loading @@ -174,9 +168,3 @@ int list_lru_init(struct list_lru *lru) return 0; } EXPORT_SYMBOL_GPL(list_lru_init); void list_lru_destroy(struct list_lru *lru) { kfree(lru->node); } EXPORT_SYMBOL_GPL(list_lru_destroy); Loading
fs/super.c +2 −10 Original line number Diff line number Diff line Loading @@ -34,7 +34,6 @@ #include <linux/cleancache.h> #include <linux/fsnotify.h> #include <linux/lockdep.h> #include <linux/list_lru.h> #include "internal.h" Loading Loading @@ -171,12 +170,8 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags) INIT_HLIST_NODE(&s->s_instances); INIT_HLIST_BL_HEAD(&s->s_anon); INIT_LIST_HEAD(&s->s_inodes); if (list_lru_init(&s->s_dentry_lru)) goto err_out; if (list_lru_init(&s->s_inode_lru)) goto err_out_dentry_lru; INIT_LIST_HEAD(&s->s_dentry_lru); INIT_LIST_HEAD(&s->s_inode_lru); spin_lock_init(&s->s_inode_lru_lock); INIT_LIST_HEAD(&s->s_mounts); init_rwsem(&s->s_umount); Loading Loading @@ -215,9 +210,6 @@ static struct super_block *alloc_super(struct file_system_type *type, int flags) } out: return s; err_out_dentry_lru: list_lru_destroy(&s->s_dentry_lru); err_out: security_sb_free(s); destroy_sb_writers(s); Loading
fs/xfs/xfs_buf.c +0 −7 Original line number Diff line number Diff line Loading @@ -1586,7 +1586,6 @@ xfs_free_buftarg( struct xfs_mount *mp, struct xfs_buftarg *btp) { list_lru_destroy(&btp->bt_lru); unregister_shrinker(&btp->bt_shrinker); if (mp->m_flags & XFS_MOUNT_BARRIER) Loading Loading @@ -1661,12 +1660,6 @@ xfs_alloc_buftarg( if (!btp->bt_bdi) goto error; if (xfs_setsize_buftarg_early(btp, bdev)) goto error; if (list_lru_init(&btp->bt_lru)) goto error; INIT_LIST_HEAD(&btp->bt_lru); spin_lock_init(&btp->bt_lru_lock); if (xfs_setsize_buftarg_early(btp, bdev)) Loading
fs/xfs/xfs_qm.c +0 −11 Original line number Diff line number Diff line Loading @@ -648,18 +648,11 @@ xfs_qm_init_quotainfo( qinf = mp->m_quotainfo = kmem_zalloc(sizeof(xfs_quotainfo_t), KM_SLEEP); if ((error = list_lru_init(&qinf->qi_lru))) { kmem_free(qinf); mp->m_quotainfo = NULL; return error; } /* * See if quotainodes are setup, and if not, allocate them, * and change the superblock accordingly. */ if ((error = xfs_qm_init_quotainos(mp))) { list_lru_destroy(&qinf->qi_lru); kmem_free(qinf); mp->m_quotainfo = NULL; return error; Loading @@ -669,13 +662,10 @@ xfs_qm_init_quotainfo( INIT_RADIX_TREE(&qinf->qi_gquota_tree, GFP_NOFS); mutex_init(&qinf->qi_tree_lock); <<<<<<< HEAD INIT_LIST_HEAD(&qinf->qi_lru_list); qinf->qi_lru_count = 0; mutex_init(&qinf->qi_lru_lock); ======= >>>>>>> 5ca302c8e502 (list_lru: dynamically adjust node arrays) /* mutex used to serialize quotaoffs */ mutex_init(&qinf->qi_quotaofflock); Loading Loading @@ -761,7 +751,6 @@ xfs_qm_destroy_quotainfo( qi = mp->m_quotainfo; ASSERT(qi != NULL); list_lru_destroy(&qi->qi_lru); unregister_shrinker(&qi->qi_shrinker); if (qi->qi_uquotaip) { Loading
include/linux/list_lru.h +11 −2 Original line number Diff line number Diff line Loading @@ -27,11 +27,20 @@ struct list_lru_node { } ____cacheline_aligned_in_smp; struct list_lru { struct list_lru_node *node; /* * Because we use a fixed-size array, this struct can be very big if * MAX_NUMNODES is big. If this becomes a problem this is fixable by * turning this into a pointer and dynamically allocating this to * nr_node_ids. This quantity is firwmare-provided, and still would * provide room for all nodes at the cost of a pointer lookup and an * extra allocation. Because that allocation will most likely come from * a different slab cache than the main structure holding this * structure, we may very well fail. */ struct list_lru_node node[MAX_NUMNODES]; nodemask_t active_nodes; }; void list_lru_destroy(struct list_lru *lru); int list_lru_init(struct list_lru *lru); /** Loading
mm/list_lru.c +1 −13 Original line number Diff line number Diff line Loading @@ -8,7 +8,6 @@ #include <linux/module.h> #include <linux/mm.h> #include <linux/list_lru.h> #include <linux/slab.h> bool list_lru_add(struct list_lru *lru, struct list_head *item) { Loading Loading @@ -159,14 +158,9 @@ unsigned long list_lru_dispose_all(struct list_lru *lru, int list_lru_init(struct list_lru *lru) { int i; size_t size = sizeof(*lru->node) * nr_node_ids; lru->node = kzalloc(size, GFP_KERNEL); if (!lru->node) return -ENOMEM; nodes_clear(lru->active_nodes); for (i = 0; i < nr_node_ids; i++) { for (i = 0; i < MAX_NUMNODES; i++) { spin_lock_init(&lru->node[i].lock); INIT_LIST_HEAD(&lru->node[i].list); lru->node[i].nr_items = 0; Loading @@ -174,9 +168,3 @@ int list_lru_init(struct list_lru *lru) return 0; } EXPORT_SYMBOL_GPL(list_lru_init); void list_lru_destroy(struct list_lru *lru) { kfree(lru->node); } EXPORT_SYMBOL_GPL(list_lru_destroy);