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
66 with a line card type.66 with a line card type.
67 * ``provisioning_failed``: Provisioning was not successful.67 * ``provisioning_failed``: Provisioning was not successful.
68 * ``provisioned``: Line card slot is provisioned with a type.68 * ``provisioned``: Line card slot is provisioned with a type.
69 * ``active``: Line card is powered-up and active.
69 70
70The following diagram provides a general overview of ``devlink-linecard``71The following diagram provides a general overview of ``devlink-linecard``
71state transitions::72state transitions::
@@ -85,11 +86,11 @@ state transitions:: · 13 unmodified lines
85 | |86 | |
86 | +-----------------------------+87 | +-----------------------------+
87 | | |88 | | |
88 | +------------v------------+ +------------v------------+89 | +------------v------------+ +------------v------------+ +-------------------------+
89 | | | | |90 | | | | ----> |
90 +----- provisioning_failed | | provisioned |91 +----- provisioning_failed | | provisioned | | active |
91 | | | | |92 | | | | <---- |
92 | +------------^------------+ +------------|------------+93 | +------------^------------+ +------------|------------+ +-------------------------+
93 | | |94 | | |
94 | | |95 | | |
95 | | +------------v------------+96 | | +------------v------------+
include/net/devlink.h+2−0
@@ -1579,6 +1579,8 @@ void devlink_linecard_provision_set(struct devlink_linecard *linecard, · 1578 unmodified lines
1579 const char *type);1579 const char *type);
1580void devlink_linecard_provision_clear(struct devlink_linecard *linecard);1580void devlink_linecard_provision_clear(struct devlink_linecard *linecard);
1581void devlink_linecard_provision_fail(struct devlink_linecard *linecard);1581void devlink_linecard_provision_fail(struct devlink_linecard *linecard);
1582void devlink_linecard_activate(struct devlink_linecard *linecard);
1583void devlink_linecard_deactivate(struct devlink_linecard *linecard);
1582int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,1584int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
1583 u32 size, u16 ingress_pools_count,1585 u32 size, u16 ingress_pools_count,
1584 u16 egress_pools_count, u16 ingress_tc_count,1586 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
350 DEVLINK_LINECARD_STATE_PROVISIONING,350 DEVLINK_LINECARD_STATE_PROVISIONING,
351 DEVLINK_LINECARD_STATE_PROVISIONING_FAILED,351 DEVLINK_LINECARD_STATE_PROVISIONING_FAILED,
352 DEVLINK_LINECARD_STATE_PROVISIONED,352 DEVLINK_LINECARD_STATE_PROVISIONED,
353 DEVLINK_LINECARD_STATE_ACTIVE,
353 354
354 __DEVLINK_LINECARD_STATE_MAX,355 __DEVLINK_LINECARD_STATE_MAX,
355 DEVLINK_LINECARD_STATE_MAX = __DEVLINK_LINECARD_STATE_MAX - 1356 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
10331}10331}
10332EXPORT_SYMBOL_GPL(devlink_linecard_provision_fail);10332EXPORT_SYMBOL_GPL(devlink_linecard_provision_fail);
10333 10333
10334/**
10335 * devlink_linecard_activate - Set linecard active
10336 *
10337 * @linecard: devlink linecard
10338 */
10339void 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}
10347EXPORT_SYMBOL_GPL(devlink_linecard_activate);
10348
10349/**
10350 * devlink_linecard_deactivate - Set linecard inactive
10351 *
10352 * @linecard: devlink linecard
10353 */
10354void 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}
10373EXPORT_SYMBOL_GPL(devlink_linecard_deactivate);
10374
10334int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,10375int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
10335 u32 size, u16 ingress_pools_count,10376 u32 size, u16 ingress_pools_count,
10336 u16 egress_pools_count, u16 ingress_tc_count,10377 u16 egress_pools_count, u16 ingress_tc_count,