The patch titled Subject: dcache: fix indirectly reclaimable memory accounting has been removed from the -mm tree. Its filename was dcache-account-external-names-as-indirectly-reclaimable-memory-fix-2.patch This patch was dropped because it was folded into dcache-account-external-names-as-indirectly-reclaimable-memory.patch ------------------------------------------------------ From: Roman Gushchin <guro@xxxxxx> Subject: dcache: fix indirectly reclaimable memory accounting External names can be released using kfree_rcu() from release_dentry_name_snapshot() and copy_name(), and it will lead to the imbalance in the indirectly reclaimable memory accounting. Fix this by introducing __d_free_external_name() and call it from all release paths. Link: http://lkml.kernel.org/r/20180313125701.7955-1-guro@xxxxxx Signed-off-by: Roman Gushchin <guro@xxxxxx> Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Cc: Alexander Viro <viro@xxxxxxxxxxxxxxxxxx> Cc: Michal Hocko <mhocko@xxxxxxxx> Cc: Johannes Weiner <hannes@xxxxxxxxxxx> Cc: Tony Lindgren <tony@xxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- diff -puN fs/dcache.c~dcache-account-external-names-as-indirectly-reclaimable-memory-fix-2 fs/dcache.c --- a/fs/dcache.c~dcache-account-external-names-as-indirectly-reclaimable-memory-fix-2 +++ a/fs/dcache.c @@ -257,16 +257,24 @@ static void __d_free(struct rcu_head *he kmem_cache_free(dentry_cache, dentry); } -static void __d_free_external(struct rcu_head *head) +static void __d_free_external_name(struct rcu_head *head) { - struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu); - struct external_name *name = external_name(dentry); + struct external_name *name = container_of(head, struct external_name, + u.head); mod_node_page_state(page_pgdat(virt_to_page(name)), NR_INDIRECTLY_RECLAIMABLE_BYTES, -ksize(name)); kfree(name); +} + +static void __d_free_external(struct rcu_head *head) +{ + struct dentry *dentry = container_of(head, struct dentry, d_u.d_rcu); + + __d_free_external_name(&external_name(dentry)->u.head); + kmem_cache_free(dentry_cache, dentry); } @@ -298,7 +306,7 @@ void release_dentry_name_snapshot(struct struct external_name *p; p = container_of(name->name, struct external_name, name[0]); if (unlikely(atomic_dec_and_test(&p->u.count))) - kfree_rcu(p, u.head); + call_rcu(&p->u.head, __d_free_external_name); } } EXPORT_SYMBOL(release_dentry_name_snapshot); @@ -2784,7 +2792,7 @@ static void copy_name(struct dentry *den dentry->d_name.hash_len = target->d_name.hash_len; } if (old_name && likely(atomic_dec_and_test(&old_name->u.count))) - kfree_rcu(old_name, u.head); + call_rcu(&old_name->u.head, __d_free_external_name); } /* _ Patches currently in -mm which might be from guro@xxxxxx are mm-introduce-nr_indirectly_reclaimable_bytes.patch mm-treat-indirectly-reclaimable-memory-as-available-in-memavailable.patch dcache-account-external-names-as-indirectly-reclaimable-memory.patch mm-treat-indirectly-reclaimable-memory-as-free-in-overcommit-logic.patch -- To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html