netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Moshe Shemesh <moshe@mellanox.com>
To: "David S. Miller" <davem@davemloft.net>,
	Jakub Kicinski <kuba@kernel.org>, Jiri Pirko <jiri@nvidia.com>
Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
	Moshe Shemesh <moshe@mellanox.com>
Subject: [PATCH net-next v2 15/16] net/mlx5: Add support for devlink reload limit no reset
Date: Wed,  7 Oct 2020 09:00:56 +0300	[thread overview]
Message-ID: <1602050457-21700-16-git-send-email-moshe@mellanox.com> (raw)
In-Reply-To: <1602050457-21700-1-git-send-email-moshe@mellanox.com>

Add support for devlink reload action fw_activate with reload limit
no_reset which does firmware live patching, updating the firmware image
without reset, no downtime and no configuration lose. The driver checks
if the firmware is capable of handling the pending firmware changes as a
live patch. If it is then it triggers firmware live patching flow.

Signed-off-by: Moshe Shemesh <moshe@mellanox.com>
Reviewed-by: Saeed Mahameed <saeedm@nvidia.com>
---
v1 ->v2:
- Shorten return flow in mlx5_devlink_trigger_fw_live_patch()
RFCv5 -> v1:
- Renamed reload_action_limit_level to reload_limit
RFCv3 -> RFCv4:
- Have action fw_activate with limit level no_reset instead of action
  fw_activate_no_reset
RFCv2 -> RFCv3:
- Replace fw_live_patch action by fw_activate_no_reset
RFCv1 -> RFCv2:
- Have fw_live_patch action instead of level
---
 .../net/ethernet/mellanox/mlx5/core/devlink.c | 25 +++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
index cbfb84d1cac2..a28f95df2901 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/devlink.c
@@ -111,6 +111,25 @@ static int mlx5_devlink_reload_fw_activate(struct devlink *devlink, struct netli
 	return err;
 }
 
+static int mlx5_devlink_trigger_fw_live_patch(struct devlink *devlink,
+					      struct netlink_ext_ack *extack)
+{
+	struct mlx5_core_dev *dev = devlink_priv(devlink);
+	u8 reset_level;
+	int err;
+
+	err = mlx5_fw_reset_query(dev, &reset_level, NULL);
+	if (err)
+		return err;
+	if (!(reset_level & MLX5_MFRL_REG_RESET_LEVEL0)) {
+		NL_SET_ERR_MSG_MOD(extack,
+				   "FW upgrade to the stored FW can't be done by FW live patching");
+		return -EINVAL;
+	}
+
+	return mlx5_fw_reset_set_live_patch(dev);
+}
+
 static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change,
 				    enum devlink_reload_action action,
 				    enum devlink_reload_limit limit,
@@ -123,6 +142,8 @@ static int mlx5_devlink_reload_down(struct devlink *devlink, bool netns_change,
 		mlx5_unload_one(dev, false);
 		return 0;
 	case DEVLINK_RELOAD_ACTION_FW_ACTIVATE:
+		if (limit == DEVLINK_RELOAD_LIMIT_NO_RESET)
+			return mlx5_devlink_trigger_fw_live_patch(devlink, extack);
 		return mlx5_devlink_reload_fw_activate(devlink, extack);
 	default:
 		/* Unsupported action should not get to this function */
@@ -140,7 +161,10 @@ static int mlx5_devlink_reload_up(struct devlink *devlink, enum devlink_reload_a
 	*actions_performed = BIT(action);
 	switch (action) {
 	case DEVLINK_RELOAD_ACTION_DRIVER_REINIT:
+		return mlx5_load_one(dev, false);
 	case DEVLINK_RELOAD_ACTION_FW_ACTIVATE:
+		if (limit == DEVLINK_RELOAD_LIMIT_NO_RESET)
+			break;
 		/* On fw_activate action, also driver is reloaded and reinit performed */
 		*actions_performed |= BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT);
 		return mlx5_load_one(dev, false);
@@ -168,6 +192,7 @@ static const struct devlink_ops mlx5_devlink_ops = {
 	.info_get = mlx5_devlink_info_get,
 	.reload_actions = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT) |
 			  BIT(DEVLINK_RELOAD_ACTION_FW_ACTIVATE),
+	.reload_limits = BIT(DEVLINK_RELOAD_LIMIT_NO_RESET),
 	.reload_down = mlx5_devlink_reload_down,
 	.reload_up = mlx5_devlink_reload_up,
 };
-- 
2.18.2


  parent reply	other threads:[~2020-10-07  6:14 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-07  6:00 [PATCH net-next v2 00/16] Add devlink reload action and limit options Moshe Shemesh
2020-10-07  6:00 ` [PATCH net-next v2 01/16] devlink: Change devlink_reload_supported() param type Moshe Shemesh
2020-10-07  6:00 ` [PATCH net-next v2 02/16] devlink: Add reload action option to devlink reload command Moshe Shemesh
2020-10-07 15:34   ` Jiri Pirko
2020-10-07  6:00 ` [PATCH net-next v2 03/16] devlink: Add devlink reload limit option Moshe Shemesh
2020-10-07 12:41   ` Vasundhara Volam
2020-10-07 17:35     ` Moshe Shemesh
2020-10-08  7:39   ` Jiri Pirko
2020-10-07  6:00 ` [PATCH net-next v2 04/16] devlink: Add reload stats Moshe Shemesh
2020-10-07 15:46   ` Jiri Pirko
2020-10-07  6:00 ` [PATCH net-next v2 05/16] devlink: Add remote " Moshe Shemesh
2020-10-07 16:01   ` Jiri Pirko
2020-10-07  6:00 ` [PATCH net-next v2 06/16] net/mlx5: Add functions to set/query MFRL register Moshe Shemesh
2020-10-07  6:00 ` [PATCH net-next v2 07/16] net/mlx5: Set cap for pci sync for fw update event Moshe Shemesh
2020-10-07  6:00 ` [PATCH net-next v2 08/16] net/mlx5: Handle sync reset request event Moshe Shemesh
2020-10-07  6:00 ` [PATCH net-next v2 09/16] net/mlx5: Handle sync reset now event Moshe Shemesh
2020-10-07  6:00 ` [PATCH net-next v2 10/16] net/mlx5: Handle sync reset abort event Moshe Shemesh
2020-10-07  6:00 ` [PATCH net-next v2 11/16] net/mlx5: Add support for devlink reload action fw activate Moshe Shemesh
2020-10-07  6:00 ` [PATCH net-next v2 12/16] devlink: Add enable_remote_dev_reset generic parameter Moshe Shemesh
2020-10-07  6:00 ` [PATCH net-next v2 13/16] net/mlx5: Add devlink param enable_remote_dev_reset support Moshe Shemesh
2020-10-07  6:00 ` [PATCH net-next v2 14/16] net/mlx5: Add support for fw live patch event Moshe Shemesh
2020-10-07  6:00 ` Moshe Shemesh [this message]
2020-10-07  6:00 ` [PATCH net-next v2 16/16] devlink: Add Documentation/networking/devlink/devlink-reload.rst Moshe Shemesh
2020-10-09 19:10 ` [PATCH net-next v2 00/16] Add devlink reload action and limit options Jakub Kicinski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1602050457-21700-16-git-send-email-moshe@mellanox.com \
    --to=moshe@mellanox.com \
    --cc=davem@davemloft.net \
    --cc=jiri@nvidia.com \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).