From patchwork Wed Jul 20 13:42:47 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Elo, Matias \(Nokia - FI/Espoo\)" X-Patchwork-Id: 72425 Delivered-To: patch@linaro.org Received: by 10.140.29.52 with SMTP id a49csp663083qga; Wed, 20 Jul 2016 06:44:43 -0700 (PDT) X-Received: by 10.55.162.138 with SMTP id l132mr58768740qke.85.1469022283213; Wed, 20 Jul 2016 06:44:43 -0700 (PDT) Return-Path: Received: from lists.linaro.org (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTP id n34si1731346qkh.150.2016.07.20.06.44.42; Wed, 20 Jul 2016 06:44:43 -0700 (PDT) Received-SPF: pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) client-ip=54.225.227.206; Authentication-Results: mx.google.com; spf=pass (google.com: domain of lng-odp-bounces@lists.linaro.org designates 54.225.227.206 as permitted sender) smtp.mailfrom=lng-odp-bounces@lists.linaro.org; dmarc=fail (p=NONE dis=NONE) header.from=nokia.com Received: by lists.linaro.org (Postfix, from userid 109) id CE3B7686D6; Wed, 20 Jul 2016 13:44:42 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on ip-10-142-244-252 X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAD_ENC_HEADER,BAYES_00, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,URIBL_BLOCKED autolearn=disabled version=3.4.0 Received: from [127.0.0.1] (localhost [127.0.0.1]) by lists.linaro.org (Postfix) with ESMTP id EC91F68437; Wed, 20 Jul 2016 13:44:32 +0000 (UTC) X-Original-To: lng-odp@lists.linaro.org Delivered-To: lng-odp@lists.linaro.org Received: by lists.linaro.org (Postfix, from userid 109) id A003C684EC; Wed, 20 Jul 2016 13:44:21 +0000 (UTC) Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0112.outbound.protection.outlook.com [104.47.1.112]) by lists.linaro.org (Postfix) with ESMTPS id B3BB768436 for ; Wed, 20 Jul 2016 13:43:23 +0000 (UTC) Received: from DB6PR0701CA0021.eurprd07.prod.outlook.com (10.168.7.159) by AM2PR07MB0484.eurprd07.prod.outlook.com (10.160.31.147) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.544.10; Wed, 20 Jul 2016 13:43:19 +0000 Received: from DB3FFO11FD005.protection.gbl (2a01:111:f400:7e04::140) by DB6PR0701CA0021.outlook.office365.com (2603:10a6:4:3::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.544.10 via Frontend Transport; Wed, 20 Jul 2016 13:43:19 +0000 Received-SPF: Pass (protection.outlook.com: domain of nokia.com designates 131.228.2.240 as permitted sender) receiver=protection.outlook.com; client-ip=131.228.2.240; helo=fihe3nok0734.emea.nsn-net.net; Received: from fihe3nok0734.emea.nsn-net.net (131.228.2.240) by DB3FFO11FD005.mail.protection.outlook.com (10.47.216.94) with Microsoft SMTP Server (TLS) id 15.1.523.9 via Frontend Transport; Wed, 20 Jul 2016 13:43:20 +0000 Received: from fihe3nok0734.emea.nsn-net.net (localhost [127.0.0.1]) by fihe3nok0734.emea.nsn-net.net (8.14.9/8.14.5) with ESMTP id u6KDgmja030647 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 20 Jul 2016 16:42:49 +0300 Received: from 10.144.19.15 ([10.144.104.111]) by fihe3nok0734.emea.nsn-net.net (8.14.9/8.14.5) with ESMTP id u6KDgmZK030641 (version=TLSv1/SSLv3 cipher=AES128-SHA256 bits=128 verify=NOT); Wed, 20 Jul 2016 16:42:48 +0300 X-HPESVCS-Source-Ip: 10.144.104.111 From: Matias Elo To: Date: Wed, 20 Jul 2016 16:42:47 +0300 Message-ID: <1469022168-28941-2-git-send-email-matias.elo@nokia.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1469022168-28941-1-git-send-email-matias.elo@nokia.com> References: <1469022168-28941-1-git-send-email-matias.elo@nokia.com> X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:131.228.2.240; IPV:NLI; CTRY:FI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(7916002)(2980300002)(438002)(199003)(189002)(92566002)(19580395003)(19580405001)(76176999)(50986999)(4001430100002)(5003940100001)(50226002)(97736004)(77096005)(2950100001)(2351001)(47776003)(106466001)(87936001)(11100500001)(575784001)(33646002)(450100001)(305945005)(189998001)(356003)(81156014)(81166006)(68736007)(7846002)(8936002)(50466002)(6806005)(48376002)(110136002)(8676002)(16796002)(229853001)(36756003)(2906002)(586003)(107886002)(4326007)(42882005); DIR:OUT; SFP:1102; SCL:1; SRVR:AM2PR07MB0484; H:fihe3nok0734.emea.nsn-net.net; FPR:; SPF:Pass; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; DB3FFO11FD005; 1:VIN2wNzBfZKKz71aM71uJ+J0bsFeGQnSDSYQWJ4cyMdg+doBJCxSKHKNmv6Qo+ACLrs5cSEQdjvEMDt71zZGOrkncjlGAerwmrzJ/NKtnD45R+wn99Jg8mHbEuPO2jbzEUrJcEkboNMRnvJ7IgNWvUMO7uxKtWT9aBA/tXrdUFAZzs8oEnB7ABlLj9s+qrQbPa9dvlzuWg4pVjA+f7tkr/TzMS4xpYlK3+Q7bH8ewj7aFQ+WjiTcUSTq3TAWPn/MJP8CLbiBmSFLKr3oEl7sZ7hmFMT0VS3qeKtW6bPaAtpLYEcpRfZhsbogVfG9ILwl7YaNtNaDxTRxC3BLhrYUYl3TARJIbRXhoNE6MziHt81l5nKUhIokwg7SRbPvWjQYZ8JPWOt4BHvTcUpQ3/AdqdtvcB/exz+WPskiN4X474GYkpyI+dPP8CtMj5GUtxbkDo/gbeAL10Yiq8h+mzxShOposL4LdMW+9HxF5BEItDtwAHTe0SdMYFbs9iCn4ybik/RmRAcu7NTd8b0DNJKfAg== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 395d6886-63f9-4375-86ff-08d3b0a3cff9 X-Microsoft-Exchange-Diagnostics: 1; AM2PR07MB0484; 2:morD+eZwP0HCNIJdiH+pnTwEET5gYLWAG1AP8sHPfqhnIkL7d5iIoKy+yfqOdyPHdm4uM3F9BP0lsJiiaQgd8GuwHZSOcMWxzQaqsabSdK0LQHczlxC9viZVasY3vHLjEy14LF/LmwtqpZol/4DGTDJiEOFgvxQD5qwbaHFPaTnOuUYecFb/SWMdj6Ut+YlT; 3:f/Zcdr7nflSkBiRVoquHUOyb9lE33jibI6LZaDxRlcYmMDR/HID/9X1Ve7nowo8i3pAr5v0J+mQQA8TBkH7cZ/U5cX64ECsnrumcSQGvHNDqp7buCYYCRaJRi48zjDlGxs6h4mtbicz6wjpjMU63x9r6H5u9aHPiLPbX1m/w0qz2Y04RbVeeVqdR9IULxLw0q1DmeqVnhXnf1/Y14Yye8Haq+yylLKt8+0EWp9B/OxTCDZnQtDSs3dvDK/i/CDLFu31quIwQk8dxL8Pkxihhuw== X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(8251501002); SRVR:AM2PR07MB0484; X-Microsoft-Exchange-Diagnostics: 1; AM2PR07MB0484; 25:oWUIAwOfpsZJqAx8lSpuhZHMJ2dOJueN71K/eZRAAmOk5UKR+R4P+iBPTNcI+0g17TCSr+0ygYGEhQrmv8n9lz1D+wXBsoS5mgv2h96P3Zkt+mHNFQdgpu2TSYx+tp13B0mosq1m9t0FAfgVvWzKah6IIA+xhn08XOknxdtQTHhbKJCAo9UvtOijz2l981Nqen3Uri5Tl/G8DG4HwlKEksxN8RGt+OY/6vus0NT3CvhQLx2fQfMAPkSMven/FJ+BUW5kUyev8go1tUhZI0e8+KHq/aXf3guE+8W6pCaaUQ2/Tdz1bmRMz0oNv7j79KUjPzRF7l8NBjSyYmMo4lFL/MluuJ0pCiUwUxjixzqRmhKWgS/IUTsDdwg1I+HUWvW24fQ6jfX6OufDpswb8Vo5sHJvppmYCcj7oUnjomzND6onnobdDCh9oSyh31pq0N+bd/EuOQNzx6+VETWS9tPv4JkNhBhp+FHRchF6o8MOn3JUz3Uhftmqpu/SLpSfq6YPYzvv8j+W6i6ArAXahdfsHRklSbP4OfcPzOdobRSvXkVp88cDV+oOnZO1U2jNStsLSId7YUh8zo1yBDAMjo09S0xhKyu6/Gw173tJeafmGPoSXz85hWWaXUAEo8gAC7KKSGXCfJDAPDRQxoxH1Oj4pfSDUdLwOtf5CepKxbv46gVgf4zPE7rKx5GYRKxG38VOB/5KLOit0smPD6L7GNoYbmP+LMm9dPUk9UE7b1WXRz2xvteiEksIFjke8aYYkYwP X-Microsoft-Exchange-Diagnostics: 1; AM2PR07MB0484; 31:j+aUlThP+3eJYDw8tx4J2dyFHpY6OddU7kubS/Ql8YoD9jQWtaSNfqOhMUXAg2mkA0bNn+8Begumi2qo9qUuhnbm4/VT79pltNtO5EEfqJkCJh5tEDpmwyNOP/Rco/RIa0Yg2WCzLBRUI4hywzpH5REGdp6hFALrj2HVroDgKQOp2A1a6pdrATDnzyJABuGa514fchMrnPNFI8zw9BiVWA==; 20:7NRiBXvml+gf5OLrHr8qHmOo1SyBw7WKIG1NQn5XLR/OqXgPAS3qxK63Fijxkjmx1nlwMnUvQcjoxK0J5JESh7N97u/K4qegdvd+LoF0Pm/qmQXwc38ZPh3hWzGhoVpf7LdAI8cUeHUfnk2hv4gt9v8mpjEw7kcuYL/goF4DQhc30oeTaXgabb0v/8p1C6SmeLnVlJi6j+xYgdPnVCzkELyHTMcX0ORnM3SAwgJlkf3qHVHXAJDBz1EJI81VIdC4cO5ybnwjiPukGlVIfq3XFxrh5Tw4U+oHXEcJT4lWoNCF9X1A4/8qnKN3Vz6RDqvmeGp9fSAcLRE1jnoy+T29GXEXctKL22kniCHX+PoY0QB/PNoinCoCqplSDdEtMFqgD8aTyu2q7sKslDZ70Li6i2D073GL5PaLS16LbfA1JpOBc4xbj4O76b5r7AJxf8ic4Gsnf9NuBZb01F7tGgpE6uqQTqJGpvDSmL6N2qBi3Fl3QIehiZ//46uvx2hFX4hk6Y8mZh+henC4iJBgcjqHBfZHWOSFHkeV5OhO4JR4U/eh8gbpmPLgeOnIoIyt1/I+3xpB8J7enB1TFPtn5dFRdyq3XYGkHfECk2Uwc1S/dI0= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(82608151540597)(22766785571888); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(13016025)(13018025)(8121501046)(5005006)(10201501046)(3002001)(6055026); SRVR:AM2PR07MB0484; BCL:0; PCL:0; RULEID:; SRVR:AM2PR07MB0484; X-Microsoft-Exchange-Diagnostics: 1; AM2PR07MB0484; 4:3DTfxtcXzfDNdy0mOtL3BH9lRtAjAIZWinGMqnN3BS55jJu4SVo+olpQ1qjIGCAYNBigulvXKpfgVoQX52ez3Zhjz5adCOklDt1APSCWJyyvczO/5ZWHvld3hTKDL7jtuZ5oAwso/GpUsRfA3RR39vTDhP4Iek/m55mHbcbdLBgoof/6WpckYSi5ocVp2nId+QWD9Iqf1zBNI8ytQ9pd9ZoObdhTPofnJjSAWSM7Vi/lOrn6cxlOkk3spHiq7mlGcPu1ZZDEibEkN46da6diLek86T6GV0vylTlVMm/aPgSj9mpltISqK9oBpYlnBBkXlseu4oyCxyVeTAGx1eb3zwuerkdg/6AOpI5gv92w+zFWTpioxxmVF8g8Fy7t0hFhFanxr+4sB3drf3r/f3bU2oNU8Fz3FAkPYWFClGVIv0ew7ZZxVdoguhNbODpofffHqFMcBTry5NK3xoD94uGOet+29FQebhhqfHQwCpHFnyw0Z2Tr5gznwtlxVJ4mIZ8v X-Forefront-PRVS: 000947967F X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM2PR07MB0484; 23:FVlWxI72+5LPsPAjZ3D2KHUNiR1rodKSbvjWCcUPm?= =?us-ascii?Q?fjc6Bd7Ong+9gr9PzsyWHIBSnppBoFI9S69Ijr9apMunEVP5uchO53geIIAM?= =?us-ascii?Q?toNrQVqWkpMiJEd1o2f6PNDsd25OCOSa4vM+5/YUqJvafzmd6AiGxso9ua/H?= =?us-ascii?Q?4HXg7+6FxzaP9q5XmRY4RRVcIz7KhE4G8Y3pzpqf0t+VewxbM/2QU33WgbeQ?= =?us-ascii?Q?Qc/8UASYpCRPXspS9C0VhKYS5D7457nF6UVT9sXp7HEZXDFB+TgXYlHq+8RD?= =?us-ascii?Q?E4yIidBnjVDQnkZ1kcTGcA8vGT9SKnL7rXOGes+xmfEH2LTTnGMW+aEZLp7I?= =?us-ascii?Q?6Gg6lf2Po46EL/OOY5MwSBFOMFKbWKxzeueY6QX13hM1+Z4N3ph0x8ezrYZ2?= =?us-ascii?Q?HmElJ/zM18woHd85JHieJtiLRdR9YeqKzuvOiINlQvvwfnDnLeMvTOI/mg4t?= =?us-ascii?Q?4btgSI7IdeqmeIkpHSEkYw73boxAS674j0d7/RDQyTHWpVjFA7fPq6yQJyJ2?= =?us-ascii?Q?5zZh5YNjSUCJIRLg0CD4LAarm10lwm4SVzC91PGgNu+paPotWF8KAeKrUK/z?= =?us-ascii?Q?qBUxxLkD7APFBfB293cuCirP0vwJw/M+io8aGBxLPlDQe96mC4Kv8M0EU5TT?= =?us-ascii?Q?UPKErjXu1Dpsp4HcQmnAmQk4y4iNC+g9WTIQBz4C/s/2mwvnN6VwWVupN5bp?= =?us-ascii?Q?G6ZF/V4BVOMsKJYr+TigOw3cu7xAdzQTOnOPRtbTL5yqbQ1Z9mKf4RAHoG+m?= =?us-ascii?Q?fFKhB5VqaTkDJy4fmkTwIEL3jIMpJ4eEoFjn80JoI/jNsyEW7GiEffGn3MxH?= =?us-ascii?Q?lTCGrcpHFJcwAt3BnavR3S1KoThq4zM1aOzO38aN/rYBdoNfZXQRRe0hpy2k?= =?us-ascii?Q?J+/EYIQbDboqX6nIfA6nvge0YlY/sAOLvfIEOwANe+G3uAX540+QHnCQ0NTc?= =?us-ascii?Q?IJHToMBpflbIML0HToyoeArDF761NR2RNhB/XtQQROkR2nyO5ooEpE3TdcxX?= =?us-ascii?Q?YS2c8QBfd4hxK2ASnO1sMluNye7I0FmU3PhayEhE/Xc7RCn8FRs4yBY55k4E?= =?us-ascii?Q?+46uwzJEfvchPnFjLByoXBFzoYM5v0YogjXAo3+xvYIRn6icxrfLqbvhPClh?= =?us-ascii?Q?xTTb/CEQwopM2MnLqimpX8OtWZueVTnUafFrU54VvpZfWRHIf8cQg=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; AM2PR07MB0484; 6:bdeo7Q0SS36Jp3Eg5cLiw/hi/nyuPUhpCpvlhI2pyQ7MoofTh3Zn6pnTNcVo42h1DvTuOyoDjsY67OSPLRls+wZousIYpSZppKO7FfNVYuaDmsxaS0Fu3+7rknEqfdkVpYcGeNV2G7Di2t35lZJlhSYxx4kKQUyETifyV5OV49zZ4OpDiSScuG0QlVc17GPelOrgvmD+yyrZxnCTD99tRSV+XfcfbyxNnioIuwtKKpv6p5f092ZtWq8HwGHx3/IFP615rt9qUDtdKrTiG4koSwM4oUq6KAG3kNNjA2KXRDFjLe8mLSiRi2E9NaULYkaNItW4tS7oLVf6M15973puJg==; 5:zTg+7Up1DROrhNS4P9qn8Xg0cA/uFFc7ihZgu6CAyCIvcQSPWXMayunLV3rOU2EP+ISLNcoD2KvdussTNc3aMwzcWMuDDcFO0uabCfPg/IE9a2c2nhM3LTL/DJ+1XYeFb8Vkk259IaUvlLHJPctTUQ==; 24:VviPZGcFi4f418C3wk4XLFTu2cyN7L/lUTtnwjcpW9ULgBzyMlsr5gQ785BRCtqfRCn7vo8Vyr8c7AZKLTOKPqpz2I6SHZ9buGqjDTzDxzM=; 7:Zsu+HyMCGPZbKuuWK/PPFdBRXaUgpxmElgfhy9G7TEiAdlvK+d/PDiMx4q9QYzthATO+aytsxqzUj7ApamZyqn9GQGb828t6D7TYHilo+DB4BAMopZNK8N+aFpStUD1c7DJOWNP7EGZs+MYNa+RgLduljVCCT4di2qtmlDFMfI5Y2nmVsXWU4y7vXHvqFkTa7aQqOwfA/T3Ow8iJNR8F3yvY1hn9ExqzVWJcI6alkWrgsTCf1fSF/IWC59IuCdWN SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: nokia.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jul 2016 13:43:20.2738 (UTC) X-MS-Exchange-CrossTenant-Id: 5d471751-9675-428d-917b-70f44f9630b0 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5d471751-9675-428d-917b-70f44f9630b0; Ip=[131.228.2.240]; Helo=[fihe3nok0734.emea.nsn-net.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM2PR07MB0484 X-Topics: patch Cc: Petri Savolainen Subject: [lng-odp] [PATCH v2 2/3] linux-gen: pktio: use multi alloc X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "The OpenDataPlane \(ODP\) List" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: lng-odp-bounces@lists.linaro.org Sender: "lng-odp" Modify dpdk pktio to take advantage of multi-alloc/free. Others pktios do alloc/free still one packet at a time. For example, l2fwd test application packet throughput is increased about 10% (with dpdk pktio). Signed-off-by: Petri Savolainen Signed-off-by: Matias Elo --- V2: - Allocate MTU sized packets with socket pktio .../linux-generic/include/odp_packet_internal.h | 4 +- platform/linux-generic/include/odp_packet_socket.h | 1 + platform/linux-generic/odp_packet.c | 71 +++++++++++++--------- platform/linux-generic/pktio/dpdk.c | 24 +++++--- platform/linux-generic/pktio/netmap.c | 5 +- platform/linux-generic/pktio/pcap.c | 26 ++------ platform/linux-generic/pktio/socket.c | 21 +++++-- platform/linux-generic/pktio/socket_mmap.c | 7 ++- platform/linux-generic/pktio/tap.c | 7 ++- 9 files changed, 94 insertions(+), 72 deletions(-) -- 2.7.4 diff --git a/platform/linux-generic/include/odp_packet_internal.h b/platform/linux-generic/include/odp_packet_internal.h index 4c4e36c..392d670 100644 --- a/platform/linux-generic/include/odp_packet_internal.h +++ b/platform/linux-generic/include/odp_packet_internal.h @@ -306,7 +306,9 @@ static inline int packet_parse_not_complete(odp_packet_hdr_t *pkt_hdr) /* Forward declarations */ int _odp_packet_copy_md_to_packet(odp_packet_t srcpkt, odp_packet_t dstpkt); -odp_packet_t packet_alloc(odp_pool_t pool_hdl, uint32_t len, int parse); +/* Packet alloc of pktios */ +int packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len, + odp_packet_t pkt[], int max_num); /* Fill in parser metadata for L2 */ void packet_parse_l2(packet_parser_t *prs, uint32_t frame_len); diff --git a/platform/linux-generic/include/odp_packet_socket.h b/platform/linux-generic/include/odp_packet_socket.h index ccff69a..dbfc9f1 100644 --- a/platform/linux-generic/include/odp_packet_socket.h +++ b/platform/linux-generic/include/odp_packet_socket.h @@ -45,6 +45,7 @@ typedef struct { int sockfd; /**< socket descriptor */ odp_pool_t pool; /**< pool to alloc packets from */ + uint32_t mtu; /**< maximum transmission unit */ unsigned char if_mac[ETH_ALEN]; /**< IF eth mac addr */ uint8_t *cache_ptr[ODP_PACKET_SOCKET_MAX_BURST_RX]; odp_shm_t shm; diff --git a/platform/linux-generic/odp_packet.c b/platform/linux-generic/odp_packet.c index 474fa81..c4cf324 100644 --- a/platform/linux-generic/odp_packet.c +++ b/platform/linux-generic/odp_packet.c @@ -76,35 +76,46 @@ static void packet_init(pool_entry_t *pool, odp_packet_hdr_t *pkt_hdr, pkt_hdr->input = ODP_PKTIO_INVALID; } -odp_packet_t packet_alloc(odp_pool_t pool_hdl, uint32_t len, int parse) +int packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len, + odp_packet_t pkt[], int max_num) { + odp_packet_hdr_t *pkt_hdr; + pool_entry_t *pool = odp_pool_to_entry(pool_hdl); + int num, i; + + num = buffer_alloc_multi(pool_hdl, len, (odp_buffer_t *)pkt, max_num); + + for (i = 0; i < num; i++) { + pkt_hdr = odp_packet_hdr(pkt[i]); + packet_init(pool, pkt_hdr, len, 1 /* do parse */); + + if (pkt_hdr->tailroom >= pkt_hdr->buf_hdr.segsize) + pull_tail_seg(pkt_hdr); + } + + return num; +} + +odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, uint32_t len) +{ + pool_entry_t *pool = odp_pool_to_entry(pool_hdl); + size_t pkt_size = len ? len : pool->s.params.buf.size; odp_packet_t pkt; odp_packet_hdr_t *pkt_hdr; - pool_entry_t *pool = odp_pool_to_entry(pool_hdl); - if (pool->s.params.type != ODP_POOL_PACKET) + if (pool->s.params.type != ODP_POOL_PACKET) { + __odp_errno = EINVAL; return ODP_PACKET_INVALID; - - /* Handle special case for zero-length packets */ - if (len == 0) { - len = pool->s.params.buf.size; - - pkt = (odp_packet_t)buffer_alloc(pool_hdl, len); - - if (pkt == ODP_PACKET_INVALID) - return ODP_PACKET_INVALID; - - pull_tail(odp_packet_hdr(pkt), len); - - } else { - pkt = (odp_packet_t)buffer_alloc(pool_hdl, len); - - if (pkt == ODP_PACKET_INVALID) - return ODP_PACKET_INVALID; } + pkt = (odp_packet_t)buffer_alloc(pool_hdl, pkt_size); + if (pkt == ODP_PACKET_INVALID) + return ODP_PACKET_INVALID; + pkt_hdr = odp_packet_hdr(pkt); - packet_init(pool, pkt_hdr, len, parse); + packet_init(pool, pkt_hdr, pkt_size, 0 /* do not parse */); + if (len == 0) + pull_tail(pkt_hdr, pkt_size); if (pkt_hdr->tailroom >= pkt_hdr->buf_hdr.segsize) pull_tail_seg(pkt_hdr); @@ -112,11 +123,6 @@ odp_packet_t packet_alloc(odp_pool_t pool_hdl, uint32_t len, int parse) return pkt; } -odp_packet_t odp_packet_alloc(odp_pool_t pool_hdl, uint32_t len) -{ - return packet_alloc(pool_hdl, len, 0); -} - int odp_packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len, odp_packet_t pkt[], int num) { @@ -135,9 +141,12 @@ int odp_packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len, for (i = 0; i < count; ++i) { odp_packet_hdr_t *pkt_hdr = odp_packet_hdr(pkt[i]); - packet_init(pool, pkt_hdr, pkt_size, 0); + packet_init(pool, pkt_hdr, pkt_size, 0 /* do not parse */); if (len == 0) pull_tail(pkt_hdr, pkt_size); + + if (pkt_hdr->tailroom >= pkt_hdr->buf_hdr.segsize) + pull_tail_seg(pkt_hdr); } return count; @@ -145,12 +154,16 @@ int odp_packet_alloc_multi(odp_pool_t pool_hdl, uint32_t len, void odp_packet_free(odp_packet_t pkt) { - odp_buffer_free((odp_buffer_t)pkt); + uint32_t pool_id = pool_id_from_buf((odp_buffer_t)pkt); + + buffer_free(pool_id, (odp_buffer_t)pkt); } void odp_packet_free_multi(const odp_packet_t pkt[], int num) { - odp_buffer_free_multi((const odp_buffer_t *)pkt, num); + uint32_t pool_id = pool_id_from_buf((odp_buffer_t)pkt[0]); + + buffer_free_multi(pool_id, (const odp_buffer_t * const)pkt, num); } int odp_packet_reset(odp_packet_t pkt, uint32_t len) diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c index a5934a5..1fad8a9 100644 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@ -706,7 +706,7 @@ static int dpdk_stop(pktio_entry_t *pktio_entry) static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[], struct rte_mbuf *mbuf_table[], - uint16_t num, odp_time_t *ts) + uint16_t mbuf_num, odp_time_t *ts) { odp_packet_t pkt; odp_packet_hdr_t *pkt_hdr; @@ -715,9 +715,15 @@ static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry, void *buf; int i, j; int nb_pkts = 0; + int alloc_len, num; + odp_pool_t pool = pktio_entry->s.pkt_dpdk.pool; + + /* Allocate maximum sized packets */ + alloc_len = pktio_entry->s.pkt_dpdk.data_room; + + num = packet_alloc_multi(pool, alloc_len, pkt_table, mbuf_num); for (i = 0; i < num; i++) { - odp_pool_t pool = pktio_entry->s.pkt_dpdk.pool; odp_packet_hdr_t parsed_hdr; mbuf = mbuf_table[i]; @@ -738,18 +744,16 @@ static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry, &parsed_hdr)) goto fail; } - pkt = packet_alloc(pool, pkt_len, 1); - if (pkt == ODP_PACKET_INVALID) - goto fail; + pkt = pkt_table[i]; pkt_hdr = odp_packet_hdr(pkt); + pull_tail(pkt_hdr, alloc_len - pkt_len); /* For now copy the data in the mbuf, worry about zero-copy later */ - if (odp_packet_copy_from_mem(pkt, 0, pkt_len, buf) != 0) { - odp_packet_free(pkt); + if (odp_packet_copy_from_mem(pkt, 0, pkt_len, buf) != 0) goto fail; - } + pkt_hdr->input = pktio_entry->s.handle; if (pktio_cls_enabled(pktio_entry)) @@ -770,7 +774,9 @@ static inline int mbuf_to_pkt(pktio_entry_t *pktio_entry, return nb_pkts; fail: - for (j = i; j < num; j++) + odp_packet_free_multi(&pkt_table[i], mbuf_num - i); + + for (j = i; j < mbuf_num; j++) rte_pktmbuf_free(mbuf_table[j]); return (i > 0 ? i : -1); diff --git a/platform/linux-generic/pktio/netmap.c b/platform/linux-generic/pktio/netmap.c index 3017e40..6498429 100644 --- a/platform/linux-generic/pktio/netmap.c +++ b/platform/linux-generic/pktio/netmap.c @@ -599,6 +599,7 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry, odp_pool_t pool = pktio_entry->s.pkt_nm.pool; odp_packet_hdr_t *pkt_hdr; odp_packet_hdr_t parsed_hdr; + int num; if (odp_unlikely(len > pktio_entry->s.pkt_nm.max_frame_len)) { ODP_ERR("RX: frame too big %" PRIu16 " %zu!\n", len, @@ -616,8 +617,8 @@ static inline int netmap_pkt_to_odp(pktio_entry_t *pktio_entry, len, &pool, &parsed_hdr)) return -1; } - pkt = packet_alloc(pool, len, 1); - if (pkt == ODP_PACKET_INVALID) + num = packet_alloc_multi(pool, len, &pkt, 1); + if (num != 1) return -1; pkt_hdr = odp_packet_hdr(pkt); diff --git a/platform/linux-generic/pktio/pcap.c b/platform/linux-generic/pktio/pcap.c index e501858..e54a56f 100644 --- a/platform/linux-generic/pktio/pcap.c +++ b/platform/linux-generic/pktio/pcap.c @@ -224,19 +224,9 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, pktio_entry->s.config.pktin.bit.ts_ptp) ts = &ts_val; - pkt = ODP_PACKET_INVALID; - pkt_len = 0; - for (i = 0; i < len; ) { int ret; - if (pkt == ODP_PACKET_INVALID) { - pkt = packet_alloc(pcap->pool, 0 /*default len*/, 1); - if (odp_unlikely(pkt == ODP_PACKET_INVALID)) - break; - pkt_len = odp_packet_len(pkt); - } - ret = pcap_next_ex(pcap->rx, &hdr, &data); /* end of file, attempt to reopen if within loop limit */ @@ -246,17 +236,17 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, if (ret != 1) break; + pkt_len = hdr->caplen; + + ret = packet_alloc_multi(pcap->pool, pkt_len, &pkt, 1); + if (odp_unlikely(ret != 1)) + break; + if (ts != NULL) ts_val = odp_time_global(); pkt_hdr = odp_packet_hdr(pkt); - if (!odp_packet_pull_tail(pkt, pkt_len - hdr->caplen)) { - ODP_ERR("failed to pull tail: pkt_len: %d caplen: %d\n", - pkt_len, hdr->caplen); - break; - } - if (odp_packet_copy_from_mem(pkt, 0, hdr->caplen, data) != 0) { ODP_ERR("failed to copy packet data\n"); break; @@ -269,7 +259,6 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, pkt_hdr->input = pktio_entry->s.handle; pkts[i] = pkt; - pkt = ODP_PACKET_INVALID; i++; } @@ -277,9 +266,6 @@ static int pcapif_recv_pkt(pktio_entry_t *pktio_entry, int index ODP_UNUSED, odp_ticketlock_unlock(&pktio_entry->s.rxl); - if (pkt != ODP_PACKET_INVALID) - odp_packet_free(pkt); - return i; } diff --git a/platform/linux-generic/pktio/socket.c b/platform/linux-generic/pktio/socket.c index 0309b0d..e01b0a5 100644 --- a/platform/linux-generic/pktio/socket.c +++ b/platform/linux-generic/pktio/socket.c @@ -527,6 +527,10 @@ static int sock_setup_pkt(pktio_entry_t *pktio_entry, const char *netdev, if (err != 0) goto error; + pkt_sock->mtu = mtu_get_fd(sockfd, netdev); + if (!pkt_sock->mtu) + goto error; + /* bind socket to if */ memset(&sa_ll, 0, sizeof(sa_ll)); sa_ll.sll_family = AF_PACKET; @@ -659,6 +663,7 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, void *base = msgvec[i].msg_hdr.msg_iov->iov_base; struct ethhdr *eth_hdr = base; uint16_t pkt_len = msgvec[i].msg_len; + int num; /* Don't receive packets sent by ourselves */ if (odp_unlikely(ethaddrs_equal(pkt_sock->if_mac, @@ -668,8 +673,8 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, if (cls_classify_packet(pktio_entry, base, pkt_len, pkt_len, &pool, &parsed_hdr)) continue; - pkt = packet_alloc(pool, pkt_len, 1); - if (pkt == ODP_PACKET_INVALID) + num = packet_alloc_multi(pool, pkt_len, &pkt, 1); + if (num != 1) continue; pkt_hdr = odp_packet_hdr(pkt); @@ -690,10 +695,14 @@ static int sock_mmsg_recv(pktio_entry_t *pktio_entry, int index ODP_UNUSED, [ODP_BUFFER_MAX_SEG]; for (i = 0; i < (int)len; i++) { - pkt_table[i] = packet_alloc(pkt_sock->pool, - 0 /*default*/, 1); - if (odp_unlikely(pkt_table[i] == ODP_PACKET_INVALID)) + int num; + + num = packet_alloc_multi(pkt_sock->pool, pkt_sock->mtu, + &pkt_table[i], 1); + if (odp_unlikely(num != 1)) { + pkt_table[i] = ODP_PACKET_INVALID; break; + } msgvec[i].msg_hdr.msg_iovlen = _rx_pkt_to_iovec(pkt_table[i], iovecs[i]); @@ -818,7 +827,7 @@ static int sock_mmsg_send(pktio_entry_t *pktio_entry, int index ODP_UNUSED, */ static uint32_t sock_mtu_get(pktio_entry_t *pktio_entry) { - return mtu_get_fd(pktio_entry->s.pkt_sock.sockfd, pktio_entry->s.name); + return pktio_entry->s.pkt_sock.mtu; } /* diff --git a/platform/linux-generic/pktio/socket_mmap.c b/platform/linux-generic/pktio/socket_mmap.c index b6be81a..8b24c99 100644 --- a/platform/linux-generic/pktio/socket_mmap.c +++ b/platform/linux-generic/pktio/socket_mmap.c @@ -171,6 +171,7 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, odp_packet_hdr_t *hdr; odp_packet_hdr_t parsed_hdr; odp_pool_t pool = pkt_sock->pool; + int num; if (!mmap_rx_kernel_ready(ring->rd[frame_num].iov_base)) break; @@ -208,8 +209,10 @@ static inline unsigned pkt_mmap_v2_rx(pktio_entry_t *pktio_entry, } } - pkt_table[nb_rx] = packet_alloc(pool, pkt_len, 1); - if (odp_unlikely(pkt_table[nb_rx] == ODP_PACKET_INVALID)) { + num = packet_alloc_multi(pool, pkt_len, &pkt_table[nb_rx], 1); + + if (odp_unlikely(num != 1)) { + pkt_table[nb_rx] = ODP_PACKET_INVALID; mmap_rx_user_ready(ppd.raw); /* drop */ frame_num = next_frame_num; continue; diff --git a/platform/linux-generic/pktio/tap.c b/platform/linux-generic/pktio/tap.c index a9a8886..d758a39 100644 --- a/platform/linux-generic/pktio/tap.c +++ b/platform/linux-generic/pktio/tap.c @@ -185,11 +185,12 @@ static odp_packet_t pack_odp_pkt(pktio_entry_t *pktio_entry, const void *data, { odp_packet_t pkt; odp_packet_hdr_t *pkt_hdr; + int num; - pkt = packet_alloc(pktio_entry->s.pkt_tap.pool, len, 1); + num = packet_alloc_multi(pktio_entry->s.pkt_tap.pool, len, &pkt, 1); - if (pkt == ODP_PACKET_INVALID) - return pkt; + if (num != 1) + return ODP_PACKET_INVALID; if (odp_packet_copy_from_mem(pkt, 0, len, data) < 0) { ODP_ERR("failed to copy packet data\n");