History

devlink: implement line card active state

Allow driver to mark a line card as active. Expose this state to the userspace over devlink netlink interface with proper notifications. 'active' state means that line card was plugged in after being provisioned.

Jiri Pirko committed 4 years ago

Commit fc9f50d1 parent fcdc8ce4 files · +50 −5Browse files

Unified · Split

4 files
  1. Documentation/networking/devlink/devlink-linecard.rst +6 −5
  2. include/net/devlink.h +2 −0
  3. include/uapi/linux/devlink.h +1 −0
  4. net/core/devlink.c +41 −0
Documentation/networking/devlink/devlink-linecard.rst+6−5
@@ -66,6 +66,7 @@ The ``devlink-linecard`` mechanism supports the following line card states: · 65 unmodified lines
6666 with a line card type.
6767 * ``provisioning_failed``: Provisioning was not successful.
6868 * ``provisioned``: Line card slot is provisioned with a type.
69+ * ``active``: Line card is powered-up and active.
6970
7071 The following diagram provides a general overview of ``devlink-linecard``
7172 state transitions::
@@ -85,11 +86,11 @@ state transitions:: · 13 unmodified lines
8586 | |
8687 | +-----------------------------+
8788 | | |
88− | +------------v------------+ +------------v------------+
89− | | | | |
90− +----- provisioning_failed | | provisioned |
91− | | | | |
92− | +------------^------------+ +------------|------------+
89+ | +------------v------------+ +------------v------------+ +-------------------------+
90+ | | | | ----> |
91+ +----- provisioning_failed | | provisioned | | active |
92+ | | | | <---- |
93+ | +------------^------------+ +------------|------------+ +-------------------------+
9394 | | |
9495 | | |
9596 | | +------------v------------+
include/net/devlink.h+2−0
@@ -1579,6 +1579,8 @@ void devlink_linecard_provision_set(struct devlink_linecard *linecard, · 1578 unmodified lines
15791579 const char *type);
15801580 void devlink_linecard_provision_clear(struct devlink_linecard *linecard);
15811581 void devlink_linecard_provision_fail(struct devlink_linecard *linecard);
1582+void devlink_linecard_activate(struct devlink_linecard *linecard);
1583+void devlink_linecard_deactivate(struct devlink_linecard *linecard);
15821584 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
15831585 u32 size, u16 ingress_pools_count,
15841586 u16 egress_pools_count, u16 ingress_tc_count,
include/uapi/linux/devlink.h+1−0
@@ -350,6 +350,7 @@ enum devlink_linecard_state { · 349 unmodified lines
350350 DEVLINK_LINECARD_STATE_PROVISIONING,
351351 DEVLINK_LINECARD_STATE_PROVISIONING_FAILED,
352352 DEVLINK_LINECARD_STATE_PROVISIONED,
353+ DEVLINK_LINECARD_STATE_ACTIVE,
353354
354355 __DEVLINK_LINECARD_STATE_MAX,
355356 DEVLINK_LINECARD_STATE_MAX = __DEVLINK_LINECARD_STATE_MAX - 1
net/core/devlink.c+41−0
@@ -10331,6 +10331,47 @@ void devlink_linecard_provision_fail(struct devlink_linecard *linecard) · 10330 unmodified lines
1033110331 }
1033210332 EXPORT_SYMBOL_GPL(devlink_linecard_provision_fail);
1033310333
10334+/**
10335+ * devlink_linecard_activate - Set linecard active
10336+ *
10337+ * @linecard: devlink linecard
10338+ */
10339+void devlink_linecard_activate(struct devlink_linecard *linecard)
10340+{
10341+ mutex_lock(&linecard->state_lock);
10342+ WARN_ON(linecard->state != DEVLINK_LINECARD_STATE_PROVISIONED);
10343+ linecard->state = DEVLINK_LINECARD_STATE_ACTIVE;
10344+ devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
10345+ mutex_unlock(&linecard->state_lock);
10346+}
10347+EXPORT_SYMBOL_GPL(devlink_linecard_activate);
10348+
10349+/**
10350+ * devlink_linecard_deactivate - Set linecard inactive
10351+ *
10352+ * @linecard: devlink linecard
10353+ */
10354+void devlink_linecard_deactivate(struct devlink_linecard *linecard)
10355+{
10356+ mutex_lock(&linecard->state_lock);
10357+ switch (linecard->state) {
10358+ case DEVLINK_LINECARD_STATE_ACTIVE:
10359+ linecard->state = DEVLINK_LINECARD_STATE_PROVISIONED;
10360+ devlink_linecard_notify(linecard, DEVLINK_CMD_LINECARD_NEW);
10361+ break;
10362+ case DEVLINK_LINECARD_STATE_UNPROVISIONING:
10363+ /* Line card is being deactivated as part
10364+ * of unprovisioning flow.
10365+ */
10366+ break;
10367+ default:
10368+ WARN_ON(1);
10369+ break;
10370+ }
10371+ mutex_unlock(&linecard->state_lock);
10372+}
10373+EXPORT_SYMBOL_GPL(devlink_linecard_deactivate);
10374+
1033410375 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
1033510376 u32 size, u16 ingress_pools_count,
1033610377 u16 egress_pools_count, u16 ingress_tc_count,