@@ -2397,9 +2397,6 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
23972397 struct tc_mqprio_qopt opt = { 0 };
23982398 struct nlattr * nest , * sched_nest ;
23992399
2400- oper = rtnl_dereference (q -> oper_sched );
2401- admin = rtnl_dereference (q -> admin_sched );
2402-
24032400 mqprio_qopt_reconstruct (dev , & opt );
24042401
24052402 nest = nla_nest_start_noflag (skb , TCA_OPTIONS );
@@ -2420,30 +2417,39 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
24202417 nla_put_u32 (skb , TCA_TAPRIO_ATTR_TXTIME_DELAY , q -> txtime_delay ))
24212418 goto options_error ;
24222419
2420+ rcu_read_lock ();
2421+
2422+ oper = rtnl_dereference (q -> oper_sched );
2423+ admin = rtnl_dereference (q -> admin_sched );
2424+
24232425 if (oper && taprio_dump_tc_entries (skb , q , oper ))
2424- goto options_error ;
2426+ goto options_error_rcu ;
24252427
24262428 if (oper && dump_schedule (skb , oper ))
2427- goto options_error ;
2429+ goto options_error_rcu ;
24282430
24292431 if (!admin )
24302432 goto done ;
24312433
24322434 sched_nest = nla_nest_start_noflag (skb , TCA_TAPRIO_ATTR_ADMIN_SCHED );
24332435 if (!sched_nest )
2434- goto options_error ;
2436+ goto options_error_rcu ;
24352437
24362438 if (dump_schedule (skb , admin ))
24372439 goto admin_error ;
24382440
24392441 nla_nest_end (skb , sched_nest );
24402442
24412443done :
2444+ rcu_read_unlock ();
24422445 return nla_nest_end (skb , nest );
24432446
24442447admin_error :
24452448 nla_nest_cancel (skb , sched_nest );
24462449
2450+ options_error_rcu :
2451+ rcu_read_unlock ();
2452+
24472453options_error :
24482454 nla_nest_cancel (skb , nest );
24492455
0 commit comments