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 logging
import uuid import uuid
from spdk.rpc.client import JSONRPCException from spdk.rpc.client import JSONRPCException
from spdk.sma import qos
from .device import DeviceManager, DeviceException from .device import DeviceManager, DeviceException
from ..common import format_volume_id, volume_id_to_nguid from ..common import format_volume_id, volume_id_to_nguid
from ..volume import get_crypto_engine, CryptoException from ..volume import get_crypto_engine, CryptoException
@ -209,3 +210,37 @@ class NvmfTcpDeviceManager(DeviceManager):
def owns_device(self, handle): def owns_device(self, handle):
return handle.startswith('nvmf-tcp') 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()