summaryrefslogtreecommitdiffstats
path: root/drivers/md/dm-core.h
diff options
context:
space:
mode:
authorMikulas Patocka <mpatocka@redhat.com>2017-10-31 19:33:02 -0400
committerMike Snitzer <snitzer@redhat.com>2017-11-10 15:44:55 -0500
commit856eb0916d181da6d043cc33e03f54d5c5bbe54a (patch)
tree37dc30db88b6b90a1f1929801acf97209b4548f8 /drivers/md/dm-core.h
parent114e025968b5990ad0b57bf60697ea64ee206aac (diff)
downloadlinux-stable-856eb0916d181da6d043cc33e03f54d5c5bbe54a.tar.gz
linux-stable-856eb0916d181da6d043cc33e03f54d5c5bbe54a.tar.bz2
linux-stable-856eb0916d181da6d043cc33e03f54d5c5bbe54a.zip
dm: allocate struct mapped_device with kvzalloc
The structure srcu_struct can be very big, its size is proportional to the value CONFIG_NR_CPUS. The Fedora kernel has CONFIG_NR_CPUS 8192, the field io_barrier in the struct mapped_device has 84kB in the debugging kernel and 50kB in the non-debugging kernel. The large size may result in failure of the function kzalloc_node. In order to avoid the allocation failure, we use the function kvzalloc_node, this function falls back to vmalloc if a large contiguous chunk of memory is not available. This patch also moves the field io_barrier to the last position of struct mapped_device - the reason is that on many processor architectures, short memory offsets result in smaller code than long memory offsets - on x86-64 it reduces code size by 320 bytes. Note to stable kernel maintainers - the kernels 4.11 and older don't have the function kvzalloc_node, you can use the function vzalloc_node instead. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Cc: stable@vger.kernel.org Signed-off-by: Mike Snitzer <snitzer@redhat.com>
Diffstat (limited to 'drivers/md/dm-core.h')
-rw-r--r--drivers/md/dm-core.h3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/md/dm-core.h b/drivers/md/dm-core.h
index 203144762f36..6a14f945783c 100644
--- a/drivers/md/dm-core.h
+++ b/drivers/md/dm-core.h
@@ -29,7 +29,6 @@ struct dm_kobject_holder {
* DM targets must _not_ deference a mapped_device to directly access its members!
*/
struct mapped_device {
- struct srcu_struct io_barrier;
struct mutex suspend_lock;
/*
@@ -127,6 +126,8 @@ struct mapped_device {
struct blk_mq_tag_set *tag_set;
bool use_blk_mq:1;
bool init_tio_pdu:1;
+
+ struct srcu_struct io_barrier;
};
void dm_init_md_queue(struct mapped_device *md);