watch_queue: Fix to always request a pow-of-2 pipe ring size

Bugzilla: https://bugzilla.redhat.com/2063758

commit 96a4d8912b28451cd62825fd7caa0e66e091d938
Author: David Howells <dhowells@redhat.com>
Date:   Fri Mar 11 13:24:08 2022 +0000

    watch_queue: Fix to always request a pow-of-2 pipe ring size

    The pipe ring size must always be a power of 2 as the head and tail
    pointers are masked off by AND'ing with the size of the ring - 1.
    watch_queue_set_size(), however, lets you specify any number of notes
    between 1 and 511.  This number is passed through to pipe_resize_ring()
    without checking/forcing its alignment.

    Fix this by rounding the number of slots required up to the nearest
    power of two.  The request is meant to guarantee that at least that many
    notifications can be generated before the queue is full, so rounding
    down isn't an option, but, alternatively, it may be better to give an
    error if we aren't allowed to allocate that much ring space.

    Fixes: c73be61ced ("pipe: Add general notification queue support")
    Reported-by: Jann Horn <jannh@google.com>
    Signed-off-by: David Howells <dhowells@redhat.com>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
David Howells 2022-03-16 16:00:07 +00:00
parent b4f9a84bcc
commit 13d317ccf4
1 changed files with 1 additions and 1 deletions

View File

@ -244,7 +244,7 @@ long watch_queue_set_size(struct pipe_inode_info *pipe, unsigned int nr_notes)
goto error;
}
ret = pipe_resize_ring(pipe, nr_notes);
ret = pipe_resize_ring(pipe, roundup_pow_of_two(nr_notes));
if (ret < 0)
goto error;