@@ -2397,9 +2397,6 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
2397
2397
struct tc_mqprio_qopt opt = { 0 };
2398
2398
struct nlattr * nest , * sched_nest ;
2399
2399
2400
- oper = rtnl_dereference (q -> oper_sched );
2401
- admin = rtnl_dereference (q -> admin_sched );
2402
-
2403
2400
mqprio_qopt_reconstruct (dev , & opt );
2404
2401
2405
2402
nest = nla_nest_start_noflag (skb , TCA_OPTIONS );
@@ -2420,30 +2417,39 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
2420
2417
nla_put_u32 (skb , TCA_TAPRIO_ATTR_TXTIME_DELAY , q -> txtime_delay ))
2421
2418
goto options_error ;
2422
2419
2420
+ rcu_read_lock ();
2421
+
2422
+ oper = rtnl_dereference (q -> oper_sched );
2423
+ admin = rtnl_dereference (q -> admin_sched );
2424
+
2423
2425
if (oper && taprio_dump_tc_entries (skb , q , oper ))
2424
- goto options_error ;
2426
+ goto options_error_rcu ;
2425
2427
2426
2428
if (oper && dump_schedule (skb , oper ))
2427
- goto options_error ;
2429
+ goto options_error_rcu ;
2428
2430
2429
2431
if (!admin )
2430
2432
goto done ;
2431
2433
2432
2434
sched_nest = nla_nest_start_noflag (skb , TCA_TAPRIO_ATTR_ADMIN_SCHED );
2433
2435
if (!sched_nest )
2434
- goto options_error ;
2436
+ goto options_error_rcu ;
2435
2437
2436
2438
if (dump_schedule (skb , admin ))
2437
2439
goto admin_error ;
2438
2440
2439
2441
nla_nest_end (skb , sched_nest );
2440
2442
2441
2443
done :
2444
+ rcu_read_unlock ();
2442
2445
return nla_nest_end (skb , nest );
2443
2446
2444
2447
admin_error :
2445
2448
nla_nest_cancel (skb , sched_nest );
2446
2449
2450
+ options_error_rcu :
2451
+ rcu_read_unlock ();
2452
+
2447
2453
options_error :
2448
2454
nla_nest_cancel (skb , nest );
2449
2455
0 commit comments