On 16-08-17 03:53 PM, Eric Dumazet wrote:
> On Wed, 2016-08-17 at 12:36 -0700, John Fastabend wrote:
>> The qdisc_reset operation depends on the qdisc lock at the moment
>> to halt any additions to gso_skb and statistics while the list is
>> free'd and the stats zeroed.
> 
> ...
> 
>> Signed-off-by: John Fastabend <john.r.fastab...@intel.com>
>> ---
>>  net/sched/sch_generic.c |   45 +++++++++++++++++++++++++++++++++++----------
>>  1 file changed, 35 insertions(+), 10 deletions(-)
>>
>> diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
>> index 3b9a21f..29238c4 100644
>> --- a/net/sched/sch_generic.c
>> +++ b/net/sched/sch_generic.c
>> @@ -737,6 +737,20 @@ void qdisc_reset(struct Qdisc *qdisc)
>>      kfree_skb(qdisc->skb_bad_txq);
>>      qdisc->skb_bad_txq = NULL;
>>  
>> +    if (qdisc->gso_cpu_skb) {
>> +            int i;
>> +
>> +            for_each_possible_cpu(i) {
>> +                    struct gso_cell *cell;
>> +
>> +                    cell = per_cpu_ptr(qdisc->gso_cpu_skb, i);
>> +                    if (cell) {
>> +                            kfree_skb_list(cell->skb);
>> +                            cell = NULL;
> 
>       You probably wanted :
>                       cell->skb = NULL;
> 

Yep thanks!

> 
>> +                    }
>> +            }
>> +    }
>> +
>>      if (qdisc->gso_skb) {
>>              kfree_skb_list(qdisc->gso_skb);
>>              qdisc->gso_skb = NULL;
>> @@ -812,10 +826,6 @@ struct Qdisc *dev_graft_qdisc(struct netdev_queue 
>> *dev_queue,
>>      root_lock = qdisc_lock(oqdisc);
>>      spin_lock_bh(root_lock);
>>  
>> -    /* Prune old scheduler */
>> -    if (oqdisc && atomic_read(&oqdisc->refcnt) <= 1)
>> -            qdisc_reset(oqdisc);
>> -
>>  
> 
> This probably belongs to a separate patch, before any per cpu / lockless
> qdisc changes ?
> 
> 
> 

Agreed will do for next rev thanks for reviewing.

Reply via email to