break;
        case SWITCHDEV_OBJ_ID_PORT_MDB:
                mdb = SWITCHDEV_OBJ_PORT_MDB(obj);
-               err = mlx5_esw_bridge_port_mdb_add(vport_num, esw_owner_vhca_id, mdb->addr,
+               err = mlx5_esw_bridge_port_mdb_add(dev, vport_num, esw_owner_vhca_id, mdb->addr,
                                                   mdb->vid, br_offloads, extack);
                break;
        default:
                break;
        case SWITCHDEV_OBJ_ID_PORT_MDB:
                mdb = SWITCHDEV_OBJ_PORT_MDB(obj);
-               mlx5_esw_bridge_port_mdb_del(vport_num, esw_owner_vhca_id, mdb->addr, mdb->vid,
+               mlx5_esw_bridge_port_mdb_del(dev, vport_num, esw_owner_vhca_id, mdb->addr, mdb->vid,
                                             br_offloads);
                break;
        default:
 
        }
 }
 
-int mlx5_esw_bridge_port_mdb_add(u16 vport_num, u16 esw_owner_vhca_id, const unsigned char *addr,
-                                u16 vid, struct mlx5_esw_bridge_offloads *br_offloads,
+int mlx5_esw_bridge_port_mdb_add(struct net_device *dev, u16 vport_num, u16 esw_owner_vhca_id,
+                                const unsigned char *addr, u16 vid,
+                                struct mlx5_esw_bridge_offloads *br_offloads,
                                 struct netlink_ext_ack *extack)
 {
        struct mlx5_esw_bridge_vlan *vlan;
                }
        }
 
-       err = mlx5_esw_bridge_port_mdb_attach(port, addr, vid);
+       err = mlx5_esw_bridge_port_mdb_attach(dev, port, addr, vid);
        if (err) {
                NL_SET_ERR_MSG_FMT_MOD(extack, "Failed to add MDB (MAC=%pM,vid=%u,vport=%u)\n",
                                       addr, vid, vport_num);
        return 0;
 }
 
-void mlx5_esw_bridge_port_mdb_del(u16 vport_num, u16 esw_owner_vhca_id, const unsigned char *addr,
-                                 u16 vid, struct mlx5_esw_bridge_offloads *br_offloads)
+void mlx5_esw_bridge_port_mdb_del(struct net_device *dev, u16 vport_num, u16 esw_owner_vhca_id,
+                                 const unsigned char *addr, u16 vid,
+                                 struct mlx5_esw_bridge_offloads *br_offloads)
 {
        struct mlx5_esw_bridge_port *port;
 
        if (!port)
                return;
 
-       mlx5_esw_bridge_port_mdb_detach(port, addr, vid);
+       mlx5_esw_bridge_port_mdb_detach(dev, port, addr, vid);
 }
 
 static void mlx5_esw_bridge_flush(struct mlx5_esw_bridge_offloads *br_offloads)
 
 void mlx5_esw_bridge_port_vlan_del(u16 vport_num, u16 esw_owner_vhca_id, u16 vid,
                                   struct mlx5_esw_bridge_offloads *br_offloads);
 
-int mlx5_esw_bridge_port_mdb_add(u16 vport_num, u16 esw_owner_vhca_id, const unsigned char *addr,
-                                u16 vid, struct mlx5_esw_bridge_offloads *br_offloads,
+int mlx5_esw_bridge_port_mdb_add(struct net_device *dev, u16 vport_num, u16 esw_owner_vhca_id,
+                                const unsigned char *addr, u16 vid,
+                                struct mlx5_esw_bridge_offloads *br_offloads,
                                 struct netlink_ext_ack *extack);
-void mlx5_esw_bridge_port_mdb_del(u16 vport_num, u16 esw_owner_vhca_id, const unsigned char *addr,
-                                 u16 vid, struct mlx5_esw_bridge_offloads *br_offloads);
+void mlx5_esw_bridge_port_mdb_del(struct net_device *dev, u16 vport_num, u16 esw_owner_vhca_id,
+                                 const unsigned char *addr, u16 vid,
+                                 struct mlx5_esw_bridge_offloads *br_offloads);
 
 #endif /* __MLX5_ESW_BRIDGE_H__ */
 
 #include "bridge.h"
 #include "eswitch.h"
 #include "bridge_priv.h"
+#include "diag/bridge_tracepoint.h"
 
 static const struct rhashtable_params mdb_ht_params = {
        .key_offset = offsetof(struct mlx5_esw_bridge_mdb_entry, key),
        kvfree(entry);
 }
 
-int mlx5_esw_bridge_port_mdb_attach(struct mlx5_esw_bridge_port *port, const unsigned char *addr,
-                                   u16 vid)
+int mlx5_esw_bridge_port_mdb_attach(struct net_device *dev, struct mlx5_esw_bridge_port *port,
+                                   const unsigned char *addr, u16 vid)
 {
        struct mlx5_esw_bridge *bridge = port->bridge;
        struct mlx5_esw_bridge_mdb_entry *entry;
                 */
                esw_warn(bridge->br_offloads->esw->dev, "MDB attach failed to offload (MAC=%pM,vid=%u,vport=%u,err=%d)\n",
                         addr, vid, port->vport_num, err);
+
+       trace_mlx5_esw_bridge_port_mdb_attach(dev, entry);
        return 0;
 }
 
                         entry->key.addr, entry->key.vid, port->vport_num);
 }
 
-void mlx5_esw_bridge_port_mdb_detach(struct mlx5_esw_bridge_port *port, const unsigned char *addr,
-                                    u16 vid)
+void mlx5_esw_bridge_port_mdb_detach(struct net_device *dev, struct mlx5_esw_bridge_port *port,
+                                    const unsigned char *addr, u16 vid)
 {
        struct mlx5_esw_bridge *bridge = port->bridge;
        struct mlx5_esw_bridge_mdb_entry *entry;
                return;
        }
 
+       trace_mlx5_esw_bridge_port_mdb_detach(dev, entry);
        mlx5_esw_bridge_port_mdb_entry_detach(port, entry);
 }
 
 
 
 int mlx5_esw_bridge_mdb_init(struct mlx5_esw_bridge *bridge);
 void mlx5_esw_bridge_mdb_cleanup(struct mlx5_esw_bridge *bridge);
-int mlx5_esw_bridge_port_mdb_attach(struct mlx5_esw_bridge_port *port, const unsigned char *addr,
-                                   u16 vid);
-void mlx5_esw_bridge_port_mdb_detach(struct mlx5_esw_bridge_port *port, const unsigned char *addr,
-                                    u16 vid);
+int mlx5_esw_bridge_port_mdb_attach(struct net_device *dev, struct mlx5_esw_bridge_port *port,
+                                   const unsigned char *addr, u16 vid);
+void mlx5_esw_bridge_port_mdb_detach(struct net_device *dev, struct mlx5_esw_bridge_port *port,
+                                    const unsigned char *addr, u16 vid);
 void mlx5_esw_bridge_port_mdb_vlan_flush(struct mlx5_esw_bridge_port *port,
                                         struct mlx5_esw_bridge_vlan *vlan);
 void mlx5_esw_bridge_mdb_flush(struct mlx5_esw_bridge *bridge);
 
             TP_ARGS(port)
        );
 
+DECLARE_EVENT_CLASS(mlx5_esw_bridge_mdb_port_change_template,
+                   TP_PROTO(const struct net_device *dev,
+                            const struct mlx5_esw_bridge_mdb_entry *mdb),
+                   TP_ARGS(dev, mdb),
+                   TP_STRUCT__entry(
+                           __array(char, dev_name, IFNAMSIZ)
+                           __array(unsigned char, addr, ETH_ALEN)
+                           __field(u16, vid)
+                           __field(int, num_ports)
+                           __field(bool, offloaded)),
+                   TP_fast_assign(
+                           strscpy(__entry->dev_name, netdev_name(dev), IFNAMSIZ);
+                           memcpy(__entry->addr, mdb->key.addr, ETH_ALEN);
+                           __entry->vid = mdb->key.vid;
+                           __entry->num_ports = mdb->num_ports;
+                           __entry->offloaded = mdb->egress_handle;),
+                   TP_printk("net_device=%s addr=%pM vid=%u num_ports=%d offloaded=%d",
+                             __entry->dev_name,
+                             __entry->addr,
+                             __entry->vid,
+                             __entry->num_ports,
+                             __entry->offloaded));
+
+DEFINE_EVENT(mlx5_esw_bridge_mdb_port_change_template,
+            mlx5_esw_bridge_port_mdb_attach,
+            TP_PROTO(const struct net_device *dev,
+                     const struct mlx5_esw_bridge_mdb_entry *mdb),
+            TP_ARGS(dev, mdb));
+
+DEFINE_EVENT(mlx5_esw_bridge_mdb_port_change_template,
+            mlx5_esw_bridge_port_mdb_detach,
+            TP_PROTO(const struct net_device *dev,
+                     const struct mlx5_esw_bridge_mdb_entry *mdb),
+            TP_ARGS(dev, mdb));
+
 #endif
 
 /* This part must be outside protection */