mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
idr: introduce idr_for_each_entry_continue_ul()
Similarly, other callers of idr_get_next_ul() suffer the same overflow bug as they don't handle it properly either. Introduce idr_for_each_entry_continue_ul() to help these callers iterate from a given ID. cls_flower needs more care here because it still has overflow when does arg->cookie++, we have to fold its nested loops into one and remove the arg->cookie++. Fixes:01683a1469
("net: sched: refactor flower walk to iterate over idr") Fixes:12d6066c3b
("net/mlx5: Add flow counters idr") Reported-by: Li Shuang <shuali@redhat.com> Cc: Davide Caratti <dcaratti@redhat.com> Cc: Vlad Buslov <vladbu@mellanox.com> Cc: Chris Mi <chrism@mellanox.com> Cc: Matthew Wilcox <willy@infradead.org> Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com> Tested-by: Davide Caratti <dcaratti@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
e33d2b74d8
commit
d39d714969
@@ -216,6 +216,20 @@ static inline void idr_preload_end(void)
|
||||
entry; \
|
||||
++id, (entry) = idr_get_next((idr), &(id)))
|
||||
|
||||
/**
|
||||
* idr_for_each_entry_continue_ul() - Continue iteration over an IDR's elements of a given type
|
||||
* @idr: IDR handle.
|
||||
* @entry: The type * to use as a cursor.
|
||||
* @tmp: A temporary placeholder for ID.
|
||||
* @id: Entry ID.
|
||||
*
|
||||
* Continue to iterate over entries, continuing after the current position.
|
||||
*/
|
||||
#define idr_for_each_entry_continue_ul(idr, entry, tmp, id) \
|
||||
for (tmp = id; \
|
||||
tmp <= id && ((entry) = idr_get_next_ul(idr, &(id))) != NULL; \
|
||||
tmp = id, ++id)
|
||||
|
||||
/*
|
||||
* IDA - ID Allocator, use when translation from id to pointer isn't necessary.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user