diff options
Diffstat (limited to 'net/sched/sch_cbs.c')
| -rw-r--r-- | net/sched/sch_cbs.c | 32 | 
1 files changed, 14 insertions, 18 deletions
diff --git a/net/sched/sch_cbs.c b/net/sched/sch_cbs.c index 810645b5c086..1bef152c5721 100644 --- a/net/sched/sch_cbs.c +++ b/net/sched/sch_cbs.c @@ -299,7 +299,7 @@ static void cbs_set_port_rate(struct net_device *dev, struct cbs_sched_data *q)  {  	struct ethtool_link_ksettings ecmd;  	int speed = SPEED_10; -	int port_rate = -1; +	int port_rate;  	int err;  	err = __ethtool_get_link_ksettings(dev, &ecmd); @@ -392,7 +392,6 @@ static int cbs_init(struct Qdisc *sch, struct nlattr *opt,  {  	struct cbs_sched_data *q = qdisc_priv(sch);  	struct net_device *dev = qdisc_dev(sch); -	int err;  	if (!opt) {  		NL_SET_ERR_MSG(extack, "Missing CBS qdisc options  which are mandatory"); @@ -404,6 +403,10 @@ static int cbs_init(struct Qdisc *sch, struct nlattr *opt,  	if (!q->qdisc)  		return -ENOMEM; +	spin_lock(&cbs_list_lock); +	list_add(&q->cbs_list, &cbs_list); +	spin_unlock(&cbs_list_lock); +  	qdisc_hash_add(q->qdisc, false);  	q->queue = sch->dev_queue - netdev_get_tx_queue(dev, 0); @@ -413,17 +416,7 @@ static int cbs_init(struct Qdisc *sch, struct nlattr *opt,  	qdisc_watchdog_init(&q->watchdog, sch); -	err = cbs_change(sch, opt, extack); -	if (err) -		return err; - -	if (!q->offload) { -		spin_lock(&cbs_list_lock); -		list_add(&q->cbs_list, &cbs_list); -		spin_unlock(&cbs_list_lock); -	} - -	return 0; +	return cbs_change(sch, opt, extack);  }  static void cbs_destroy(struct Qdisc *sch) @@ -431,15 +424,18 @@ static void cbs_destroy(struct Qdisc *sch)  	struct cbs_sched_data *q = qdisc_priv(sch);  	struct net_device *dev = qdisc_dev(sch); -	spin_lock(&cbs_list_lock); -	list_del(&q->cbs_list); -	spin_unlock(&cbs_list_lock); +	/* Nothing to do if we couldn't create the underlying qdisc */ +	if (!q->qdisc) +		return;  	qdisc_watchdog_cancel(&q->watchdog);  	cbs_disable_offload(dev, q); -	if (q->qdisc) -		qdisc_put(q->qdisc); +	spin_lock(&cbs_list_lock); +	list_del(&q->cbs_list); +	spin_unlock(&cbs_list_lock); + +	qdisc_put(q->qdisc);  }  static int cbs_dump(struct Qdisc *sch, struct sk_buff *skb)  |