mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-21 06:01:23 +00:00
switchdev: remove pointers from switchdev objects
When object is used in deferred work, we cannot use pointers in switchdev object structures because the memory they point at may be already used by someone else. So rather do local copy of the value. Signed-off-by: Jiri Pirko <jiri@mellanox.com> Acked-by: Scott Feldman <sfeldma@gmail.com> Reviewed-by: John Fastabend <john.r.fastabend@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
0bc05d585d
commit
850d0cbc91
5 changed files with 15 additions and 13 deletions
|
@ -15,6 +15,7 @@
|
|||
#include <linux/mutex.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <linux/if_bridge.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
@ -891,10 +892,10 @@ int switchdev_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
|
|||
{
|
||||
struct switchdev_obj_port_fdb fdb = {
|
||||
.obj.id = SWITCHDEV_OBJ_ID_PORT_FDB,
|
||||
.addr = addr,
|
||||
.vid = vid,
|
||||
};
|
||||
|
||||
ether_addr_copy(fdb.addr, addr);
|
||||
return switchdev_port_obj_add(dev, &fdb.obj);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(switchdev_port_fdb_add);
|
||||
|
@ -916,10 +917,10 @@ int switchdev_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
|
|||
{
|
||||
struct switchdev_obj_port_fdb fdb = {
|
||||
.obj.id = SWITCHDEV_OBJ_ID_PORT_FDB,
|
||||
.addr = addr,
|
||||
.vid = vid,
|
||||
};
|
||||
|
||||
ether_addr_copy(fdb.addr, addr);
|
||||
return switchdev_port_obj_del(dev, &fdb.obj);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(switchdev_port_fdb_del);
|
||||
|
@ -1081,7 +1082,6 @@ int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
|
|||
.obj.id = SWITCHDEV_OBJ_ID_IPV4_FIB,
|
||||
.dst = dst,
|
||||
.dst_len = dst_len,
|
||||
.fi = fi,
|
||||
.tos = tos,
|
||||
.type = type,
|
||||
.nlflags = nlflags,
|
||||
|
@ -1090,6 +1090,8 @@ int switchdev_fib_ipv4_add(u32 dst, int dst_len, struct fib_info *fi,
|
|||
struct net_device *dev;
|
||||
int err = 0;
|
||||
|
||||
memcpy(&ipv4_fib.fi, fi, sizeof(ipv4_fib.fi));
|
||||
|
||||
/* Don't offload route if using custom ip rules or if
|
||||
* IPv4 FIB offloading has been disabled completely.
|
||||
*/
|
||||
|
@ -1133,7 +1135,6 @@ int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
|
|||
.obj.id = SWITCHDEV_OBJ_ID_IPV4_FIB,
|
||||
.dst = dst,
|
||||
.dst_len = dst_len,
|
||||
.fi = fi,
|
||||
.tos = tos,
|
||||
.type = type,
|
||||
.nlflags = 0,
|
||||
|
@ -1142,6 +1143,8 @@ int switchdev_fib_ipv4_del(u32 dst, int dst_len, struct fib_info *fi,
|
|||
struct net_device *dev;
|
||||
int err = 0;
|
||||
|
||||
memcpy(&ipv4_fib.fi, fi, sizeof(ipv4_fib.fi));
|
||||
|
||||
if (!(fi->fib_flags & RTNH_F_OFFLOAD))
|
||||
return 0;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue