Skip to content

Commit e5f12b3

Browse files
committed
Merge branch 'mlxsw-trap-groups-and-policers'
Jiri Pirko says: ==================== mlxsw: traps, trap groups and policers Nogah says: For a packet to be sent from the HW to the cpu, it needs to be trapped. For a trap to be activate it should be assigned to a trap group. Those trap groups can have policers, to limit the packet rate (the max number of packets that can be sent to the cpu in a time slot, the rest will be discarded) or the data rate (the same, but the count is not by the number of packets but by their total length in bytes). This patchset rearrange the trap setting API, re-write the traps and the trap groups list in spectrum and assign them policers. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
2 parents eafa6ab + 9148e7c commit e5f12b3

File tree

8 files changed

+625
-408
lines changed

8 files changed

+625
-408
lines changed

drivers/net/ethernet/mellanox/mlxsw/core.c

Lines changed: 79 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -572,27 +572,9 @@ static void mlxsw_emad_rx_listener_func(struct sk_buff *skb, u8 local_port,
572572
dev_kfree_skb(skb);
573573
}
574574

575-
static const struct mlxsw_rx_listener mlxsw_emad_rx_listener = {
576-
.func = mlxsw_emad_rx_listener_func,
577-
.local_port = MLXSW_PORT_DONT_CARE,
578-
.trap_id = MLXSW_TRAP_ID_ETHEMAD,
579-
};
580-
581-
static int mlxsw_emad_traps_set(struct mlxsw_core *mlxsw_core)
582-
{
583-
char htgt_pl[MLXSW_REG_HTGT_LEN];
584-
char hpkt_pl[MLXSW_REG_HPKT_LEN];
585-
int err;
586-
587-
mlxsw_reg_htgt_pack(htgt_pl, MLXSW_REG_HTGT_TRAP_GROUP_EMAD);
588-
err = mlxsw_reg_write(mlxsw_core, MLXSW_REG(htgt), htgt_pl);
589-
if (err)
590-
return err;
591-
592-
mlxsw_reg_hpkt_pack(hpkt_pl, MLXSW_REG_HPKT_ACTION_TRAP_TO_CPU,
593-
MLXSW_TRAP_ID_ETHEMAD);
594-
return mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl);
595-
}
575+
static const struct mlxsw_listener mlxsw_emad_rx_listener =
576+
MLXSW_RXL(mlxsw_emad_rx_listener_func, ETHEMAD, TRAP_TO_CPU, false,
577+
EMAD, DISCARD);
596578

597579
static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core)
598580
{
@@ -613,42 +595,33 @@ static int mlxsw_emad_init(struct mlxsw_core *mlxsw_core)
613595
INIT_LIST_HEAD(&mlxsw_core->emad.trans_list);
614596
spin_lock_init(&mlxsw_core->emad.trans_list_lock);
615597

616-
err = mlxsw_core_rx_listener_register(mlxsw_core,
617-
&mlxsw_emad_rx_listener,
618-
mlxsw_core);
598+
err = mlxsw_core_trap_register(mlxsw_core, &mlxsw_emad_rx_listener,
599+
mlxsw_core);
619600
if (err)
620601
return err;
621602

622-
err = mlxsw_emad_traps_set(mlxsw_core);
603+
err = mlxsw_core->driver->basic_trap_groups_set(mlxsw_core);
623604
if (err)
624605
goto err_emad_trap_set;
625-
626606
mlxsw_core->emad.use_emad = true;
627607

628608
return 0;
629609

630610
err_emad_trap_set:
631-
mlxsw_core_rx_listener_unregister(mlxsw_core,
632-
&mlxsw_emad_rx_listener,
633-
mlxsw_core);
611+
mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener,
612+
mlxsw_core);
634613
return err;
635614
}
636615

637616
static void mlxsw_emad_fini(struct mlxsw_core *mlxsw_core)
638617
{
639-
char hpkt_pl[MLXSW_REG_HPKT_LEN];
640618

641619
if (!(mlxsw_core->bus->features & MLXSW_BUS_F_TXRX))
642620
return;
643621

644622
mlxsw_core->emad.use_emad = false;
645-
mlxsw_reg_hpkt_pack(hpkt_pl, MLXSW_REG_HPKT_ACTION_DISCARD,
646-
MLXSW_TRAP_ID_ETHEMAD);
647-
mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl);
648-
649-
mlxsw_core_rx_listener_unregister(mlxsw_core,
650-
&mlxsw_emad_rx_listener,
651-
mlxsw_core);
623+
mlxsw_core_trap_unregister(mlxsw_core, &mlxsw_emad_rx_listener,
624+
mlxsw_core);
652625
}
653626

654627
static struct sk_buff *mlxsw_emad_alloc(const struct mlxsw_core *mlxsw_core,
@@ -1392,6 +1365,75 @@ void mlxsw_core_event_listener_unregister(struct mlxsw_core *mlxsw_core,
13921365
}
13931366
EXPORT_SYMBOL(mlxsw_core_event_listener_unregister);
13941367

1368+
static int mlxsw_core_listener_register(struct mlxsw_core *mlxsw_core,
1369+
const struct mlxsw_listener *listener,
1370+
void *priv)
1371+
{
1372+
if (listener->is_event)
1373+
return mlxsw_core_event_listener_register(mlxsw_core,
1374+
&listener->u.event_listener,
1375+
priv);
1376+
else
1377+
return mlxsw_core_rx_listener_register(mlxsw_core,
1378+
&listener->u.rx_listener,
1379+
priv);
1380+
}
1381+
1382+
static void mlxsw_core_listener_unregister(struct mlxsw_core *mlxsw_core,
1383+
const struct mlxsw_listener *listener,
1384+
void *priv)
1385+
{
1386+
if (listener->is_event)
1387+
mlxsw_core_event_listener_unregister(mlxsw_core,
1388+
&listener->u.event_listener,
1389+
priv);
1390+
else
1391+
mlxsw_core_rx_listener_unregister(mlxsw_core,
1392+
&listener->u.rx_listener,
1393+
priv);
1394+
}
1395+
1396+
int mlxsw_core_trap_register(struct mlxsw_core *mlxsw_core,
1397+
const struct mlxsw_listener *listener, void *priv)
1398+
{
1399+
char hpkt_pl[MLXSW_REG_HPKT_LEN];
1400+
int err;
1401+
1402+
err = mlxsw_core_listener_register(mlxsw_core, listener, priv);
1403+
if (err)
1404+
return err;
1405+
1406+
mlxsw_reg_hpkt_pack(hpkt_pl, listener->action, listener->trap_id,
1407+
listener->trap_group, listener->is_ctrl);
1408+
err = mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl);
1409+
if (err)
1410+
goto err_trap_set;
1411+
1412+
return 0;
1413+
1414+
err_trap_set:
1415+
mlxsw_core_listener_unregister(mlxsw_core, listener, priv);
1416+
return err;
1417+
}
1418+
EXPORT_SYMBOL(mlxsw_core_trap_register);
1419+
1420+
void mlxsw_core_trap_unregister(struct mlxsw_core *mlxsw_core,
1421+
const struct mlxsw_listener *listener,
1422+
void *priv)
1423+
{
1424+
char hpkt_pl[MLXSW_REG_HPKT_LEN];
1425+
1426+
if (!listener->is_event) {
1427+
mlxsw_reg_hpkt_pack(hpkt_pl, listener->unreg_action,
1428+
listener->trap_id, listener->trap_group,
1429+
listener->is_ctrl);
1430+
mlxsw_reg_write(mlxsw_core, MLXSW_REG(hpkt), hpkt_pl);
1431+
}
1432+
1433+
mlxsw_core_listener_unregister(mlxsw_core, listener, priv);
1434+
}
1435+
EXPORT_SYMBOL(mlxsw_core_trap_unregister);
1436+
13951437
static u64 mlxsw_core_tid_get(struct mlxsw_core *mlxsw_core)
13961438
{
13971439
return atomic64_inc_return(&mlxsw_core->emad.tid);

drivers/net/ethernet/mellanox/mlxsw/core.h

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,50 @@ struct mlxsw_event_listener {
9090
enum mlxsw_event_trap_id trap_id;
9191
};
9292

93+
struct mlxsw_listener {
94+
u16 trap_id;
95+
union {
96+
struct mlxsw_rx_listener rx_listener;
97+
struct mlxsw_event_listener event_listener;
98+
} u;
99+
enum mlxsw_reg_hpkt_action action;
100+
enum mlxsw_reg_hpkt_action unreg_action;
101+
u8 trap_group;
102+
bool is_ctrl; /* should go via control buffer or not */
103+
bool is_event;
104+
};
105+
106+
#define MLXSW_RXL(_func, _trap_id, _action, _is_ctrl, _trap_group, \
107+
_unreg_action) \
108+
{ \
109+
.trap_id = MLXSW_TRAP_ID_##_trap_id, \
110+
.u.rx_listener = \
111+
{ \
112+
.func = _func, \
113+
.local_port = MLXSW_PORT_DONT_CARE, \
114+
.trap_id = MLXSW_TRAP_ID_##_trap_id, \
115+
}, \
116+
.action = MLXSW_REG_HPKT_ACTION_##_action, \
117+
.unreg_action = MLXSW_REG_HPKT_ACTION_##_unreg_action, \
118+
.trap_group = MLXSW_REG_HTGT_TRAP_GROUP_##_trap_group, \
119+
.is_ctrl = _is_ctrl, \
120+
.is_event = false, \
121+
}
122+
123+
#define MLXSW_EVENTL(_func, _trap_id, _trap_group) \
124+
{ \
125+
.trap_id = MLXSW_TRAP_ID_##_trap_id, \
126+
.u.event_listener = \
127+
{ \
128+
.func = _func, \
129+
.trap_id = MLXSW_TRAP_ID_##_trap_id, \
130+
}, \
131+
.action = MLXSW_REG_HPKT_ACTION_TRAP_TO_CPU, \
132+
.trap_group = MLXSW_REG_HTGT_TRAP_GROUP_##_trap_group, \
133+
.is_ctrl = false, \
134+
.is_event = true, \
135+
}
136+
93137
int mlxsw_core_rx_listener_register(struct mlxsw_core *mlxsw_core,
94138
const struct mlxsw_rx_listener *rxl,
95139
void *priv);
@@ -104,6 +148,13 @@ void mlxsw_core_event_listener_unregister(struct mlxsw_core *mlxsw_core,
104148
const struct mlxsw_event_listener *el,
105149
void *priv);
106150

151+
int mlxsw_core_trap_register(struct mlxsw_core *mlxsw_core,
152+
const struct mlxsw_listener *listener,
153+
void *priv);
154+
void mlxsw_core_trap_unregister(struct mlxsw_core *mlxsw_core,
155+
const struct mlxsw_listener *listener,
156+
void *priv);
157+
107158
typedef void mlxsw_reg_trans_cb_t(struct mlxsw_core *mlxsw_core, char *payload,
108159
size_t payload_len, unsigned long cb_priv);
109160

@@ -214,6 +265,7 @@ struct mlxsw_driver {
214265
int (*init)(struct mlxsw_core *mlxsw_core,
215266
const struct mlxsw_bus_info *mlxsw_bus_info);
216267
void (*fini)(struct mlxsw_core *mlxsw_core);
268+
int (*basic_trap_groups_set)(struct mlxsw_core *mlxsw_core);
217269
int (*port_type_set)(struct mlxsw_core *mlxsw_core, u8 local_port,
218270
enum devlink_port_type new_type);
219271
int (*port_split)(struct mlxsw_core *mlxsw_core, u8 local_port,

0 commit comments

Comments
 (0)