| From d8c712ea471ce7a4fd1734ad2211adf8469ddddc Mon Sep 17 00:00:00 2001 |
| From: Greg Thelen <gthelen@google.com> |
| Date: Thu, 31 Jul 2014 09:07:19 -0700 |
| Subject: dm bufio: fully initialize shrinker |
| |
| From: Greg Thelen <gthelen@google.com> |
| |
| commit d8c712ea471ce7a4fd1734ad2211adf8469ddddc upstream. |
| |
| 1d3d4437eae1 ("vmscan: per-node deferred work") added a flags field to |
| struct shrinker assuming that all shrinkers were zero filled. The dm |
| bufio shrinker is not zero filled, which leaves arbitrary kmalloc() data |
| in flags. So far the only defined flags bit is SHRINKER_NUMA_AWARE. |
| But there are proposed patches which add other bits to shrinker.flags |
| (e.g. memcg awareness). |
| |
| Rather than simply initializing the shrinker, this patch uses kzalloc() |
| when allocating the dm_bufio_client to ensure that the embedded shrinker |
| and any other similar structures are zeroed. |
| |
| This fixes theoretical over aggressive shrinking of dm bufio objects. |
| If the uninitialized dm_bufio_client.shrinker.flags contains |
| SHRINKER_NUMA_AWARE then shrink_slab() would call the dm shrinker for |
| each numa node rather than just once. This has been broken since 3.12. |
| |
| Signed-off-by: Greg Thelen <gthelen@google.com> |
| Acked-by: Mikulas Patocka <mpatocka@redhat.com> |
| Signed-off-by: Mike Snitzer <snitzer@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/md/dm-bufio.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/drivers/md/dm-bufio.c |
| +++ b/drivers/md/dm-bufio.c |
| @@ -1541,7 +1541,7 @@ struct dm_bufio_client *dm_bufio_client_ |
| BUG_ON(block_size < 1 << SECTOR_SHIFT || |
| (block_size & (block_size - 1))); |
| |
| - c = kmalloc(sizeof(*c), GFP_KERNEL); |
| + c = kzalloc(sizeof(*c), GFP_KERNEL); |
| if (!c) { |
| r = -ENOMEM; |
| goto bad_client; |