sma: support bdev-based QoS for NVMe/TCP devices

Signed-off-by: Konrad Sztyber <konrad.sztyber@intel.com>
Change-Id: I9634c2492addd3b4848d4b53b9b258dd59b7d1dd
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/14269
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Tomasz Zawadzki <tomasz.zawadzki@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Konrad Sztyber 2022-08-30 05:52:23 +02:00 committed by Tomasz Zawadzki
parent aed37fb98f
commit 89b81dc2ff

View File

@ -2,6 +2,7 @@ import grpc
import logging
import uuid
from spdk.rpc.client import JSONRPCException
from spdk.sma import qos
from .device import DeviceManager, DeviceException
from ..common import format_volume_id, volume_id_to_nguid
from ..volume import get_crypto_engine, CryptoException
@ -209,3 +210,37 @@ class NvmfTcpDeviceManager(DeviceManager):
def owns_device(self, handle):
return handle.startswith('nvmf-tcp')
def set_qos(self, request):
nqn = self._get_nqn_from_handle(request.device_handle)
volume = format_volume_id(request.volume_id)
if volume is None:
raise DeviceException(grpc.StatusCode.INVALID_ARGUMENT,
'Invalid volume ID')
try:
with self._client() as client:
# Make sure that a volume exists and is attached to the device
bdev = self._find_bdev(client, volume)
if bdev is None:
raise DeviceException(grpc.StatusCode.NOT_FOUND,
'No volume associated with volume_id could be found')
try:
subsys = client.call('nvmf_get_subsystems', {'nqn': nqn})[0]
except JSONRPCException:
raise DeviceException(grpc.StatusCode.NOT_FOUND,
'No device associated with device_handle could be found')
for ns in subsys['namespaces']:
if ns['name'] == bdev['name']:
break
else:
raise DeviceException(grpc.StatusCode.INVALID_ARGUMENT,
'Specified volume is not attached to the device')
qos.set_volume_bdev_qos(client, request)
except qos.QosException as ex:
raise DeviceException(ex.code, ex.message)
except JSONRPCException:
raise DeviceException(grpc.StatusCode.INTERNAL,
'Failed to set QoS')
def get_qos_capabilities(self, request):
return qos.get_bdev_qos_capabilities()