Patch "dm bufio: make the parameter "retain_bytes" unsigned long" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
dm bufio: make the parameter "retain_bytes" unsigned long
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
dm-bufio-make-the-parameter-retain_bytes-unsigned-long.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
13840d38016203f0095cd547b90352812d24b787Mon Sep 17 00:00:00 2001
From: Mikulas Patocka <[email protected]>
Date: Sun, 30 Apr 2017 17:32:28 -0400
Subject: dm bufio: make the parameter "retain_bytes" unsigned long
From: Mikulas Patocka <[email protected]>
commit 13840d38016203f0095cd547b90352812d24b787 upstream.
Change the type of the parameter "retain_bytes" from unsigned to unsigned long, so that on 64-bit machines the user can set more than 4GiB of data to be retained.
Also, change the type of the variable "count" in the function "__evict_old_buffers" to unsigned long. The assignment "count = c->n_buffers[LIST_CLEAN] + c->n_buffers[LIST_DIRTY];" could result in unsigned long to unsigned overflow and that could result in buffers not being freed when they should.
While at it, avoid division in get_retain_buffers(). Division is slow, we can change it to shift because we have precalculated the log2 of block size.
--- drivers/md/dm-bufio.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/md/dm-bufio.c +8 -8
@@ -215,7 +215,7 @@ static DEFINE_SPINLOCK(param_spinlock);* Buffers are freed after this timeout */ static unsigned dm_bufio_max_age =DM_BUFIO_DEFAULT_AGE_SECS ; -static unsigned dm_bufio_retain_bytes =DM_BUFIO_DEFAULT_RETAIN_BYTES ; +static unsigned long dm_bufio_retain_bytes =DM_BUFIO_DEFAULT_RETAIN_BYTES ;static unsigned long dm_bufio_peak_allocated;static unsigned long dm_bufio_allocated_kmem_cache;
@@ -1541,10 +1541,10 @@ static bool __try_evict_buffer(struct dmreturn true; } -static unsigned get_retain_buffers (struct dm_bufio_client *c) +static unsigned long get_retain_buffers (struct dm_bufio_client *c) { -unsigned retain_bytes =ACCESS_ONCE (dm_bufio_retain_bytes); -return retain_bytes / c->block_size; +unsigned long retain_bytes =ACCESS_ONCE (dm_bufio_retain_bytes); +return retain_bytes >> (c->sectors_per_block_bits +SECTOR_SHIFT ); } static unsigned long __scan(struct dm_bufio_client *c, unsigned long nr_to_scan,
@@ -1554,7 +1554,7 @@ static unsigned long __scan(struct dm_bustruct dm_buffer *b, *tmp;unsigned long freed =0 ;unsigned long count = nr_to_scan; -unsigned retain_target =get_retain_buffers (c); +unsigned long retain_target =get_retain_buffers (c);for (l =0 ; l <LIST_SIZE ; l++) {list_for_each_entry_safe_reverse (b, tmp, &c->lru[l], lru_list) {
@@ -1780,8 +1780,8 @@ static bool older_than(struct dm_bufferstatic void __evict_old_buffers (struct dm_bufio_client *c,unsigned long age_hz) {struct dm_buffer *b, *tmp; -unsigned retain_target =get_retain_buffers (c); -unsigned count; +unsigned long retain_target =get_retain_buffers (c); +unsigned long count;LIST_HEAD (write_list);dm_bufio_lock (c);
@@ -1941,7 +1941,7 @@ MODULE_PARM_DESC(max_cache_size_bytes, "module_param_named (max_age_seconds, dm_bufio_max_age, uint,S_IRUGO |S_IWUSR );MODULE_PARM_DESC (max_age_seconds,"Max age of a buffer in seconds" ); -module_param_named (retain_bytes, dm_bufio_retain_bytes, uint,S_IRUGO |S_IWUSR ); +module_param_named (retain_bytes, dm_bufio_retain_bytes, ulong,S_IRUGO |S_IWUSR );MODULE_PARM_DESC (retain_bytes,"Try to keep at least this many bytes cached in memory" );module_param_named (peak_allocated_bytes, dm_bufio_peak_allocated, ulong,S_IRUGO |S_IWUSR );
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/dm-bufio-avoid-a-possible-abba-deadlock.patch queue-4.9/dm-cache-metadata-fail-operations-if-fail_io-mode-has-been-established.patch queue-4.9/dm-raid-select-the-kconfig-option-config_md_raid0.patch queue-4.9/dm-bufio-make-the-parameter-retain_bytes-unsigned-long.patch queue-4.9/dm-bufio-check-new-buffer-allocation-watermark-every-30-seconds.patch