From: Luca Ceresoli Date: Fri, 1 Aug 2025 17:05:23 +0000 (+0200) Subject: list: add list_last_entry_or_null() X-Git-Tag: v6.18-rc1~134^2~16^2~15 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cb86408b1fc2e3f6fe45ebe8509a5404060e01e0;p=thirdparty%2Fkernel%2Flinux.git list: add list_last_entry_or_null() Add an equivalent of list_first_entry_or_null() to obtain the last element of a list. Acked-by: Andy Shevchenko Link: https://lore.kernel.org/r/20250801-drm-bridge-alloc-getput-drm_bridge_get_next_bridge-v2-1-888912b0be13@bootlin.com Signed-off-by: Luca Ceresoli --- diff --git a/include/linux/list.h b/include/linux/list.h index e7e28afd28f8e..7f7657e416209 100644 --- a/include/linux/list.h +++ b/include/linux/list.h @@ -636,6 +636,20 @@ static inline void list_splice_tail_init(struct list_head *list, pos__ != head__ ? list_entry(pos__, type, member) : NULL; \ }) +/** + * list_last_entry_or_null - get the last element from a list + * @ptr: the list head to take the element from. + * @type: the type of the struct this is embedded in. + * @member: the name of the list_head within the struct. + * + * Note that if the list is empty, it returns NULL. + */ +#define list_last_entry_or_null(ptr, type, member) ({ \ + struct list_head *head__ = (ptr); \ + struct list_head *pos__ = READ_ONCE(head__->prev); \ + pos__ != head__ ? list_entry(pos__, type, member) : NULL; \ +}) + /** * list_next_entry - get the next element in list * @pos: the type * to cursor