From: David Arinzon <darinzon@amazon.com>
To: David Miller <davem@davemloft.net>,
Jakub Kicinski <kuba@kernel.org>, <netdev@vger.kernel.org>
Cc: David Arinzon <darinzon@amazon.com>,
"Machulsky, Zorik" <zorik@amazon.com>,
"Matushevsky, Alexander" <matua@amazon.com>,
Saeed Bshara <saeedb@amazon.com>,
"Bshara, Nafea" <nafea@amazon.com>,
"Saidi, Ali" <alisaidi@amazon.com>,
"Kiyanovski, Arthur" <akiyano@amazon.com>,
"Dagan, Noam" <ndagan@amazon.com>,
"Agroskin, Shay" <shayagr@amazon.com>,
"Itzko, Shahar" <itzko@amazon.com>,
"Abboud, Osama" <osamaabb@amazon.com>
Subject: [PATCH V1 net-next 2/5] net: ena: Add devlink reload functionality
Date: Sun, 8 Jan 2023 10:35:30 +0000 [thread overview]
Message-ID: <20230108103533.10104-3-darinzon@amazon.com> (raw)
In-Reply-To: <20230108103533.10104-1-darinzon@amazon.com>
This system allows to reload most of the driver's resources.
This functionality is added to our driver to apply configurations which
require a reset (such as changing LLQ entry size).
For the implementation of reload functionality, the driver performs
the same sequence that device reset performs with a few exceptions:
- The reset occurs immediately rather than setting a reset flag which
would cause the timer routine to trigger the reset.
This is done to provide a smoother user experience,
which makes sure the reset operation is done by the time
the 'devlink reload' command returns.
- Destruction of driver resources (using ena_destroy_device()) and
their re-initialization (using ena_restore_device()) is done without
holding the rtnl_lock() throughout the 'devlink reload' execution,
but rather with holding it for *each* of the operations separately.
Signed-off-by: Shay Agroskin <shayagr@amazon.com>
Signed-off-by: David Arinzon <darinzon@amazon.com>
---
drivers/net/ethernet/amazon/ena/ena_devlink.c | 73 ++++++++++++++++++-
drivers/net/ethernet/amazon/ena/ena_netdev.c | 6 +-
drivers/net/ethernet/amazon/ena/ena_netdev.h | 3 +
3 files changed, 77 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/amazon/ena/ena_devlink.c b/drivers/net/ethernet/amazon/ena/ena_devlink.c
index 6897d60d8376..2568ade34c2a 100644
--- a/drivers/net/ethernet/amazon/ena/ena_devlink.c
+++ b/drivers/net/ethernet/amazon/ena/ena_devlink.c
@@ -7,7 +7,76 @@
#include "ena_devlink.h"
-static const struct devlink_ops ena_devlink_ops = {};
+static int ena_devlink_reload_down(struct devlink *devlink,
+ bool netns_change,
+ enum devlink_reload_action action,
+ enum devlink_reload_limit limit,
+ struct netlink_ext_ack *extack)
+{
+ struct ena_adapter *adapter = ENA_DEVLINK_PRIV(devlink);
+
+ if (netns_change) {
+ NL_SET_ERR_MSG_MOD(extack, "Namespace change is not supported");
+ return -EOPNOTSUPP;
+ }
+
+ if (action != DEVLINK_RELOAD_ACTION_DRIVER_REINIT) {
+ NL_SET_ERR_MSG_MOD(extack, "Action is not supported");
+ return -EOPNOTSUPP;
+ }
+
+ if (limit != DEVLINK_RELOAD_LIMIT_UNSPEC) {
+ NL_SET_ERR_MSG_MOD(extack, "Driver reload doesn't support limitations");
+ return -EOPNOTSUPP;
+ }
+
+ rtnl_lock();
+ ena_destroy_device(adapter, false);
+ rtnl_unlock();
+
+ return 0;
+}
+
+static int ena_devlink_reload_up(struct devlink *devlink,
+ enum devlink_reload_action action,
+ enum devlink_reload_limit limit,
+ u32 *actions_performed,
+ struct netlink_ext_ack *extack)
+{
+ struct ena_adapter *adapter = ENA_DEVLINK_PRIV(devlink);
+ int err = 0;
+
+ if (action != DEVLINK_RELOAD_ACTION_DRIVER_REINIT) {
+ NL_SET_ERR_MSG_MOD(extack, "Action is not supported");
+ return -EOPNOTSUPP;
+ }
+
+ if (limit != DEVLINK_RELOAD_LIMIT_UNSPEC) {
+ NL_SET_ERR_MSG_MOD(extack, "Driver reload doesn't support limitations");
+ return -EOPNOTSUPP;
+ }
+
+ rtnl_lock();
+ /* Check that no other routine initialized the device (e.g.
+ * ena_fw_reset_device()). Also we're under devlink_mutex here,
+ * so devlink isn't freed under our feet.
+ */
+ if (!test_bit(ENA_FLAG_DEVICE_RUNNING, &adapter->flags))
+ err = ena_restore_device(adapter);
+
+ rtnl_unlock();
+
+ if (!err)
+ *actions_performed = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT);
+
+ return err;
+}
+
+static const struct devlink_ops ena_devlink_ops = {
+ .reload_actions = BIT(DEVLINK_RELOAD_ACTION_DRIVER_REINIT),
+ .reload_down = ena_devlink_reload_down,
+ .reload_up = ena_devlink_reload_up,
+};
struct devlink *ena_devlink_alloc(struct ena_adapter *adapter)
{
@@ -20,6 +89,8 @@ struct devlink *ena_devlink_alloc(struct ena_adapter *adapter)
return NULL;
}
+ devlink_set_features(devlink, DEVLINK_F_RELOAD);
+
ENA_DEVLINK_PRIV(devlink) = adapter;
adapter->devlink = devlink;
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.c b/drivers/net/ethernet/amazon/ena/ena_netdev.c
index ce79a0c42e6a..a42db781472c 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.c
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.c
@@ -44,8 +44,6 @@ MODULE_DEVICE_TABLE(pci, ena_pci_tbl);
static int ena_rss_init_default(struct ena_adapter *adapter);
static void check_for_admin_com_state(struct ena_adapter *adapter);
-static void ena_destroy_device(struct ena_adapter *adapter, bool graceful);
-static int ena_restore_device(struct ena_adapter *adapter);
static void ena_init_io_rings(struct ena_adapter *adapter,
int first_index, int count);
@@ -3587,7 +3585,7 @@ static int ena_enable_msix_and_set_admin_interrupts(struct ena_adapter *adapter)
return rc;
}
-static void ena_destroy_device(struct ena_adapter *adapter, bool graceful)
+void ena_destroy_device(struct ena_adapter *adapter, bool graceful)
{
struct net_device *netdev = adapter->netdev;
struct ena_com_dev *ena_dev = adapter->ena_dev;
@@ -3633,7 +3631,7 @@ static void ena_destroy_device(struct ena_adapter *adapter, bool graceful)
clear_bit(ENA_FLAG_DEVICE_RUNNING, &adapter->flags);
}
-static int ena_restore_device(struct ena_adapter *adapter)
+int ena_restore_device(struct ena_adapter *adapter)
{
struct ena_com_dev_get_features_ctx get_feat_ctx;
struct ena_com_dev *ena_dev = adapter->ena_dev;
diff --git a/drivers/net/ethernet/amazon/ena/ena_netdev.h b/drivers/net/ethernet/amazon/ena/ena_netdev.h
index c6132aa229df..244c80af6974 100644
--- a/drivers/net/ethernet/amazon/ena/ena_netdev.h
+++ b/drivers/net/ethernet/amazon/ena/ena_netdev.h
@@ -452,4 +452,7 @@ static inline enum ena_xdp_errors_t ena_xdp_allowed(struct ena_adapter *adapter)
return rc;
}
+void ena_destroy_device(struct ena_adapter *adapter, bool graceful);
+int ena_restore_device(struct ena_adapter *adapter);
+
#endif /* !(ENA_H) */
--
2.38.1
next prev parent reply other threads:[~2023-01-08 10:36 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-08 10:35 [PATCH V1 net-next 0/5] Add devlink support to ena David Arinzon
2023-01-08 10:35 ` [PATCH V1 net-next 1/5] net: ena: Register ena device to devlink David Arinzon
2023-01-09 5:59 ` Kuniyuki Iwashima
2023-01-10 15:17 ` Arinzon, David
2023-01-08 10:35 ` David Arinzon [this message]
2023-01-08 10:35 ` [PATCH V1 net-next 3/5] net: ena: Configure large LLQ using devlink params David Arinzon
2023-01-08 10:35 ` [PATCH V1 net-next 4/5] net: ena: Several changes to support large LLQ configuration David Arinzon
2023-01-08 10:35 ` [PATCH V1 net-next 5/5] net: ena: Add devlink documentation David Arinzon
2023-01-08 20:15 ` kernel test robot
2023-01-09 6:00 ` Kuniyuki Iwashima
2023-01-10 15:20 ` Arinzon, David
2023-01-10 0:45 ` [PATCH V1 net-next 0/5] Add devlink support to ena Jakub Kicinski
2023-01-10 20:11 ` Arinzon, David
2023-01-10 20:44 ` Jakub Kicinski
2023-01-11 8:58 ` Arinzon, David
2023-01-11 19:00 ` Jakub Kicinski
2023-01-11 19:31 ` Arinzon, David
2023-01-11 20:00 ` Jakub Kicinski
2023-01-11 21:21 ` Arinzon, David
2023-01-12 3:39 ` Jakub Kicinski
2023-01-12 10:31 ` Gal Pressman
2023-01-12 13:47 ` Shay Agroskin
2023-01-12 19:56 ` Jakub Kicinski
2023-01-15 10:05 ` Gal Pressman
2023-01-17 17:31 ` Jakub Kicinski
2023-01-16 14:23 ` Shay Agroskin
2023-01-17 17:36 ` 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=20230108103533.10104-3-darinzon@amazon.com \
--to=darinzon@amazon.com \
--cc=akiyano@amazon.com \
--cc=alisaidi@amazon.com \
--cc=davem@davemloft.net \
--cc=itzko@amazon.com \
--cc=kuba@kernel.org \
--cc=matua@amazon.com \
--cc=nafea@amazon.com \
--cc=ndagan@amazon.com \
--cc=netdev@vger.kernel.org \
--cc=osamaabb@amazon.com \
--cc=saeedb@amazon.com \
--cc=shayagr@amazon.com \
--cc=zorik@amazon.com \
/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).