@@ -2382,9 +2382,6 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
2382
2382
struct tc_mqprio_qopt opt = { 0 };
2383
2383
struct nlattr * nest , * sched_nest ;
2384
2384
2385
- oper = rtnl_dereference (q -> oper_sched );
2386
- admin = rtnl_dereference (q -> admin_sched );
2387
-
2388
2385
mqprio_qopt_reconstruct (dev , & opt );
2389
2386
2390
2387
nest = nla_nest_start_noflag (skb , TCA_OPTIONS );
@@ -2405,30 +2402,39 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
2405
2402
nla_put_u32 (skb , TCA_TAPRIO_ATTR_TXTIME_DELAY , q -> txtime_delay ))
2406
2403
goto options_error ;
2407
2404
2405
+ rcu_read_lock ();
2406
+
2407
+ oper = rtnl_dereference (q -> oper_sched );
2408
+ admin = rtnl_dereference (q -> admin_sched );
2409
+
2408
2410
if (oper && taprio_dump_tc_entries (skb , q , oper ))
2409
- goto options_error ;
2411
+ goto options_error_rcu ;
2410
2412
2411
2413
if (oper && dump_schedule (skb , oper ))
2412
- goto options_error ;
2414
+ goto options_error_rcu ;
2413
2415
2414
2416
if (!admin )
2415
2417
goto done ;
2416
2418
2417
2419
sched_nest = nla_nest_start_noflag (skb , TCA_TAPRIO_ATTR_ADMIN_SCHED );
2418
2420
if (!sched_nest )
2419
- goto options_error ;
2421
+ goto options_error_rcu ;
2420
2422
2421
2423
if (dump_schedule (skb , admin ))
2422
2424
goto admin_error ;
2423
2425
2424
2426
nla_nest_end (skb , sched_nest );
2425
2427
2426
2428
done :
2429
+ rcu_read_unlock ();
2427
2430
return nla_nest_end (skb , nest );
2428
2431
2429
2432
admin_error :
2430
2433
nla_nest_cancel (skb , sched_nest );
2431
2434
2435
+ options_error_rcu :
2436
+ rcu_read_unlock ();
2437
+
2432
2438
options_error :
2433
2439
nla_nest_cancel (skb , nest );
2434
2440
0 commit comments