From patchwork Thu Jan 10 10:29:00 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Saeed Mahameed X-Patchwork-Id: 1022843 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming-netdev@ozlabs.org Delivered-To: patchwork-incoming-netdev@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=mellanox.com Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 43b2LG0c5vz9sN4 for ; Thu, 10 Jan 2019 21:29:42 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728170AbfAJK3l (ORCPT ); Thu, 10 Jan 2019 05:29:41 -0500 Received: from mail-il-dmz.mellanox.com ([193.47.165.129]:40968 "EHLO mellanox.co.il" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726255AbfAJK3k (ORCPT ); Thu, 10 Jan 2019 05:29:40 -0500 Received: from Internal Mail-Server by MTLPINE1 (envelope-from saeedm@mellanox.com) with ESMTPS (AES256-SHA encrypted); 10 Jan 2019 12:29:34 +0200 Received: from sx1.mtl.com ([172.16.5.7]) by labmailer.mlnx (8.13.8/8.13.8) with ESMTP id x0AATDGI031830; Thu, 10 Jan 2019 12:29:31 +0200 From: Saeed Mahameed To: "David S. Miller" Cc: netdev@vger.kernel.org, Alex Vesker , Feras Daoud , Saeed Mahameed Subject: [net-next 4/9] net/mlx5: Use devlink region_snapshot parameter Date: Thu, 10 Jan 2019 12:29:00 +0200 Message-Id: <20190110102906.3751-5-saeedm@mellanox.com> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190110102906.3751-1-saeedm@mellanox.com> References: <20190110102906.3751-1-saeedm@mellanox.com> MIME-Version: 1.0 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Alex Vesker This parameter enables capturing region snapshot of the crspace during critical errors. The default value of this parameter is disabled, it can be enabled using devlink param commands. It is possible to configure during runtime and also driver init. Signed-off-by: Alex Vesker Reviewed-by: Feras Daoud Reviewed-by: Alex Vesker Signed-off-by: Saeed Mahameed --- .../net/ethernet/mellanox/mlx5/core/Makefile | 2 +- .../net/ethernet/mellanox/mlx5/core/devlink.c | 60 ++++++++++++++++++- .../ethernet/mellanox/mlx5/core/diag/crdump.c | 22 +++++++ .../ethernet/mellanox/mlx5/core/lib/mlx5.h | 2 + 4 files changed, 84 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Makefile b/drivers/net/ethernet/mellanox/mlx5/core/Makefile index f5415e229614..767c411a040c 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/Makefile +++ b/drivers/net/ethernet/mellanox/mlx5/core/Makefile @@ -14,7 +14,7 @@ obj-$(CONFIG_MLX5_CORE) += mlx5_core.o mlx5_core-y := main.o cmd.o debugfs.o fw.o eq.o uar.o pagealloc.o \ health.o mcg.o cq.o alloc.o qp.o port.o mr.o pd.o \ mad.o transobj.o vport.o sriov.o fs_cmd.o fs_core.o \ - fs_counters.o rl.o lag.o dev.o events.o wq.o lib/gid.o \ + fs_counters.o rl.o lag.o dev.o events.o wq.o devlink.o lib/gid.o \ lib/devcom.o lib/pci_vsc.o diag/fs_tracepoint.o diag/fw_tracer.o \ diag/crdump.o diff --git a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c index ddfaf06c910c..88190acae873 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c @@ -2,13 +2,71 @@ /* Copyright (c) 2018 Mellanox Technologies */ #include +#include +#include "lib/mlx5.h" + +static int mlx5_devlink_get_crdump_snapshot(struct devlink *devlink, u32 id, + struct devlink_param_gset_ctx *ctx) +{ + struct mlx5_core_dev *dev = devlink_priv(devlink); + + ctx->val.vbool = mlx5_crdump_is_snapshot_enabled(dev); + return 0; +} + +static int mlx5_devlink_set_crdump_snapshot(struct devlink *devlink, u32 id, + struct devlink_param_gset_ctx *ctx) +{ + struct mlx5_core_dev *dev = devlink_priv(devlink); + + return mlx5_crdump_set_snapshot_enabled(dev, ctx->val.vbool); +} + +static const struct devlink_param mlx5_devlink_params[] = { + DEVLINK_PARAM_GENERIC(REGION_SNAPSHOT, + BIT(DEVLINK_PARAM_CMODE_RUNTIME) | + BIT(DEVLINK_PARAM_CMODE_DRIVERINIT), + mlx5_devlink_get_crdump_snapshot, + mlx5_devlink_set_crdump_snapshot, NULL), +}; int mlx5_devlink_register(struct devlink *devlink, struct device *dev) { - return devlink_register(devlink, dev); + union devlink_param_value init_val; + int err; + + err = devlink_register(devlink, dev); + if (err) { + dev_warn(dev, + "devlink register failed (err = %d)", err); + return err; + } + + err = devlink_params_register(devlink, mlx5_devlink_params, + ARRAY_SIZE(mlx5_devlink_params)); + if (err) { + dev_err(dev, "devlink_params_register failed, err = %d\n", err); + goto unregister; + } + + init_val.vbool = false; + err = devlink_param_driverinit_value_set(devlink, + DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT, + init_val); + if (err) + dev_warn(dev, + "devlink param init failed (err = %d)", err); + + return 0; + +unregister: + devlink_unregister(devlink); + return err; } void mlx5_devlink_unregister(struct devlink *devlink) { + devlink_params_unregister(devlink, mlx5_devlink_params, + ARRAY_SIZE(mlx5_devlink_params)); devlink_unregister(devlink); } diff --git a/drivers/net/ethernet/mellanox/mlx5/core/diag/crdump.c b/drivers/net/ethernet/mellanox/mlx5/core/diag/crdump.c index 78c92d235641..9a87db775c36 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/diag/crdump.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/diag/crdump.c @@ -15,6 +15,7 @@ static const char *region_cr_space_str = "cr-space"; struct mlx5_fw_crdump { u32 size; + bool snapshot_enable; struct devlink_region *region_crspace; }; @@ -97,6 +98,27 @@ int mlx5_crdump_collect(struct mlx5_core_dev *dev) return ret; } +bool mlx5_crdump_is_snapshot_enabled(struct mlx5_core_dev *dev) +{ + struct mlx5_priv *priv = &dev->priv; + + if (mlx5_crdump_enbaled(dev)) + return priv->health.crdump->snapshot_enable; + + return false; +} + +int mlx5_crdump_set_snapshot_enabled(struct mlx5_core_dev *dev, bool value) +{ + struct mlx5_priv *priv = &dev->priv; + + if (!mlx5_crdump_enbaled(dev)) + return -ENODEV; + + priv->health.crdump->snapshot_enable = value; + return 0; +} + int mlx5_crdump_init(struct mlx5_core_dev *dev) { struct devlink *devlink = priv_to_devlink(dev); diff --git a/drivers/net/ethernet/mellanox/mlx5/core/lib/mlx5.h b/drivers/net/ethernet/mellanox/mlx5/core/lib/mlx5.h index 29f4ed7e5034..98ef3341bdf1 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/lib/mlx5.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/lib/mlx5.h @@ -43,6 +43,8 @@ int mlx5_core_reserved_gid_alloc(struct mlx5_core_dev *dev, int *gid_index); void mlx5_core_reserved_gid_free(struct mlx5_core_dev *dev, int gid_index); int mlx5_crdump_init(struct mlx5_core_dev *dev); void mlx5_crdump_cleanup(struct mlx5_core_dev *dev); +bool mlx5_crdump_is_snapshot_enabled(struct mlx5_core_dev *dev); +int mlx5_crdump_set_snapshot_enabled(struct mlx5_core_dev *dev, bool value); /* TODO move to lib/events.h */