mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-07-05 13:25:20 +02:00
dm stats: limit the number of entries
The kvmalloc function fails with a warning if the size is larger than INT_MAX. Linus said that there should be limits that prevent this warning from being hit. This commit adds the limits to the dm-stats subsystem in DM core. Signed-off-by: Mikulas Patocka <mpatocka@redhat.com> Signed-off-by: Mike Snitzer <snitzer@kernel.org>
This commit is contained in:
parent
bd504bcfec
commit
9cf11ce06e
|
@ -66,6 +66,9 @@ struct dm_stats_last_position {
|
||||||
unsigned int last_rw;
|
unsigned int last_rw;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define DM_STAT_MAX_ENTRIES 8388608
|
||||||
|
#define DM_STAT_MAX_HISTOGRAM_ENTRIES 134217728
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* A typo on the command line could possibly make the kernel run out of memory
|
* A typo on the command line could possibly make the kernel run out of memory
|
||||||
* and crash. To prevent the crash we account all used memory. We fail if we
|
* and crash. To prevent the crash we account all used memory. We fail if we
|
||||||
|
@ -285,6 +288,9 @@ static int dm_stats_create(struct dm_stats *stats, sector_t start, sector_t end,
|
||||||
if (n_entries != (size_t)n_entries || !(size_t)(n_entries + 1))
|
if (n_entries != (size_t)n_entries || !(size_t)(n_entries + 1))
|
||||||
return -EOVERFLOW;
|
return -EOVERFLOW;
|
||||||
|
|
||||||
|
if (n_entries > DM_STAT_MAX_ENTRIES)
|
||||||
|
return -EOVERFLOW;
|
||||||
|
|
||||||
shared_alloc_size = struct_size(s, stat_shared, n_entries);
|
shared_alloc_size = struct_size(s, stat_shared, n_entries);
|
||||||
if ((shared_alloc_size - sizeof(struct dm_stat)) / sizeof(struct dm_stat_shared) != n_entries)
|
if ((shared_alloc_size - sizeof(struct dm_stat)) / sizeof(struct dm_stat_shared) != n_entries)
|
||||||
return -EOVERFLOW;
|
return -EOVERFLOW;
|
||||||
|
@ -297,6 +303,9 @@ static int dm_stats_create(struct dm_stats *stats, sector_t start, sector_t end,
|
||||||
if (histogram_alloc_size / (n_histogram_entries + 1) != (size_t)n_entries * sizeof(unsigned long long))
|
if (histogram_alloc_size / (n_histogram_entries + 1) != (size_t)n_entries * sizeof(unsigned long long))
|
||||||
return -EOVERFLOW;
|
return -EOVERFLOW;
|
||||||
|
|
||||||
|
if ((n_histogram_entries + 1) * (size_t)n_entries > DM_STAT_MAX_HISTOGRAM_ENTRIES)
|
||||||
|
return -EOVERFLOW;
|
||||||
|
|
||||||
if (!check_shared_memory(shared_alloc_size + histogram_alloc_size +
|
if (!check_shared_memory(shared_alloc_size + histogram_alloc_size +
|
||||||
num_possible_cpus() * (percpu_alloc_size + histogram_alloc_size)))
|
num_possible_cpus() * (percpu_alloc_size + histogram_alloc_size)))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user