forked from Minki/linux
sfc: optional logging of TC offload errors
TC offload support will involve complex limitations on what matches and actions a rule can do, in some cases potentially depending on rules already offloaded. So add an ethtool private flag "log-tc-errors" which controls reporting the reasons for un-offloadable TC rules at NETIF_INFO. Signed-off-by: Edward Cree <ecree.xilinx@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
5b2e12d51b
commit
7c9d266d8f
@ -43,6 +43,8 @@ const struct ethtool_ops ef100_ethtool_ops = {
|
||||
.get_pauseparam = efx_ethtool_get_pauseparam,
|
||||
.set_pauseparam = efx_ethtool_set_pauseparam,
|
||||
.get_sset_count = efx_ethtool_get_sset_count,
|
||||
.get_priv_flags = efx_ethtool_get_priv_flags,
|
||||
.set_priv_flags = efx_ethtool_set_priv_flags,
|
||||
.self_test = efx_ethtool_self_test,
|
||||
.get_strings = efx_ethtool_get_strings,
|
||||
.get_link_ksettings = efx_ethtool_get_link_ksettings,
|
||||
|
@ -101,6 +101,14 @@ static const struct efx_sw_stat_desc efx_sw_stat_desc[] = {
|
||||
|
||||
#define EFX_ETHTOOL_SW_STAT_COUNT ARRAY_SIZE(efx_sw_stat_desc)
|
||||
|
||||
static const char efx_ethtool_priv_flags_strings[][ETH_GSTRING_LEN] = {
|
||||
"log-tc-errors",
|
||||
};
|
||||
|
||||
#define EFX_ETHTOOL_PRIV_FLAGS_LOG_TC_ERRS BIT(0)
|
||||
|
||||
#define EFX_ETHTOOL_PRIV_FLAGS_COUNT ARRAY_SIZE(efx_ethtool_priv_flags_strings)
|
||||
|
||||
void efx_ethtool_get_drvinfo(struct net_device *net_dev,
|
||||
struct ethtool_drvinfo *info)
|
||||
{
|
||||
@ -452,6 +460,8 @@ int efx_ethtool_get_sset_count(struct net_device *net_dev, int string_set)
|
||||
efx_ptp_describe_stats(efx, NULL);
|
||||
case ETH_SS_TEST:
|
||||
return efx_ethtool_fill_self_tests(efx, NULL, NULL, NULL);
|
||||
case ETH_SS_PRIV_FLAGS:
|
||||
return EFX_ETHTOOL_PRIV_FLAGS_COUNT;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
@ -478,12 +488,39 @@ void efx_ethtool_get_strings(struct net_device *net_dev,
|
||||
case ETH_SS_TEST:
|
||||
efx_ethtool_fill_self_tests(efx, NULL, strings, NULL);
|
||||
break;
|
||||
case ETH_SS_PRIV_FLAGS:
|
||||
for (i = 0; i < EFX_ETHTOOL_PRIV_FLAGS_COUNT; i++)
|
||||
strscpy(strings + i * ETH_GSTRING_LEN,
|
||||
efx_ethtool_priv_flags_strings[i],
|
||||
ETH_GSTRING_LEN);
|
||||
break;
|
||||
default:
|
||||
/* No other string sets */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
u32 efx_ethtool_get_priv_flags(struct net_device *net_dev)
|
||||
{
|
||||
struct efx_nic *efx = efx_netdev_priv(net_dev);
|
||||
u32 ret_flags = 0;
|
||||
|
||||
if (efx->log_tc_errs)
|
||||
ret_flags |= EFX_ETHTOOL_PRIV_FLAGS_LOG_TC_ERRS;
|
||||
|
||||
return ret_flags;
|
||||
}
|
||||
|
||||
int efx_ethtool_set_priv_flags(struct net_device *net_dev, u32 flags)
|
||||
{
|
||||
struct efx_nic *efx = efx_netdev_priv(net_dev);
|
||||
|
||||
efx->log_tc_errs =
|
||||
!!(flags & EFX_ETHTOOL_PRIV_FLAGS_LOG_TC_ERRS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void efx_ethtool_get_stats(struct net_device *net_dev,
|
||||
struct ethtool_stats *stats,
|
||||
u64 *data)
|
||||
|
@ -27,6 +27,8 @@ int efx_ethtool_fill_self_tests(struct efx_nic *efx,
|
||||
int efx_ethtool_get_sset_count(struct net_device *net_dev, int string_set);
|
||||
void efx_ethtool_get_strings(struct net_device *net_dev, u32 string_set,
|
||||
u8 *strings);
|
||||
u32 efx_ethtool_get_priv_flags(struct net_device *net_dev);
|
||||
int efx_ethtool_set_priv_flags(struct net_device *net_dev, u32 flags);
|
||||
void efx_ethtool_get_stats(struct net_device *net_dev,
|
||||
struct ethtool_stats *stats __attribute__ ((unused)),
|
||||
u64 *data);
|
||||
|
@ -855,6 +855,7 @@ enum efx_xdp_tx_queues_mode {
|
||||
* @timer_max_ns: Interrupt timer maximum value, in nanoseconds
|
||||
* @irq_rx_adaptive: Adaptive IRQ moderation enabled for RX event queues
|
||||
* @irqs_hooked: Channel interrupts are hooked
|
||||
* @log_tc_errs: Error logging for TC filter insertion is enabled
|
||||
* @irq_rx_mod_step_us: Step size for IRQ moderation for RX event queues
|
||||
* @irq_rx_moderation_us: IRQ moderation time for RX event queues
|
||||
* @msg_enable: Log message enable flags
|
||||
@ -1017,6 +1018,7 @@ struct efx_nic {
|
||||
unsigned int timer_max_ns;
|
||||
bool irq_rx_adaptive;
|
||||
bool irqs_hooked;
|
||||
bool log_tc_errs;
|
||||
unsigned int irq_mod_step_us;
|
||||
unsigned int irq_rx_moderation_us;
|
||||
u32 msg_enable;
|
||||
|
@ -14,6 +14,24 @@
|
||||
#include <net/flow_offload.h>
|
||||
#include "net_driver.h"
|
||||
|
||||
/* Error reporting: convenience macros. For indicating why a given filter
|
||||
* insertion is not supported; errors in internal operation or in the
|
||||
* hardware should be netif_err()s instead.
|
||||
*/
|
||||
/* Used when error message is constant. */
|
||||
#define EFX_TC_ERR_MSG(efx, extack, message) do { \
|
||||
NL_SET_ERR_MSG_MOD(extack, message); \
|
||||
if (efx->log_tc_errs) \
|
||||
netif_info(efx, drv, efx->net_dev, "%s\n", message); \
|
||||
} while (0)
|
||||
/* Used when error message is not constant; caller should also supply a
|
||||
* constant extack message with NL_SET_ERR_MSG_MOD().
|
||||
*/
|
||||
#define efx_tc_err(efx, fmt, args...) do { \
|
||||
if (efx->log_tc_errs) \
|
||||
netif_info(efx, drv, efx->net_dev, fmt, ##args);\
|
||||
} while (0)
|
||||
|
||||
struct efx_tc_action_set {
|
||||
u16 deliver:1;
|
||||
u32 dest_mport;
|
||||
|
Loading…
Reference in New Issue
Block a user