@@ -2374,9 +2374,6 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
2374
2374
struct tc_mqprio_qopt opt = { 0 };
2375
2375
struct nlattr * nest , * sched_nest ;
2376
2376
2377
- oper = rtnl_dereference (q -> oper_sched );
2378
- admin = rtnl_dereference (q -> admin_sched );
2379
-
2380
2377
mqprio_qopt_reconstruct (dev , & opt );
2381
2378
2382
2379
nest = nla_nest_start_noflag (skb , TCA_OPTIONS );
@@ -2397,30 +2394,39 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
2397
2394
nla_put_u32 (skb , TCA_TAPRIO_ATTR_TXTIME_DELAY , q -> txtime_delay ))
2398
2395
goto options_error ;
2399
2396
2397
+ rcu_read_lock ();
2398
+
2399
+ oper = rtnl_dereference (q -> oper_sched );
2400
+ admin = rtnl_dereference (q -> admin_sched );
2401
+
2400
2402
if (oper && taprio_dump_tc_entries (skb , q , oper ))
2401
- goto options_error ;
2403
+ goto options_error_rcu ;
2402
2404
2403
2405
if (oper && dump_schedule (skb , oper ))
2404
- goto options_error ;
2406
+ goto options_error_rcu ;
2405
2407
2406
2408
if (!admin )
2407
2409
goto done ;
2408
2410
2409
2411
sched_nest = nla_nest_start_noflag (skb , TCA_TAPRIO_ATTR_ADMIN_SCHED );
2410
2412
if (!sched_nest )
2411
- goto options_error ;
2413
+ goto options_error_rcu ;
2412
2414
2413
2415
if (dump_schedule (skb , admin ))
2414
2416
goto admin_error ;
2415
2417
2416
2418
nla_nest_end (skb , sched_nest );
2417
2419
2418
2420
done :
2421
+ rcu_read_unlock ();
2419
2422
return nla_nest_end (skb , nest );
2420
2423
2421
2424
admin_error :
2422
2425
nla_nest_cancel (skb , sched_nest );
2423
2426
2427
+ options_error_rcu :
2428
+ rcu_read_unlock ();
2429
+
2424
2430
options_error :
2425
2431
nla_nest_cancel (skb , nest );
2426
2432
0 commit comments