get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 40743,
    "url": "http://patchwork.dpdk.org/api/patches/40743/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/1528374591-26126-1-git-send-email-rasland@mellanox.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<1528374591-26126-1-git-send-email-rasland@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1528374591-26126-1-git-send-email-rasland@mellanox.com",
    "date": "2018-06-07T12:29:51",
    "name": "[dpdk-dev,RFC] net/tap: add queues when attaching from secondary process",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "7902943de039b943bf85c8eae2dc41266d6f35b4",
    "submitter": {
        "id": 513,
        "url": "http://patchwork.dpdk.org/api/people/513/?format=api",
        "name": "Raslan Darawsheh",
        "email": "rasland@mellanox.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patchwork.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/1528374591-26126-1-git-send-email-rasland@mellanox.com/mbox/",
    "series": [
        {
            "id": 29,
            "url": "http://patchwork.dpdk.org/api/series/29/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=29",
            "date": "2018-06-07T12:29:51",
            "name": "[dpdk-dev,RFC] net/tap: add queues when attaching from secondary process",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/29/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/40743/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/40743/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 8B2131B018;\n\tThu,  7 Jun 2018 14:30:05 +0200 (CEST)",
            "from EUR01-VE1-obe.outbound.protection.outlook.com\n\t(mail-ve1eur01on0063.outbound.protection.outlook.com [104.47.1.63])\n\tby dpdk.org (Postfix) with ESMTP id AA3621B014\n\tfor <dev@dpdk.org>; Thu,  7 Jun 2018 14:30:04 +0200 (CEST)",
            "from mellanox.com (37.142.13.130) by\n\tVI1PR05MB1264.eurprd05.prod.outlook.com (2a01:111:e400:5188::14) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.820.14;\n\tThu, 7 Jun 2018 12:30:02 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com;\n\ts=selector1;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=4lNO+USZTeF1ihL+v6n5sLa8Fw6cObuJ1pti6cNofUs=;\n\tb=h8zE2z/hYXoEe36WzSYsPynJWtkUBCnscuNMDbBfhx/z68tsKxe+e+Q4xpFaNSHqHkTIgbp8XK4LDd1hoZUcVPVEwF9dfSGGxvotQjQaUjcgc29i57qEeiURpm5J4NnEXH9oBYN9Hb74f5NrIcTwPkPtufMgDFR6UmzZPJMl5hw=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=rasland@mellanox.com; ",
        "From": "Raslan Darawsheh <rasland@mellanox.com>",
        "To": "thomas@monjalon.net",
        "Cc": "dev@dpdk.org,\n\trasland@mellanox.com",
        "Date": "Thu,  7 Jun 2018 15:29:51 +0300",
        "Message-Id": "<1528374591-26126-1-git-send-email-rasland@mellanox.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[37.142.13.130]",
        "X-ClientProxiedBy": "VI1PR07CA0176.eurprd07.prod.outlook.com\n\t(2603:10a6:802:3e::24) To VI1PR05MB1264.eurprd05.prod.outlook.com\n\t(2a01:111:e400:5188::14)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-HT": "Tenant",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(7020095)(4652020)(48565401081)(5600026)(4534165)(4627221)(201703031133081)(201702281549075)(2017052603328)(7153060)(7193020);\n\tSRVR:VI1PR05MB1264; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; VI1PR05MB1264;\n\t3:rJKGhsMlQyew5rzgVaxbTYeRGWcKRXjNmfCowkeGnjkgfGBkbnawiOuFwum0u3pvrB8uRJ2pPJsR1Yz06YBgSWXWnK9JiO4jV9biQADr/kYgaxD1omiKt2/uFij5kudikj1kQIbSj+8bCeqVzVIWMehiRvAveHw65enjxBLXYZV/ewoF1YqBH4NljU4EHadiyTw7UOPWe++5GzStJcKdteHXl3gNuh2nwDT6zK1Ny4f39x265aOXEb6LLVoxfc8v;\n\t25:ibEb9TW8L3oSyFSRRqe1v0+40IGFSbBhDQErLIZcH/HaNReVfj/oEXDk1DQjqSzDrc23YDHDwdo0czACpqxElmpheGKhIOOH4bYUNtp8l4TpWr1T1c/QU6x5prV1aFPS+Ekno2BplwQPxle2YjDCuCKRjU8yDDjzDXrSJm7o6YClFsDGVXKPH6h/suhonVMonVmjuDfZJqG9XQWd5S4CKEByyI1AwClEB9Hq4CoS6XYVsVjFU/z3NjMkV6m5bmcyTuWGZwRtGol6HTHqbtc3Bj0bcGzDPnDQjiKmE5VDm2Xj5H7tarsgCA9rhubQlLQ4XATtfEEkClWtFUunAPKh1g==;\n\t31:wrMZ0DdyRNmuQpMql3jmyz5zvmsQ7uCpkqsYjyuDt1MxseEMqrsyg1p8fdpgmvZ/UXGDHjHUhBlR72qog5xVXdT7xojTpIx+tcZccwSrDJpLeT1F5WaNy0oQVENc4BT7+DcNTAd29jwxOjF9DT8MkHhlJ8MCDt7gk/an1aWmqOh52TfodesLNtVN85aqlh8l2cZhz8Rz90F6hphbSat9yDpVFGPPDnjDIAde39zyShA=",
            "1; VI1PR05MB1264;\n\t20:4c4YnPnpIrWGFkDAagxSk9pKXLvZ4RAmkDXbwFVPlCr5HvSoEhZKGf25WRFXtqPy+CzjLSgvs/N5cS2QnYb6QWNG8n7jsjRGDVetnLUpaWHN5z+0AtUnUTJ4q+KRHEXiC7nzLRYS1oYN5kg58UWFetO1LoBEgps9BwnJqqMjb2ezT1mTTgN9HkF18w9otddfUBJBjPCfDqFvOXWn7Y3IzE5Tq3teGJtB3aaWpGs4LuzpmV/D2voLwVb+o7cTNqS2xg1618DyR5P7YgBzrCl+kdy1Gy4W4FzraYsKleaZfFqcz61sXKtBEoKqzoR0fO4RBRHX3S6aqb6aPXWlsmQ5JtoNPURF3bJD6JHU2t2gw0v36dYsuQpSjCyeNhmxrqKY7FvuDffCYNgDqbNOA3GDr0JXT1OmEbrOVE941UwDIjTyT0Tgk+nlm+O4FDMm5ZV4RNU4xq/WX2FmHN0JJyUeDEsZzGtmyQwIEuVBBEcwuMJVr+fYJlJ2cTZhu9U9BECS;\n\t4:JqnUmiIL8Yrv2aTgn0W6T9nR8SYiVT3xHYhimGoUYTTQnGldYbxQ5ruwlBdxFGNO1T8qq9Zql9RYXnq24TG7nbPaGhM2ni3OnFZFGR4TJKj8LqMCFRZ/TivNhGJRnrxOxL/POLoHTT0KrgIJI1MDAynlhxHSeRQfDVUFdmQ46i0HatDda0STpo5adfuard3WjIl3w/jhe9t1ffcWRVuOvsyyjtjdIbAobevFgAx+bGYjCRhki4S/upGF6b4houveJPgQK6zHrTk9y1U+x84C2w==",
            "=?us-ascii?Q?1; VI1PR05MB1264;\n\t23:crT7yScy3Uq/wn+2hPDP9Xdy6yDijIMPxmXPfC///?=\n\t4M/EzXXXJzwE7xZa1APOGvr/5rp+2KFSkjPXgnjMLQ/Q3St52Ht8gBUMt/JZKwM5V1m5n0KLYhb4xX6qirtd6hcGjwscDYyqU5yk4lzl3i25YnfrvHWomfv2r7gENAD250g5TB60tfm4zJrjnNLFQWd144n8/x+coxfBNxXXU3AdKiK+QWz5DuLbSwlc/UB8n/ynhCLFGAAePLnDtBDYu4ynhc9+yc1ML2EB/5Ix4Tn5uVvL7nYzVkvEVpeV+kyyaKQtKs4+loT0+S+O4qPFVP53BTHX3gdDRRQTGm3JJC/geTCOA421ieRDn/TbLX9Q6kedVg7Sf+NtO1V7CH4rPNsncEaVV/dt1Rh2b9sp14TYX5hIDcQ8wkahwAd8b+1oLEG0QLpacLx1j/h0YVLSvTjOZNqjgILD5jdwaB9FyDTjAQ/9aZjOSkpFgjJY+hiEgNiksTbUjdsZfVu7Rvndk170YAm9wdM64pglXig13+HfkCia5nGQKarg9fwcD1HoygmqyeIq4+6wo3MdEeTZz6p6EcQjBCLuPrGcu68jpZF8ZuE3PslPInvGc7YzJEXd3MhxbgrMtBx0s2oPhNvy6hpAJ+PCEOkfv+r2lF4f0l7lv6q6PX99dA3JCPBSeJAJ/I+WYTWjqLnrUOA4rxH/G/QNt0OsWsffNhOAmP8sDsAn2/ketl71mhgDj2uzFhA/Zp+4Qh36uYKYt7UsYxnzo/UKNgUUtNpR1MRlwHldyuAkELK/RNeDkr/+NiyGuP1yrhGFfNP6UTwLRV+AdsJdZie5UjHziFXgEJ3tb/DJvsd3sniZTZwm+ENr7XHZrvISGR6oaSUvh2h1OhOKZK9qP/zXI+bAgJE/udw6DOtPDRXlCqynOdLPqJbMfbevJLOd9ickdOKdberDsxZRBT8FILsKzN2Z9UnMECbRbKqk1eFpeAO/pj7cYrp7WSoFh2yWVa/bOgDJRRyFxpuRspKlFRTtM+9Fhsx+mXesC0JWF9IWfo90Y4NPF9OZIt5/13s1+jCBx4D3H8llMa6aZM0t+H71Wp6/ORahhE6aS+yhdesJf0cdRyFwzHk8Nz3o2PSJ5QYO+KR5D0cp26fScUHR5ol+O9b23/mnkCnwD6mSD9ZSbQmYZun03apl2Ab31hRN0nCSr4o3yWk+dJbwI/LuyCB3YfaQRXLlvSzaFAqbVBiPs6asXXavsJc/ExO4tndxxM/v2Cm8sTAsXzoWSyvAsA5hjayICRkdjOA2gzjifAXpg==",
            "1; VI1PR05MB1264;\n\t6:H+lBV5vbkSLZaKoH26pNE5I+awPvIA+taKVK2fwNg+/vv1pNAUPxT25Bs++Tmp899sEwHSANlQ7szFLS85VyId4U7zIFkbHbE4NXQaqg8X1rxMP98Lt1rBTrc06hp0FZt8bEgIwac4dVGIKOn1nse1vDCDlawU7+SatpVnLUSpTgOpDAPBZOS7mfC8sw8Mk2BJbkZRc0VHRLhZZfCsAG9ddRECoWM3AxJ5cPNCpxkbLV6UwJLnuYdmKjbmWI+cb9yax1F71Li4mtAitegfAj7RVdOpiZ0kRE4EmmjYLs44fziGJKmhMJmerRdTBLrce2DBNWAfBexoyWfNsT3HVK9FgzzZTtrhjZGXZuYT7V3cByXpU0+GwVggIIoeixqB27kygYLHcN8VbE4SGEqrOjNxXcUhNxW+snVQc7JNF/WqGr0iVBbzbNKxUx+C9h9va18Hncy0AEb/TNlbFpKAlMWw==;\n\t5:CRwYXwtLRN7+Yg6AWLkLCkupXgfc4Kz5CvC9EIOmqK4wsW8uUe4muPKsEFfBzXp+bfCeRgBb9CMRlT5bu1zjGX3nLv9whg8xgV/ogVyGBjjusFIzdISn4zyThYvBLZBePN0yRretU3ojlInyf+ZMTX74Q0Ri7Ehd1ivh87jKRjo=;\n\t24:gevRbk2vjM77TLrbCDP5BC6F8o6eNkdQsA/3J+SxWc/awD8iGNDbvd/UuKUgT9IP5YXF0hXOYxKmnnD1jx+s1IBXafeDNqj8WzG435CKbsA=",
            "1; VI1PR05MB1264;\n\t7:bUxzh6K+WIsBOIqiTKDnA/6yVt+/sXGwT+p6cdKRtRZhmlwi58KmGsrA9LPV+gTIdtvgSEC3wpMznaUABNDBlqsBGFK+N2PgDRz/PZNAt0ekQ39F8LGAXSpxb4pVzpXuUMA0bEAzbO0wG7qsMyXAMK8dsnu2/ISTFkjKHd5w38g5YdF1Dlrk4iw8DkoMj2V+naWhWQupG2L9NNZZyDT/wnMOi9PEQ5NgNvck2qh8tLm5KqGSdkH0i3+zgRDJnCJ9"
        ],
        "X-MS-TrafficTypeDiagnostic": "VI1PR05MB1264:",
        "X-LD-Processed": "a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr",
        "X-Microsoft-Antispam-PRVS": "<VI1PR05MB1264871E3690E4606C274953C2640@VI1PR05MB1264.eurprd05.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:;",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3231254)(944501410)(52105095)(93006095)(93001095)(3002001)(10201501046)(6055026)(149027)(150027)(6041310)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123564045)(20161123558120)(20161123562045)(6072148)(201708071742011)(7699016);\n\tSRVR:VI1PR05MB1264; BCL:0; PCL:0; RULEID:; SRVR:VI1PR05MB1264; ",
        "X-Forefront-PRVS": "06968FD8C4",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(39860400002)(346002)(39380400002)(366004)(396003)(376002)(199004)(189003)(956004)(21086003)(316002)(3846002)(86362001)(47776003)(16586007)(8676002)(26005)(81166006)(81156014)(36756003)(6666003)(6916009)(55016002)(97736004)(66066001)(50466002)(7736002)(305945005)(478600001)(107886003)(186003)(16526019)(50226002)(8936002)(106356001)(105586002)(6116002)(52116002)(51416003)(5890100001)(25786009)(48376002)(7696005)(33026002)(476003)(486006)(5660300001)(386003)(2361001)(2616005)(68736007)(69596002)(59450400001)(2351001)(4326008)(2906002)(53936002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR05MB1264; H:mellanox.com; FPR:;\n\tSPF:None; \n\tLANG:en; PTR:InfoNoRecords; A:1; MX:1; ",
        "Received-SPF": "None (protection.outlook.com: mellanox.com does not designate\n\tpermitted sender hosts)",
        "X-Microsoft-Antispam-Message-Info": "iblMSTivpXor/ke/mhaOb/jpRvzUxyc1ChTzUWt5hU5xqin/gUrY0B9UtvrjxrVizhgNsa1tjG6PpdD43q4hm22lWybAVKAc8AkhCeoobFZNCrgNlB5iy2qZz4ahTd9NeTaYkCfDzTgMPqS38vcHr0YlxoiPo5oPRGBWmaJylxCJ52qM64INMCAUkoXOioDS",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-MS-Office365-Filtering-Correlation-Id": "e3786c72-d184-423c-7081-08d5cc7264a5",
        "X-OriginatorOrg": "Mellanox.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "07 Jun 2018 12:30:02.4381\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "e3786c72-d184-423c-7081-08d5cc7264a5",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "a652971c-7d2e-4d9b-a6a4-d149256f461b",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "VI1PR05MB1264",
        "Subject": "[dpdk-dev] [RFC] net/tap: add queues when attaching from secondary\n\tprocess",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "In the case where the device is created by the primary process.\nCurrently, secondary process only contains the eth dev without being\nable to do any Rx/Tx.\n\nWhen attaching the device from secondary process this patch adds queues\ninfo got from IPC massaging.\n\nSigned-off-by: Raslan Darawsheh <rasland@mellanox.com>\n---\n drivers/net/tap/Makefile      |   2 +\n drivers/net/tap/rte_eth_tap.c | 105 +++++++++++++++++++++++++++++++++++++++++-\n 2 files changed, 106 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/net/tap/Makefile b/drivers/net/tap/Makefile\nindex ccc5c5f..913423c 100644\n--- a/drivers/net/tap/Makefile\n+++ b/drivers/net/tap/Makefile\n@@ -27,6 +27,8 @@ LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs -lrte_hash\n LDLIBS += -lrte_bus_vdev\n \n CFLAGS += -DTAP_MAX_QUEUES=$(TAP_MAX_QUEUES)\n+CFLAGS += -DALLOW_EXPERIMENTAL_API\n+\n \n #\n # all source are stored in SRCS-y\ndiff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c\nindex 5531fe9..0f4c8d9 100644\n--- a/drivers/net/tap/rte_eth_tap.c\n+++ b/drivers/net/tap/rte_eth_tap.c\n@@ -16,6 +16,8 @@\n #include <rte_debug.h>\n #include <rte_ip.h>\n #include <rte_string_fns.h>\n+#include <rte_ethdev.h>\n+#include <rte_errno.h>\n \n #include <sys/types.h>\n #include <sys/stat.h>\n@@ -55,6 +57,9 @@\n #define ETH_TAP_CMP_MAC_FMT     \"0123456789ABCDEFabcdef\"\n #define ETH_TAP_MAC_ARG_FMT     ETH_TAP_MAC_FIXED \"|\" ETH_TAP_USR_MAC_FMT\n \n+/* IPC key for communication of queue fds between processes. */\n+#define TAP_MP_KEY     \"tap_mp_exchange_fds\"\n+\n static struct rte_vdev_driver pmd_tap_drv;\n static struct rte_vdev_driver pmd_tun_drv;\n \n@@ -93,6 +98,15 @@ enum ioctl_mode {\n \tREMOTE_ONLY,\n };\n \n+/* To communicate queue infos between processes */\n+struct queues_fds {\n+\tchar name[RTE_DEV_NAME_MAX_LEN];\n+\tint num_rxq_fds;\n+\tint num_txq_fds;\n+\tint rxq_fds[RTE_PMD_TAP_MAX_QUEUES];\n+\tint txq_fds[RTE_PMD_TAP_MAX_QUEUES];\n+};\n+\n static int tap_intr_handle_set(struct rte_eth_dev *dev, int set);\n \n /**\n@@ -1731,6 +1745,47 @@ rte_pmd_tun_probe(struct rte_vdev_device *dev)\n \treturn ret;\n }\n \n+/*\n+ * Send the queues fds from the primary process to secondary.\n+ */\n+static int\n+tap_exchange_queues_fds(const struct rte_mp_msg *mp_msg, const void *peer)\n+{\n+\tstruct rte_eth_dev *eth_dev;\n+\tstruct rte_mp_msg mp_resp;\n+\tstruct queues_fds *out = (struct queues_fds *)&mp_resp.param;\n+\tconst struct queues_fds *in = (const struct queues_fds *)mp_msg->param;\n+\tuint16_t port_id;\n+\tint i, ret;\n+\n+\tTAP_LOG(DEBUG, \"received request\");\n+\tstrlcpy(out->name, in->name, sizeof(out->name));\n+\tret = rte_eth_dev_get_port_by_name(in->name, &port_id);\n+\tif (ret) {\n+\t\tTAP_LOG(ERR, \"Failed to get dev %s\", in->name);\n+\t\treturn -1;\n+\t}\n+\teth_dev = &rte_eth_devices[port_id];\n+\tstruct pmd_internals *pmd = eth_dev->data->dev_private;\n+\n+\t/* fill the queues fds data in the reply msg */\n+\tstrlcpy(mp_resp.name, TAP_MP_KEY, sizeof(mp_resp.name));\n+\tout->num_rxq_fds = eth_dev->data->nb_rx_queues;\n+\tfor (i = 0; i < eth_dev->data->nb_rx_queues; i++)\n+\t\tout->rxq_fds[i] = pmd->rxq[i].fd;\n+\tout->num_txq_fds = eth_dev->data->nb_tx_queues;\n+\tfor (i = 0; i < eth_dev->data->nb_tx_queues; i++)\n+\t\tout->txq_fds[i] = pmd->txq[i].fd;\n+\tmp_resp.len_param = sizeof(*out);\n+\tmp_resp.num_fds = 0;\n+\tif (rte_mp_reply(&mp_resp, peer) < 0) {\n+\t\tTAP_LOG(ERR, \"Failed to reply a fds request\");\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n /* Open a TAP interface device.\n  */\n static int\n@@ -1744,6 +1799,7 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev)\n \tchar remote_iface[RTE_ETH_NAME_MAX_LEN];\n \tstruct ether_addr user_mac = { .addr_bytes = {0} };\n \tstruct rte_eth_dev *eth_dev;\n+\tint queue_id;\n \n \tstrcpy(tuntap_name, \"TAP\");\n \n@@ -1757,8 +1813,46 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev)\n \t\t\tTAP_LOG(ERR, \"Failed to probe %s\", name);\n \t\t\treturn -1;\n \t\t}\n-\t\t/* TODO: request info from primary to set up Rx and Tx */\n \t\teth_dev->dev_ops = &ops;\n+\t\t/* request a sync from the primary process to get queues fds */\n+\t\teth_dev->rx_pkt_burst = pmd_rx_burst;\n+\t\teth_dev->tx_pkt_burst = pmd_tx_burst;\n+\t\tif (!rte_eal_primary_proc_alive(NULL)) {\n+\t\t\tTAP_LOG(ERR, \"cannot initialize secondary process \"\n+\t\t\t\t\"without a primary one\");\n+\t\t\treturn  -1;\n+\t\t}\n+\t\tstruct rte_mp_msg mp_req, *mp_rep;\n+\t\tstruct rte_mp_reply mp_reply;\n+\t\tstruct timespec ts = {.tv_sec = 5, .tv_nsec = 0};\n+\t\tstruct queues_fds *req = (struct queues_fds *)mp_req.param;\n+\t\tstruct queues_fds *resp;\n+\n+\t\tstrlcpy(req->name, name, sizeof(mp_req.name));\n+\t\tstrlcpy(mp_req.name, TAP_MP_KEY, sizeof(mp_req.name));\n+\t\tmp_req.len_param = sizeof(*req);\n+\t\t/* request for sync from primary process to get queues fds. */\n+\t\tif (rte_mp_request_sync(&mp_req, &mp_reply, &ts) == 0 &&\n+\t\t    mp_reply.nb_received == 1) {\n+\t\t\tmp_rep = &mp_reply.msgs[0];\n+\t\t\tresp = (struct queues_fds *)mp_rep->param;\n+\t\t\tTAP_LOG(INFO, \"Received fds for %d rx_queues and \"\n+\t\t\t\t\"%d tx_queues\", resp->num_rxq_fds,\n+\t\t\t\tresp->num_txq_fds);\n+\t\t} else {\n+\t\t\tTAP_LOG(ERR, \"Failed to request queues from primary\");\n+\t\t\treturn -1;\n+\t\t}\n+\n+\t\tstruct pmd_internals *pmd = eth_dev->data->dev_private;\n+\t\tfor (queue_id = 0; queue_id < resp->num_rxq_fds; queue_id++)\n+\t\t\tpmd->rxq[queue_id].fd = resp->rxq_fds[queue_id];\n+\n+\t\tfor (queue_id = 0; queue_id < resp->num_txq_fds; queue_id++)\n+\t\t\tpmd->txq[queue_id].fd = resp->txq_fds[queue_id];\n+\n+\t\tTAP_LOG(NOTICE, \"Initializing secondary process pmd_tap for %s\",\n+\t\t\tname);\n \t\trte_eth_dev_probing_finish(eth_dev);\n \t\treturn 0;\n \t}\n@@ -1806,6 +1900,14 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev)\n \tTAP_LOG(NOTICE, \"Initializing pmd_tap for %s as %s\",\n \t\tname, tap_name);\n \n+\t/* register for mp communication between secondary and primary */\n+\tif (rte_mp_action_register(TAP_MP_KEY, tap_exchange_queues_fds) &&\n+\t    rte_errno != EEXIST) {\n+\t\tTAP_LOG(ERR, \"%s : %s fail to register MP action : %s\",\n+\t\t\ttuntap_name, name, strerror(errno));\n+\t\treturn  -1;\n+\t}\n+\n \tret = eth_dev_tap_create(dev, tap_name, remote_iface, &user_mac,\n \t\tETH_TUNTAP_TYPE_TAP);\n \n@@ -1813,6 +1915,7 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev)\n \tif (ret == -1) {\n \t\tTAP_LOG(ERR, \"Failed to create pmd for %s as %s\",\n \t\t\tname, tap_name);\n+\t\trte_mp_action_unregister(TAP_MP_KEY);\n \t\ttap_unit--;\t\t/* Restore the unit number */\n \t}\n \trte_kvargs_free(kvlist);\n",
    "prefixes": [
        "dpdk-dev",
        "RFC"
    ]
}