mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
net: sched: Pass root lock to Qdisc_ops.enqueue
A following patch introduces qevents, points in qdisc algorithm where packet can be processed by user-defined filters. Should this processing lead to a situation where a new packet is to be enqueued on the same port, holding the root lock would lead to deadlocks. To solve the issue, qevent handler needs to unlock and relock the root lock when necessary. To that end, add the root lock argument to the qdisc op enqueue, and propagate throughout. Signed-off-by: Petr Machata <petrm@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5e701e49b7
commit
aebe4426cc
35 changed files with 73 additions and 71 deletions
|
@ -57,6 +57,7 @@ struct qdisc_skb_head {
|
|||
struct Qdisc {
|
||||
int (*enqueue)(struct sk_buff *skb,
|
||||
struct Qdisc *sch,
|
||||
spinlock_t *root_lock,
|
||||
struct sk_buff **to_free);
|
||||
struct sk_buff * (*dequeue)(struct Qdisc *sch);
|
||||
unsigned int flags;
|
||||
|
@ -241,6 +242,7 @@ struct Qdisc_ops {
|
|||
|
||||
int (*enqueue)(struct sk_buff *skb,
|
||||
struct Qdisc *sch,
|
||||
spinlock_t *root_lock,
|
||||
struct sk_buff **to_free);
|
||||
struct sk_buff * (*dequeue)(struct Qdisc *);
|
||||
struct sk_buff * (*peek)(struct Qdisc *);
|
||||
|
@ -788,11 +790,11 @@ static inline void qdisc_calculate_pkt_len(struct sk_buff *skb,
|
|||
#endif
|
||||
}
|
||||
|
||||
static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch,
|
||||
static inline int qdisc_enqueue(struct sk_buff *skb, struct Qdisc *sch, spinlock_t *root_lock,
|
||||
struct sk_buff **to_free)
|
||||
{
|
||||
qdisc_calculate_pkt_len(skb, sch);
|
||||
return sch->enqueue(skb, sch, to_free);
|
||||
return sch->enqueue(skb, sch, root_lock, to_free);
|
||||
}
|
||||
|
||||
static inline void _bstats_update(struct gnet_stats_basic_packed *bstats,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue