Message ID | 20190402230545.2929-2-tobin@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | mm: Use slab_list list_head instead of lru | expand |
On Wed, 3 Apr 2019, Tobin C. Harding wrote: > Add function list_rotate_to_front() to rotate a list until the specified > item is at the front of the list. Reviewed-by: Christoph Lameter <cl@linux.com>
On Wed, Apr 03, 2019 at 10:05:39AM +1100, Tobin C. Harding wrote: > Currently if we wish to rotate a list until a specific item is at the > front of the list we can call list_move_tail(head, list). Note that the > arguments are the reverse way to the usual use of list_move_tail(list, > head). This is a hack, it depends on the developer knowing how the > list_head operates internally which violates the layer of abstraction > offered by the list_head. Also, it is not intuitive so the next > developer to come along must study list.h in order to fully understand > what is meant by the call, while this is 'good for' the developer it > makes reading the code harder. We should have an function appropriately > named that does this if there are users for it intree. > > By grep'ing the tree for list_move_tail() and list_tail() and attempting > to guess the argument order from the names it seems there is only one > place currently in the tree that does this - the slob allocatator. > > Add function list_rotate_to_front() to rotate a list until the specified > item is at the front of the list. > > Signed-off-by: Tobin C. Harding <tobin@kernel.org> Reviewed-by: Roman Gushchin <guro@fb.com>
diff --git a/include/linux/list.h b/include/linux/list.h index 58aa3adf94e6..9e9a6403dbe4 100644 --- a/include/linux/list.h +++ b/include/linux/list.h @@ -270,6 +270,24 @@ static inline void list_rotate_left(struct list_head *head) } } +/** + * list_rotate_to_front() - Rotate list to specific item. + * @list: The desired new front of the list. + * @head: The head of the list. + * + * Rotates list so that @list becomes the new front of the list. + */ +static inline void list_rotate_to_front(struct list_head *list, + struct list_head *head) +{ + /* + * Deletes the list head from the list denoted by @head and + * places it as the tail of @list, this effectively rotates the + * list so that @list is at the front. + */ + list_move_tail(head, list); +} + /** * list_is_singular - tests whether a list has just one entry. * @head: the list to test.
Currently if we wish to rotate a list until a specific item is at the front of the list we can call list_move_tail(head, list). Note that the arguments are the reverse way to the usual use of list_move_tail(list, head). This is a hack, it depends on the developer knowing how the list_head operates internally which violates the layer of abstraction offered by the list_head. Also, it is not intuitive so the next developer to come along must study list.h in order to fully understand what is meant by the call, while this is 'good for' the developer it makes reading the code harder. We should have an function appropriately named that does this if there are users for it intree. By grep'ing the tree for list_move_tail() and list_tail() and attempting to guess the argument order from the names it seems there is only one place currently in the tree that does this - the slob allocatator. Add function list_rotate_to_front() to rotate a list until the specified item is at the front of the list. Signed-off-by: Tobin C. Harding <tobin@kernel.org> --- include/linux/list.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)