| From 447d290a58bd335d68f665713842365d3d6447df Mon Sep 17 00:00:00 2001 |
| From: Vladimir Oltean <vladimir.oltean@nxp.com> |
| Date: Wed, 6 Jan 2021 11:51:33 +0200 |
| Subject: [PATCH] net: dsa: move switchdev event implementation under the same |
| switch/case statement |
| |
| We'll need to start listening to SWITCHDEV_FDB_{ADD,DEL}_TO_DEVICE |
| events even for interfaces where dsa_slave_dev_check returns false, so |
| we need that check inside the switch-case statement for SWITCHDEV_FDB_*. |
| |
| This movement also avoids a useless allocation / free of switchdev_work |
| on the untreated "default event" case. |
| |
| Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> |
| Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> |
| Signed-off-by: Jakub Kicinski <kuba@kernel.org> |
| --- |
| net/dsa/slave.c | 35 ++++++++++++++++------------------- |
| 1 file changed, 16 insertions(+), 19 deletions(-) |
| |
| --- a/net/dsa/slave.c |
| +++ b/net/dsa/slave.c |
| @@ -1638,31 +1638,29 @@ static int dsa_slave_switchdev_event(str |
| struct dsa_port *dp; |
| int err; |
| |
| - if (event == SWITCHDEV_PORT_ATTR_SET) { |
| + switch (event) { |
| + case SWITCHDEV_PORT_ATTR_SET: |
| err = switchdev_handle_port_attr_set(dev, ptr, |
| dsa_slave_dev_check, |
| dsa_slave_port_attr_set); |
| return notifier_from_errno(err); |
| - } |
| - |
| - if (!dsa_slave_dev_check(dev)) |
| - return NOTIFY_DONE; |
| + case SWITCHDEV_FDB_ADD_TO_DEVICE: |
| + case SWITCHDEV_FDB_DEL_TO_DEVICE: |
| + if (!dsa_slave_dev_check(dev)) |
| + return NOTIFY_DONE; |
| |
| - dp = dsa_slave_to_port(dev); |
| + dp = dsa_slave_to_port(dev); |
| |
| - switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC); |
| - if (!switchdev_work) |
| - return NOTIFY_BAD; |
| - |
| - INIT_WORK(&switchdev_work->work, |
| - dsa_slave_switchdev_event_work); |
| - switchdev_work->ds = dp->ds; |
| - switchdev_work->port = dp->index; |
| - switchdev_work->event = event; |
| + switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC); |
| + if (!switchdev_work) |
| + return NOTIFY_BAD; |
| + |
| + INIT_WORK(&switchdev_work->work, |
| + dsa_slave_switchdev_event_work); |
| + switchdev_work->ds = dp->ds; |
| + switchdev_work->port = dp->index; |
| + switchdev_work->event = event; |
| |
| - switch (event) { |
| - case SWITCHDEV_FDB_ADD_TO_DEVICE: /* fall through */ |
| - case SWITCHDEV_FDB_DEL_TO_DEVICE: |
| fdb_info = ptr; |
| |
| if (!fdb_info->added_by_user) { |
| @@ -1675,13 +1673,12 @@ static int dsa_slave_switchdev_event(str |
| switchdev_work->vid = fdb_info->vid; |
| |
| dev_hold(dev); |
| + dsa_schedule_work(&switchdev_work->work); |
| break; |
| default: |
| - kfree(switchdev_work); |
| return NOTIFY_DONE; |
| } |
| |
| - dsa_schedule_work(&switchdev_work->work); |
| return NOTIFY_OK; |
| } |
| |