Commit bef7abee authored by Shuhei Matsumoto's avatar Shuhei Matsumoto Committed by Tomasz Zawadzki
Browse files

bdev/nvme: Add bdev_nvme_enable/disable_controller RPC



Based on preparation, simply add bdev_nvme_enable_controller and
bdev_nvme_disable_controller RPCs.

Signed-off-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Change-Id: Ic70413a678ce6bb889dcbe7122d5283e03e94a0f
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/18268


Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarRichael <richael.zhuang@arm.com>
parent 1b3c65d3
Loading
Loading
Loading
Loading
+87 −1
Original line number Diff line number Diff line
@@ -4123,7 +4123,7 @@ For non NVMe multipath, reset an NVMe controller whose name is given by the `nam

For NVMe multipath, an NVMe bdev controller is created and it aggregates multiple NVMe controllers.
The `name` parameter is an NVMe bdev controller name and the `cntlid` parameter is used to identify
an NVMe controller in the NVMe bdev controller. Reset only one NVMe-oF controlelr if the `cntlid`
an NVMe controller in the NVMe bdev controller. Reset only one NVMe-oF controller if the `cntlid`
parameter is specified, or all NVMe-oF controllers in an NVMe bdev controller if it is omitted.

Returns true if the controller reset was successful, false otherwise.
@@ -4160,6 +4160,92 @@ Example response:
}
~~~

### bdev_nvme_enable_controller {#rpc_bdev_nvme_enable_controller}

For non NVMe multipath, enable an NVMe controller whose name is given by the `name` parameter.

For NVMe multipath, an NVMe bdev controller is created and it aggregates multiple NVMe controllers.
The `name` parameter is an NVMe bdev controller name and the `cntlid` parameter is used to identify
an NVMe controller in the NVMe bdev controller. Enable only one NVMe-oF controller if the `cntlid`
parameter is specified, or all NVMe-oF controllers in an NVMe bdev controller if it is omitted.

Returns true if the controller enablement was successful or a controller was already enabled, false otherwise.

#### Parameters

Name                    | Optional | Type        | Description
----------------------- | -------- | ----------- | -----------
name                    | Required | string      | NVMe controller name (or NVMe bdev controller name for multipath)
cntlid                  | Optional | number      | NVMe controller ID (used as NVMe controller name for multipath)

#### Example

Example request:

~~~json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "bdev_nvme_enable_controller",
  "params": {
    "name": "Nvme0"
  }
}
~~~

Example response:

~~~json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": true
}
~~~

### bdev_nvme_disable_controller {#rpc_bdev_nvme_disable_controller}

For non NVMe multipath, disable an NVMe controller whose name is given by the `name` parameter.

For NVMe multipath, an NVMe bdev controller is created and it aggregates multiple NVMe controllers.
The `name` parameter is an NVMe bdev controller name and the `cntlid` parameter is used to identify
an NVMe controller in the NVMe bdev controller. Disable only one NVMe-oF controller if the `cntlid`
parameter is specified, or all NVMe-oF controllers in an NVMe bdev controller if it is omitted.

Returns true if the controller disablement was successful or a controller was already disabled, false otherwise.

#### Parameters

Name                    | Optional | Type        | Description
----------------------- | -------- | ----------- | -----------
name                    | Required | string      | NVMe controller name (or NVMe bdev controller name for multipath)
cntlid                  | Optional | number      | NVMe controller ID (used as NVMe controller name for multipath)

#### Example

Example request:

~~~json
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "bdev_nvme_disable_controller",
  "params": {
    "name": "Nvme0"
  }
}
~~~

Example response:

~~~json
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": true
}
~~~

### bdev_nvme_start_discovery {#rpc_bdev_nvme_start_discovery}

Start a discovery service for the discovery subsystem of the specified transport ID.
+17 −0
Original line number Diff line number Diff line
@@ -1340,6 +1340,23 @@ rpc_bdev_nvme_reset_controller(struct spdk_jsonrpc_request *request,
}
SPDK_RPC_REGISTER("bdev_nvme_reset_controller", rpc_bdev_nvme_reset_controller, SPDK_RPC_RUNTIME)

static void
rpc_bdev_nvme_enable_controller(struct spdk_jsonrpc_request *request,
				const struct spdk_json_val *params)
{
	rpc_bdev_nvme_controller_op(request, params, NVME_CTRLR_OP_ENABLE);
}
SPDK_RPC_REGISTER("bdev_nvme_enable_controller", rpc_bdev_nvme_enable_controller, SPDK_RPC_RUNTIME)

static void
rpc_bdev_nvme_disable_controller(struct spdk_jsonrpc_request *request,
				 const struct spdk_json_val *params)
{
	rpc_bdev_nvme_controller_op(request, params, NVME_CTRLR_OP_DISABLE);
}
SPDK_RPC_REGISTER("bdev_nvme_disable_controller", rpc_bdev_nvme_disable_controller,
		  SPDK_RPC_RUNTIME)

struct rpc_get_controller_health_info {
	char *name;
};
+32 −0
Original line number Diff line number Diff line
@@ -878,6 +878,38 @@ def bdev_nvme_reset_controller(client, name, cntlid):
    return client.call('bdev_nvme_reset_controller', params)


def bdev_nvme_enable_controller(client, name, cntlid):
    """Enable an NVMe controller or all NVMe controllers in an NVMe bdev controller.

    Args:
        name: controller name
        cntlid: NVMe controller ID (optional)
    """

    params = {'name': name}

    if cntlid is not None:
        params['cntlid'] = cntlid

    return client.call('bdev_nvme_enable_controller', params)


def bdev_nvme_disable_controller(client, name, cntlid):
    """Disable an NVMe controller or all NVMe controllers in an NVMe bdev controller.

    Args:
        name: controller name
        cntlid: NVMe controller ID (optional)
    """

    params = {'name': name}

    if cntlid is not None:
        params['cntlid'] = cntlid

    return client.call('bdev_nvme_disable_controller', params)


def bdev_nvme_start_discovery(client, name, trtype, traddr, adrfam=None, trsvcid=None,
                              hostnqn=None, wait_for_attach=None, ctrlr_loss_timeout_sec=None,
                              reconnect_delay_sec=None, fast_io_fail_timeout_sec=None,
+22 −0
Original line number Diff line number Diff line
@@ -787,6 +787,28 @@ if __name__ == "__main__":
    p.add_argument('-c', '--cntlid', help="NVMe controller ID", type=int)
    p.set_defaults(func=bdev_nvme_reset_controller)

    def bdev_nvme_enable_controller(args):
        rpc.bdev.bdev_nvme_enable_controller(args.client,
                                             name=args.name,
                                             cntlid=args.cntlid)

    p = subparsers.add_parser('bdev_nvme_enable_controller',
                              help='Enable an NVMe controller or all NVMe controllers in an NVMe bdev controller')
    p.add_argument('name', help="Name of the NVMe controller")
    p.add_argument('-c', '--cntlid', help="NVMe controller ID", type=int)
    p.set_defaults(func=bdev_nvme_enable_controller)

    def bdev_nvme_disable_controller(args):
        rpc.bdev.bdev_nvme_disable_controller(args.client,
                                              name=args.name,
                                              cntlid=args.cntlid)

    p = subparsers.add_parser('bdev_nvme_disable_controller',
                              help='Disable an NVMe controller or all NVMe controllers in an NVMe bdev controller')
    p.add_argument('name', help="Name of the NVMe controller")
    p.add_argument('-c', '--cntlid', help="NVMe controller ID", type=int)
    p.set_defaults(func=bdev_nvme_disable_controller)

    def bdev_nvme_start_discovery(args):
        rpc.bdev.bdev_nvme_start_discovery(args.client,
                                           name=args.name,