Commit 5c624a1d authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'netlink-formatted-extacks'

Edward Cree says:

====================
netlink: formatted extacks

Currently, netlink extacks can only carry fixed string messages, which
 is limiting when reporting failures in complex systems.  This series
 adds the ability to return printf-formatted messages, and uses it in
 the sfc driver's TC offload code.
Formatted extack messages are limited in length to a fixed buffer size,
 currently 80 characters.  If the message exceeds this, the full message
 will be logged (ratelimited) to the console and a truncated version
 returned over netlink.
There is no change to the netlink uAPI; only internal kernel changes
 are needed.
====================

Link: https://lore.kernel.org/r/cover.1666102698.git.ecree.xilinx@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents a526a3cc b799f052
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -43,8 +43,6 @@ 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,
+0 −37
Original line number Diff line number Diff line
@@ -101,14 +101,6 @@ 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)
{
@@ -460,8 +452,6 @@ 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;
	}
@@ -488,39 +478,12 @@ 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)
+0 −2
Original line number Diff line number Diff line
@@ -27,8 +27,6 @@ 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);
+2 −3
Original line number Diff line number Diff line
@@ -265,9 +265,8 @@ int efx_mae_match_check_caps(struct efx_nic *efx,
	rc = efx_mae_match_check_cap_typ(supported_fields[MAE_FIELD_INGRESS_PORT],
					 ingress_port_mask_type);
	if (rc) {
		efx_tc_err(efx, "No support for %s mask in field ingress_port\n",
		NL_SET_ERR_MSG_FMT_MOD(extack, "No support for %s mask in field ingress_port",
				       mask_type_name(ingress_port_mask_type));
		NL_SET_ERR_MSG_MOD(extack, "Unsupported mask type for ingress_port");
		return rc;
	}
	return 0;
+0 −2
Original line number Diff line number Diff line
@@ -855,7 +855,6 @@ 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
@@ -1018,7 +1017,6 @@ 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;
Loading