get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/139697/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 139697,
    "url": "https://patches.dpdk.org/api/patches/139697/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20240426074831.1729792-10-chaoyong.he@corigine.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20240426074831.1729792-10-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240426074831.1729792-10-chaoyong.he@corigine.com",
    "date": "2024-04-26T07:48:30",
    "name": "[09/10] vdpa/nfp: setup vring relay thread",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "3320601431705235c71fc44b222602b73831ac08",
    "submitter": {
        "id": 2554,
        "url": "https://patches.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.com"
    },
    "delegate": {
        "id": 2642,
        "url": "https://patches.dpdk.org/api/users/2642/?format=api",
        "username": "mcoquelin",
        "first_name": "Maxime",
        "last_name": "Coquelin",
        "email": "maxime.coquelin@redhat.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20240426074831.1729792-10-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 31827,
            "url": "https://patches.dpdk.org/api/series/31827/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=31827",
            "date": "2024-04-26T07:48:21",
            "name": "support software live migration",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/31827/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/139697/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/139697/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 6C36E43F12;\n\tFri, 26 Apr 2024 09:50:07 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 6FDBA43CA9;\n\tFri, 26 Apr 2024 09:49:15 +0200 (CEST)",
            "from NAM04-BN8-obe.outbound.protection.outlook.com\n (mail-bn8nam04on2109.outbound.protection.outlook.com [40.107.100.109])\n by mails.dpdk.org (Postfix) with ESMTP id F287443CA0\n for <dev@dpdk.org>; Fri, 26 Apr 2024 09:49:11 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by MN0PR13MB6618.namprd13.prod.outlook.com (2603:10b6:208:4c3::10)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7544.11; Fri, 26 Apr\n 2024 07:49:10 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::ec12:7411:559a:850e]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::ec12:7411:559a:850e%5]) with mapi id 15.20.7544.010; Fri, 26 Apr 2024\n 07:49:10 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=eHJzUeMaGksPCwzJjIy21/boja5XiU+fvR7Q4Bol8OeeRrG1HFs2DBoHNYoJpP+FPv5tMjOxWaBtzauGMkYLfRXCmblUyXCxQCjmYRz0MAViGTqXQixbrZWwMBUmAJZ7vfmpbqWtAuJUq4uE0Zc1ftTGJJTgAIgJ2/vkRJ3mDvi37yh34T1kFXrfX7Be4gzJurYa6nYKbWZ/hX7BNfxuc6U1VWN4zFEye2c2SiL85k/0V9tcpz0HjFM0RJd2gp6G1HW5QNmeijNQMDNUTk1R9PVsfg2uggfBYATDNqbYaRhv/DQvI43kiM8+vrYVnfD5cwiwfpBHqnKIfXmjioHLSg==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=xMxuQt0p9O/CFuebIu4mFZrN+7slowqspnyCc6Y2VBw=;\n b=OR9DMha04bKyhp63VHHGL3iPSS0jek+J8Z9lpYe77Sknn1HhZ477npiStS4kxiix/jHhvTt7Rku/0mYGcfgpH+23VrDUzgmHHE2HhitC8BnTgiAIoXDpiVIChwpJCPQECS3yaKHH8PL5u/lTows229yi1TaIikiBpxAGbVR0d4jNzr1zgGoQLm1cx46LLGWyZoIU+SyibcH0NQY9/srbM8DuqdTB8M5jON21a5MI0LRHM/FTLyxlaondGuKbqdE77jB36GhOOiNt3OBokz0veBRa14HA9ycidhALNkKMAFVc3hMTzYWLCJ7pnIBSDmeBwzQ8KHcA2l0P1P+otVytrg==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com;\n dkim=pass header.d=corigine.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=xMxuQt0p9O/CFuebIu4mFZrN+7slowqspnyCc6Y2VBw=;\n b=lZJFr4/AhaffxorcBLuqVAaOGcI5DBe+naali6JrGzdL5WB76+if6fDMXMSC2SzL/4xrxVzwYVU/oDylUHN0ptGeWjg/Ra15TKNPRVt7mTxknwAfff6iUG9tK0g8VCAcJL7mtnSOmfmiF0+Duh9709dwZbIiDVYNocSMSR03Sjg=",
        "Authentication-Results": "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=corigine.com;",
        "From": "Chaoyong He <chaoyong.he@corigine.com>",
        "To": "dev@dpdk.org",
        "Cc": "oss-drivers@corigine.com, Xinying Yu <xinying.yu@corigine.com>,\n Chaoyong He <chaoyong.he@corigine.com>, Long Wu <long.wu@corigine.com>,\n Peng Zhang <peng.zhang@corigine.com>",
        "Subject": "[PATCH 09/10] vdpa/nfp: setup vring relay thread",
        "Date": "Fri, 26 Apr 2024 15:48:30 +0800",
        "Message-Id": "<20240426074831.1729792-10-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20240426074831.1729792-1-chaoyong.he@corigine.com>",
        "References": "<20240426074831.1729792-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "BYAPR02CA0007.namprd02.prod.outlook.com\n (2603:10b6:a02:ee::20) To SJ0PR13MB5545.namprd13.prod.outlook.com\n (2603:10b6:a03:424::5)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "SJ0PR13MB5545:EE_|MN0PR13MB6618:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "2ba9b761-b6e1-4d6f-b877-08dc65c55bd3",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;\n ARA:13230031|366007|376005|52116005|1800799015|38350700005;",
        "X-Microsoft-Antispam-Message-Info": "\n aNxu3NySWW5GQDyPL+2O7FN6X65CFKdJacLJfkT/PxUpV5Vu2FnH7bPuGhmveH3HMRB237NrfPXDB66ssOfxaW1QexeYYpR+jtMvkS48f4dtm3H4oIDBbihfqoPTpihj3Y0jHKYhHTrNYGNTiHgfCP5bWVfDlKCBbuBTcr556lnbHCW8xv3gjRAs0Xq1rymOqi/w2SxAkOx7lthrqTR3D87GIschLGVBtbCEoKGTuUVkfBgVkUMDYOXt5QqtZS5Tm2RFnB5HcdsE0pi4ZzYuALOlRHjTMMBA0f/IhfnVUh7Oj65FeEnW7gsfJIObgxpkHK5Rp9PblfwolR2AvcxKF0EoPEehUU/zmg7qPvIqOKMqkSB1WsosTrExS7L8sw/67OFDYXSr7UCd63+w7ZGecWikgNLqeSEv+qg2m8gKF5AwkfCX/MVoXwaEP6aUgHR4UYm9a4wjaNKYO3nlRPYbCBoHTFzpC20Ufhbr18+vH/0NxbBv6mItYw9cuaV2sTvMJp3NHAMZCZIXJnaaiRJrk5XzD58sgxqSoekeajNYgK3tBke//k2ZTQNf+H8PYNj7YQQNSSETcKlgd1t0F5slnvW1Nxm2XfftCnY9HGbKfi6vcjaqHiXAU6pI1gTw0+xn6h6u9ct0ts3iQNfbgU/84m1li6ZRmHyCw6QfHcpSxBf1dxJWDEnp7yzCBDljq2Y33Tw0z+mfkEfzQyq6zsyp65sHPjMfCFqRHpTf11oBc5WjtdHbORuUS26oiBgxJWpwAfIu/xZUs/zDYCPlRRZM+YvZApf4Zjl487SbF9cYor90220L2MOVLuOO/qj++iGnSYr7WDnI4QRLhAb5TnZO6k2DAhOmAsepOwAQyjRVfkh4DC7Pxe5tecRhAD5o2D1iWD/HAzM3pMwM9WAHo7WbjneY3R6nffXLSqy7JfH6tVi0xMPMvJ8VJ+6kYrGUfXuVfeeV3wT+DbLHCF98DMnU2liLgS7Agr3UHryI20Mx87Rc7CaTdcn6+RKJyJWJKKlxCbTZrcPR3bzE2Yv+fgivkgNuQQIMqeX+ehlbtrbN2bcizbV6Q1N5cHyskkLbwTJ7/C/cBBvS2tT4R5KzRaS2sMEaz+TJTnDOItiMj6qwx5VeepXL/IgfM1fAgqNlTyqfyWsCls38v/ZWVMyYnIv0v43XpNehU0eCIsUovzAQd1djoLDdrbSlV/Z404i6+JuzLiJ1d5KRbFbqYNYqgy/Lzbrbzn8l74SPXS/VowzR2ffQD/fpquIsRCZpYpyVVQ7UL7nMKkpQcHdGhFuhCLPbZQuosWz+fFCYG58++4N8h6ibQdFvRpCF4fx4IRWndAUcFbrB4y83QiNAosD+upg3vA==",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230031)(366007)(376005)(52116005)(1800799015)(38350700005); DIR:OUT;\n SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n khHpFnjqwYXerjcpZci7cvr3SiRjeGG419dnovvSpLe3swpSKzFErmohSxt/tNgRE4wNYtqBdgGa0cQu0fSxKmG0SSQ+vB2Jw91bXOKPnMHxkGInPHaIw5v1ALBWlsXtpTUIrjpBEEIznuoCbpmgSQeoPY3tC6NqYsiNX59VUNIxtnqNmL5csYwReiwW8O2sF4CyVZ0YTrjgmz4UD2If+nKkZnadtxn9ojpmCmif6LMMteeT9cumsA0NMDnurZqQyZEKyJ5PrFk/0Z9EsvIAd+Ems3ThE1yRKAPlfZUzclo5nctgdZAS/tyejz0DPZPyhIVTMTMqono3TiE6HjaqnLtU3DiaCwRR30HRUNJPG38gKwseP7VbTavPDkTGYUJUUZ5mFJHws9y5hOjOSaQ/Jc2kab2UApgZLV5I9uXCSK0wpJTQLOm+Edl0aQiUJkoBgZBAn/TuXx8/IbshCEDHlMwCyMo9iwbhQuO11cLuwyMAlN/CJacwBDL/llSNjPv/xg10qs2RA25ariG9+BWP4xB/PKxtH4EyqRBQEpWlDhPEf38n0aVkrtOhP9TUx4CS7DGe1c6nFuNLe1M3OKDA2rXVv31+hhPGz0hiei9R22fMfftDEDJF2by8iK6p8w/JCKNbVMb2iNiJDF2i26DosrBJPbasq//gUIAX9jhWZ+L6fAvy3inMAxragfTqi8WfVrMHM7TyW1xS/B91BOwxD/Y4dt67NBhU9SLA04ZmJ7va9mAChEulmrII2/7HiXctfzQCFOaFJIu6AptZ6wN1gkOfYksKOHFu6gGJ6+lJHkYzjafXwyafhpdOaP+LrxM+WU3ETafQOpuDQBthO05ERKElnrIMJWeyMUoADEkty7zn65N6d/0G4BkHTxlLOvFNkXuPF2DLTjs+87SaYx7cxAHfMrTJoGb/d4hI917AbuosLuZTHjfWfTbvSIPUhEKWJwPRQmXRisJZs/krS0IECyTKbqC57KfUUQRznGG1MuVeWt9vcr1WHqVYccP4McZWJ+3jvsdjnZKSGB0HUQcZWgKUinQMAO/LkvyxnV0WMxiheSqe7j4P6ls7Euji6miV0IJ4Q0pBgCXLAGsj7Ri33rKy2IcrhLu3sS0anEiEHC3rheFeDyEMgv6eHaAZH4GSf3blN5QY/cYsoZYIJ51DUn3tLsODKWk/nguAlg9pzuwhaF+cY/7fhpluj8wLAyaS4y3k80p6T+u+pOW8XIRSFrgL6DNYJzsvjOKWKZh2SG7gtnSVm3rFRmUukf5ymn94QvFtrovs26Ibc95w6Yvj3QydmnlqLw4yefbgkfIY+hLUX3CAsaGmM/M3ocvs2fflmU0Nev1lbfcQedPHBW/mZAqg88HIZFcQQ4P4jWqLW0DtYssJn/xQacy9qN9h6o3LOZWEV8ePM/SYirhesI5/N7T+cB6JggN2ZeLJml6lZj7ROpl5h60sFI5B5+6Wu7mpBU4KWKXmvw3f/j6UyiwXtvvsDBJ2OOryIO+7CzVzbLpO7pP/QI4pToVmCfn3GZLjFWC/H6iGdaoJEzDH1hzbyNvINimF+xfD1ArZlfgsw75CEdusr8LxzMJSdhSDJ8nhqNVGA8uy8hGsLzpLQzeS9Q==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 2ba9b761-b6e1-4d6f-b877-08dc65c55bd3",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "26 Apr 2024 07:49:10.6045 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "fe128f2c-073b-4c20-818e-7246a585940c",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n aeq+ZzydjisJnry7rmvM9RN9JEIPtlEpw/fUkEyqz34aH4ymosx+0HPEIWF4bME+yZqSVbSpx/iQze74jwCaM80+y/g4L1fus+v59EMUHSY=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MN0PR13MB6618",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "From: Xinying Yu <xinying.yu@corigine.com>\n\nSetup the vring relay thread to monitor the interruption from\ndevice. And do the dirty page logging or notify device according\nto event data.\n\nSigned-off-by: Xinying Yu <xinying.yu@corigine.com>\nReviewed-by: Chaoyong He <chaoyong.he@corigine.com>\nReviewed-by: Long Wu <long.wu@corigine.com>\nReviewed-by: Peng Zhang <peng.zhang@corigine.com>\n---\n drivers/vdpa/nfp/nfp_vdpa.c      | 148 +++++++++++++++++++++++++++++++\n drivers/vdpa/nfp/nfp_vdpa_core.c |   9 ++\n drivers/vdpa/nfp/nfp_vdpa_core.h |   2 +\n 3 files changed, 159 insertions(+)",
    "diff": "diff --git a/drivers/vdpa/nfp/nfp_vdpa.c b/drivers/vdpa/nfp/nfp_vdpa.c\nindex 65f7144671..e57765eb1a 100644\n--- a/drivers/vdpa/nfp/nfp_vdpa.c\n+++ b/drivers/vdpa/nfp/nfp_vdpa.c\n@@ -26,6 +26,8 @@\n #define NFP_VDPA_USED_RING_LEN(size) \\\n \t\t((size) * sizeof(struct vring_used_elem) + sizeof(struct vring_used))\n \n+#define EPOLL_DATA_INTR        1\n+\n struct nfp_vdpa_dev {\n \tstruct rte_pci_device *pci_dev;\n \tstruct rte_vdpa_device *vdev;\n@@ -776,6 +778,139 @@ update_datapath(struct nfp_vdpa_dev *device)\n \treturn ret;\n }\n \n+static int\n+nfp_vdpa_vring_epoll_ctl(uint32_t queue_num,\n+\t\tstruct nfp_vdpa_dev *device)\n+{\n+\tint ret;\n+\tuint32_t qid;\n+\tstruct epoll_event ev;\n+\tstruct rte_vhost_vring vring;\n+\n+\tfor (qid = 0; qid < queue_num; qid++) {\n+\t\tev.events = EPOLLIN | EPOLLPRI;\n+\t\trte_vhost_get_vhost_vring(device->vid, qid, &vring);\n+\t\tev.data.u64 = qid << 1 | (uint64_t)vring.kickfd << 32;\n+\t\tret = epoll_ctl(device->epoll_fd, EPOLL_CTL_ADD, vring.kickfd, &ev);\n+\t\tif (ret < 0) {\n+\t\t\tDRV_VDPA_LOG(ERR, \"Epoll add error for queue %u\", qid);\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n+\n+\t/* vDPA driver interrupt */\n+\tfor (qid = 0; qid < queue_num; qid += 2) {\n+\t\tev.events = EPOLLIN | EPOLLPRI;\n+\t\t/* Leave a flag to mark it's for interrupt */\n+\t\tev.data.u64 = EPOLL_DATA_INTR | qid << 1 |\n+\t\t\t\t(uint64_t)device->intr_fd[qid] << 32;\n+\t\tret = epoll_ctl(device->epoll_fd, EPOLL_CTL_ADD,\n+\t\t\t\tdevice->intr_fd[qid], &ev);\n+\t\tif (ret < 0) {\n+\t\t\tDRV_VDPA_LOG(ERR, \"Epoll add error for queue %u\", qid);\n+\t\t\treturn ret;\n+\t\t}\n+\n+\t\tnfp_vdpa_update_used_ring(device, qid);\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+nfp_vdpa_vring_epoll_wait(uint32_t queue_num,\n+\t\tstruct nfp_vdpa_dev *device)\n+{\n+\tint i;\n+\tint fds;\n+\tint kickfd;\n+\tuint32_t qid;\n+\tstruct epoll_event events[NFP_VDPA_MAX_QUEUES * 2];\n+\n+\tfor (;;) {\n+\t\tfds = epoll_wait(device->epoll_fd, events, queue_num * 2, -1);\n+\t\tif (fds < 0) {\n+\t\t\tif (errno == EINTR)\n+\t\t\t\tcontinue;\n+\n+\t\t\tDRV_VDPA_LOG(ERR, \"Epoll wait fail\");\n+\t\t\treturn -EACCES;\n+\t\t}\n+\n+\t\tfor (i = 0; i < fds; i++) {\n+\t\t\tqid = events[i].data.u32 >> 1;\n+\t\t\tkickfd = (uint32_t)(events[i].data.u64 >> 32);\n+\n+\t\t\tnfp_vdpa_read_kickfd(kickfd);\n+\t\t\tif ((events[i].data.u32 & EPOLL_DATA_INTR) != 0) {\n+\t\t\t\tnfp_vdpa_update_used_ring(device, qid);\n+\t\t\t\tnfp_vdpa_irq_unmask(&device->hw);\n+\t\t\t} else {\n+\t\t\t\tnfp_vdpa_notify_queue(&device->hw, qid);\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static uint32_t\n+nfp_vdpa_vring_relay(void *arg)\n+{\n+\tint ret;\n+\tint epoll_fd;\n+\tuint16_t queue_id;\n+\tuint32_t queue_num;\n+\tstruct nfp_vdpa_dev *device = arg;\n+\n+\tepoll_fd = epoll_create(NFP_VDPA_MAX_QUEUES * 2);\n+\tif (epoll_fd < 0) {\n+\t\tDRV_VDPA_LOG(ERR, \"failed to create epoll instance.\");\n+\t\treturn 1;\n+\t}\n+\n+\tdevice->epoll_fd = epoll_fd;\n+\n+\tqueue_num = rte_vhost_get_vring_num(device->vid);\n+\n+\tret = nfp_vdpa_vring_epoll_ctl(queue_num, device);\n+\tif (ret != 0)\n+\t\tgoto notify_exit;\n+\n+\t/* Start relay with a first kick */\n+\tfor (queue_id = 0; queue_id < queue_num; queue_id++)\n+\t\tnfp_vdpa_notify_queue(&device->hw, queue_id);\n+\n+\tret = nfp_vdpa_vring_epoll_wait(queue_num, device);\n+\tif (ret != 0)\n+\t\tgoto notify_exit;\n+\n+\treturn 0;\n+\n+notify_exit:\n+\tclose(device->epoll_fd);\n+\tdevice->epoll_fd = -1;\n+\n+\treturn 1;\n+}\n+\n+static int\n+nfp_vdpa_setup_vring_relay(struct nfp_vdpa_dev *device)\n+{\n+\tint ret;\n+\tchar name[RTE_THREAD_INTERNAL_NAME_SIZE];\n+\n+\tsnprintf(name, sizeof(name), \"nfp_vring%d\", device->vid);\n+\tret = rte_thread_create_internal_control(&device->tid, name,\n+\t\t\tnfp_vdpa_vring_relay, (void *)device);\n+\tif (ret != 0) {\n+\t\tDRV_VDPA_LOG(ERR, \"Failed to create vring relay pthread.\");\n+\t\treturn -EPERM;\n+\t}\n+\n+\treturn 0;\n+}\n+\n static int\n nfp_vdpa_sw_fallback(struct nfp_vdpa_dev *device)\n {\n@@ -802,10 +937,17 @@ nfp_vdpa_sw_fallback(struct nfp_vdpa_dev *device)\n \tif (ret != 0)\n \t\tgoto unset_intr;\n \n+\t/* Setup vring relay thread */\n+\tret = nfp_vdpa_setup_vring_relay(device);\n+\tif (ret != 0)\n+\t\tgoto stop_vf;\n+\n \tdevice->hw.sw_fallback_running = true;\n \n \treturn 0;\n \n+stop_vf:\n+\tnfp_vdpa_stop(device, true);\n unset_intr:\n \tnfp_vdpa_disable_vfio_intr(device);\n error:\n@@ -859,6 +1001,12 @@ nfp_vdpa_dev_close(int vid)\n \t\t/* Reset VF */\n \t\tnfp_vdpa_stop(device, true);\n \n+\t\t/* Remove interrupt setting */\n+\t\tnfp_vdpa_disable_vfio_intr(device);\n+\n+\t\t/* Unset DMA map for guest memory */\n+\t\tnfp_vdpa_dma_map(device, false);\n+\n \t\tdevice->hw.sw_fallback_running = false;\n \n \t\trte_atomic_store_explicit(&device->dev_attached, 0,\ndiff --git a/drivers/vdpa/nfp/nfp_vdpa_core.c b/drivers/vdpa/nfp/nfp_vdpa_core.c\nindex 8f9aba9519..70aeb4a3ac 100644\n--- a/drivers/vdpa/nfp/nfp_vdpa_core.c\n+++ b/drivers/vdpa/nfp/nfp_vdpa_core.c\n@@ -271,3 +271,12 @@ nfp_vdpa_notify_queue(struct nfp_vdpa_hw *vdpa_hw,\n \tnfp_qcp_notify_ptr_add(vdpa_hw->notify_addr[qid],\n \t\t\tNFP_QCP_NOTIFY_WRITE_PTR, qid);\n }\n+\n+void nfp_vdpa_irq_unmask(struct nfp_vdpa_hw *vdpa_hw)\n+{\n+\tstruct nfp_hw *hw = &vdpa_hw->super;\n+\n+\t/* Make sure all updates are written before un-masking */\n+\trte_wmb();\n+\tnn_cfg_writeb(hw, NFP_NET_CFG_ICR(1), NFP_NET_CFG_ICR_UNMASKED);\n+}\ndiff --git a/drivers/vdpa/nfp/nfp_vdpa_core.h b/drivers/vdpa/nfp/nfp_vdpa_core.h\nindex a339ace601..bc4db556a2 100644\n--- a/drivers/vdpa/nfp/nfp_vdpa_core.h\n+++ b/drivers/vdpa/nfp/nfp_vdpa_core.h\n@@ -60,4 +60,6 @@ void nfp_vdpa_notify_queue(struct nfp_vdpa_hw *vdpa_hw, uint16_t qid);\n \n uint64_t nfp_vdpa_get_queue_notify_offset(struct nfp_vdpa_hw *vdpa_hw, int qid);\n \n+void nfp_vdpa_irq_unmask(struct nfp_vdpa_hw *vdpa_hw);\n+\n #endif /* __NFP_VDPA_CORE_H__ */\n",
    "prefixes": [
        "09/10"
    ]
}