lkml.org 
[lkml]   [2017]   [May]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 015/103] dm bufio: make the parameter "retain_bytes" unsigned long
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Mikulas Patocka <mpatocka@redhat.com>

    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.

    Signed-off-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 | 16 ++++++++--------
    1 file changed, 8 insertions(+), 8 deletions(-)

    --- a/drivers/md/dm-bufio.c
    +++ b/drivers/md/dm-bufio.c
    @@ -222,7 +222,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;
    @@ -1514,10 +1514,10 @@ static bool __try_evict_buffer(struct dm
    return 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,
    @@ -1527,7 +1527,7 @@ static unsigned long __scan(struct dm_bu
    struct 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) {
    @@ -1753,8 +1753,8 @@ static bool older_than(struct dm_buffer
    static 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);
    @@ -1915,7 +1915,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);

    \
     
     \ /
      Last update: 2017-05-23 22:36    [W:2.587 / U:0.116 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site