17c2aad20Sopenharmony_ci/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ 27c2aad20Sopenharmony_ci 37c2aad20Sopenharmony_ci#ifndef __LINUX_LIST_H 47c2aad20Sopenharmony_ci#define __LINUX_LIST_H 57c2aad20Sopenharmony_ci 67c2aad20Sopenharmony_ci#define LIST_HEAD_INIT(name) { &(name), &(name) } 77c2aad20Sopenharmony_ci#define LIST_HEAD(name) \ 87c2aad20Sopenharmony_ci struct list_head name = LIST_HEAD_INIT(name) 97c2aad20Sopenharmony_ci 107c2aad20Sopenharmony_ci#define POISON_POINTER_DELTA 0 117c2aad20Sopenharmony_ci#define LIST_POISON1 ((void *) 0x100 + POISON_POINTER_DELTA) 127c2aad20Sopenharmony_ci#define LIST_POISON2 ((void *) 0x200 + POISON_POINTER_DELTA) 137c2aad20Sopenharmony_ci 147c2aad20Sopenharmony_ci 157c2aad20Sopenharmony_cistatic inline void INIT_LIST_HEAD(struct list_head *list) 167c2aad20Sopenharmony_ci{ 177c2aad20Sopenharmony_ci list->next = list; 187c2aad20Sopenharmony_ci list->prev = list; 197c2aad20Sopenharmony_ci} 207c2aad20Sopenharmony_ci 217c2aad20Sopenharmony_cistatic inline void __list_add(struct list_head *new, 227c2aad20Sopenharmony_ci struct list_head *prev, 237c2aad20Sopenharmony_ci struct list_head *next) 247c2aad20Sopenharmony_ci{ 257c2aad20Sopenharmony_ci next->prev = new; 267c2aad20Sopenharmony_ci new->next = next; 277c2aad20Sopenharmony_ci new->prev = prev; 287c2aad20Sopenharmony_ci prev->next = new; 297c2aad20Sopenharmony_ci} 307c2aad20Sopenharmony_ci 317c2aad20Sopenharmony_ci/** 327c2aad20Sopenharmony_ci * list_add - add a new entry 337c2aad20Sopenharmony_ci * @new: new entry to be added 347c2aad20Sopenharmony_ci * @head: list head to add it after 357c2aad20Sopenharmony_ci * 367c2aad20Sopenharmony_ci * Insert a new entry after the specified head. 377c2aad20Sopenharmony_ci * This is good for implementing stacks. 387c2aad20Sopenharmony_ci */ 397c2aad20Sopenharmony_cistatic inline void list_add(struct list_head *new, struct list_head *head) 407c2aad20Sopenharmony_ci{ 417c2aad20Sopenharmony_ci __list_add(new, head, head->next); 427c2aad20Sopenharmony_ci} 437c2aad20Sopenharmony_ci 447c2aad20Sopenharmony_ci/* 457c2aad20Sopenharmony_ci * Delete a list entry by making the prev/next entries 467c2aad20Sopenharmony_ci * point to each other. 477c2aad20Sopenharmony_ci * 487c2aad20Sopenharmony_ci * This is only for internal list manipulation where we know 497c2aad20Sopenharmony_ci * the prev/next entries already! 507c2aad20Sopenharmony_ci */ 517c2aad20Sopenharmony_cistatic inline void __list_del(struct list_head * prev, struct list_head * next) 527c2aad20Sopenharmony_ci{ 537c2aad20Sopenharmony_ci next->prev = prev; 547c2aad20Sopenharmony_ci prev->next = next; 557c2aad20Sopenharmony_ci} 567c2aad20Sopenharmony_ci 577c2aad20Sopenharmony_ci/** 587c2aad20Sopenharmony_ci * list_del - deletes entry from list. 597c2aad20Sopenharmony_ci * @entry: the element to delete from the list. 607c2aad20Sopenharmony_ci * Note: list_empty() on entry does not return true after this, the entry is 617c2aad20Sopenharmony_ci * in an undefined state. 627c2aad20Sopenharmony_ci */ 637c2aad20Sopenharmony_cistatic inline void __list_del_entry(struct list_head *entry) 647c2aad20Sopenharmony_ci{ 657c2aad20Sopenharmony_ci __list_del(entry->prev, entry->next); 667c2aad20Sopenharmony_ci} 677c2aad20Sopenharmony_ci 687c2aad20Sopenharmony_cistatic inline void list_del(struct list_head *entry) 697c2aad20Sopenharmony_ci{ 707c2aad20Sopenharmony_ci __list_del(entry->prev, entry->next); 717c2aad20Sopenharmony_ci entry->next = LIST_POISON1; 727c2aad20Sopenharmony_ci entry->prev = LIST_POISON2; 737c2aad20Sopenharmony_ci} 747c2aad20Sopenharmony_ci 757c2aad20Sopenharmony_cistatic inline int list_empty(const struct list_head *head) 767c2aad20Sopenharmony_ci{ 777c2aad20Sopenharmony_ci return head->next == head; 787c2aad20Sopenharmony_ci} 797c2aad20Sopenharmony_ci 807c2aad20Sopenharmony_ci#define list_entry(ptr, type, member) \ 817c2aad20Sopenharmony_ci container_of(ptr, type, member) 827c2aad20Sopenharmony_ci#define list_first_entry(ptr, type, member) \ 837c2aad20Sopenharmony_ci list_entry((ptr)->next, type, member) 847c2aad20Sopenharmony_ci#define list_next_entry(pos, member) \ 857c2aad20Sopenharmony_ci list_entry((pos)->member.next, typeof(*(pos)), member) 867c2aad20Sopenharmony_ci#define list_for_each_entry(pos, head, member) \ 877c2aad20Sopenharmony_ci for (pos = list_first_entry(head, typeof(*pos), member); \ 887c2aad20Sopenharmony_ci &pos->member != (head); \ 897c2aad20Sopenharmony_ci pos = list_next_entry(pos, member)) 907c2aad20Sopenharmony_ci 917c2aad20Sopenharmony_ci#endif 92