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>
此提交包含在:
@@ -102,13 +102,15 @@ static struct list_head *mlx5_fc_counters_lookup_next(struct mlx5_core_dev *dev,
|
||||
struct mlx5_fc_stats *fc_stats = &dev->priv.fc_stats;
|
||||
unsigned long next_id = (unsigned long)id + 1;
|
||||
struct mlx5_fc *counter;
|
||||
unsigned long tmp;
|
||||
|
||||
rcu_read_lock();
|
||||
/* skip counters that are in idr, but not yet in counters list */
|
||||
while ((counter = idr_get_next_ul(&fc_stats->counters_idr,
|
||||
&next_id)) != NULL &&
|
||||
list_empty(&counter->list))
|
||||
next_id++;
|
||||
idr_for_each_entry_continue_ul(&fc_stats->counters_idr,
|
||||
counter, tmp, next_id) {
|
||||
if (!list_empty(&counter->list))
|
||||
break;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
return counter ? &counter->list : &fc_stats->counters;
|
||||
|
新增問題並參考
封鎖使用者