mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 06:34:12 +08:00
switchdev: Adding complete operation to deferred switchdev ops
When using switchdev deferred operation (SWITCHDEV_F_DEFER), the operation is executed in different context and the application doesn't have any way to get the operation real status. Adding a completion callback fixes that. This patch adds fields to switchdev_attr and switchdev_obj "complete_priv" field which is used by the "complete" callback. Application can set a complete function which will be called once the operation executed. Signed-off-by: Elad Raz <eladr@mellanox.com> Signed-off-by: Jiri Pirko <jiri@mellanox.com> Reviewed-by: Ido Schimmel <idosch@mellanox.com> Acked-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
f75cfbadde
commit
7ceb2afbd6
@ -54,6 +54,8 @@ struct switchdev_attr {
|
||||
struct net_device *orig_dev;
|
||||
enum switchdev_attr_id id;
|
||||
u32 flags;
|
||||
void *complete_priv;
|
||||
void (*complete)(struct net_device *dev, int err, void *priv);
|
||||
union {
|
||||
struct netdev_phys_item_id ppid; /* PORT_PARENT_ID */
|
||||
u8 stp_state; /* PORT_STP_STATE */
|
||||
@ -75,6 +77,8 @@ struct switchdev_obj {
|
||||
struct net_device *orig_dev;
|
||||
enum switchdev_obj_id id;
|
||||
u32 flags;
|
||||
void *complete_priv;
|
||||
void (*complete)(struct net_device *dev, int err, void *priv);
|
||||
};
|
||||
|
||||
/* SWITCHDEV_OBJ_ID_PORT_VLAN */
|
||||
|
@ -305,6 +305,8 @@ static void switchdev_port_attr_set_deferred(struct net_device *dev,
|
||||
if (err && err != -EOPNOTSUPP)
|
||||
netdev_err(dev, "failed (err=%d) to set attribute (id=%d)\n",
|
||||
err, attr->id);
|
||||
if (attr->complete)
|
||||
attr->complete(dev, err, attr->complete_priv);
|
||||
}
|
||||
|
||||
static int switchdev_port_attr_set_defer(struct net_device *dev,
|
||||
@ -434,6 +436,8 @@ static void switchdev_port_obj_add_deferred(struct net_device *dev,
|
||||
if (err && err != -EOPNOTSUPP)
|
||||
netdev_err(dev, "failed (err=%d) to add object (id=%d)\n",
|
||||
err, obj->id);
|
||||
if (obj->complete)
|
||||
obj->complete(dev, err, obj->complete_priv);
|
||||
}
|
||||
|
||||
static int switchdev_port_obj_add_defer(struct net_device *dev,
|
||||
@ -502,6 +506,8 @@ static void switchdev_port_obj_del_deferred(struct net_device *dev,
|
||||
if (err && err != -EOPNOTSUPP)
|
||||
netdev_err(dev, "failed (err=%d) to del object (id=%d)\n",
|
||||
err, obj->id);
|
||||
if (obj->complete)
|
||||
obj->complete(dev, err, obj->complete_priv);
|
||||
}
|
||||
|
||||
static int switchdev_port_obj_del_defer(struct net_device *dev,
|
||||
|
Loading…
Reference in New Issue
Block a user