@@ -392,7 +392,6 @@ static int cbs_init(struct Qdisc *sch, struct nlattr *opt,
392
392
{
393
393
struct cbs_sched_data * q = qdisc_priv (sch );
394
394
struct net_device * dev = qdisc_dev (sch );
395
- int err ;
396
395
397
396
if (!opt ) {
398
397
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,
404
403
if (!q -> qdisc )
405
404
return - ENOMEM ;
406
405
406
+ spin_lock (& cbs_list_lock );
407
+ list_add (& q -> cbs_list , & cbs_list );
408
+ spin_unlock (& cbs_list_lock );
409
+
407
410
qdisc_hash_add (q -> qdisc , false);
408
411
409
412
q -> queue = sch -> dev_queue - netdev_get_tx_queue (dev , 0 );
@@ -413,33 +416,26 @@ static int cbs_init(struct Qdisc *sch, struct nlattr *opt,
413
416
414
417
qdisc_watchdog_init (& q -> watchdog , sch );
415
418
416
- err = cbs_change (sch , opt , extack );
417
- if (err )
418
- return err ;
419
-
420
- if (!q -> offload ) {
421
- spin_lock (& cbs_list_lock );
422
- list_add (& q -> cbs_list , & cbs_list );
423
- spin_unlock (& cbs_list_lock );
424
- }
425
-
426
- return 0 ;
419
+ return cbs_change (sch , opt , extack );
427
420
}
428
421
429
422
static void cbs_destroy (struct Qdisc * sch )
430
423
{
431
424
struct cbs_sched_data * q = qdisc_priv (sch );
432
425
struct net_device * dev = qdisc_dev (sch );
433
426
434
- spin_lock ( & cbs_list_lock );
435
- list_del ( & q -> cbs_list );
436
- spin_unlock ( & cbs_list_lock ) ;
427
+ /* Nothing to do if we couldn't create the underlying qdisc */
428
+ if (! q -> qdisc )
429
+ return ;
437
430
438
431
qdisc_watchdog_cancel (& q -> watchdog );
439
432
cbs_disable_offload (dev , q );
440
433
441
- if (q -> qdisc )
442
- qdisc_put (q -> qdisc );
434
+ spin_lock (& cbs_list_lock );
435
+ list_del (& q -> cbs_list );
436
+ spin_unlock (& cbs_list_lock );
437
+
438
+ qdisc_put (q -> qdisc );
443
439
}
444
440
445
441
static int cbs_dump (struct Qdisc * sch , struct sk_buff * skb )
0 commit comments