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 37392A04A7; Mon, 24 Jan 2022 14:05:56 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id AEC72427C3; Mon, 24 Jan 2022 14:05:55 +0100 (CET) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by mails.dpdk.org (Postfix) with ESMTP id 8F1F240E0F; Mon, 24 Jan 2022 14:05:48 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643029553; x=1674565553; h=message-id:date:subject:to:cc:references:from: in-reply-to:content-transfer-encoding:mime-version; bh=yvfRyyBKjOlzF+3CqncISDsdafw7J61OzxSCJDJB2Js=; b=SBhe3ZRp821jnybUUQf+5mQTidxNNWFWNoO0PZiXyAysyUtVyzXaCzWJ f2fGr2x5WJmdv1VfnUq+y3qGUxShDBwgBf0QgeLmMC1yeD6A3Q75uFH5U 5eQCDHZI4PZL7dGd77Xaf3crfNcomZBEMnUFddY/eICd6izmf1I19Ig/X xhEqh0UfSNtDjwUd9HCvHnyf9Bu7dOmuQGzGNO3N/k9lE/EN+kT/zoEJu DIWhAmDReS0JJIzcTAMaUvaiZ5sbkz5wVmnJhDI+SIGXMD22LVHW3OyCB K13/gKIyNNPSZMWi//Bc0jQjtUZ4fcpZl0160H9jPJkQh0ZCB8Zs7W7Cj w==; X-IronPort-AV: E=McAfee;i="6200,9189,10236"; a="243634719" X-IronPort-AV: E=Sophos;i="5.88,311,1635231600"; d="scan'208";a="243634719" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2022 05:05:47 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.88,311,1635231600"; d="scan'208";a="617225924" Received: from orsmsx601.amr.corp.intel.com ([10.22.229.14]) by FMSMGA003.fm.intel.com with ESMTP; 24 Jan 2022 05:05:47 -0800 Received: from orsmsx611.amr.corp.intel.com (10.22.229.24) by ORSMSX601.amr.corp.intel.com (10.22.229.14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.20; Mon, 24 Jan 2022 05:05:47 -0800 Received: from orsmsx609.amr.corp.intel.com (10.22.229.22) by ORSMSX611.amr.corp.intel.com (10.22.229.24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.20; Mon, 24 Jan 2022 05:05:46 -0800 Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by orsmsx609.amr.corp.intel.com (10.22.229.22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2308.20 via Frontend Transport; Mon, 24 Jan 2022 05:05:46 -0800 Received: from NAM12-DM6-obe.outbound.protection.outlook.com (104.47.59.172) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2308.20; Mon, 24 Jan 2022 05:05:46 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Lvmz8hYkyVBoKVSbJI9ZITLZ89ytSoXBjgt9UPAUGEdJQYo1OHKwvgyYWZQP6LtoAVakynNeW6bQBxN96nE61QwckGBSXt0RS7ClzPTRUK4cvXylUzR2sm9Bn1RTDr4oVQKTmH6QQQabDn1+MZkNYGsa0lxjIA4LaXTHqSy9K+ZlgwEjlnmJyY2S4z2ZPwZkXHumF/oxFHtaT0XGMAXu28XOw+Rk9x8GAHQdGY/5ZUQ9tIqCj+qmytlxsfoSOUAywtcR0zxi5YDfF0/KTpJmbPKb6URztLmqcEVKp9rgwrlgE9sRBhbaEGu8vgfBA48TYkWkgfT1wwCXlTedc9UEhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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; bh=P/YUKYKaFkOFxnW2vwFepColnQoN4QWrNQKoQQRiV/I=; b=Ft6LRcDirzviPwSLDBIiV7bIqdbOYfye2wA2uTKF6hScx8mXMyJN16Qax66x/YxjJU8MxKPdPuCS88RHYCHaBW0D0Rb1eeM0nX+l2VrmrIbtrpLbTd/g+TJES2zqbzOrtYytIISObjC+FNwM5lf+8toIivV0s5rtxFdD9/G8OYDNdBYHR1LdEh0uumPKxh8OlMTyqQYcCRvBpz5o6RvuNcAxroYhk/PlAVvLRUEsoPNtMbP3E1ID97mXWEG8APCcn8D0JwKqqs88dOJ4X6wOw7qSNAGmgrvrDgtqQeUUgUqlgNMcssMk1c7cop7LmL3PVG2eOY6uWb/MwdhiQvWxEQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; Received: from PH0PR11MB5000.namprd11.prod.outlook.com (2603:10b6:510:41::19) by CH2PR11MB4312.namprd11.prod.outlook.com (2603:10b6:610:3a::24) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4909.12; Mon, 24 Jan 2022 13:05:44 +0000 Received: from PH0PR11MB5000.namprd11.prod.outlook.com ([fe80::5046:8550:928d:850e]) by PH0PR11MB5000.namprd11.prod.outlook.com ([fe80::5046:8550:928d:850e%7]) with mapi id 15.20.4909.017; Mon, 24 Jan 2022 13:05:44 +0000 Message-ID: Date: Mon, 24 Jan 2022 13:05:38 +0000 Subject: Re: [PATCH v2] net/tap: fix to populate fds in secondary process Content-Language: en-US To: kumaraparameshwaran rathinavel CC: , Kumara Parameshwaran , References: <20220121042944.23929-1-kumaraparamesh92@gmail.com> <20220124121251.64762-1-kumaraparamesh92@gmail.com> From: Ferruh Yigit X-User: ferruhy In-Reply-To: Content-Type: text/plain; charset="UTF-8"; format=flowed Content-Transfer-Encoding: 8bit X-ClientProxiedBy: LO2P123CA0082.GBRP123.PROD.OUTLOOK.COM (2603:10a6:600:138::15) To PH0PR11MB5000.namprd11.prod.outlook.com (2603:10b6:510:41::19) MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 977ec1ee-c54c-49e5-236a-08d9df3a3af7 X-MS-TrafficTypeDiagnostic: CH2PR11MB4312:EE_ X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:2733; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: MeTaUADeuftNFVF5BYuElEGZXibxDvUDx77K0q4b9YGgMwGUZ1SJwXCNLPImOqhoCTLi80KCDr/OqloXr2VFa7Lw7T5Eq4gJPaOdLKMVElsqL479IxUxka58C7BVAAeHJy2R3Oz7dLa9iYnOS8zYBtVx2y5iaGVbircOmF0lEPXdqGcDmmsdQOUBi5LukjeWjgwYN/KTY8/aAXUN5/Q0T2WUSSIVCrDn/dHz6VxVqVfw+aZuni4z8z2lgunR3tTzNpeJZ464q5jKEe9f3HeYjeGZlLPmE7n1aP9UOz74cRves8VeivpD1A6zjbrMC2PG9UxrLcJyYXReG8NLe2VrIbbP8F41cyae/36JCqGHIsSltptweeu450Npo9y/kbcsUj61n2EkZnBzmceLA91QyoomvFWU3kDfXM1pljgULbM4dFEkuCRU/5a/29jj+RX+XfAKCPvhnX0rcSAy5xWCydqk8OZuGS9j/59y1pzh9DaZEGIR86SzUVPmJjck9bvwfygN/6Tc7nr7En4K+z+t0blNHIs+/JaD0jv66u5J1W7XrNWSgFDA3uIBN8p4T9I+coafbXxTrSizfkqcdvb6kS4L8pFCT0Ek9jwh5t+uQFLRGDSE4f3Vjzu902P0H9l/0Zpv+wygp0rbGBsjgP5uZgeEUNDFqh51YtFSUYkHzyz0KrRa/4XOATL6VzuoElwi5dXeEzYeW79WgwWD6ApZqCQwyu2NwH6TbYN7SALJvsVVUVeWp5RFnkQFKiGSWCu6PPr7qUUmW7Ti5AU7bOQzlHKerO4KDnPHYcjyCdBzY2E= X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:PH0PR11MB5000.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(366004)(2906002)(38100700002)(44832011)(66556008)(83380400001)(36756003)(66946007)(6916009)(5660300002)(30864003)(66476007)(186003)(6486002)(26005)(53546011)(31696002)(6512007)(316002)(86362001)(6666004)(4326008)(508600001)(31686004)(6506007)(2616005)(8936002)(82960400001)(8676002)(45980500001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?eHVYYmtWdHVLZ3lSVUtDREhQdktQYmcwbzUwaEx3TU9WRzJmUThid3l4ZDlk?= =?utf-8?B?Vkg0eVhBQlhYaHhhQThTQitQdXNBSWo2cGd2TEk4S2lnbUpQV0E5VVRUSmZo?= =?utf-8?B?ODMwcm42YnhMdlRPZGZ0WWVDSERYVWl5eFpMcjdBWmRxMStSVlJxUUdZRXpK?= =?utf-8?B?NmpINzFwcG92aVpOYjVvR1NFTUhvVU5iTU55VFFBV1dWVHN1SGJHT2p6SGNC?= =?utf-8?B?UnpnZHNXRnNpWE12OW52U3BnMVNybEE5aFAxUlVuWlRWZXU2UkRoMWYvVnhn?= =?utf-8?B?TFJUdVFmTkdRL3FuclpJRjJkWHVyb1E3UFFtM21yL2FNc283QStLVWI5cndY?= =?utf-8?B?eGN1WmJzSkt3MXAzMWJ5VVkxOVhxRXJyUStPbVNMdFNWbzVnQ0RKOW04OTU0?= =?utf-8?B?N29MeXIxeStpKzl6eHhtWkdTemRJWjN6ZmxyNDJPWkJiaWtkK010SGwvZ3c4?= =?utf-8?B?SkgycWZCT2FQK3YzUzV3RlFZU3hhcWpCVzRwWENkWno2eVVoUGxKWHNmajdC?= =?utf-8?B?NzJTVWRhNVdiSTk5dVpPS2V5Z3JOcU5oVXB3NFNOblF5MWtUWk4rd1hMVFFu?= =?utf-8?B?OForSWFpcDhiRFV4ekpZZ0VLZGpnWVV5OGtZR3lOTEZJajNrQzRycjdOdEJJ?= =?utf-8?B?MTJBMkx2Z2RWMnFiczQ4OGhrcFo5QmU5QkkvNlljazFKTzJJZXpONlZ5bytz?= =?utf-8?B?RTBIWWxKRFl0ZWVJeVpHV1N4Y0o3ZDhOQUJ1T0FOK3JUdmVuVFNIWjJhRSsr?= =?utf-8?B?Y3RHRzFWMEtqZ0xHUkhJc1pXL0tSSTdrV09jcVYwUFBlNFcwL2VTRU1CTFdL?= =?utf-8?B?NzBXZkxPdE9CUWlYVUo5SFFHakxndVA1bitSMTI3VDNNbmJrdzFzdjZidS9k?= =?utf-8?B?QVZ5SXBSSks0eHRlNndQaFAwaXpQMmRZZnBRV0I0TCtSQWh2c0dPOVdWRzRJ?= =?utf-8?B?QlJacDBrd1dkNkN2Ym1yUzJZRUJwUTIrYmhXMytDME9hZW9KN1lQYlhTOHhW?= =?utf-8?B?ZXlMdG9OMVhNOW5XbS9NUVB5QjBxaGIybVhPY0hNWlNEclFZSVhsY2RuQ3JV?= =?utf-8?B?MTJsME51TjBYNFVPQk5CWDcrVUtNL1BWZ0tuTCsva21hRVc2cm5IOEtrUUtK?= =?utf-8?B?a2tibytXWG1BM0oyNXJ2d3dyTFNDL1ZLL0hMejAyZDE0SkFQZStJUGdMTGlo?= =?utf-8?B?R1hFUGFxVStKdlRENkpjRGJWcm55RHd3NGJ3dWY3ZUpjZGZIYTlKckt6WWJ1?= =?utf-8?B?MktYclVidGhZaklGdE8xd0JPYWpzcjZxZmZlcWhxM29TSXhBdklTVk5aQUZo?= =?utf-8?B?a3BIWnZZaVFKd1lmQWZHaFl6SlFpMFE3RE5IRXJSUk1IV1RMaUlTbVRuN25N?= =?utf-8?B?UitiTkJFYVRDMFdES1p0cHZsNUlnVUtjdVNzNHl0QTBkTkx5VGFKY2ZnZHE0?= =?utf-8?B?N3hWN2NVa0ZQV3BKeVJJUS8yM0JXb3dxOW5xVGR6LzFHeElRNHlMeUtPYldu?= =?utf-8?B?Vlh0WFBaRkFicjNEandNY3dUVkcxdFkwZi9vanRKcEMzSnJOWGE0WjdsRE8y?= =?utf-8?B?dWVSSzlENTROM2w1YVM1cFRvd201TkpqbER4UmtPdzFKb2FBak0wR0o2MGdJ?= =?utf-8?B?N1U2dTF1SkJlQ0FBQ2tQSFNKNVV3NEZ3ZGZlaERMSzR1MUpuYVFqT3Rhem00?= =?utf-8?B?dVpVOENFdUY0bHNyaGJvVTkxWjJ4V0YzY09XazhkZ091WFcxeXlaZXZCL0R6?= =?utf-8?B?bWhPT0lkaU9pNkVKUVlsVmxHaFcyTHNSTkNWc0RxYmlENUYwSXZhemhrcEZB?= =?utf-8?B?NDJ2ZWlQQUo2dFF1eHZRcitTNjd4VEdrNUZBWENEVWdCVDZRNExmNlNPc2NH?= =?utf-8?B?QmEwUjBEdlg1a0ZNcGVuZzI4ckhzcE95TXVZVTIxZCtHY1I2cExLTjBCenFH?= =?utf-8?B?R29VcStmVHp0eW5uK3I5MEJ4V2Z5dnM0aU9tN2VsNlFjTzRWVjY4K0Z3NzJE?= =?utf-8?B?dFVuSytvY0ptK2ZPOVJFeTVSenpQc05xTlRPZzIwYXM2aWlpdzQ2VlJ2V2xu?= =?utf-8?B?QmlwUnJFNTRsOEFhTjFZczgwVzVYVjRFVktBeGJpREZoMFhDZFNTNzIrUnla?= =?utf-8?B?M2IrM2xaU24zdkVac3BUYmZ6Ni90Q0l4WXlBU0psQUxXVHRINVo4dzRrTll6?= =?utf-8?Q?2ZL/GycGk+RMfbKH8Ss0MGc=3D?= X-MS-Exchange-CrossTenant-Network-Message-Id: 977ec1ee-c54c-49e5-236a-08d9df3a3af7 X-MS-Exchange-CrossTenant-AuthSource: PH0PR11MB5000.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Jan 2022 13:05:44.1246 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: a53cxzX4fxRq4pzzQv4+Ke5ABHZ4xj3E9z8keHlS3hGorryXQzdIc5+3lHKYSSGqRdjY52Xp4glut7OvJ4deuQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: CH2PR11MB4312 X-OriginatorOrg: intel.com 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 On 1/24/2022 12:54 PM, kumaraparameshwaran rathinavel wrote: > > > On Mon, Jan 24, 2022 at 6:05 PM Ferruh Yigit > wrote: > > On 1/24/2022 12:12 PM, Kumara Parameshwaran wrote: > > From: Kumara Parameshwaran > > > > > When a tap device is hotplugged to primary process which in turn > > adds the device to all secondary process, the secondary process > > does a tap_mp_attach_queues, but the fds are not populated in > > the primary during the probe they are populated during the queue_setup, > > added a fix to sync the queues during rte_eth_dev_start > > > > Fixes: 4852aa8f6e21 ("drivers/net: enable hotplug on secondary process") > > Cc: stable@dpdk.org > > > > Signed-off-by: Kumara Parameshwaran > > > --- > > > > v2: > > * Addressed review comments to move the function declaration and version > >    map > > > > Thanks for adding patch version. > > >   drivers/net/tap/rte_eth_tap.c | 196 +++++++++++++--------------------- > >   lib/ethdev/ethdev_driver.h    |  17 +++ > >   lib/ethdev/rte_ethdev.c       |  11 ++ > >   lib/ethdev/version.map        |   2 + > >   4 files changed, 102 insertions(+), 124 deletions(-) > > > > Can you please separate etdev (API) changes to another patch, so this will be a patchset > with two patches, > first patch adds ethdev API > second patch is tap patch, that uses the API in the first patch > >     Sure, I will do it. > > > > diff --git a/drivers/net/tap/rte_eth_tap.c b/drivers/net/tap/rte_eth_tap.c > > index f1b48cae82..f6c25d7e21 100644 > > --- a/drivers/net/tap/rte_eth_tap.c > > +++ b/drivers/net/tap/rte_eth_tap.c > > @@ -66,7 +66,7 @@ > >       (TAP_GSO_MBUFS_PER_CORE * TAP_GSO_MBUF_CACHE_SIZE) > > > >   /* IPC key for queue fds sync */ > > -#define TAP_MP_KEY "tap_mp_sync_queues" > > +#define TAP_MP_REQ_START_RXTX "tap_mp_req_start_rxtx" > > > > We said we can drop "tap_mp_sync_queues", but thinking twice, > will current implementation cover following usecase: > > - Primary applicaiton started with tap interface, all config, setup, >    start done > - Secondary app started without any parameter > > Since primary already started, I think secondary fds will be wrong, > what do you think? > That is true, the fds would be unitialised, we should retain for the secondary attach case. > >   #define TAP_IOV_DEFAULT_MAX 1024 > > > > @@ -880,11 +880,48 @@ tap_link_set_up(struct rte_eth_dev *dev) > >       return tap_ioctl(pmd, SIOCSIFFLAGS, &ifr, 1, LOCAL_AND_REMOTE); > >   } > > > > +static int tap_mp_req_on_rxtx(struct rte_eth_dev *dev) > > Can you please follow the coding convention: > sure, will do it. There are more comments/questions below, ca you please check them too? > static int > tap_mp_req_on_rxtx(struct rte_eth_dev *dev) > { > > > +{ > > +     struct rte_mp_msg msg; > > +     struct ipc_queues *request_param = (struct ipc_queues *)msg.param; > > +     int err; > > +     int fd_iterator = 0; > > +     struct pmd_process_private *process_private = dev->process_private; > > +     int i; > > + > > +     memset(&msg, 0, sizeof(msg)); > > +     strlcpy(msg.name , TAP_MP_REQ_START_RXTX, sizeof(msg.name )); > > +     strlcpy(request_param->port_name, dev->data->name, sizeof(request_param->port_name)); > > +     msg.len_param = sizeof(*request_param); > > +     for (i = 0; i < dev->data->nb_tx_queues; i++) { > > +             msg.fds[fd_iterator++] = process_private->txq_fds[i]; > > +             msg.num_fds++; > > +             request_param->txq_count++; > > +     } > > +     for (i = 0; i < dev->data->nb_rx_queues; i++) { > > +             msg.fds[fd_iterator++] = process_private->rxq_fds[i]; > > +             msg.num_fds++; > > +             request_param->rxq_count++; > > +     } > > + > > +     err = rte_mp_sendmsg(&msg); > > +     if (err < 0) { > > +             TAP_LOG(ERR, "Failed to send start req to secondary %d", > > +                     rte_errno); > > +             return -1; > > +     } > > + > > +     return 0; > > +} > > + > >   static int > >   tap_dev_start(struct rte_eth_dev *dev) > >   { > >       int err, i; > > > > +     if (rte_eal_process_type() == RTE_PROC_PRIMARY) > > +             tap_mp_req_on_rxtx(dev); > > + > >       err = tap_intr_handle_set(dev, 1); > >       if (err) > >               return err; > > @@ -901,6 +938,34 @@ tap_dev_start(struct rte_eth_dev *dev) > >       return err; > >   } > > > > +static int > > +tap_mp_req_start_rxtx(const struct rte_mp_msg *request, __rte_unused const void *peer) > > +{ > > I asked last time but I don't remember the response, > what should be in the 'peer' variable? > > > +     struct rte_eth_dev *dev; > > +     const struct ipc_queues *request_param = > > +             (const struct ipc_queues *)request->param; > > +     int fd_iterator; > > +     int queue; > > +     struct pmd_process_private *process_private; > > + > > +     dev = rte_get_eth_dev_by_name(request_param->port_name); > > +     if (!dev) { > > +             TAP_LOG(ERR, "Failed to get dev for %s", > > +                     request_param->port_name); > > +             return -1; > > +     } > > +     process_private = dev->process_private; > > +     fd_iterator = 0; > > +     TAP_LOG(DEBUG, "tap_attach rx_q:%d tx_q:%d\n", request_param->rxq_count, > > +             request_param->txq_count); > > +     for (queue = 0; queue < request_param->txq_count; queue++) > > +             process_private->txq_fds[queue] = request->fds[fd_iterator++]; > > +     for (queue = 0; queue < request_param->rxq_count; queue++) > > +             process_private->rxq_fds[queue] = request->fds[fd_iterator++]; > > + > > +     return 0; > > +} > > + > >   /* This function gets called when the current port gets stopped. > >    */ > >   static int > > @@ -1084,6 +1149,7 @@ tap_dev_close(struct rte_eth_dev *dev) > > > >       if (rte_eal_process_type() != RTE_PROC_PRIMARY) { > >               rte_free(dev->process_private); > > +             rte_mp_action_unregister(TAP_MP_REQ_START_RXTX); > >               return 0; > >       } > > > > @@ -1140,8 +1206,6 @@ tap_dev_close(struct rte_eth_dev *dev) > >               internals->ioctl_sock = -1; > >       } > >       rte_free(dev->process_private); > > -     if (tap_devices_count == 1) > > -             rte_mp_action_unregister(TAP_MP_KEY); > >       tap_devices_count--; > >       /* > >        * Since TUN device has no more opened file descriptors > > @@ -2292,113 +2356,6 @@ rte_pmd_tun_probe(struct rte_vdev_device *dev) > >       return ret; > >   } > > > > -/* Request queue file descriptors from secondary to primary. */ > > -static int > > -tap_mp_attach_queues(const char *port_name, struct rte_eth_dev *dev) > > -{ > > -     int ret; > > -     struct timespec timeout = {.tv_sec = 1, .tv_nsec = 0}; > > -     struct rte_mp_msg request, *reply; > > -     struct rte_mp_reply replies; > > -     struct ipc_queues *request_param = (struct ipc_queues *)request.param; > > -     struct ipc_queues *reply_param; > > -     struct pmd_process_private *process_private = dev->process_private; > > -     int queue, fd_iterator; > > - > > -     /* Prepare the request */ > > -     memset(&request, 0, sizeof(request)); > > -     strlcpy(request.name , TAP_MP_KEY, sizeof(request.name )); > > -     strlcpy(request_param->port_name, port_name, > > -             sizeof(request_param->port_name)); > > -     request.len_param = sizeof(*request_param); > > -     /* Send request and receive reply */ > > -     ret = rte_mp_request_sync(&request, &replies, &timeout); > > -     if (ret < 0 || replies.nb_received != 1) { > > -             TAP_LOG(ERR, "Failed to request queues from primary: %d", > > -                     rte_errno); > > -             return -1; > > -     } > > -     reply = &replies.msgs[0]; > > -     reply_param = (struct ipc_queues *)reply->param; > > -     TAP_LOG(DEBUG, "Received IPC reply for %s", reply_param->port_name); > > - > > -     /* Attach the queues from received file descriptors */ > > -     if (reply_param->rxq_count + reply_param->txq_count != reply->num_fds) { > > -             TAP_LOG(ERR, "Unexpected number of fds received"); > > -             return -1; > > -     } > > - > > -     dev->data->nb_rx_queues = reply_param->rxq_count; > > -     dev->data->nb_tx_queues = reply_param->txq_count; > > -     fd_iterator = 0; > > -     for (queue = 0; queue < reply_param->rxq_count; queue++) > > -             process_private->rxq_fds[queue] = reply->fds[fd_iterator++]; > > -     for (queue = 0; queue < reply_param->txq_count; queue++) > > -             process_private->txq_fds[queue] = reply->fds[fd_iterator++]; > > -     free(reply); > > -     return 0; > > -} > > - > > -/* Send the queue file descriptors from the primary process to secondary. */ > > -static int > > -tap_mp_sync_queues(const struct rte_mp_msg *request, const void *peer) > > -{ > > -     struct rte_eth_dev *dev; > > -     struct pmd_process_private *process_private; > > -     struct rte_mp_msg reply; > > -     const struct ipc_queues *request_param = > > -             (const struct ipc_queues *)request->param; > > -     struct ipc_queues *reply_param = > > -             (struct ipc_queues *)reply.param; > > -     uint16_t port_id; > > -     int queue; > > -     int ret; > > - > > -     /* Get requested port */ > > -     TAP_LOG(DEBUG, "Received IPC request for %s", request_param->port_name); > > -     ret = rte_eth_dev_get_port_by_name(request_param->port_name, &port_id); > > -     if (ret) { > > -             TAP_LOG(ERR, "Failed to get port id for %s", > > -                     request_param->port_name); > > -             return -1; > > -     } > > -     dev = &rte_eth_devices[port_id]; > > -     process_private = dev->process_private; > > - > > -     /* Fill file descriptors for all queues */ > > -     reply.num_fds = 0; > > -     reply_param->rxq_count = 0; > > -     if (dev->data->nb_rx_queues + dev->data->nb_tx_queues > > > -                     RTE_MP_MAX_FD_NUM){ > > -             TAP_LOG(ERR, "Number of rx/tx queues exceeds max number of fds"); > > -             return -1; > > -     } > > - > > -     for (queue = 0; queue < dev->data->nb_rx_queues; queue++) { > > -             reply.fds[reply.num_fds++] = process_private->rxq_fds[queue]; > > -             reply_param->rxq_count++; > > -     } > > -     RTE_ASSERT(reply_param->rxq_count == dev->data->nb_rx_queues); > > - > > -     reply_param->txq_count = 0; > > -     for (queue = 0; queue < dev->data->nb_tx_queues; queue++) { > > -             reply.fds[reply.num_fds++] = process_private->txq_fds[queue]; > > -             reply_param->txq_count++; > > -     } > > -     RTE_ASSERT(reply_param->txq_count == dev->data->nb_tx_queues); > > - > > -     /* Send reply */ > > -     strlcpy(reply.name , request->name, sizeof(reply.name )); > > -     strlcpy(reply_param->port_name, request_param->port_name, > > -             sizeof(reply_param->port_name)); > > -     reply.len_param = sizeof(*reply_param); > > -     if (rte_mp_reply(&reply, peer) < 0) { > > -             TAP_LOG(ERR, "Failed to reply an IPC request to sync queues"); > > -             return -1; > > -     } > > -     return 0; > > -} > > - > >   /* Open a TAP interface device. > >    */ > >   static int > > @@ -2442,9 +2399,11 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev) > >                       return -1; > >               } > > > > -             ret = tap_mp_attach_queues(name, eth_dev); > > -             if (ret != 0) > > -                     return -1; > > +             ret = rte_mp_action_register(TAP_MP_REQ_START_RXTX, tap_mp_req_start_rxtx); > > +             if (ret < 0 && rte_errno != ENOTSUP) > > +                     TAP_LOG(ERR, "tap: Failed to register IPC callback: %s", > > +                             strerror(rte_errno)); > > + > >               rte_eth_dev_probing_finish(eth_dev); > >               return 0; > >       } > > @@ -2492,15 +2451,6 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev) > > > >       TAP_LOG(DEBUG, "Initializing pmd_tap for %s", name); > > > > -     /* Register IPC feed callback */ > > -     if (!tap_devices_count) { > > -             ret = rte_mp_action_register(TAP_MP_KEY, tap_mp_sync_queues); > > -             if (ret < 0 && rte_errno != ENOTSUP) { > > -                     TAP_LOG(ERR, "tap: Failed to register IPC callback: %s", > > -                             strerror(rte_errno)); > > -                     goto leave; > > -             } > > -     } > >       tap_devices_count++; > >       tap_devices_count_increased = 1; > >       ret = eth_dev_tap_create(dev, tap_name, remote_iface, &user_mac, > > @@ -2511,8 +2461,6 @@ rte_pmd_tap_probe(struct rte_vdev_device *dev) > >               TAP_LOG(ERR, "Failed to create pmd for %s as %s", > >                       name, tap_name); > >               if (tap_devices_count_increased == 1) { > > -                     if (tap_devices_count == 1) > > -                             rte_mp_action_unregister(TAP_MP_KEY); > >                       tap_devices_count--; > >               } > >       } > > diff --git a/lib/ethdev/ethdev_driver.h b/lib/ethdev/ethdev_driver.h > > index d95605a355..a08991bcdf 100644 > > --- a/lib/ethdev/ethdev_driver.h > > +++ b/lib/ethdev/ethdev_driver.h > > @@ -1629,6 +1629,23 @@ rte_eth_hairpin_queue_peer_bind(uint16_t cur_port, uint16_t cur_queue, > >                               struct rte_hairpin_peer_info *peer_info, > >                               uint32_t direction); > > > > +/** > > Please add '@internal' tag into doxygen comment. > > > +* Get rte_eth_dev from device name. The device name should be specified > > +* as below: > > +* - PCIe address (Domain:Bus:Device.Function), for example- 0000:2:00.0 > > +* - SoC device name, for example- fsl-gmac0 > > +* - vdev dpdk name, for example- net_[pcap0|null0|tap0] > > +* > > +* @param name > > +*  pci address or name of the device > > +* @return > > +*   - rte_eth_dev if successful > > +*   - NULL on failure > > +*/ > > +__rte_internal > > +struct rte_eth_dev* > > +rte_get_eth_dev_by_name(const char *name); > > As the API name, better to start with 'rte_eth_' prefix to be consistent with > rest of the APIs. > I suggest 'rte_eth_dev_get_by_name' but feel free to chose better one. > > > + > >   /** > >    * @internal > >    * Reset the current queue state and configuration to disconnect (unbind) it > > diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c > > index a1d475a292..9192b0d664 100644 > > --- a/lib/ethdev/rte_ethdev.c > > +++ b/lib/ethdev/rte_ethdev.c > > @@ -894,6 +894,17 @@ rte_eth_dev_get_port_by_name(const char *name, uint16_t *port_id) > >       return -ENODEV; > >   } > > > > +struct rte_eth_dev * > > +rte_get_eth_dev_by_name(const char *name) > > +{ > > +     uint16_t pid; > > + > > +     if (rte_eth_dev_get_port_by_name(name, &pid)) > > +             return NULL; > > + > > +     return &rte_eth_devices[pid]; > > +} > > + > >   static int > >   eth_err(uint16_t port_id, int ret) > >   { > > diff --git a/lib/ethdev/version.map b/lib/ethdev/version.map > > index c2fb0669a4..7e3797189b 100644 > > --- a/lib/ethdev/version.map > > +++ b/lib/ethdev/version.map > > @@ -256,6 +256,7 @@ EXPERIMENTAL { > >       rte_flow_flex_item_create; > >       rte_flow_flex_item_release; > >       rte_flow_pick_transfer_proxy; > > + > > This is unintendent change. > > >   }; > > > >   INTERNAL { > > @@ -282,4 +283,5 @@ INTERNAL { > >       rte_eth_representor_id_get; > >       rte_eth_switch_domain_alloc; > >       rte_eth_switch_domain_free; > > +     rte_get_eth_dev_by_name; > > Please add in a sorted way. > > >   }; >