* [PATCH v2 net-next 00/11] qed: introduce devlink health support
@ 2020-07-28 8:58 Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 01/11] qed: move out devlink logic into a new file Igor Russkikh
` (10 more replies)
0 siblings, 11 replies; 14+ messages in thread
From: Igor Russkikh @ 2020-07-28 8:58 UTC (permalink / raw)
To: netdev
Cc: David S . Miller, Jakub Kicinski, Ariel Elior, Michal Kalderon,
Igor Russkikh
This is a followup implementation after series
https://patchwork.ozlabs.org/project/netdev/cover/20200514095727.1361-1-irusskikh@marvell.com/
This is an implementation of devlink health infrastructure.
With this we are now able to report HW errors to devlink, and it'll take
its own actions depending on user configuration to capture and store the
dump at the bad moment, and to request the driver to recover the device.
So far we do not differentiate global device failures or specific PCI
function failures. This means that some errors specific to one physical
function will affect an entire device. This is not yet fully designed
and verified, will followup in future.
Solution was verified with artificial HW errors generated, existing
tools for dump analysis could be used.
v2: fix #include issue from kbuild test robot.
Igor Russkikh (11):
qed: move out devlink logic into a new file
qed/qede: make devlink survive recovery
qed: swap param init and publish
qed: fix kconfig help entries
qed: implement devlink info request
qed: health reporter init deinit seq
qed: use devlink logic to report errors
qed*: make use of devlink recovery infrastructure
qed: implement devlink dump
qed: align adjacent indent
qede: make driver reliable on unload after failures
drivers/net/ethernet/qlogic/Kconfig | 5 +-
drivers/net/ethernet/qlogic/qed/Makefile | 1 +
drivers/net/ethernet/qlogic/qed/qed.h | 3 +-
drivers/net/ethernet/qlogic/qed/qed_dev.c | 10 +
drivers/net/ethernet/qlogic/qed/qed_devlink.c | 256 ++++++++++++++++++
drivers/net/ethernet/qlogic/qed/qed_devlink.h | 20 ++
drivers/net/ethernet/qlogic/qed/qed_main.c | 116 +-------
drivers/net/ethernet/qlogic/qede/qede.h | 2 +
drivers/net/ethernet/qlogic/qede/qede_main.c | 35 ++-
include/linux/qed/qed_if.h | 23 +-
10 files changed, 342 insertions(+), 129 deletions(-)
create mode 100644 drivers/net/ethernet/qlogic/qed/qed_devlink.c
create mode 100644 drivers/net/ethernet/qlogic/qed/qed_devlink.h
--
2.17.1
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v2 net-next 01/11] qed: move out devlink logic into a new file
2020-07-28 8:58 [PATCH v2 net-next 00/11] qed: introduce devlink health support Igor Russkikh
@ 2020-07-28 8:58 ` Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 02/11] qed/qede: make devlink survive recovery Igor Russkikh
` (9 subsequent siblings)
10 siblings, 0 replies; 14+ messages in thread
From: Igor Russkikh @ 2020-07-28 8:58 UTC (permalink / raw)
To: netdev
Cc: David S . Miller, Jakub Kicinski, Ariel Elior, Michal Kalderon,
Igor Russkikh, Alexander Lobakin, Michal Kalderon
We are extending devlink infrastructure, thus move the existing
stuff into a new file qed_devlink.c
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
Signed-off-by: Alexander Lobakin <alobakin@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
---
drivers/net/ethernet/qlogic/qed/Makefile | 1 +
drivers/net/ethernet/qlogic/qed/qed_devlink.c | 110 ++++++++++++++++++
drivers/net/ethernet/qlogic/qed/qed_devlink.h | 15 +++
drivers/net/ethernet/qlogic/qed/qed_main.c | 102 +---------------
4 files changed, 127 insertions(+), 101 deletions(-)
create mode 100644 drivers/net/ethernet/qlogic/qed/qed_devlink.c
create mode 100644 drivers/net/ethernet/qlogic/qed/qed_devlink.h
diff --git a/drivers/net/ethernet/qlogic/qed/Makefile b/drivers/net/ethernet/qlogic/qed/Makefile
index f947b105cf14..8251755ec18c 100644
--- a/drivers/net/ethernet/qlogic/qed/Makefile
+++ b/drivers/net/ethernet/qlogic/qed/Makefile
@@ -9,6 +9,7 @@ qed-y := \
qed_dcbx.o \
qed_debug.o \
qed_dev.o \
+ qed_devlink.o \
qed_hw.o \
qed_init_fw_funcs.o \
qed_init_ops.o \
diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.c b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
new file mode 100644
index 000000000000..eb693787c99e
--- /dev/null
+++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/* Marvell/Qlogic FastLinQ NIC driver
+ *
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+
+#include <linux/kernel.h>
+#include "qed.h"
+#include "qed_devlink.h"
+
+enum qed_devlink_param_id {
+ QED_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX,
+ QED_DEVLINK_PARAM_ID_IWARP_CMT,
+};
+
+struct qed_devlink {
+ struct qed_dev *cdev;
+};
+
+static int qed_dl_param_get(struct devlink *dl, u32 id,
+ struct devlink_param_gset_ctx *ctx)
+{
+ struct qed_devlink *qed_dl;
+ struct qed_dev *cdev;
+
+ qed_dl = devlink_priv(dl);
+ cdev = qed_dl->cdev;
+ ctx->val.vbool = cdev->iwarp_cmt;
+
+ return 0;
+}
+
+static int qed_dl_param_set(struct devlink *dl, u32 id,
+ struct devlink_param_gset_ctx *ctx)
+{
+ struct qed_devlink *qed_dl;
+ struct qed_dev *cdev;
+
+ qed_dl = devlink_priv(dl);
+ cdev = qed_dl->cdev;
+ cdev->iwarp_cmt = ctx->val.vbool;
+
+ return 0;
+}
+
+static const struct devlink_param qed_devlink_params[] = {
+ DEVLINK_PARAM_DRIVER(QED_DEVLINK_PARAM_ID_IWARP_CMT,
+ "iwarp_cmt", DEVLINK_PARAM_TYPE_BOOL,
+ BIT(DEVLINK_PARAM_CMODE_RUNTIME),
+ qed_dl_param_get, qed_dl_param_set, NULL),
+};
+
+static const struct devlink_ops qed_dl_ops;
+
+int qed_devlink_register(struct qed_dev *cdev)
+{
+ union devlink_param_value value;
+ struct qed_devlink *qed_dl;
+ struct devlink *dl;
+ int rc;
+
+ dl = devlink_alloc(&qed_dl_ops, sizeof(*qed_dl));
+ if (!dl)
+ return -ENOMEM;
+
+ qed_dl = devlink_priv(dl);
+
+ cdev->dl = dl;
+ qed_dl->cdev = cdev;
+
+ rc = devlink_register(dl, &cdev->pdev->dev);
+ if (rc)
+ goto err_free;
+
+ rc = devlink_params_register(dl, qed_devlink_params,
+ ARRAY_SIZE(qed_devlink_params));
+ if (rc)
+ goto err_unregister;
+
+ value.vbool = false;
+ devlink_param_driverinit_value_set(dl,
+ QED_DEVLINK_PARAM_ID_IWARP_CMT,
+ value);
+
+ devlink_params_publish(dl);
+ cdev->iwarp_cmt = false;
+
+ return 0;
+
+err_unregister:
+ devlink_unregister(dl);
+
+err_free:
+ cdev->dl = NULL;
+ devlink_free(dl);
+
+ return rc;
+}
+
+void qed_devlink_unregister(struct qed_dev *cdev)
+{
+ if (!cdev->dl)
+ return;
+
+ devlink_params_unregister(cdev->dl, qed_devlink_params,
+ ARRAY_SIZE(qed_devlink_params));
+
+ devlink_unregister(cdev->dl);
+ devlink_free(cdev->dl);
+}
diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.h b/drivers/net/ethernet/qlogic/qed/qed_devlink.h
new file mode 100644
index 000000000000..b94c40e9b7c1
--- /dev/null
+++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/* Marvell/Qlogic FastLinQ NIC driver
+ *
+ * Copyright (C) 2020 Marvell International Ltd.
+ */
+#ifndef _QED_DEVLINK_H
+#define _QED_DEVLINK_H
+
+#include <linux/qed/qed_if.h>
+#include <net/devlink.h>
+
+int qed_devlink_register(struct qed_dev *cdev);
+void qed_devlink_unregister(struct qed_dev *cdev);
+
+#endif
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c
index 2558cb680db3..8751355d9ef7 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_main.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_main.c
@@ -39,6 +39,7 @@
#include "qed_hw.h"
#include "qed_selftest.h"
#include "qed_debug.h"
+#include "qed_devlink.h"
#define QED_ROCE_QPS (8192)
#define QED_ROCE_DPIS (8)
@@ -510,107 +511,6 @@ static int qed_set_power_state(struct qed_dev *cdev, pci_power_t state)
return 0;
}
-struct qed_devlink {
- struct qed_dev *cdev;
-};
-
-enum qed_devlink_param_id {
- QED_DEVLINK_PARAM_ID_BASE = DEVLINK_PARAM_GENERIC_ID_MAX,
- QED_DEVLINK_PARAM_ID_IWARP_CMT,
-};
-
-static int qed_dl_param_get(struct devlink *dl, u32 id,
- struct devlink_param_gset_ctx *ctx)
-{
- struct qed_devlink *qed_dl;
- struct qed_dev *cdev;
-
- qed_dl = devlink_priv(dl);
- cdev = qed_dl->cdev;
- ctx->val.vbool = cdev->iwarp_cmt;
-
- return 0;
-}
-
-static int qed_dl_param_set(struct devlink *dl, u32 id,
- struct devlink_param_gset_ctx *ctx)
-{
- struct qed_devlink *qed_dl;
- struct qed_dev *cdev;
-
- qed_dl = devlink_priv(dl);
- cdev = qed_dl->cdev;
- cdev->iwarp_cmt = ctx->val.vbool;
-
- return 0;
-}
-
-static const struct devlink_param qed_devlink_params[] = {
- DEVLINK_PARAM_DRIVER(QED_DEVLINK_PARAM_ID_IWARP_CMT,
- "iwarp_cmt", DEVLINK_PARAM_TYPE_BOOL,
- BIT(DEVLINK_PARAM_CMODE_RUNTIME),
- qed_dl_param_get, qed_dl_param_set, NULL),
-};
-
-static const struct devlink_ops qed_dl_ops;
-
-static int qed_devlink_register(struct qed_dev *cdev)
-{
- union devlink_param_value value;
- struct qed_devlink *qed_dl;
- struct devlink *dl;
- int rc;
-
- dl = devlink_alloc(&qed_dl_ops, sizeof(*qed_dl));
- if (!dl)
- return -ENOMEM;
-
- qed_dl = devlink_priv(dl);
-
- cdev->dl = dl;
- qed_dl->cdev = cdev;
-
- rc = devlink_register(dl, &cdev->pdev->dev);
- if (rc)
- goto err_free;
-
- rc = devlink_params_register(dl, qed_devlink_params,
- ARRAY_SIZE(qed_devlink_params));
- if (rc)
- goto err_unregister;
-
- value.vbool = false;
- devlink_param_driverinit_value_set(dl,
- QED_DEVLINK_PARAM_ID_IWARP_CMT,
- value);
-
- devlink_params_publish(dl);
- cdev->iwarp_cmt = false;
-
- return 0;
-
-err_unregister:
- devlink_unregister(dl);
-
-err_free:
- cdev->dl = NULL;
- devlink_free(dl);
-
- return rc;
-}
-
-static void qed_devlink_unregister(struct qed_dev *cdev)
-{
- if (!cdev->dl)
- return;
-
- devlink_params_unregister(cdev->dl, qed_devlink_params,
- ARRAY_SIZE(qed_devlink_params));
-
- devlink_unregister(cdev->dl);
- devlink_free(cdev->dl);
-}
-
/* probing */
static struct qed_dev *qed_probe(struct pci_dev *pdev,
struct qed_probe_params *params)
--
2.17.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 net-next 02/11] qed/qede: make devlink survive recovery
2020-07-28 8:58 [PATCH v2 net-next 00/11] qed: introduce devlink health support Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 01/11] qed: move out devlink logic into a new file Igor Russkikh
@ 2020-07-28 8:58 ` Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 03/11] qed: swap param init and publish Igor Russkikh
` (8 subsequent siblings)
10 siblings, 0 replies; 14+ messages in thread
From: Igor Russkikh @ 2020-07-28 8:58 UTC (permalink / raw)
To: netdev
Cc: David S . Miller, Jakub Kicinski, Ariel Elior, Michal Kalderon,
Igor Russkikh, Alexander Lobakin, Michal Kalderon
Before that, devlink instance lifecycle was linked to qed_dev object,
that causes devlink to be recreated on each recovery.
Changing it by making higher level driver (qede) responsible for its
life. This way devlink will survive recoveries.
qede will store devlink structure pointer as a part of its device
object, devlink private data contains a linkage structure, it'll
contain extra devlink related content in following patches.
The same lifecycle should be applied to storage drivers (qedf/qedi) later.
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
Signed-off-by: Alexander Lobakin <alobakin@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
---
drivers/net/ethernet/qlogic/qed/qed.h | 1 -
drivers/net/ethernet/qlogic/qed/qed_devlink.c | 40 ++++++++-----------
drivers/net/ethernet/qlogic/qed/qed_devlink.h | 4 +-
drivers/net/ethernet/qlogic/qed/qed_main.c | 10 +----
drivers/net/ethernet/qlogic/qede/qede.h | 1 +
drivers/net/ethernet/qlogic/qede/qede_main.c | 18 +++++++++
include/linux/qed/qed_if.h | 9 +++++
7 files changed, 48 insertions(+), 35 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qed/qed.h b/drivers/net/ethernet/qlogic/qed/qed.h
index b2a7b53ee760..b6ce1488abcc 100644
--- a/drivers/net/ethernet/qlogic/qed/qed.h
+++ b/drivers/net/ethernet/qlogic/qed/qed.h
@@ -849,7 +849,6 @@ struct qed_dev {
u32 rdma_max_srq_sge;
u16 tunn_feature_mask;
- struct devlink *dl;
bool iwarp_cmt;
};
diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.c b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
index eb693787c99e..a62c47c61edf 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_devlink.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
@@ -5,6 +5,7 @@
*/
#include <linux/kernel.h>
+#include <linux/qed/qed_if.h>
#include "qed.h"
#include "qed_devlink.h"
@@ -13,17 +14,12 @@ enum qed_devlink_param_id {
QED_DEVLINK_PARAM_ID_IWARP_CMT,
};
-struct qed_devlink {
- struct qed_dev *cdev;
-};
-
static int qed_dl_param_get(struct devlink *dl, u32 id,
struct devlink_param_gset_ctx *ctx)
{
- struct qed_devlink *qed_dl;
+ struct qed_devlink *qed_dl = devlink_priv(dl);
struct qed_dev *cdev;
- qed_dl = devlink_priv(dl);
cdev = qed_dl->cdev;
ctx->val.vbool = cdev->iwarp_cmt;
@@ -33,10 +29,9 @@ static int qed_dl_param_get(struct devlink *dl, u32 id,
static int qed_dl_param_set(struct devlink *dl, u32 id,
struct devlink_param_gset_ctx *ctx)
{
- struct qed_devlink *qed_dl;
+ struct qed_devlink *qed_dl = devlink_priv(dl);
struct qed_dev *cdev;
- qed_dl = devlink_priv(dl);
cdev = qed_dl->cdev;
cdev->iwarp_cmt = ctx->val.vbool;
@@ -52,21 +47,19 @@ static const struct devlink_param qed_devlink_params[] = {
static const struct devlink_ops qed_dl_ops;
-int qed_devlink_register(struct qed_dev *cdev)
+struct devlink *qed_devlink_register(struct qed_dev *cdev)
{
union devlink_param_value value;
- struct qed_devlink *qed_dl;
+ struct qed_devlink *qdevlink;
struct devlink *dl;
int rc;
- dl = devlink_alloc(&qed_dl_ops, sizeof(*qed_dl));
+ dl = devlink_alloc(&qed_dl_ops, sizeof(struct qed_devlink));
if (!dl)
- return -ENOMEM;
+ return ERR_PTR(-ENOMEM);
- qed_dl = devlink_priv(dl);
-
- cdev->dl = dl;
- qed_dl->cdev = cdev;
+ qdevlink = devlink_priv(dl);
+ qdevlink->cdev = cdev;
rc = devlink_register(dl, &cdev->pdev->dev);
if (rc)
@@ -85,26 +78,25 @@ int qed_devlink_register(struct qed_dev *cdev)
devlink_params_publish(dl);
cdev->iwarp_cmt = false;
- return 0;
+ return dl;
err_unregister:
devlink_unregister(dl);
err_free:
- cdev->dl = NULL;
devlink_free(dl);
- return rc;
+ return ERR_PTR(rc);
}
-void qed_devlink_unregister(struct qed_dev *cdev)
+void qed_devlink_unregister(struct devlink *devlink)
{
- if (!cdev->dl)
+ if (!devlink)
return;
- devlink_params_unregister(cdev->dl, qed_devlink_params,
+ devlink_params_unregister(devlink, qed_devlink_params,
ARRAY_SIZE(qed_devlink_params));
- devlink_unregister(cdev->dl);
- devlink_free(cdev->dl);
+ devlink_unregister(devlink);
+ devlink_free(devlink);
}
diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.h b/drivers/net/ethernet/qlogic/qed/qed_devlink.h
index b94c40e9b7c1..c79dc6bfa194 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_devlink.h
+++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.h
@@ -9,7 +9,7 @@
#include <linux/qed/qed_if.h>
#include <net/devlink.h>
-int qed_devlink_register(struct qed_dev *cdev);
-void qed_devlink_unregister(struct qed_dev *cdev);
+struct devlink *qed_devlink_register(struct qed_dev *cdev);
+void qed_devlink_unregister(struct devlink *devlink);
#endif
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c
index 8751355d9ef7..d6f76421379b 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_main.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_main.c
@@ -539,12 +539,6 @@ static struct qed_dev *qed_probe(struct pci_dev *pdev,
}
DP_INFO(cdev, "PCI init completed successfully\n");
- rc = qed_devlink_register(cdev);
- if (rc) {
- DP_INFO(cdev, "Failed to register devlink.\n");
- goto err2;
- }
-
rc = qed_hw_prepare(cdev, QED_PCI_DEFAULT);
if (rc) {
DP_ERR(cdev, "hw prepare failed\n");
@@ -574,8 +568,6 @@ static void qed_remove(struct qed_dev *cdev)
qed_set_power_state(cdev, PCI_D3hot);
- qed_devlink_unregister(cdev);
-
qed_free_cdev(cdev);
}
@@ -3012,6 +3004,8 @@ const struct qed_common_ops qed_common_ops_pass = {
.get_link = &qed_get_current_link,
.drain = &qed_drain,
.update_msglvl = &qed_init_dp,
+ .devlink_register = qed_devlink_register,
+ .devlink_unregister = qed_devlink_unregister,
.dbg_all_data = &qed_dbg_all_data,
.dbg_all_data_size = &qed_dbg_all_data_size,
.chain_alloc = &qed_chain_alloc,
diff --git a/drivers/net/ethernet/qlogic/qede/qede.h b/drivers/net/ethernet/qlogic/qede/qede.h
index 803c1fcca8ad..1f0e7505a973 100644
--- a/drivers/net/ethernet/qlogic/qede/qede.h
+++ b/drivers/net/ethernet/qlogic/qede/qede.h
@@ -172,6 +172,7 @@ struct qede_dev {
struct qed_dev *cdev;
struct net_device *ndev;
struct pci_dev *pdev;
+ struct devlink *devlink;
u32 dp_module;
u8 dp_level;
diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c
index 1aaae3203f5a..7c2d948b2035 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_main.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_main.c
@@ -1172,10 +1172,23 @@ static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
rc = -ENOMEM;
goto err2;
}
+
+ edev->devlink = qed_ops->common->devlink_register(cdev);
+ if (IS_ERR(edev->devlink)) {
+ DP_NOTICE(edev, "Cannot register devlink\n");
+ edev->devlink = NULL;
+ /* Go on, we can live without devlink */
+ }
} else {
struct net_device *ndev = pci_get_drvdata(pdev);
edev = netdev_priv(ndev);
+
+ if (edev && edev->devlink) {
+ struct qed_devlink *qdl = devlink_priv(edev->devlink);
+
+ qdl->cdev = cdev;
+ }
edev->cdev = cdev;
memset(&edev->stats, 0, sizeof(edev->stats));
memcpy(&edev->dev_info, &dev_info, sizeof(dev_info));
@@ -1298,6 +1311,11 @@ static void __qede_remove(struct pci_dev *pdev, enum qede_remove_mode mode)
qed_ops->common->slowpath_stop(cdev);
if (system_state == SYSTEM_POWER_OFF)
return;
+
+ if (mode != QEDE_REMOVE_RECOVERY && edev->devlink) {
+ qed_ops->common->devlink_unregister(edev->devlink);
+ edev->devlink = NULL;
+ }
qed_ops->common->remove(cdev);
edev->cdev = NULL;
diff --git a/include/linux/qed/qed_if.h b/include/linux/qed/qed_if.h
index cd6a5c7e56eb..d8368e1770df 100644
--- a/include/linux/qed/qed_if.h
+++ b/include/linux/qed/qed_if.h
@@ -21,6 +21,7 @@
#include <linux/qed/common_hsi.h>
#include <linux/qed/qed_chain.h>
#include <linux/io-64-nonatomic-lo-hi.h>
+#include <net/devlink.h>
enum dcbx_protocol_type {
DCBX_PROTOCOL_ISCSI,
@@ -779,6 +780,10 @@ enum qed_nvm_flash_cmd {
QED_NVM_FLASH_CMD_NVM_MAX,
};
+struct qed_devlink {
+ struct qed_dev *cdev;
+};
+
struct qed_common_cb_ops {
void (*arfs_filter_op)(void *dev, void *fltr, u8 fw_rc);
void (*link_update)(void *dev, struct qed_link_output *link);
@@ -1137,6 +1142,10 @@ struct qed_common_ops {
*
*/
int (*set_grc_config)(struct qed_dev *cdev, u32 cfg_id, u32 val);
+
+ struct devlink* (*devlink_register)(struct qed_dev *cdev);
+
+ void (*devlink_unregister)(struct devlink *devlink);
};
#define MASK_FIELD(_name, _value) \
--
2.17.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 net-next 03/11] qed: swap param init and publish
2020-07-28 8:58 [PATCH v2 net-next 00/11] qed: introduce devlink health support Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 01/11] qed: move out devlink logic into a new file Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 02/11] qed/qede: make devlink survive recovery Igor Russkikh
@ 2020-07-28 8:58 ` Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 04/11] qed: fix kconfig help entries Igor Russkikh
` (7 subsequent siblings)
10 siblings, 0 replies; 14+ messages in thread
From: Igor Russkikh @ 2020-07-28 8:58 UTC (permalink / raw)
To: netdev
Cc: David S . Miller, Jakub Kicinski, Ariel Elior, Michal Kalderon,
Igor Russkikh, Alexander Lobakin, Michal Kalderon
In theory that could lead to race condition
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
Signed-off-by: Alexander Lobakin <alobakin@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
---
drivers/net/ethernet/qlogic/qed/qed_devlink.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.c b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
index a62c47c61edf..4e3316c6beb6 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_devlink.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
@@ -75,8 +75,8 @@ struct devlink *qed_devlink_register(struct qed_dev *cdev)
QED_DEVLINK_PARAM_ID_IWARP_CMT,
value);
- devlink_params_publish(dl);
cdev->iwarp_cmt = false;
+ devlink_params_publish(dl);
return dl;
--
2.17.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 net-next 04/11] qed: fix kconfig help entries
2020-07-28 8:58 [PATCH v2 net-next 00/11] qed: introduce devlink health support Igor Russkikh
` (2 preceding siblings ...)
2020-07-28 8:58 ` [PATCH v2 net-next 03/11] qed: swap param init and publish Igor Russkikh
@ 2020-07-28 8:58 ` Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 05/11] qed: implement devlink info request Igor Russkikh
` (6 subsequent siblings)
10 siblings, 0 replies; 14+ messages in thread
From: Igor Russkikh @ 2020-07-28 8:58 UTC (permalink / raw)
To: netdev
Cc: David S . Miller, Jakub Kicinski, Ariel Elior, Michal Kalderon,
Igor Russkikh, Alexander Lobakin, Michal Kalderon
This patch replaces stubs in kconfig help entries with an actual description.
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
Signed-off-by: Alexander Lobakin <alobakin@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
---
drivers/net/ethernet/qlogic/Kconfig | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/Kconfig b/drivers/net/ethernet/qlogic/Kconfig
index 8f743d80760b..4366c7a8de95 100644
--- a/drivers/net/ethernet/qlogic/Kconfig
+++ b/drivers/net/ethernet/qlogic/Kconfig
@@ -80,7 +80,7 @@ config QED
select CRC8
select NET_DEVLINK
help
- This enables the support for ...
+ This enables the support for Marvell FastLinQ adapters family.
config QED_LL2
bool
@@ -100,7 +100,8 @@ config QEDE
depends on QED
imply PTP_1588_CLOCK
help
- This enables the support for ...
+ This enables the support for Marvell FastLinQ adapters family,
+ ethernet driver.
config QED_RDMA
bool
--
2.17.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 net-next 05/11] qed: implement devlink info request
2020-07-28 8:58 [PATCH v2 net-next 00/11] qed: introduce devlink health support Igor Russkikh
` (3 preceding siblings ...)
2020-07-28 8:58 ` [PATCH v2 net-next 04/11] qed: fix kconfig help entries Igor Russkikh
@ 2020-07-28 8:58 ` Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 06/11] qed: health reporter init deinit seq Igor Russkikh
` (5 subsequent siblings)
10 siblings, 0 replies; 14+ messages in thread
From: Igor Russkikh @ 2020-07-28 8:58 UTC (permalink / raw)
To: netdev
Cc: David S . Miller, Jakub Kicinski, Ariel Elior, Michal Kalderon,
Igor Russkikh, Alexander Lobakin, Michal Kalderon
Here we return existing fw & mfw versions, we also fetch device's
serial number.
The base device specific structure (qed_dev_info) was not directly
available to the base driver before.
Thus, here we create and store a private copy of this structure
in qed_dev root object.
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
Signed-off-by: Alexander Lobakin <alobakin@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
---
drivers/net/ethernet/qlogic/qed/qed.h | 1 +
drivers/net/ethernet/qlogic/qed/qed_dev.c | 10 ++++
drivers/net/ethernet/qlogic/qed/qed_devlink.c | 52 ++++++++++++++++++-
drivers/net/ethernet/qlogic/qed/qed_main.c | 1 +
4 files changed, 63 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/qlogic/qed/qed.h b/drivers/net/ethernet/qlogic/qed/qed.h
index b6ce1488abcc..ccd789eeda3e 100644
--- a/drivers/net/ethernet/qlogic/qed/qed.h
+++ b/drivers/net/ethernet/qlogic/qed/qed.h
@@ -807,6 +807,7 @@ struct qed_dev {
struct qed_llh_info *p_llh_info;
/* Linux specific here */
+ struct qed_dev_info common_dev_info;
struct qede_dev *edev;
struct pci_dev *pdev;
u32 flags;
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c
index b3c9ebaf2280..377950ce8ea2 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
@@ -4290,6 +4290,16 @@ static int qed_hw_get_nvm_info(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
__set_bit(QED_DEV_CAP_ROCE,
&p_hwfn->hw_info.device_capabilities);
+ /* Read device serial number information from shmem */
+ addr = MCP_REG_SCRATCH + nvm_cfg1_offset +
+ offsetof(struct nvm_cfg1, glob) +
+ offsetof(struct nvm_cfg1_glob, serial_number);
+
+ p_hwfn->hw_info.part_num[0] = qed_rd(p_hwfn, p_ptt, addr);
+ p_hwfn->hw_info.part_num[1] = qed_rd(p_hwfn, p_ptt, addr + 4);
+ p_hwfn->hw_info.part_num[2] = qed_rd(p_hwfn, p_ptt, addr + 8);
+ p_hwfn->hw_info.part_num[3] = qed_rd(p_hwfn, p_ptt, addr + 12);
+
return qed_mcp_fill_shmem_func_info(p_hwfn, p_ptt);
}
diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.c b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
index 4e3316c6beb6..5bd5528dc409 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_devlink.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
@@ -45,7 +45,57 @@ static const struct devlink_param qed_devlink_params[] = {
qed_dl_param_get, qed_dl_param_set, NULL),
};
-static const struct devlink_ops qed_dl_ops;
+static int qed_devlink_info_get(struct devlink *devlink,
+ struct devlink_info_req *req,
+ struct netlink_ext_ack *extack)
+{
+ struct qed_devlink *qed_dl = devlink_priv(devlink);
+ struct qed_dev *cdev = qed_dl->cdev;
+ struct qed_dev_info *dev_info;
+ char buf[100];
+ int err;
+
+ dev_info = &cdev->common_dev_info;
+
+ err = devlink_info_driver_name_put(req, KBUILD_MODNAME);
+ if (err)
+ return err;
+
+ memcpy(buf, cdev->hwfns[0].hw_info.part_num, sizeof(cdev->hwfns[0].hw_info.part_num));
+ buf[sizeof(cdev->hwfns[0].hw_info.part_num)] = 0;
+
+ if (buf[0]) {
+ err = devlink_info_serial_number_put(req, buf);
+ if (err)
+ return err;
+ }
+
+ snprintf(buf, sizeof(buf), "%d.%d.%d.%d",
+ GET_MFW_FIELD(dev_info->mfw_rev, QED_MFW_VERSION_3),
+ GET_MFW_FIELD(dev_info->mfw_rev, QED_MFW_VERSION_2),
+ GET_MFW_FIELD(dev_info->mfw_rev, QED_MFW_VERSION_1),
+ GET_MFW_FIELD(dev_info->mfw_rev, QED_MFW_VERSION_0));
+
+ err = devlink_info_version_stored_put(req,
+ DEVLINK_INFO_VERSION_GENERIC_FW_MGMT, buf);
+ if (err)
+ return err;
+
+ snprintf(buf, sizeof(buf), "%d.%d.%d.%d",
+ dev_info->fw_major,
+ dev_info->fw_minor,
+ dev_info->fw_rev,
+ dev_info->fw_eng);
+
+ err = devlink_info_version_running_put(req,
+ DEVLINK_INFO_VERSION_GENERIC_FW, buf);
+
+ return err;
+}
+
+static const struct devlink_ops qed_dl_ops = {
+ .info_get = qed_devlink_info_get,
+};
struct devlink *qed_devlink_register(struct qed_dev *cdev)
{
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c
index d6f76421379b..d1a559ccf516 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_main.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_main.c
@@ -479,6 +479,7 @@ int qed_fill_dev_info(struct qed_dev *cdev,
}
dev_info->mtu = hw_info->mtu;
+ cdev->common_dev_info = *dev_info;
return 0;
}
--
2.17.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 net-next 06/11] qed: health reporter init deinit seq
2020-07-28 8:58 [PATCH v2 net-next 00/11] qed: introduce devlink health support Igor Russkikh
` (4 preceding siblings ...)
2020-07-28 8:58 ` [PATCH v2 net-next 05/11] qed: implement devlink info request Igor Russkikh
@ 2020-07-28 8:58 ` Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 07/11] qed: use devlink logic to report errors Igor Russkikh
` (4 subsequent siblings)
10 siblings, 0 replies; 14+ messages in thread
From: Igor Russkikh @ 2020-07-28 8:58 UTC (permalink / raw)
To: netdev
Cc: David S . Miller, Jakub Kicinski, Ariel Elior, Michal Kalderon,
Igor Russkikh, Alexander Lobakin, Michal Kalderon
Here we declare health reporter ops (empty for now)
and register these in qed probe and remove callbacks.
This way we get devlink attached to all kind of qed* PCI
device entities: networking or storage offload entity.
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
Signed-off-by: Alexander Lobakin <alobakin@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
---
drivers/net/ethernet/qlogic/qed/qed_devlink.c | 30 +++++++++++++++++++
drivers/net/ethernet/qlogic/qed/qed_devlink.h | 3 ++
include/linux/qed/qed_if.h | 1 +
3 files changed, 34 insertions(+)
diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.c b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
index 5bd5528dc409..843a35f14cca 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_devlink.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
@@ -14,6 +14,34 @@ enum qed_devlink_param_id {
QED_DEVLINK_PARAM_ID_IWARP_CMT,
};
+static const struct devlink_health_reporter_ops qed_fw_fatal_reporter_ops = {
+ .name = "fw_fatal",
+};
+
+#define QED_REPORTER_FW_GRACEFUL_PERIOD 1200000
+
+void qed_fw_reporters_create(struct devlink *devlink)
+{
+ struct qed_devlink *dl = devlink_priv(devlink);
+
+ dl->fw_reporter = devlink_health_reporter_create(devlink, &qed_fw_fatal_reporter_ops,
+ QED_REPORTER_FW_GRACEFUL_PERIOD, dl);
+ if (IS_ERR(dl->fw_reporter))
+ DP_NOTICE(dl->cdev, "Failed to create fw reporter, err = %ld\n",
+ PTR_ERR(dl->fw_reporter));
+}
+
+void qed_fw_reporters_destroy(struct devlink *devlink)
+{
+ struct qed_devlink *dl = devlink_priv(devlink);
+ struct devlink_health_reporter *rep;
+
+ rep = dl->fw_reporter;
+
+ if (!IS_ERR_OR_NULL(rep))
+ devlink_health_reporter_destroy(rep);
+}
+
static int qed_dl_param_get(struct devlink *dl, u32 id,
struct devlink_param_gset_ctx *ctx)
{
@@ -144,6 +172,8 @@ void qed_devlink_unregister(struct devlink *devlink)
if (!devlink)
return;
+ qed_fw_reporters_destroy(devlink);
+
devlink_params_unregister(devlink, qed_devlink_params,
ARRAY_SIZE(qed_devlink_params));
diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.h b/drivers/net/ethernet/qlogic/qed/qed_devlink.h
index c79dc6bfa194..c68ecf778826 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_devlink.h
+++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.h
@@ -12,4 +12,7 @@
struct devlink *qed_devlink_register(struct qed_dev *cdev);
void qed_devlink_unregister(struct devlink *devlink);
+void qed_fw_reporters_create(struct devlink *devlink);
+void qed_fw_reporters_destroy(struct devlink *devlink);
+
#endif
diff --git a/include/linux/qed/qed_if.h b/include/linux/qed/qed_if.h
index d8368e1770df..30fe06fe06a0 100644
--- a/include/linux/qed/qed_if.h
+++ b/include/linux/qed/qed_if.h
@@ -782,6 +782,7 @@ enum qed_nvm_flash_cmd {
struct qed_devlink {
struct qed_dev *cdev;
+ struct devlink_health_reporter *fw_reporter;
};
struct qed_common_cb_ops {
--
2.17.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 net-next 07/11] qed: use devlink logic to report errors
2020-07-28 8:58 [PATCH v2 net-next 00/11] qed: introduce devlink health support Igor Russkikh
` (5 preceding siblings ...)
2020-07-28 8:58 ` [PATCH v2 net-next 06/11] qed: health reporter init deinit seq Igor Russkikh
@ 2020-07-28 8:58 ` Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 08/11] qed*: make use of devlink recovery infrastructure Igor Russkikh
` (3 subsequent siblings)
10 siblings, 0 replies; 14+ messages in thread
From: Igor Russkikh @ 2020-07-28 8:58 UTC (permalink / raw)
To: netdev
Cc: David S . Miller, Jakub Kicinski, Ariel Elior, Michal Kalderon,
Igor Russkikh, Alexander Lobakin, Michal Kalderon
Use devlink_health_report to push error indications.
We implement this in qede via callback function to make it possible
to reuse the same for other drivers sitting on top of qed in future.
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
Signed-off-by: Alexander Lobakin <alobakin@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
---
drivers/net/ethernet/qlogic/qed/qed_devlink.c | 17 +++++++++++++++++
drivers/net/ethernet/qlogic/qed/qed_devlink.h | 2 ++
drivers/net/ethernet/qlogic/qed/qed_main.c | 1 +
drivers/net/ethernet/qlogic/qede/qede.h | 1 +
drivers/net/ethernet/qlogic/qede/qede_main.c | 5 ++++-
include/linux/qed/qed_if.h | 3 +++
6 files changed, 28 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.c b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
index 843a35f14cca..ffe776a4f99a 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_devlink.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
@@ -14,6 +14,23 @@ enum qed_devlink_param_id {
QED_DEVLINK_PARAM_ID_IWARP_CMT,
};
+struct qed_fw_fatal_ctx {
+ enum qed_hw_err_type err_type;
+};
+
+int qed_report_fatal_error(struct devlink *devlink, enum qed_hw_err_type err_type)
+{
+ struct qed_devlink *qdl = devlink_priv(devlink);
+ struct qed_fw_fatal_ctx fw_fatal_ctx = {
+ .err_type = err_type,
+ };
+
+ devlink_health_report(qdl->fw_reporter,
+ "Fatal error reported", &fw_fatal_ctx);
+
+ return 0;
+}
+
static const struct devlink_health_reporter_ops qed_fw_fatal_reporter_ops = {
.name = "fw_fatal",
};
diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.h b/drivers/net/ethernet/qlogic/qed/qed_devlink.h
index c68ecf778826..ccc7d1d1bfd4 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_devlink.h
+++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.h
@@ -15,4 +15,6 @@ void qed_devlink_unregister(struct devlink *devlink);
void qed_fw_reporters_create(struct devlink *devlink);
void qed_fw_reporters_destroy(struct devlink *devlink);
+int qed_report_fatal_error(struct devlink *dl, enum qed_hw_err_type err_type);
+
#endif
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c
index d1a559ccf516..a64d594f9294 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_main.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_main.c
@@ -3007,6 +3007,7 @@ const struct qed_common_ops qed_common_ops_pass = {
.update_msglvl = &qed_init_dp,
.devlink_register = qed_devlink_register,
.devlink_unregister = qed_devlink_unregister,
+ .report_fatal_error = qed_report_fatal_error,
.dbg_all_data = &qed_dbg_all_data,
.dbg_all_data_size = &qed_dbg_all_data_size,
.chain_alloc = &qed_chain_alloc,
diff --git a/drivers/net/ethernet/qlogic/qede/qede.h b/drivers/net/ethernet/qlogic/qede/qede.h
index 1f0e7505a973..3efc5899f656 100644
--- a/drivers/net/ethernet/qlogic/qede/qede.h
+++ b/drivers/net/ethernet/qlogic/qede/qede.h
@@ -264,6 +264,7 @@ struct qede_dev {
struct bpf_prog *xdp_prog;
+ enum qed_hw_err_type last_err_type;
unsigned long err_flags;
#define QEDE_ERR_IS_HANDLED 31
#define QEDE_ERR_ATTN_CLR_EN 0
diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c
index 7c2d948b2035..df437c3f1fc9 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_main.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_main.c
@@ -1181,7 +1181,6 @@ static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
}
} else {
struct net_device *ndev = pci_get_drvdata(pdev);
-
edev = netdev_priv(ndev);
if (edev && edev->devlink) {
@@ -2603,6 +2602,9 @@ static void qede_generic_hw_err_handler(struct qede_dev *edev)
"Generic sleepable HW error handling started - err_flags 0x%lx\n",
edev->err_flags);
+ if (edev->devlink)
+ edev->ops->common->report_fatal_error(edev->devlink, edev->last_err_type);
+
/* Trigger a recovery process.
* This is placed in the sleep requiring section just to make
* sure it is the last one, and that all the other operations
@@ -2663,6 +2665,7 @@ static void qede_schedule_hw_err_handler(void *dev,
return;
}
+ edev->last_err_type = err_type;
qede_set_hw_err_flags(edev, err_type);
qede_atomic_hw_err_handler(edev);
set_bit(QEDE_SP_HW_ERR, &edev->sp_flags);
diff --git a/include/linux/qed/qed_if.h b/include/linux/qed/qed_if.h
index 30fe06fe06a0..1297726f2b25 100644
--- a/include/linux/qed/qed_if.h
+++ b/include/linux/qed/qed_if.h
@@ -906,6 +906,9 @@ struct qed_common_ops {
int (*dbg_all_data_size) (struct qed_dev *cdev);
+ int (*report_fatal_error)(struct devlink *devlink,
+ enum qed_hw_err_type err_type);
+
/**
* @brief can_link_change - can the instance change the link or not
*
--
2.17.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 net-next 08/11] qed*: make use of devlink recovery infrastructure
2020-07-28 8:58 [PATCH v2 net-next 00/11] qed: introduce devlink health support Igor Russkikh
` (6 preceding siblings ...)
2020-07-28 8:58 ` [PATCH v2 net-next 07/11] qed: use devlink logic to report errors Igor Russkikh
@ 2020-07-28 8:58 ` Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 09/11] qed: implement devlink dump Igor Russkikh
` (2 subsequent siblings)
10 siblings, 0 replies; 14+ messages in thread
From: Igor Russkikh @ 2020-07-28 8:58 UTC (permalink / raw)
To: netdev
Cc: David S . Miller, Jakub Kicinski, Ariel Elior, Michal Kalderon,
Igor Russkikh, Alexander Lobakin, Michal Kalderon
Remove forcible recovery trigger and put it as a normal devlink
callback.
This allows user to enable/disable it via
devlink health set pci/0000:03:00.0 reporter fw_fatal auto_recover false
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
Signed-off-by: Alexander Lobakin <alobakin@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
---
drivers/net/ethernet/qlogic/qed/qed.h | 1 +
drivers/net/ethernet/qlogic/qed/qed_devlink.c | 14 ++++++++++++++
drivers/net/ethernet/qlogic/qed/qed_main.c | 2 +-
drivers/net/ethernet/qlogic/qede/qede_main.c | 10 ----------
4 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/drivers/net/ethernet/qlogic/qed/qed.h b/drivers/net/ethernet/qlogic/qed/qed.h
index ccd789eeda3e..f34b25a79449 100644
--- a/drivers/net/ethernet/qlogic/qed/qed.h
+++ b/drivers/net/ethernet/qlogic/qed/qed.h
@@ -981,6 +981,7 @@ void qed_bw_update(struct qed_hwfn *hwfn, struct qed_ptt *ptt);
u32 qed_unzip_data(struct qed_hwfn *p_hwfn,
u32 input_len, u8 *input_buf,
u32 max_size, u8 *unzip_buf);
+int qed_recovery_process(struct qed_dev *cdev);
void qed_schedule_recovery_handler(struct qed_hwfn *p_hwfn);
void qed_hw_error_occurred(struct qed_hwfn *p_hwfn,
enum qed_hw_err_type err_type);
diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.c b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
index ffe776a4f99a..b25be68f959c 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_devlink.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
@@ -31,8 +31,22 @@ int qed_report_fatal_error(struct devlink *devlink, enum qed_hw_err_type err_typ
return 0;
}
+static int
+qed_fw_fatal_reporter_recover(struct devlink_health_reporter *reporter,
+ void *priv_ctx,
+ struct netlink_ext_ack *extack)
+{
+ struct qed_devlink *qdl = devlink_health_reporter_priv(reporter);
+ struct qed_dev *cdev = qdl->cdev;
+
+ qed_recovery_process(cdev);
+
+ return 0;
+}
+
static const struct devlink_health_reporter_ops qed_fw_fatal_reporter_ops = {
.name = "fw_fatal",
+ .recover = qed_fw_fatal_reporter_recover,
};
#define QED_REPORTER_FW_GRACEFUL_PERIOD 1200000
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c
index a64d594f9294..db5d003770ba 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_main.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_main.c
@@ -2817,7 +2817,7 @@ static int qed_set_led(struct qed_dev *cdev, enum qed_led_mode mode)
return status;
}
-static int qed_recovery_process(struct qed_dev *cdev)
+int qed_recovery_process(struct qed_dev *cdev)
{
struct qed_hwfn *p_hwfn = QED_LEADING_HWFN(cdev);
struct qed_ptt *p_ptt;
diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c
index df437c3f1fc9..937d8e69ad39 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_main.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_main.c
@@ -2596,8 +2596,6 @@ static void qede_atomic_hw_err_handler(struct qede_dev *edev)
static void qede_generic_hw_err_handler(struct qede_dev *edev)
{
- struct qed_dev *cdev = edev->cdev;
-
DP_NOTICE(edev,
"Generic sleepable HW error handling started - err_flags 0x%lx\n",
edev->err_flags);
@@ -2605,14 +2603,6 @@ static void qede_generic_hw_err_handler(struct qede_dev *edev)
if (edev->devlink)
edev->ops->common->report_fatal_error(edev->devlink, edev->last_err_type);
- /* Trigger a recovery process.
- * This is placed in the sleep requiring section just to make
- * sure it is the last one, and that all the other operations
- * were completed.
- */
- if (test_bit(QEDE_ERR_IS_RECOVERABLE, &edev->err_flags))
- edev->ops->common->recovery_process(cdev);
-
clear_bit(QEDE_ERR_IS_HANDLED, &edev->err_flags);
DP_NOTICE(edev, "Generic sleepable HW error handling is done\n");
--
2.17.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 net-next 09/11] qed: implement devlink dump
2020-07-28 8:58 [PATCH v2 net-next 00/11] qed: introduce devlink health support Igor Russkikh
` (7 preceding siblings ...)
2020-07-28 8:58 ` [PATCH v2 net-next 08/11] qed*: make use of devlink recovery infrastructure Igor Russkikh
@ 2020-07-28 8:58 ` Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 10/11] qed: align adjacent indent Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 11/11] qede: make driver reliable on unload after failures Igor Russkikh
10 siblings, 0 replies; 14+ messages in thread
From: Igor Russkikh @ 2020-07-28 8:58 UTC (permalink / raw)
To: netdev
Cc: David S . Miller, Jakub Kicinski, Ariel Elior, Michal Kalderon,
Igor Russkikh, Alexander Lobakin, Michal Kalderon
Gather and push out full device dump to devlink.
Device dump is the same as with `ethtool -d`, but now its generated
exactly at the moment bad thing happens.
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
Signed-off-by: Alexander Lobakin <alobakin@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
---
drivers/net/ethernet/qlogic/qed/qed_devlink.c | 43 +++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/drivers/net/ethernet/qlogic/qed/qed_devlink.c b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
index b25be68f959c..904babe70489 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_devlink.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_devlink.c
@@ -6,6 +6,7 @@
#include <linux/kernel.h>
#include <linux/qed/qed_if.h>
+#include <linux/vmalloc.h>
#include "qed.h"
#include "qed_devlink.h"
@@ -31,6 +32,47 @@ int qed_report_fatal_error(struct devlink *devlink, enum qed_hw_err_type err_typ
return 0;
}
+static int
+qed_fw_fatal_reporter_dump(struct devlink_health_reporter *reporter,
+ struct devlink_fmsg *fmsg, void *priv_ctx,
+ struct netlink_ext_ack *extack)
+{
+ struct qed_devlink *qdl = devlink_health_reporter_priv(reporter);
+ struct qed_fw_fatal_ctx *fw_fatal_ctx = priv_ctx;
+ struct qed_dev *cdev = qdl->cdev;
+ u32 dbg_data_buf_size;
+ u8 *p_dbg_data_buf;
+ int err;
+
+ /* Having context means that was a dump request after fatal,
+ * so we enable extra debugging while gathering the dump,
+ * just in case
+ */
+ cdev->print_dbg_data = fw_fatal_ctx ? true : false;
+
+ dbg_data_buf_size = qed_dbg_all_data_size(cdev);
+ p_dbg_data_buf = vzalloc(dbg_data_buf_size);
+ if (!p_dbg_data_buf) {
+ DP_NOTICE(cdev,
+ "Failed to allocate memory for a debug data buffer\n");
+ return -ENOMEM;
+ }
+
+ err = qed_dbg_all_data(cdev, p_dbg_data_buf);
+ if (err) {
+ DP_NOTICE(cdev, "Failed to obtain debug data\n");
+ vfree(p_dbg_data_buf);
+ return err;
+ }
+
+ err = devlink_fmsg_binary_pair_put(fmsg, "dump_data",
+ p_dbg_data_buf, dbg_data_buf_size);
+
+ vfree(p_dbg_data_buf);
+
+ return err;
+}
+
static int
qed_fw_fatal_reporter_recover(struct devlink_health_reporter *reporter,
void *priv_ctx,
@@ -47,6 +89,7 @@ qed_fw_fatal_reporter_recover(struct devlink_health_reporter *reporter,
static const struct devlink_health_reporter_ops qed_fw_fatal_reporter_ops = {
.name = "fw_fatal",
.recover = qed_fw_fatal_reporter_recover,
+ .dump = qed_fw_fatal_reporter_dump,
};
#define QED_REPORTER_FW_GRACEFUL_PERIOD 1200000
--
2.17.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 net-next 10/11] qed: align adjacent indent
2020-07-28 8:58 [PATCH v2 net-next 00/11] qed: introduce devlink health support Igor Russkikh
` (8 preceding siblings ...)
2020-07-28 8:58 ` [PATCH v2 net-next 09/11] qed: implement devlink dump Igor Russkikh
@ 2020-07-28 8:58 ` Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 11/11] qede: make driver reliable on unload after failures Igor Russkikh
10 siblings, 0 replies; 14+ messages in thread
From: Igor Russkikh @ 2020-07-28 8:58 UTC (permalink / raw)
To: netdev
Cc: David S . Miller, Jakub Kicinski, Ariel Elior, Michal Kalderon,
Igor Russkikh, Alexander Lobakin, Michal Kalderon
Fix indent on some of adjacent declarations.
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
Signed-off-by: Alexander Lobakin <alobakin@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
---
include/linux/qed/qed_if.h | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/include/linux/qed/qed_if.h b/include/linux/qed/qed_if.h
index 1297726f2b25..b8fb80c9be80 100644
--- a/include/linux/qed/qed_if.h
+++ b/include/linux/qed/qed_if.h
@@ -897,14 +897,14 @@ struct qed_common_ops {
void (*simd_handler_clean)(struct qed_dev *cdev,
int index);
- int (*dbg_grc)(struct qed_dev *cdev,
- void *buffer, u32 *num_dumped_bytes);
+ int (*dbg_grc)(struct qed_dev *cdev,
+ void *buffer, u32 *num_dumped_bytes);
- int (*dbg_grc_size)(struct qed_dev *cdev);
+ int (*dbg_grc_size)(struct qed_dev *cdev);
- int (*dbg_all_data) (struct qed_dev *cdev, void *buffer);
+ int (*dbg_all_data)(struct qed_dev *cdev, void *buffer);
- int (*dbg_all_data_size) (struct qed_dev *cdev);
+ int (*dbg_all_data_size)(struct qed_dev *cdev);
int (*report_fatal_error)(struct devlink *devlink,
enum qed_hw_err_type err_type);
--
2.17.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 net-next 11/11] qede: make driver reliable on unload after failures
2020-07-28 8:58 [PATCH v2 net-next 00/11] qed: introduce devlink health support Igor Russkikh
` (9 preceding siblings ...)
2020-07-28 8:58 ` [PATCH v2 net-next 10/11] qed: align adjacent indent Igor Russkikh
@ 2020-07-28 8:58 ` Igor Russkikh
2020-07-28 16:04 ` kernel test robot
10 siblings, 1 reply; 14+ messages in thread
From: Igor Russkikh @ 2020-07-28 8:58 UTC (permalink / raw)
To: netdev
Cc: David S . Miller, Jakub Kicinski, Ariel Elior, Michal Kalderon,
Igor Russkikh, Alexander Lobakin, Michal Kalderon
First, we check cdev for null on dev close. That could be a case
if recovery was not successful.
Next, we nullify cdev if something bad happens on recovery, to
not to access freed memory accidentially.
Signed-off-by: Igor Russkikh <irusskikh@marvell.com>
Signed-off-by: Alexander Lobakin <alobakin@marvell.com>
Signed-off-by: Michal Kalderon <michal.kalderon@marvell.com>
---
drivers/net/ethernet/qlogic/qede/qede_main.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c
index 937d8e69ad39..03b0c943b759 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_main.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_main.c
@@ -1244,6 +1244,7 @@ static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
qed_ops->common->slowpath_stop(cdev);
err1:
qed_ops->common->remove(cdev);
+ edev->cdev = NULL;
err0:
return rc;
}
@@ -2474,7 +2475,8 @@ static int qede_close(struct net_device *ndev)
qede_unload(edev, QEDE_UNLOAD_NORMAL, false);
- edev->ops->common->update_drv_state(edev->cdev, false);
+ if (edev->cdev)
+ edev->ops->common->update_drv_state(edev->cdev, false);
return 0;
}
--
2.17.1
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v2 net-next 11/11] qede: make driver reliable on unload after failures
2020-07-28 8:58 ` [PATCH v2 net-next 11/11] qede: make driver reliable on unload after failures Igor Russkikh
@ 2020-07-28 16:04 ` kernel test robot
0 siblings, 0 replies; 14+ messages in thread
From: kernel test robot @ 2020-07-28 16:04 UTC (permalink / raw)
To: Igor Russkikh, netdev
Cc: kbuild-all, clang-built-linux, David S . Miller, Jakub Kicinski,
Ariel Elior, Michal Kalderon, Igor Russkikh, Alexander Lobakin
[-- Attachment #1: Type: text/plain, Size: 12079 bytes --]
Hi Igor,
I love your patch! Perhaps something to improve:
[auto build test WARNING on net-next/master]
url: https://github.com/0day-ci/linux/commits/Igor-Russkikh/qed-introduce-devlink-health-support/20200728-170206
base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 5e619d73e6797ed9f2554a1bf996d52d8c91ca50
config: x86_64-randconfig-a003-20200728 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project e57464151d4c4912a7ec4d6fd0920056b2f75c7c)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/net/ethernet/qlogic/qede/qede_main.c:1165:6: warning: variable 'edev' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (rc)
^~
drivers/net/ethernet/qlogic/qede/qede_main.c:1247:2: note: uninitialized use occurs here
edev->cdev = NULL;
^~~~
drivers/net/ethernet/qlogic/qede/qede_main.c:1165:2: note: remove the 'if' if its condition is always false
if (rc)
^~~~~~~
drivers/net/ethernet/qlogic/qede/qede_main.c:1158:6: warning: variable 'edev' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (rc) {
^~
drivers/net/ethernet/qlogic/qede/qede_main.c:1247:2: note: uninitialized use occurs here
edev->cdev = NULL;
^~~~
drivers/net/ethernet/qlogic/qede/qede_main.c:1158:2: note: remove the 'if' if its condition is always false
if (rc) {
^~~~~~~~~
drivers/net/ethernet/qlogic/qede/qede_main.c:1128:23: note: initialize the variable 'edev' to silence this warning
struct qede_dev *edev;
^
= NULL
2 warnings generated.
vim +1165 drivers/net/ethernet/qlogic/qede/qede_main.c
2950219d87b040 Yuval Mintz 2015-10-26 1121
2950219d87b040 Yuval Mintz 2015-10-26 1122 static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
1408cc1fa48c54 Yuval Mintz 2016-05-11 1123 bool is_vf, enum qede_probe_mode mode)
2950219d87b040 Yuval Mintz 2015-10-26 1124 {
1408cc1fa48c54 Yuval Mintz 2016-05-11 1125 struct qed_probe_params probe_params;
1a635e488ecf6f Yuval Mintz 2016-08-15 1126 struct qed_slowpath_params sp_params;
2950219d87b040 Yuval Mintz 2015-10-26 1127 struct qed_dev_eth_info dev_info;
2950219d87b040 Yuval Mintz 2015-10-26 1128 struct qede_dev *edev;
2950219d87b040 Yuval Mintz 2015-10-26 1129 struct qed_dev *cdev;
2950219d87b040 Yuval Mintz 2015-10-26 1130 int rc;
2950219d87b040 Yuval Mintz 2015-10-26 1131
2950219d87b040 Yuval Mintz 2015-10-26 1132 if (unlikely(dp_level & QED_LEVEL_INFO))
2950219d87b040 Yuval Mintz 2015-10-26 1133 pr_notice("Starting qede probe\n");
2950219d87b040 Yuval Mintz 2015-10-26 1134
1408cc1fa48c54 Yuval Mintz 2016-05-11 1135 memset(&probe_params, 0, sizeof(probe_params));
1408cc1fa48c54 Yuval Mintz 2016-05-11 1136 probe_params.protocol = QED_PROTOCOL_ETH;
1408cc1fa48c54 Yuval Mintz 2016-05-11 1137 probe_params.dp_module = dp_module;
1408cc1fa48c54 Yuval Mintz 2016-05-11 1138 probe_params.dp_level = dp_level;
1408cc1fa48c54 Yuval Mintz 2016-05-11 1139 probe_params.is_vf = is_vf;
ccc67ef50b9085 Tomer Tayar 2019-01-28 1140 probe_params.recov_in_prog = (mode == QEDE_PROBE_RECOVERY);
1408cc1fa48c54 Yuval Mintz 2016-05-11 1141 cdev = qed_ops->common->probe(pdev, &probe_params);
2950219d87b040 Yuval Mintz 2015-10-26 1142 if (!cdev) {
2950219d87b040 Yuval Mintz 2015-10-26 1143 rc = -ENODEV;
2950219d87b040 Yuval Mintz 2015-10-26 1144 goto err0;
2950219d87b040 Yuval Mintz 2015-10-26 1145 }
2950219d87b040 Yuval Mintz 2015-10-26 1146
2950219d87b040 Yuval Mintz 2015-10-26 1147 qede_update_pf_params(cdev);
2950219d87b040 Yuval Mintz 2015-10-26 1148
2950219d87b040 Yuval Mintz 2015-10-26 1149 /* Start the Slowpath-process */
1a635e488ecf6f Yuval Mintz 2016-08-15 1150 memset(&sp_params, 0, sizeof(sp_params));
1a635e488ecf6f Yuval Mintz 2016-08-15 1151 sp_params.int_mode = QED_INT_MODE_MSIX;
1a635e488ecf6f Yuval Mintz 2016-08-15 1152 sp_params.drv_major = QEDE_MAJOR_VERSION;
1a635e488ecf6f Yuval Mintz 2016-08-15 1153 sp_params.drv_minor = QEDE_MINOR_VERSION;
1a635e488ecf6f Yuval Mintz 2016-08-15 1154 sp_params.drv_rev = QEDE_REVISION_VERSION;
1a635e488ecf6f Yuval Mintz 2016-08-15 1155 sp_params.drv_eng = QEDE_ENGINEERING_VERSION;
1a635e488ecf6f Yuval Mintz 2016-08-15 1156 strlcpy(sp_params.name, "qede LAN", QED_DRV_VER_STR_SIZE);
1a635e488ecf6f Yuval Mintz 2016-08-15 1157 rc = qed_ops->common->slowpath_start(cdev, &sp_params);
2950219d87b040 Yuval Mintz 2015-10-26 1158 if (rc) {
2950219d87b040 Yuval Mintz 2015-10-26 1159 pr_notice("Cannot start slowpath\n");
2950219d87b040 Yuval Mintz 2015-10-26 1160 goto err1;
2950219d87b040 Yuval Mintz 2015-10-26 1161 }
2950219d87b040 Yuval Mintz 2015-10-26 1162
2950219d87b040 Yuval Mintz 2015-10-26 1163 /* Learn information crucial for qede to progress */
2950219d87b040 Yuval Mintz 2015-10-26 1164 rc = qed_ops->fill_dev_info(cdev, &dev_info);
2950219d87b040 Yuval Mintz 2015-10-26 @1165 if (rc)
2950219d87b040 Yuval Mintz 2015-10-26 1166 goto err2;
2950219d87b040 Yuval Mintz 2015-10-26 1167
ccc67ef50b9085 Tomer Tayar 2019-01-28 1168 if (mode != QEDE_PROBE_RECOVERY) {
2950219d87b040 Yuval Mintz 2015-10-26 1169 edev = qede_alloc_etherdev(cdev, pdev, &dev_info, dp_module,
2950219d87b040 Yuval Mintz 2015-10-26 1170 dp_level);
2950219d87b040 Yuval Mintz 2015-10-26 1171 if (!edev) {
2950219d87b040 Yuval Mintz 2015-10-26 1172 rc = -ENOMEM;
2950219d87b040 Yuval Mintz 2015-10-26 1173 goto err2;
2950219d87b040 Yuval Mintz 2015-10-26 1174 }
66f590e1507178 Igor Russkikh 2020-07-28 1175
66f590e1507178 Igor Russkikh 2020-07-28 1176 edev->devlink = qed_ops->common->devlink_register(cdev);
66f590e1507178 Igor Russkikh 2020-07-28 1177 if (IS_ERR(edev->devlink)) {
66f590e1507178 Igor Russkikh 2020-07-28 1178 DP_NOTICE(edev, "Cannot register devlink\n");
66f590e1507178 Igor Russkikh 2020-07-28 1179 edev->devlink = NULL;
66f590e1507178 Igor Russkikh 2020-07-28 1180 /* Go on, we can live without devlink */
66f590e1507178 Igor Russkikh 2020-07-28 1181 }
ccc67ef50b9085 Tomer Tayar 2019-01-28 1182 } else {
ccc67ef50b9085 Tomer Tayar 2019-01-28 1183 struct net_device *ndev = pci_get_drvdata(pdev);
ccc67ef50b9085 Tomer Tayar 2019-01-28 1184 edev = netdev_priv(ndev);
66f590e1507178 Igor Russkikh 2020-07-28 1185
66f590e1507178 Igor Russkikh 2020-07-28 1186 if (edev && edev->devlink) {
66f590e1507178 Igor Russkikh 2020-07-28 1187 struct qed_devlink *qdl = devlink_priv(edev->devlink);
66f590e1507178 Igor Russkikh 2020-07-28 1188
66f590e1507178 Igor Russkikh 2020-07-28 1189 qdl->cdev = cdev;
66f590e1507178 Igor Russkikh 2020-07-28 1190 }
ccc67ef50b9085 Tomer Tayar 2019-01-28 1191 edev->cdev = cdev;
ccc67ef50b9085 Tomer Tayar 2019-01-28 1192 memset(&edev->stats, 0, sizeof(edev->stats));
ccc67ef50b9085 Tomer Tayar 2019-01-28 1193 memcpy(&edev->dev_info, &dev_info, sizeof(dev_info));
ccc67ef50b9085 Tomer Tayar 2019-01-28 1194 }
2950219d87b040 Yuval Mintz 2015-10-26 1195
fefb0202cc5c12 Yuval Mintz 2016-05-11 1196 if (is_vf)
149d3775f108c9 Sudarsana Reddy Kalluru 2018-11-26 1197 set_bit(QEDE_FLAGS_IS_VF, &edev->flags);
fefb0202cc5c12 Yuval Mintz 2016-05-11 1198
2950219d87b040 Yuval Mintz 2015-10-26 1199 qede_init_ndev(edev);
2950219d87b040 Yuval Mintz 2015-10-26 1200
ccc67ef50b9085 Tomer Tayar 2019-01-28 1201 rc = qede_rdma_dev_add(edev, (mode == QEDE_PROBE_RECOVERY));
cee9fbd8e2e9e7 Ram Amrani 2016-10-01 1202 if (rc)
cee9fbd8e2e9e7 Ram Amrani 2016-10-01 1203 goto err3;
cee9fbd8e2e9e7 Ram Amrani 2016-10-01 1204
ccc67ef50b9085 Tomer Tayar 2019-01-28 1205 if (mode != QEDE_PROBE_RECOVERY) {
3f2176dd7fe9e4 Colin Ian King 2018-03-19 1206 /* Prepare the lock prior to the registration of the netdev,
0e0b80a9a7181c Mintz, Yuval 2017-02-20 1207 * as once it's registered we might reach flows requiring it
0e0b80a9a7181c Mintz, Yuval 2017-02-20 1208 * [it's even possible to reach a flow needing it directly
0e0b80a9a7181c Mintz, Yuval 2017-02-20 1209 * from there, although it's unlikely].
0e0b80a9a7181c Mintz, Yuval 2017-02-20 1210 */
0e0b80a9a7181c Mintz, Yuval 2017-02-20 1211 INIT_DELAYED_WORK(&edev->sp_task, qede_sp_task);
0e0b80a9a7181c Mintz, Yuval 2017-02-20 1212 mutex_init(&edev->qede_lock);
ccc67ef50b9085 Tomer Tayar 2019-01-28 1213
2950219d87b040 Yuval Mintz 2015-10-26 1214 rc = register_netdev(edev->ndev);
2950219d87b040 Yuval Mintz 2015-10-26 1215 if (rc) {
2950219d87b040 Yuval Mintz 2015-10-26 1216 DP_NOTICE(edev, "Cannot register net-device\n");
cee9fbd8e2e9e7 Ram Amrani 2016-10-01 1217 goto err4;
2950219d87b040 Yuval Mintz 2015-10-26 1218 }
ccc67ef50b9085 Tomer Tayar 2019-01-28 1219 }
2950219d87b040 Yuval Mintz 2015-10-26 1220
712c3cbf193fca Mintz, Yuval 2017-05-23 1221 edev->ops->common->set_name(cdev, edev->ndev->name);
2950219d87b040 Yuval Mintz 2015-10-26 1222
4c55215c05d252 Sudarsana Reddy Kalluru 2017-02-15 1223 /* PTP not supported on VFs */
035744975aecf9 sudarsana.kalluru@cavium.com 2017-04-26 1224 if (!is_vf)
1c85f394c2206e Alexander Lobakin 2020-06-23 1225 qede_ptp_enable(edev);
4c55215c05d252 Sudarsana Reddy Kalluru 2017-02-15 1226
a2ec6172d29cf3 Sudarsana Kalluru 2015-10-26 1227 edev->ops->register_ops(cdev, &qede_ll_ops, edev);
a2ec6172d29cf3 Sudarsana Kalluru 2015-10-26 1228
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 35042 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 net-next 11/11] qede: make driver reliable on unload after failures
@ 2020-07-28 16:04 ` kernel test robot
0 siblings, 0 replies; 14+ messages in thread
From: kernel test robot @ 2020-07-28 16:04 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 12244 bytes --]
Hi Igor,
I love your patch! Perhaps something to improve:
[auto build test WARNING on net-next/master]
url: https://github.com/0day-ci/linux/commits/Igor-Russkikh/qed-introduce-devlink-health-support/20200728-170206
base: https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 5e619d73e6797ed9f2554a1bf996d52d8c91ca50
config: x86_64-randconfig-a003-20200728 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project e57464151d4c4912a7ec4d6fd0920056b2f75c7c)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install x86_64 cross compiling tool for clang build
# apt-get install binutils-x86-64-linux-gnu
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/net/ethernet/qlogic/qede/qede_main.c:1165:6: warning: variable 'edev' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (rc)
^~
drivers/net/ethernet/qlogic/qede/qede_main.c:1247:2: note: uninitialized use occurs here
edev->cdev = NULL;
^~~~
drivers/net/ethernet/qlogic/qede/qede_main.c:1165:2: note: remove the 'if' if its condition is always false
if (rc)
^~~~~~~
drivers/net/ethernet/qlogic/qede/qede_main.c:1158:6: warning: variable 'edev' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (rc) {
^~
drivers/net/ethernet/qlogic/qede/qede_main.c:1247:2: note: uninitialized use occurs here
edev->cdev = NULL;
^~~~
drivers/net/ethernet/qlogic/qede/qede_main.c:1158:2: note: remove the 'if' if its condition is always false
if (rc) {
^~~~~~~~~
drivers/net/ethernet/qlogic/qede/qede_main.c:1128:23: note: initialize the variable 'edev' to silence this warning
struct qede_dev *edev;
^
= NULL
2 warnings generated.
vim +1165 drivers/net/ethernet/qlogic/qede/qede_main.c
2950219d87b040 Yuval Mintz 2015-10-26 1121
2950219d87b040 Yuval Mintz 2015-10-26 1122 static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
1408cc1fa48c54 Yuval Mintz 2016-05-11 1123 bool is_vf, enum qede_probe_mode mode)
2950219d87b040 Yuval Mintz 2015-10-26 1124 {
1408cc1fa48c54 Yuval Mintz 2016-05-11 1125 struct qed_probe_params probe_params;
1a635e488ecf6f Yuval Mintz 2016-08-15 1126 struct qed_slowpath_params sp_params;
2950219d87b040 Yuval Mintz 2015-10-26 1127 struct qed_dev_eth_info dev_info;
2950219d87b040 Yuval Mintz 2015-10-26 1128 struct qede_dev *edev;
2950219d87b040 Yuval Mintz 2015-10-26 1129 struct qed_dev *cdev;
2950219d87b040 Yuval Mintz 2015-10-26 1130 int rc;
2950219d87b040 Yuval Mintz 2015-10-26 1131
2950219d87b040 Yuval Mintz 2015-10-26 1132 if (unlikely(dp_level & QED_LEVEL_INFO))
2950219d87b040 Yuval Mintz 2015-10-26 1133 pr_notice("Starting qede probe\n");
2950219d87b040 Yuval Mintz 2015-10-26 1134
1408cc1fa48c54 Yuval Mintz 2016-05-11 1135 memset(&probe_params, 0, sizeof(probe_params));
1408cc1fa48c54 Yuval Mintz 2016-05-11 1136 probe_params.protocol = QED_PROTOCOL_ETH;
1408cc1fa48c54 Yuval Mintz 2016-05-11 1137 probe_params.dp_module = dp_module;
1408cc1fa48c54 Yuval Mintz 2016-05-11 1138 probe_params.dp_level = dp_level;
1408cc1fa48c54 Yuval Mintz 2016-05-11 1139 probe_params.is_vf = is_vf;
ccc67ef50b9085 Tomer Tayar 2019-01-28 1140 probe_params.recov_in_prog = (mode == QEDE_PROBE_RECOVERY);
1408cc1fa48c54 Yuval Mintz 2016-05-11 1141 cdev = qed_ops->common->probe(pdev, &probe_params);
2950219d87b040 Yuval Mintz 2015-10-26 1142 if (!cdev) {
2950219d87b040 Yuval Mintz 2015-10-26 1143 rc = -ENODEV;
2950219d87b040 Yuval Mintz 2015-10-26 1144 goto err0;
2950219d87b040 Yuval Mintz 2015-10-26 1145 }
2950219d87b040 Yuval Mintz 2015-10-26 1146
2950219d87b040 Yuval Mintz 2015-10-26 1147 qede_update_pf_params(cdev);
2950219d87b040 Yuval Mintz 2015-10-26 1148
2950219d87b040 Yuval Mintz 2015-10-26 1149 /* Start the Slowpath-process */
1a635e488ecf6f Yuval Mintz 2016-08-15 1150 memset(&sp_params, 0, sizeof(sp_params));
1a635e488ecf6f Yuval Mintz 2016-08-15 1151 sp_params.int_mode = QED_INT_MODE_MSIX;
1a635e488ecf6f Yuval Mintz 2016-08-15 1152 sp_params.drv_major = QEDE_MAJOR_VERSION;
1a635e488ecf6f Yuval Mintz 2016-08-15 1153 sp_params.drv_minor = QEDE_MINOR_VERSION;
1a635e488ecf6f Yuval Mintz 2016-08-15 1154 sp_params.drv_rev = QEDE_REVISION_VERSION;
1a635e488ecf6f Yuval Mintz 2016-08-15 1155 sp_params.drv_eng = QEDE_ENGINEERING_VERSION;
1a635e488ecf6f Yuval Mintz 2016-08-15 1156 strlcpy(sp_params.name, "qede LAN", QED_DRV_VER_STR_SIZE);
1a635e488ecf6f Yuval Mintz 2016-08-15 1157 rc = qed_ops->common->slowpath_start(cdev, &sp_params);
2950219d87b040 Yuval Mintz 2015-10-26 1158 if (rc) {
2950219d87b040 Yuval Mintz 2015-10-26 1159 pr_notice("Cannot start slowpath\n");
2950219d87b040 Yuval Mintz 2015-10-26 1160 goto err1;
2950219d87b040 Yuval Mintz 2015-10-26 1161 }
2950219d87b040 Yuval Mintz 2015-10-26 1162
2950219d87b040 Yuval Mintz 2015-10-26 1163 /* Learn information crucial for qede to progress */
2950219d87b040 Yuval Mintz 2015-10-26 1164 rc = qed_ops->fill_dev_info(cdev, &dev_info);
2950219d87b040 Yuval Mintz 2015-10-26 @1165 if (rc)
2950219d87b040 Yuval Mintz 2015-10-26 1166 goto err2;
2950219d87b040 Yuval Mintz 2015-10-26 1167
ccc67ef50b9085 Tomer Tayar 2019-01-28 1168 if (mode != QEDE_PROBE_RECOVERY) {
2950219d87b040 Yuval Mintz 2015-10-26 1169 edev = qede_alloc_etherdev(cdev, pdev, &dev_info, dp_module,
2950219d87b040 Yuval Mintz 2015-10-26 1170 dp_level);
2950219d87b040 Yuval Mintz 2015-10-26 1171 if (!edev) {
2950219d87b040 Yuval Mintz 2015-10-26 1172 rc = -ENOMEM;
2950219d87b040 Yuval Mintz 2015-10-26 1173 goto err2;
2950219d87b040 Yuval Mintz 2015-10-26 1174 }
66f590e1507178 Igor Russkikh 2020-07-28 1175
66f590e1507178 Igor Russkikh 2020-07-28 1176 edev->devlink = qed_ops->common->devlink_register(cdev);
66f590e1507178 Igor Russkikh 2020-07-28 1177 if (IS_ERR(edev->devlink)) {
66f590e1507178 Igor Russkikh 2020-07-28 1178 DP_NOTICE(edev, "Cannot register devlink\n");
66f590e1507178 Igor Russkikh 2020-07-28 1179 edev->devlink = NULL;
66f590e1507178 Igor Russkikh 2020-07-28 1180 /* Go on, we can live without devlink */
66f590e1507178 Igor Russkikh 2020-07-28 1181 }
ccc67ef50b9085 Tomer Tayar 2019-01-28 1182 } else {
ccc67ef50b9085 Tomer Tayar 2019-01-28 1183 struct net_device *ndev = pci_get_drvdata(pdev);
ccc67ef50b9085 Tomer Tayar 2019-01-28 1184 edev = netdev_priv(ndev);
66f590e1507178 Igor Russkikh 2020-07-28 1185
66f590e1507178 Igor Russkikh 2020-07-28 1186 if (edev && edev->devlink) {
66f590e1507178 Igor Russkikh 2020-07-28 1187 struct qed_devlink *qdl = devlink_priv(edev->devlink);
66f590e1507178 Igor Russkikh 2020-07-28 1188
66f590e1507178 Igor Russkikh 2020-07-28 1189 qdl->cdev = cdev;
66f590e1507178 Igor Russkikh 2020-07-28 1190 }
ccc67ef50b9085 Tomer Tayar 2019-01-28 1191 edev->cdev = cdev;
ccc67ef50b9085 Tomer Tayar 2019-01-28 1192 memset(&edev->stats, 0, sizeof(edev->stats));
ccc67ef50b9085 Tomer Tayar 2019-01-28 1193 memcpy(&edev->dev_info, &dev_info, sizeof(dev_info));
ccc67ef50b9085 Tomer Tayar 2019-01-28 1194 }
2950219d87b040 Yuval Mintz 2015-10-26 1195
fefb0202cc5c12 Yuval Mintz 2016-05-11 1196 if (is_vf)
149d3775f108c9 Sudarsana Reddy Kalluru 2018-11-26 1197 set_bit(QEDE_FLAGS_IS_VF, &edev->flags);
fefb0202cc5c12 Yuval Mintz 2016-05-11 1198
2950219d87b040 Yuval Mintz 2015-10-26 1199 qede_init_ndev(edev);
2950219d87b040 Yuval Mintz 2015-10-26 1200
ccc67ef50b9085 Tomer Tayar 2019-01-28 1201 rc = qede_rdma_dev_add(edev, (mode == QEDE_PROBE_RECOVERY));
cee9fbd8e2e9e7 Ram Amrani 2016-10-01 1202 if (rc)
cee9fbd8e2e9e7 Ram Amrani 2016-10-01 1203 goto err3;
cee9fbd8e2e9e7 Ram Amrani 2016-10-01 1204
ccc67ef50b9085 Tomer Tayar 2019-01-28 1205 if (mode != QEDE_PROBE_RECOVERY) {
3f2176dd7fe9e4 Colin Ian King 2018-03-19 1206 /* Prepare the lock prior to the registration of the netdev,
0e0b80a9a7181c Mintz, Yuval 2017-02-20 1207 * as once it's registered we might reach flows requiring it
0e0b80a9a7181c Mintz, Yuval 2017-02-20 1208 * [it's even possible to reach a flow needing it directly
0e0b80a9a7181c Mintz, Yuval 2017-02-20 1209 * from there, although it's unlikely].
0e0b80a9a7181c Mintz, Yuval 2017-02-20 1210 */
0e0b80a9a7181c Mintz, Yuval 2017-02-20 1211 INIT_DELAYED_WORK(&edev->sp_task, qede_sp_task);
0e0b80a9a7181c Mintz, Yuval 2017-02-20 1212 mutex_init(&edev->qede_lock);
ccc67ef50b9085 Tomer Tayar 2019-01-28 1213
2950219d87b040 Yuval Mintz 2015-10-26 1214 rc = register_netdev(edev->ndev);
2950219d87b040 Yuval Mintz 2015-10-26 1215 if (rc) {
2950219d87b040 Yuval Mintz 2015-10-26 1216 DP_NOTICE(edev, "Cannot register net-device\n");
cee9fbd8e2e9e7 Ram Amrani 2016-10-01 1217 goto err4;
2950219d87b040 Yuval Mintz 2015-10-26 1218 }
ccc67ef50b9085 Tomer Tayar 2019-01-28 1219 }
2950219d87b040 Yuval Mintz 2015-10-26 1220
712c3cbf193fca Mintz, Yuval 2017-05-23 1221 edev->ops->common->set_name(cdev, edev->ndev->name);
2950219d87b040 Yuval Mintz 2015-10-26 1222
4c55215c05d252 Sudarsana Reddy Kalluru 2017-02-15 1223 /* PTP not supported on VFs */
035744975aecf9 sudarsana.kalluru(a)cavium.com 2017-04-26 1224 if (!is_vf)
1c85f394c2206e Alexander Lobakin 2020-06-23 1225 qede_ptp_enable(edev);
4c55215c05d252 Sudarsana Reddy Kalluru 2017-02-15 1226
a2ec6172d29cf3 Sudarsana Kalluru 2015-10-26 1227 edev->ops->register_ops(cdev, &qede_ll_ops, edev);
a2ec6172d29cf3 Sudarsana Kalluru 2015-10-26 1228
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 35042 bytes --]
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2020-07-28 16:05 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-28 8:58 [PATCH v2 net-next 00/11] qed: introduce devlink health support Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 01/11] qed: move out devlink logic into a new file Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 02/11] qed/qede: make devlink survive recovery Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 03/11] qed: swap param init and publish Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 04/11] qed: fix kconfig help entries Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 05/11] qed: implement devlink info request Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 06/11] qed: health reporter init deinit seq Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 07/11] qed: use devlink logic to report errors Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 08/11] qed*: make use of devlink recovery infrastructure Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 09/11] qed: implement devlink dump Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 10/11] qed: align adjacent indent Igor Russkikh
2020-07-28 8:58 ` [PATCH v2 net-next 11/11] qede: make driver reliable on unload after failures Igor Russkikh
2020-07-28 16:04 ` kernel test robot
2020-07-28 16:04 ` kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.