|
@@ -2253,7 +2253,7 @@ int netif_get_num_default_rss_queues(void)
|
|
|
}
|
|
|
EXPORT_SYMBOL(netif_get_num_default_rss_queues);
|
|
|
|
|
|
-static inline void __netif_reschedule(struct Qdisc *q)
|
|
|
+static void __netif_reschedule(struct Qdisc *q)
|
|
|
{
|
|
|
struct softnet_data *sd;
|
|
|
unsigned long flags;
|
|
@@ -3898,22 +3898,14 @@ static void net_tx_action(struct softirq_action *h)
|
|
|
head = head->next_sched;
|
|
|
|
|
|
root_lock = qdisc_lock(q);
|
|
|
- if (spin_trylock(root_lock)) {
|
|
|
- smp_mb__before_atomic();
|
|
|
- clear_bit(__QDISC_STATE_SCHED,
|
|
|
- &q->state);
|
|
|
- qdisc_run(q);
|
|
|
- spin_unlock(root_lock);
|
|
|
- } else {
|
|
|
- if (!test_bit(__QDISC_STATE_DEACTIVATED,
|
|
|
- &q->state)) {
|
|
|
- __netif_reschedule(q);
|
|
|
- } else {
|
|
|
- smp_mb__before_atomic();
|
|
|
- clear_bit(__QDISC_STATE_SCHED,
|
|
|
- &q->state);
|
|
|
- }
|
|
|
- }
|
|
|
+ spin_lock(root_lock);
|
|
|
+ /* We need to make sure head->next_sched is read
|
|
|
+ * before clearing __QDISC_STATE_SCHED
|
|
|
+ */
|
|
|
+ smp_mb__before_atomic();
|
|
|
+ clear_bit(__QDISC_STATE_SCHED, &q->state);
|
|
|
+ qdisc_run(q);
|
|
|
+ spin_unlock(root_lock);
|
|
|
}
|
|
|
}
|
|
|
}
|