Skip to content

Commit f55e36d

Browse files
smalin1davem330
authored andcommitted
qed: Improve the stack space of filter_config()
As it was reported and discussed in: https://lore.kernel.org/lkml/CAHk-=whF9F89vsfH8E9TGc0tZA-yhzi2Di8wOtquNB5vRkFX5w@mail.gmail.com/ This patch improves the stack space of qede_config_rx_mode() by splitting filter_config() to 3 functions and removing the union qed_filter_type_params. Reported-by: Naresh Kamboju <[email protected]> Signed-off-by: Ariel Elior <[email protected]> Signed-off-by: Shai Malin <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 626bf91 commit f55e36d

File tree

3 files changed

+30
-61
lines changed

3 files changed

+30
-61
lines changed

drivers/net/ethernet/qlogic/qed/qed_l2.c

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2763,25 +2763,6 @@ static int qed_configure_filter_mcast(struct qed_dev *cdev,
27632763
return qed_filter_mcast_cmd(cdev, &mcast, QED_SPQ_MODE_CB, NULL);
27642764
}
27652765

2766-
static int qed_configure_filter(struct qed_dev *cdev,
2767-
struct qed_filter_params *params)
2768-
{
2769-
enum qed_filter_rx_mode_type accept_flags;
2770-
2771-
switch (params->type) {
2772-
case QED_FILTER_TYPE_UCAST:
2773-
return qed_configure_filter_ucast(cdev, &params->filter.ucast);
2774-
case QED_FILTER_TYPE_MCAST:
2775-
return qed_configure_filter_mcast(cdev, &params->filter.mcast);
2776-
case QED_FILTER_TYPE_RX_MODE:
2777-
accept_flags = params->filter.accept_flags;
2778-
return qed_configure_filter_rx_mode(cdev, accept_flags);
2779-
default:
2780-
DP_NOTICE(cdev, "Unknown filter type %d\n", (int)params->type);
2781-
return -EINVAL;
2782-
}
2783-
}
2784-
27852766
static int qed_configure_arfs_searcher(struct qed_dev *cdev,
27862767
enum qed_filter_config_mode mode)
27872768
{
@@ -2904,7 +2885,9 @@ static const struct qed_eth_ops qed_eth_ops_pass = {
29042885
.q_rx_stop = &qed_stop_rxq,
29052886
.q_tx_start = &qed_start_txq,
29062887
.q_tx_stop = &qed_stop_txq,
2907-
.filter_config = &qed_configure_filter,
2888+
.filter_config_rx_mode = &qed_configure_filter_rx_mode,
2889+
.filter_config_ucast = &qed_configure_filter_ucast,
2890+
.filter_config_mcast = &qed_configure_filter_mcast,
29082891
.fastpath_stop = &qed_fastpath_stop,
29092892
.eth_cqe_completion = &qed_fp_cqe_completion,
29102893
.get_vport_stats = &qed_get_vport_stats,

drivers/net/ethernet/qlogic/qede/qede_filter.c

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -619,30 +619,28 @@ static int qede_set_ucast_rx_mac(struct qede_dev *edev,
619619
enum qed_filter_xcast_params_type opcode,
620620
unsigned char mac[ETH_ALEN])
621621
{
622-
struct qed_filter_params filter_cmd;
622+
struct qed_filter_ucast_params ucast;
623623

624-
memset(&filter_cmd, 0, sizeof(filter_cmd));
625-
filter_cmd.type = QED_FILTER_TYPE_UCAST;
626-
filter_cmd.filter.ucast.type = opcode;
627-
filter_cmd.filter.ucast.mac_valid = 1;
628-
ether_addr_copy(filter_cmd.filter.ucast.mac, mac);
624+
memset(&ucast, 0, sizeof(ucast));
625+
ucast.type = opcode;
626+
ucast.mac_valid = 1;
627+
ether_addr_copy(ucast.mac, mac);
629628

630-
return edev->ops->filter_config(edev->cdev, &filter_cmd);
629+
return edev->ops->filter_config_ucast(edev->cdev, &ucast);
631630
}
632631

633632
static int qede_set_ucast_rx_vlan(struct qede_dev *edev,
634633
enum qed_filter_xcast_params_type opcode,
635634
u16 vid)
636635
{
637-
struct qed_filter_params filter_cmd;
636+
struct qed_filter_ucast_params ucast;
638637

639-
memset(&filter_cmd, 0, sizeof(filter_cmd));
640-
filter_cmd.type = QED_FILTER_TYPE_UCAST;
641-
filter_cmd.filter.ucast.type = opcode;
642-
filter_cmd.filter.ucast.vlan_valid = 1;
643-
filter_cmd.filter.ucast.vlan = vid;
638+
memset(&ucast, 0, sizeof(ucast));
639+
ucast.type = opcode;
640+
ucast.vlan_valid = 1;
641+
ucast.vlan = vid;
644642

645-
return edev->ops->filter_config(edev->cdev, &filter_cmd);
643+
return edev->ops->filter_config_ucast(edev->cdev, &ucast);
646644
}
647645

648646
static int qede_config_accept_any_vlan(struct qede_dev *edev, bool action)
@@ -1057,18 +1055,17 @@ static int qede_set_mcast_rx_mac(struct qede_dev *edev,
10571055
enum qed_filter_xcast_params_type opcode,
10581056
unsigned char *mac, int num_macs)
10591057
{
1060-
struct qed_filter_params filter_cmd;
1058+
struct qed_filter_mcast_params mcast;
10611059
int i;
10621060

1063-
memset(&filter_cmd, 0, sizeof(filter_cmd));
1064-
filter_cmd.type = QED_FILTER_TYPE_MCAST;
1065-
filter_cmd.filter.mcast.type = opcode;
1066-
filter_cmd.filter.mcast.num = num_macs;
1061+
memset(&mcast, 0, sizeof(mcast));
1062+
mcast.type = opcode;
1063+
mcast.num = num_macs;
10671064

10681065
for (i = 0; i < num_macs; i++, mac += ETH_ALEN)
1069-
ether_addr_copy(filter_cmd.filter.mcast.mac[i], mac);
1066+
ether_addr_copy(mcast.mac[i], mac);
10701067

1071-
return edev->ops->filter_config(edev->cdev, &filter_cmd);
1068+
return edev->ops->filter_config_mcast(edev->cdev, &mcast);
10721069
}
10731070

10741071
int qede_set_mac_addr(struct net_device *ndev, void *p)
@@ -1194,7 +1191,6 @@ void qede_config_rx_mode(struct net_device *ndev)
11941191
{
11951192
enum qed_filter_rx_mode_type accept_flags;
11961193
struct qede_dev *edev = netdev_priv(ndev);
1197-
struct qed_filter_params rx_mode;
11981194
unsigned char *uc_macs, *temp;
11991195
struct netdev_hw_addr *ha;
12001196
int rc, uc_count;
@@ -1220,10 +1216,6 @@ void qede_config_rx_mode(struct net_device *ndev)
12201216

12211217
netif_addr_unlock_bh(ndev);
12221218

1223-
/* Configure the struct for the Rx mode */
1224-
memset(&rx_mode, 0, sizeof(struct qed_filter_params));
1225-
rx_mode.type = QED_FILTER_TYPE_RX_MODE;
1226-
12271219
/* Remove all previous unicast secondary macs and multicast macs
12281220
* (configure / leave the primary mac)
12291221
*/
@@ -1271,8 +1263,7 @@ void qede_config_rx_mode(struct net_device *ndev)
12711263
qede_config_accept_any_vlan(edev, false);
12721264
}
12731265

1274-
rx_mode.filter.accept_flags = accept_flags;
1275-
edev->ops->filter_config(edev->cdev, &rx_mode);
1266+
edev->ops->filter_config_rx_mode(edev->cdev, accept_flags);
12761267
out:
12771268
kfree(uc_macs);
12781269
}

include/linux/qed/qed_eth_if.h

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -145,24 +145,13 @@ struct qed_filter_mcast_params {
145145
unsigned char mac[64][ETH_ALEN];
146146
};
147147

148-
union qed_filter_type_params {
149-
enum qed_filter_rx_mode_type accept_flags;
150-
struct qed_filter_ucast_params ucast;
151-
struct qed_filter_mcast_params mcast;
152-
};
153-
154148
enum qed_filter_type {
155149
QED_FILTER_TYPE_UCAST,
156150
QED_FILTER_TYPE_MCAST,
157151
QED_FILTER_TYPE_RX_MODE,
158152
QED_MAX_FILTER_TYPES,
159153
};
160154

161-
struct qed_filter_params {
162-
enum qed_filter_type type;
163-
union qed_filter_type_params filter;
164-
};
165-
166155
struct qed_tunn_params {
167156
u16 vxlan_port;
168157
u8 update_vxlan_port;
@@ -314,8 +303,14 @@ struct qed_eth_ops {
314303

315304
int (*q_tx_stop)(struct qed_dev *cdev, u8 rss_id, void *handle);
316305

317-
int (*filter_config)(struct qed_dev *cdev,
318-
struct qed_filter_params *params);
306+
int (*filter_config_rx_mode)(struct qed_dev *cdev,
307+
enum qed_filter_rx_mode_type type);
308+
309+
int (*filter_config_ucast)(struct qed_dev *cdev,
310+
struct qed_filter_ucast_params *params);
311+
312+
int (*filter_config_mcast)(struct qed_dev *cdev,
313+
struct qed_filter_mcast_params *params);
319314

320315
int (*fastpath_stop)(struct qed_dev *cdev);
321316

0 commit comments

Comments
 (0)