Commit c09fc2e11ed1b7fc8cfa97fb1da544225fc32277

Authored by Jiri Pirko
Committed by David S. Miller
1 parent 8cc6251381

net: sched: cls_flow: no need to call tcf_exts_change for newly allocated struct

As the fnew struct just was allocated, so no need to use tcf_exts_change
to do atomic change, and we can just fill-up the unused exts struct
directly by tcf_exts_validate.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 1 changed file with 16 additions and 25 deletions Side-by-side Diff

net/sched/cls_flow.c
... ... @@ -388,7 +388,6 @@
388 388 struct flow_filter *fold, *fnew;
389 389 struct nlattr *opt = tca[TCA_OPTIONS];
390 390 struct nlattr *tb[TCA_FLOW_MAX + 1];
391   - struct tcf_exts e;
392 391 unsigned int nkeys = 0;
393 392 unsigned int perturb_period = 0;
394 393 u32 baseclass = 0;
395 394  
396 395  
397 396  
398 397  
399 398  
... ... @@ -424,31 +423,27 @@
424 423 return -EOPNOTSUPP;
425 424 }
426 425  
427   - err = tcf_exts_init(&e, TCA_FLOW_ACT, TCA_FLOW_POLICE);
428   - if (err < 0)
429   - goto err1;
430   - err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &e, ovr);
431   - if (err < 0)
432   - goto err1;
433   -
434   - err = -ENOBUFS;
435 426 fnew = kzalloc(sizeof(*fnew), GFP_KERNEL);
436 427 if (!fnew)
437   - goto err1;
  428 + return -ENOBUFS;
438 429  
439 430 err = tcf_em_tree_validate(tp, tb[TCA_FLOW_EMATCHES], &fnew->ematches);
440 431 if (err < 0)
441   - goto err2;
  432 + goto err1;
442 433  
443 434 err = tcf_exts_init(&fnew->exts, TCA_FLOW_ACT, TCA_FLOW_POLICE);
444 435 if (err < 0)
445   - goto err3;
  436 + goto err2;
446 437  
  438 + err = tcf_exts_validate(net, tp, tb, tca[TCA_RATE], &fnew->exts, ovr);
  439 + if (err < 0)
  440 + goto err2;
  441 +
447 442 fold = (struct flow_filter *)*arg;
448 443 if (fold) {
449 444 err = -EINVAL;
450 445 if (fold->handle != handle && handle)
451   - goto err3;
  446 + goto err2;
452 447  
453 448 /* Copy fold into fnew */
454 449 fnew->tp = fold->tp;
455 450  
456 451  
457 452  
458 453  
459 454  
... ... @@ -468,31 +463,31 @@
468 463 if (tb[TCA_FLOW_MODE])
469 464 mode = nla_get_u32(tb[TCA_FLOW_MODE]);
470 465 if (mode != FLOW_MODE_HASH && nkeys > 1)
471   - goto err3;
  466 + goto err2;
472 467  
473 468 if (mode == FLOW_MODE_HASH)
474 469 perturb_period = fold->perturb_period;
475 470 if (tb[TCA_FLOW_PERTURB]) {
476 471 if (mode != FLOW_MODE_HASH)
477   - goto err3;
  472 + goto err2;
478 473 perturb_period = nla_get_u32(tb[TCA_FLOW_PERTURB]) * HZ;
479 474 }
480 475 } else {
481 476 err = -EINVAL;
482 477 if (!handle)
483   - goto err3;
  478 + goto err2;
484 479 if (!tb[TCA_FLOW_KEYS])
485   - goto err3;
  480 + goto err2;
486 481  
487 482 mode = FLOW_MODE_MAP;
488 483 if (tb[TCA_FLOW_MODE])
489 484 mode = nla_get_u32(tb[TCA_FLOW_MODE]);
490 485 if (mode != FLOW_MODE_HASH && nkeys > 1)
491   - goto err3;
  486 + goto err2;
492 487  
493 488 if (tb[TCA_FLOW_PERTURB]) {
494 489 if (mode != FLOW_MODE_HASH)
495   - goto err3;
  490 + goto err2;
496 491 perturb_period = nla_get_u32(tb[TCA_FLOW_PERTURB]) * HZ;
497 492 }
498 493  
... ... @@ -510,8 +505,6 @@
510 505 setup_deferrable_timer(&fnew->perturb_timer, flow_perturbation,
511 506 (unsigned long)fnew);
512 507  
513   - tcf_exts_change(tp, &fnew->exts, &e);
514   -
515 508 netif_keep_dst(qdisc_dev(tp->q));
516 509  
517 510 if (tb[TCA_FLOW_KEYS]) {
518 511  
519 512  
... ... @@ -550,13 +543,11 @@
550 543 call_rcu(&fold->rcu, flow_destroy_filter);
551 544 return 0;
552 545  
553   -err3:
  546 +err2:
554 547 tcf_exts_destroy(&fnew->exts);
555 548 tcf_em_tree_destroy(&fnew->ematches);
556   -err2:
557   - kfree(fnew);
558 549 err1:
559   - tcf_exts_destroy(&e);
  550 + kfree(fnew);
560 551 return err;
561 552 }
562 553