dma/idxd: move config script from raw driver
Move the example script for configuring IDXD devices bound to the IDXD kernel driver from raw to dma, and create a symlink to still allow use from raw. Signed-off-by: Conor Walsh <conor.walsh@intel.com> Signed-off-by: Kevin Laatz <kevin.laatz@intel.com> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
This commit is contained in:
parent
9459de4edc
commit
8bedc51583
117
drivers/dma/idxd/dpdk_idxd_cfg.py
Executable file
117
drivers/dma/idxd/dpdk_idxd_cfg.py
Executable file
@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env python3
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
# Copyright(c) 2020 Intel Corporation
|
||||
|
||||
"""
|
||||
Configure an entire Intel DSA instance, using idxd kernel driver, for DPDK use
|
||||
"""
|
||||
|
||||
import sys
|
||||
import argparse
|
||||
import os
|
||||
import os.path
|
||||
|
||||
|
||||
class SysfsDir:
|
||||
"Used to read/write paths in a sysfs directory"
|
||||
def __init__(self, path):
|
||||
self.path = path
|
||||
|
||||
def read_int(self, filename):
|
||||
"Return a value from sysfs file"
|
||||
with open(os.path.join(self.path, filename)) as f:
|
||||
return int(f.readline())
|
||||
|
||||
def write_values(self, values):
|
||||
"write dictionary, where key is filename and value is value to write"
|
||||
for filename, contents in values.items():
|
||||
with open(os.path.join(self.path, filename), "w") as f:
|
||||
f.write(str(contents))
|
||||
|
||||
|
||||
def reset_device(dsa_id):
|
||||
"Reset the DSA device and all its queues"
|
||||
drv_dir = SysfsDir("/sys/bus/dsa/drivers/dsa")
|
||||
drv_dir.write_values({"unbind": f"dsa{dsa_id}"})
|
||||
|
||||
|
||||
def get_pci_dir(pci):
|
||||
"Search for the sysfs directory of the PCI device"
|
||||
base_dir = '/sys/bus/pci/devices/'
|
||||
for path, dirs, files in os.walk(base_dir):
|
||||
for dir in dirs:
|
||||
if pci in dir:
|
||||
return os.path.join(base_dir, dir)
|
||||
sys.exit(f"Could not find sysfs directory for device {pci}")
|
||||
|
||||
|
||||
def get_dsa_id(pci):
|
||||
"Get the DSA instance ID using the PCI address of the device"
|
||||
pci_dir = get_pci_dir(pci)
|
||||
for path, dirs, files in os.walk(pci_dir):
|
||||
for dir in dirs:
|
||||
if dir.startswith('dsa') and 'wq' not in dir:
|
||||
return int(dir[3:])
|
||||
sys.exit(f"Could not get device ID for device {pci}")
|
||||
|
||||
|
||||
def configure_dsa(dsa_id, queues, prefix):
|
||||
"Configure the DSA instance with appropriate number of queues"
|
||||
dsa_dir = SysfsDir(f"/sys/bus/dsa/devices/dsa{dsa_id}")
|
||||
drv_dir = SysfsDir("/sys/bus/dsa/drivers/dsa")
|
||||
|
||||
max_groups = dsa_dir.read_int("max_groups")
|
||||
max_engines = dsa_dir.read_int("max_engines")
|
||||
max_queues = dsa_dir.read_int("max_work_queues")
|
||||
max_work_queues_size = dsa_dir.read_int("max_work_queues_size")
|
||||
|
||||
nb_queues = min(queues, max_queues)
|
||||
if queues > nb_queues:
|
||||
print(f"Setting number of queues to max supported value: {max_queues}")
|
||||
|
||||
# we want one engine per group, and no more engines than queues
|
||||
nb_groups = min(max_engines, max_groups, nb_queues)
|
||||
for grp in range(nb_groups):
|
||||
dsa_dir.write_values({f"engine{dsa_id}.{grp}/group_id": grp})
|
||||
|
||||
# configure each queue
|
||||
for q in range(nb_queues):
|
||||
wq_dir = SysfsDir(os.path.join(dsa_dir.path, f"wq{dsa_id}.{q}"))
|
||||
wq_dir.write_values({"group_id": q % nb_groups,
|
||||
"type": "user",
|
||||
"mode": "dedicated",
|
||||
"name": f"{prefix}_wq{dsa_id}.{q}",
|
||||
"priority": 1,
|
||||
"size": int(max_work_queues_size / nb_queues)})
|
||||
|
||||
# enable device and then queues
|
||||
drv_dir.write_values({"bind": f"dsa{dsa_id}"})
|
||||
for q in range(nb_queues):
|
||||
drv_dir.write_values({"bind": f"wq{dsa_id}.{q}"})
|
||||
|
||||
|
||||
def main(args):
|
||||
"Main function, does arg parsing and calls config function"
|
||||
arg_p = argparse.ArgumentParser(
|
||||
description="Configure whole DSA device instance for DPDK use")
|
||||
arg_p.add_argument('dsa_id',
|
||||
help="Specify DSA instance either via DSA instance number or PCI address")
|
||||
arg_p.add_argument('-q', metavar='queues', type=int, default=255,
|
||||
help="Number of queues to set up")
|
||||
arg_p.add_argument('--name-prefix', metavar='prefix', dest='prefix',
|
||||
default="dpdk",
|
||||
help="Prefix for workqueue name to mark for DPDK use [default: 'dpdk']")
|
||||
arg_p.add_argument('--reset', action='store_true',
|
||||
help="Reset DSA device and its queues")
|
||||
parsed_args = arg_p.parse_args(args[1:])
|
||||
|
||||
dsa_id = parsed_args.dsa_id
|
||||
dsa_id = get_dsa_id(dsa_id) if ':' in dsa_id else dsa_id
|
||||
if parsed_args.reset:
|
||||
reset_device(dsa_id)
|
||||
else:
|
||||
configure_dsa(dsa_id, parsed_args.q, parsed_args.prefix)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
@ -1,117 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
# Copyright(c) 2020 Intel Corporation
|
||||
|
||||
"""
|
||||
Configure an entire Intel DSA instance, using idxd kernel driver, for DPDK use
|
||||
"""
|
||||
|
||||
import sys
|
||||
import argparse
|
||||
import os
|
||||
import os.path
|
||||
|
||||
|
||||
class SysfsDir:
|
||||
"Used to read/write paths in a sysfs directory"
|
||||
def __init__(self, path):
|
||||
self.path = path
|
||||
|
||||
def read_int(self, filename):
|
||||
"Return a value from sysfs file"
|
||||
with open(os.path.join(self.path, filename)) as f:
|
||||
return int(f.readline())
|
||||
|
||||
def write_values(self, values):
|
||||
"write dictionary, where key is filename and value is value to write"
|
||||
for filename, contents in values.items():
|
||||
with open(os.path.join(self.path, filename), "w") as f:
|
||||
f.write(str(contents))
|
||||
|
||||
|
||||
def reset_device(dsa_id):
|
||||
"Reset the DSA device and all its queues"
|
||||
drv_dir = SysfsDir("/sys/bus/dsa/drivers/dsa")
|
||||
drv_dir.write_values({"unbind": f"dsa{dsa_id}"})
|
||||
|
||||
|
||||
def get_pci_dir(pci):
|
||||
"Search for the sysfs directory of the PCI device"
|
||||
base_dir = '/sys/bus/pci/devices/'
|
||||
for path, dirs, files in os.walk(base_dir):
|
||||
for dir in dirs:
|
||||
if pci in dir:
|
||||
return os.path.join(base_dir, dir)
|
||||
sys.exit(f"Could not find sysfs directory for device {pci}")
|
||||
|
||||
|
||||
def get_dsa_id(pci):
|
||||
"Get the DSA instance ID using the PCI address of the device"
|
||||
pci_dir = get_pci_dir(pci)
|
||||
for path, dirs, files in os.walk(pci_dir):
|
||||
for dir in dirs:
|
||||
if dir.startswith('dsa') and 'wq' not in dir:
|
||||
return int(dir[3:])
|
||||
sys.exit(f"Could not get device ID for device {pci}")
|
||||
|
||||
|
||||
def configure_dsa(dsa_id, queues, prefix):
|
||||
"Configure the DSA instance with appropriate number of queues"
|
||||
dsa_dir = SysfsDir(f"/sys/bus/dsa/devices/dsa{dsa_id}")
|
||||
drv_dir = SysfsDir("/sys/bus/dsa/drivers/dsa")
|
||||
|
||||
max_groups = dsa_dir.read_int("max_groups")
|
||||
max_engines = dsa_dir.read_int("max_engines")
|
||||
max_queues = dsa_dir.read_int("max_work_queues")
|
||||
max_work_queues_size = dsa_dir.read_int("max_work_queues_size")
|
||||
|
||||
nb_queues = min(queues, max_queues)
|
||||
if queues > nb_queues:
|
||||
print(f"Setting number of queues to max supported value: {max_queues}")
|
||||
|
||||
# we want one engine per group, and no more engines than queues
|
||||
nb_groups = min(max_engines, max_groups, nb_queues)
|
||||
for grp in range(nb_groups):
|
||||
dsa_dir.write_values({f"engine{dsa_id}.{grp}/group_id": grp})
|
||||
|
||||
# configure each queue
|
||||
for q in range(nb_queues):
|
||||
wq_dir = SysfsDir(os.path.join(dsa_dir.path, f"wq{dsa_id}.{q}"))
|
||||
wq_dir.write_values({"group_id": q % nb_groups,
|
||||
"type": "user",
|
||||
"mode": "dedicated",
|
||||
"name": f"{prefix}_wq{dsa_id}.{q}",
|
||||
"priority": 1,
|
||||
"size": int(max_work_queues_size / nb_queues)})
|
||||
|
||||
# enable device and then queues
|
||||
drv_dir.write_values({"bind": f"dsa{dsa_id}"})
|
||||
for q in range(nb_queues):
|
||||
drv_dir.write_values({"bind": f"wq{dsa_id}.{q}"})
|
||||
|
||||
|
||||
def main(args):
|
||||
"Main function, does arg parsing and calls config function"
|
||||
arg_p = argparse.ArgumentParser(
|
||||
description="Configure whole DSA device instance for DPDK use")
|
||||
arg_p.add_argument('dsa_id',
|
||||
help="Specify DSA instance either via DSA instance number or PCI address")
|
||||
arg_p.add_argument('-q', metavar='queues', type=int, default=255,
|
||||
help="Number of queues to set up")
|
||||
arg_p.add_argument('--name-prefix', metavar='prefix', dest='prefix',
|
||||
default="dpdk",
|
||||
help="Prefix for workqueue name to mark for DPDK use [default: 'dpdk']")
|
||||
arg_p.add_argument('--reset', action='store_true',
|
||||
help="Reset DSA device and its queues")
|
||||
parsed_args = arg_p.parse_args(args[1:])
|
||||
|
||||
dsa_id = parsed_args.dsa_id
|
||||
dsa_id = get_dsa_id(dsa_id) if ':' in dsa_id else dsa_id
|
||||
if parsed_args.reset:
|
||||
reset_device(dsa_id)
|
||||
else:
|
||||
configure_dsa(dsa_id, parsed_args.q, parsed_args.prefix)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main(sys.argv)
|
1
drivers/raw/ioat/dpdk_idxd_cfg.py
Symbolic link
1
drivers/raw/ioat/dpdk_idxd_cfg.py
Symbolic link
@ -0,0 +1 @@
|
||||
../../dma/idxd/dpdk_idxd_cfg.py
|
Loading…
x
Reference in New Issue
Block a user