From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id D214DA0548; Thu, 27 May 2021 15:36:08 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4C6B140150; Thu, 27 May 2021 15:36:08 +0200 (CEST) Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by mails.dpdk.org (Postfix) with ESMTP id 2337C40143 for ; Thu, 27 May 2021 15:36:05 +0200 (CEST) IronPort-SDR: 3B5wK1Uenoz0Pgha5S2BeZTo0PTG5xqWyZPTSc/gzv4argAmNpElSz8RD2Z58h3GGU9kGsPsY+ J8Cbr8gVW/bQ== X-IronPort-AV: E=McAfee;i="6200,9189,9996"; a="202767778" X-IronPort-AV: E=Sophos;i="5.82,334,1613462400"; d="scan'208";a="202767778" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 May 2021 06:36:04 -0700 IronPort-SDR: KyehSQf10eWl6T0TJGf5xqm2mFAEstgxMxtE4J3N4AirfalaKa+lwyDSaEoGBa2lNvaHttK5Bc +IxLiIsUxH/A== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.82,334,1613462400"; d="scan'208";a="480581991" Received: from silpixa00399838.ir.intel.com ([10.237.213.105]) by fmsmga002.fm.intel.com with ESMTP; 27 May 2021 06:36:03 -0700 From: Kevin Laatz To: dev@dpdk.org Cc: bruce.richardson@intel.com, Kevin Laatz Date: Thu, 27 May 2021 14:26:46 +0100 Message-Id: <20210527132646.3565721-1-kevin.laatz@intel.com> X-Mailer: git-send-email 2.27.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH] raw/ioat: extend python script functionality X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Currently the user needs to find the DSA instance number for any DSA device they would like to configure using this script, which can be cumbersome and error-prone since the instance numbering changes when changing the binding of the devices between vfio-pci and idxd. In addition to this, once the device is configured, there is no option to reset the device using the script. This patch contains two additions to the script: 1. Add the ability to specify the DSA device to configure using the device's PCI address instead of the DSA instance number. For example, "$dpdk_idxd_cfg.py 0" and "$dpdk_idxd_cfg.py 6a:01.0" are both valid references to the same device (assuming the numbering). 2. An option to reset the device via the script. For example, "$dpdk_idxd_cfg.py 6a:01.0 --reset" Signed-off-by: Kevin Laatz --- drivers/raw/ioat/dpdk_idxd_cfg.py | 38 +++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/drivers/raw/ioat/dpdk_idxd_cfg.py b/drivers/raw/ioat/dpdk_idxd_cfg.py index ff06d9e240..7bc33b6ddb 100755 --- a/drivers/raw/ioat/dpdk_idxd_cfg.py +++ b/drivers/raw/ioat/dpdk_idxd_cfg.py @@ -29,6 +29,29 @@ def write_values(self, values): 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" + full_pci = pci if pci.startswith("0000:") else f"0000:{pci}" + if os.path.exists(f'/sys/bus/pci/devices/{full_pci}'): + return f'/sys/bus/pci/devices/{full_pci}' + return None + + +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:]) + + 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}") @@ -68,14 +91,25 @@ 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', type=int, help="DSA instance number") + 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:]) - configure_dsa(parsed_args.dsa_id, parsed_args.q, parsed_args.prefix) + + dsa_id = parsed_args.dsa_id + dsa_id = get_dsa_id(dsa_id) if ':' in dsa_id else dsa_id + if parsed_args.reset: + print(f"Resetting DSA instance {dsa_id}") + reset_device(dsa_id) + else: + print(f"Configuring DSA instance {dsa_id}") + configure_dsa(dsa_id, parsed_args.q, parsed_args.prefix) if __name__ == "__main__": -- 2.30.2