hc
2023-11-06 15ade055295d13f95d49e3d99b09f3bbfb4a43e7
kernel/include/net/sch_generic.h
....@@ -10,6 +10,7 @@
1010 #include <linux/percpu.h>
1111 #include <linux/dynamic_queue_limits.h>
1212 #include <linux/list.h>
13
+#include <net/net_seq_lock.h>
1314 #include <linux/refcount.h>
1415 #include <linux/workqueue.h>
1516 #include <net/gen_stats.h>
....@@ -100,7 +101,7 @@
100101 struct sk_buff_head gso_skb ____cacheline_aligned_in_smp;
101102 struct qdisc_skb_head q;
102103 struct gnet_stats_basic_packed bstats;
103
- seqcount_t running;
104
+ net_seqlock_t running;
104105 struct gnet_stats_queue qstats;
105106 unsigned long state;
106107 struct Qdisc *next_sched;
....@@ -137,7 +138,11 @@
137138 {
138139 if (qdisc->flags & TCQ_F_NOLOCK)
139140 return spin_is_locked(&qdisc->seqlock);
141
+#ifdef CONFIG_PREEMPT_RT_BASE
142
+ return spin_is_locked(&qdisc->running.lock) ? true : false;
143
+#else
140144 return (raw_read_seqcount(&qdisc->running) & 1) ? true : false;
145
+#endif
141146 }
142147
143148 static inline bool qdisc_run_begin(struct Qdisc *qdisc)
....@@ -148,17 +153,27 @@
148153 } else if (qdisc_is_running(qdisc)) {
149154 return false;
150155 }
156
+#ifdef CONFIG_PREEMPT_RT_BASE
157
+ if (try_write_seqlock(&qdisc->running))
158
+ return true;
159
+ return false;
160
+#else
151161 /* Variant of write_seqcount_begin() telling lockdep a trylock
152162 * was attempted.
153163 */
154164 raw_write_seqcount_begin(&qdisc->running);
155165 seqcount_acquire(&qdisc->running.dep_map, 0, 1, _RET_IP_);
156166 return true;
167
+#endif
157168 }
158169
159170 static inline void qdisc_run_end(struct Qdisc *qdisc)
160171 {
172
+#ifdef CONFIG_PREEMPT_RT_BASE
173
+ write_sequnlock(&qdisc->running);
174
+#else
161175 write_seqcount_end(&qdisc->running);
176
+#endif
162177 if (qdisc->flags & TCQ_F_NOLOCK)
163178 spin_unlock(&qdisc->seqlock);
164179 }
....@@ -475,7 +490,7 @@
475490 return qdisc_lock(root);
476491 }
477492
478
-static inline seqcount_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc)
493
+static inline net_seqlock_t *qdisc_root_sleeping_running(const struct Qdisc *qdisc)
479494 {
480495 struct Qdisc *root = qdisc_root_sleeping(qdisc);
481496