@@ -1890,10 +1890,6 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
1890
1890
struct nlattr * nest , * sched_nest ;
1891
1891
unsigned int i ;
1892
1892
1893
- rcu_read_lock ();
1894
- oper = rcu_dereference (q -> oper_sched );
1895
- admin = rcu_dereference (q -> admin_sched );
1896
-
1897
1893
opt .num_tc = netdev_get_num_tc (dev );
1898
1894
memcpy (opt .prio_tc_map , dev -> prio_tc_map , sizeof (opt .prio_tc_map ));
1899
1895
@@ -1920,15 +1916,20 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
1920
1916
nla_put_u32 (skb , TCA_TAPRIO_ATTR_TXTIME_DELAY , q -> txtime_delay ))
1921
1917
goto options_error ;
1922
1918
1919
+ rcu_read_lock ();
1920
+
1921
+ oper = rtnl_dereference (q -> oper_sched );
1922
+ admin = rtnl_dereference (q -> admin_sched );
1923
+
1923
1924
if (oper && dump_schedule (skb , oper ))
1924
- goto options_error ;
1925
+ goto options_error_rcu ;
1925
1926
1926
1927
if (!admin )
1927
1928
goto done ;
1928
1929
1929
1930
sched_nest = nla_nest_start_noflag (skb , TCA_TAPRIO_ATTR_ADMIN_SCHED );
1930
1931
if (!sched_nest )
1931
- goto options_error ;
1932
+ goto options_error_rcu ;
1932
1933
1933
1934
if (dump_schedule (skb , admin ))
1934
1935
goto admin_error ;
@@ -1943,6 +1944,9 @@ static int taprio_dump(struct Qdisc *sch, struct sk_buff *skb)
1943
1944
admin_error :
1944
1945
nla_nest_cancel (skb , sched_nest );
1945
1946
1947
+ options_error_rcu :
1948
+ rcu_read_unlock ();
1949
+
1946
1950
options_error :
1947
1951
nla_nest_cancel (skb , nest );
1948
1952
0 commit comments