From patchwork Thu Sep 15 17:13:26 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hemant Agrawal X-Patchwork-Id: 15815 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 7AC5B558C; Thu, 15 Sep 2016 13:39:34 +0200 (CEST) Received: from NAM03-CO1-obe.outbound.protection.outlook.com (mail-co1nam03on0079.outbound.protection.outlook.com [104.47.40.79]) by dpdk.org (Postfix) with ESMTP id 7DF45530F for ; Thu, 15 Sep 2016 13:39:32 +0200 (CEST) Received: from DM5PR03CA0009.namprd03.prod.outlook.com (10.175.104.19) by BN6PR03MB2436.namprd03.prod.outlook.com (10.168.223.14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.619.10; Thu, 15 Sep 2016 11:39:30 +0000 Received: from BY2FFO11FD020.protection.gbl (2a01:111:f400:7c0c::109) by DM5PR03CA0009.outlook.office365.com (2603:10b6:3:118::19) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.629.8 via Frontend Transport; Thu, 15 Sep 2016 11:39:30 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none; nxp.com; dmarc=fail action=none header.from=nxp.com; nxp.com; dkim=none (message not signed) header.d=none; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BY2FFO11FD020.mail.protection.outlook.com (10.1.14.137) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.619.6 via Frontend Transport; Thu, 15 Sep 2016 11:39:30 +0000 Received: from netperf1.ap.freescale.net ([10.232.134.28]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id u8FBdQke028935; Thu, 15 Sep 2016 04:39:27 -0700 From: Hemant Agrawal To: CC: , , , Hemant Agrawal Date: Thu, 15 Sep 2016 22:43:26 +0530 Message-ID: <1473959607-1951-1-git-send-email-hemant.agrawal@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1473346213-6038-1-git-send-email-hemant.agrawal@nxp.com> References: <1473346213-6038-1-git-send-email-hemant.agrawal@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131184131705673192; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(105606002)(5660300001)(47776003)(189998001)(586003)(626004)(85426001)(50226002)(4326007)(77096005)(68736007)(87936001)(2950100001)(305945005)(11100500001)(356003)(8666005)(8936002)(92566002)(8676002)(76176999)(7846002)(50986999)(50466002)(33646002)(229853001)(110136003)(106466001)(2906002)(19580405001)(19580395003)(104016004)(48376002)(81156014)(5003940100001)(81166006)(36756003)(2351001)(97736004)(86362001)(7059030); DIR:OUT; SFP:1101; SCL:1; SRVR:BN6PR03MB2436; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD020; 1:PO+Kn95IZPxOEi6zNkdpsQWVs13IHY+9QfCtgXJ2f4rj+3/Gqp66PXlMhV7YvE/08MQJnKzHTkTBf6M7X5xmQW+r5I1zpz3jNStREZfcUns0SnladSqJ8/1n8O93BTrbOBAcXPWmeTln468mOCThtiCJ5xGy5CZ8QDtvfYVpBNoDlSMw+CwHLb1DG/6o8FUP6xy1iuD3eLJP4OjnA19aLdsKLp+dgST+v9j4UY9gjZmYPr7eng0a69Yhf4jO3NMNpR2zNZisGw8xi2OX8MyXNLXLzP9apE8AAux5ZDf41XjUzX9DwKDXHJWWYs1Pz1H03xlt3BQZ+grGddIPDZLfIgvupgRyCsPe5uFFcgMJRubwAvrvpawjlqvZWNGT7femmUkkW6MYE8wbSZNM61UTTTjqVC4xgDMOyzZH+i4Bw8OVMo6JZw2IETUrQwqKCQ9Xdk4S0tnVYwNGDvuGA5TM8GIrzr+aqX4tVmiQnNZ8G2T8RLMjiCPjywDOYhVdm/eRW/sQzS11EusgSPdHJyJuOiqK3dOzEmvmPNBJE++E2TDN9L2CLhNejcFHGdiIJ9yzdArX0/Z8ti0GxIKj6Hi3SwHMru5ygIJI1fUbSYgvG4gxMuRDbpbKHIEIheUn7/mh08wsluPKAzo3gbu+8vGs7KAQPBXsiToierwUw1+z9XBgMltyuZJ4Jt3Joml/xRb7sV/JMJfKsgSy4EXthnVTwZl5WAufF82i/skRJ2573Dpb2MwjMyDuVBgLAv2DFANomifR4ZInTXau1pPjjAzc8Q== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 3698447f-ede9-4b05-15e8-08d3dd5cf4f3 X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2436; 2:dIQdxiQo+quyCqrwyAbFA7c+8xB+S5UPnqfZtNtQ+aTPdyJRdy7XCoJz6UfEtYL4QwXjKEz7b4BXFJvEdM30mpQ6s+UGcYxM4JflVzr/dpqeffhIW8kTUVBmSEaI2G0cLlM4NRm5VghcV0gbyHjwrWAPzrFPjH+di6HBf+Wm55cucVTSEBDCa+HyfoGaWRF4; 3:5cJnIfWUo8zisxYWHQfVckf8PpbGlfVeFkkQN8TOFO5p2aYhBCV3so7RAFFRluih6S89TwxEIiC5UyevyfVTILf7bIsc/myEaYSWLwE5XvlViJEaQB3unfOV79VXFMpRbyAqL/igu4Bu1zVZGYW8rLCG4dpZAyedDYztxxdachiTwOPQ6vRh/iQCISHAmcVfISp/Y/P8B8xySodAQmLEaP9ePh7VEZeX/hdNTkPVFhM=; 25:Le8fTNMmTELgJDxz6QB5N9EVMqUI4giubcw3DRG7Si+BrXnQDGPvIW4WyZDU9PMHcCWqou5cQhHVC1f5Qliu43eko+1WHpC/XKkEGUld1oEarsiHNJoB7dSCOqu3WHfKHsa+e3I4Hik+IIPsp/ngVkkkk3px0TdLatNRKl1jBI6KQKTl3c8nMk3VcWg6X1pTnjW5XIUqJnqGuvwBK9I5wgQ/HK9YqXRGbE8ayWjJJqCKRAydi+KBFrnD5Er5EiBoUDgQ9MaYYsatY2hz4ARuF1usnanWvzAT6NRxlNBEW/FDvG6w0de3cLGu1nPELsmht7+ZGmuLBjWlMAdsrRc8vA14O949Q8hBoTatx+R9M+LdFDadHDMuCkTp99y2wgDCDjMIMD1Rvi0XeVeGVaxGtsdqv/FB8SPdmMvBeILuZDI= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BN6PR03MB2436; X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2436; 31:SP5KtsC7Sc3QTa1g1L/Y4PvuV6aQQD0Y+vrdmy256anSOVTWXFQPE5G5IkEW3lGczEMrj+wsHBgnpbgsKHpWshS/N9/bCushUj74tEFxSb97zMT1IzeDC7rhZMYklHq1EiUY+RC1nz1+bxiv1rUHG+e0wPTHMWrIJ0UjdUGg6u6Ul7rPrb0VDVGKWw/3FgmPbcjeGTsrsO91P2lj21vtCMDi5vIa+LWnStouHNdRzb4=; 4:nrGJjfxZy985Kq+F4djbaIYj7pNVpD0cOYPR1jBQRNTU0l2ANIFrkYjjctU30N4Oi8fpdoulLICaAnoKcTCVEL+UYWnr8gX/g4wOoQk/v1OM+jlhF1c2srPqbdEUZ4O7z4qRczozKxNOVRjm8zvpgIM7c1OdJnXHZpEU/lAxkzx1KBEq+MXhWMBp+PE2DScpp2mloUKaNh5xV7WEqrNyfQyQwoYK9BfcyL0e9IXmmX/86+tjCo9YYFF2fuS9ER6Hfte0aLMGj8MbHN8E9dlIveXgEihdy8j3gbujbiJ7GlZXfH34eE7/wWHEiIUgWhrTdVQ9HtJGuRcyLsuscj2vEYbAchoJ/DUA6swmaSgIB/uZVCGjTdNTw07RuitPEs6dj9R7i2Wey64IsbGRD8OxMQ0G3xkV3wYYZOVWRDzZS3w5pTBHLCFmcpMs9tPkr1mR8EBF0zAXnXcR7ZgHWn1WHHDXhXE/XJXipUUpWnzdJiqwBjzwXPJJPTsufV+IrW4vEyyE+V/IXFM0+m5pcpk0WBkAECH668uW9Uh24Lnx9AE= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(13023025)(13017025)(13015025)(8121501046)(13018025)(5005006)(13024025)(3002001)(10201501046)(6055026); SRVR:BN6PR03MB2436; BCL:0; PCL:0; RULEID:(400006); SRVR:BN6PR03MB2436; X-Forefront-PRVS: 0066D63CE6 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN6PR03MB2436; 23:GG1DlmEH2apzu7Cm8tAKFppeQkHS0qfRNJmOLUfyW?= =?us-ascii?Q?DfDAZctmjVA47yC3XMnenV5LOnmCbPYLvoiO3y+67BgL5mmZalUPTW8Oo3xi?= =?us-ascii?Q?URsRjrIJBrR9QHOe2+gw9GX9JrXBQwSJvRNcfgGq3iBvlOIknVyQ26d8zD/o?= =?us-ascii?Q?RKvbyldYHXi0mtpS54ifPp8yqnmeMa0fNIaAmbb+bs8jSamQomZG0omXSBA4?= =?us-ascii?Q?BJPGvWAOuzcePVjxZoYb5Xb406b+h57nH7l9Vh+MZa7PFMGZ/Pt2YU9VFtP5?= =?us-ascii?Q?IdyTCUaqjYJpO4I97xhECYzLEWD5VzQopK4SVwQiBHscKs8XwZSQOBrTvd3n?= =?us-ascii?Q?RFq+PPWbcbwOXz98VixMcxYChTKjI+QaGy0oWelfYlq/MXpNMHG3aBtH2g2B?= =?us-ascii?Q?5p7Wz1CPnzjLlCnedC5IAHNGMvf0IuZ2JcRM4JLnoYKNk8xOwfA9892Vk41J?= =?us-ascii?Q?KPXxA5UN9heIi1izZphy4BbEyf/LzY9rd6PdsdQRn4b8sVhUV72bUTzshioO?= =?us-ascii?Q?4fdRAHpyabmSQM3yD/xdteTe6MGy9RCsRAeK4tE6RG+ndMr/XWk6RJpi/JjX?= =?us-ascii?Q?+qriRVruAsk7FZAAmS1xalNUqX9amU1VJlPbqpLG2D63akRKC/ow/FGcrLP1?= =?us-ascii?Q?kWYkCKQYi8vtU1R4fYorLAXaqPz7KKJ4DkB9bBxqcZiA8R+wcQaOSefexPPI?= =?us-ascii?Q?za9oIJpsMVZsa4yX33Of4d1RtRo25TZR/5MP3YcWFlmM0spyJcfkJdR/UG3W?= =?us-ascii?Q?Xk+4LaTcTePG5LGhkYVk2FGQhsA2vRRg9CcPVAburDABSC12NOhRRy0PPXAJ?= =?us-ascii?Q?k+EUNsrAWReu/3MZL2S50XFWTj3JhlaAPzpAEGowX/CCEr/EDV2Ms9UOvlmW?= =?us-ascii?Q?SyA/R5wNwpzSdug6hEzixLne80+o/EqhU81Pc6YBZDhS4mgnI7Nq1jPxQnw5?= =?us-ascii?Q?FH6+M69B1PzkqByuqKNrT5bn5j1D+RUXnstEvE2Mtgw5Wq1gIW+MfxTCEjLm?= =?us-ascii?Q?V+w4vzkkY69l4Hs4vL201yeN43ptfx6hgdZASpnEZmtz3JsV8lItpdqaswHM?= =?us-ascii?Q?sLxzcpy30bhvcNDpzRhGL390Vsq/sT8CEbQr2Gl/sCBWk0hViiRs8rlXMu5i?= =?us-ascii?Q?GRPX17FxNtGMXyEglwLzK7C7CE7p99gvD6KorzJALMTf+WHF83ewErZc3ooq?= =?us-ascii?Q?IS3qg28AZd4bd8=3D?= X-Microsoft-Exchange-Diagnostics: 1; BN6PR03MB2436; 6:kW64zUKyiPZSYcz5PeZwGLXjCQxHMgMOpZKEaBu50pI+mWk4Movhx7wG17eZ1A0H/Iv6M0fwWFgfG357ZBZKUmmYDZybSTVf/gGiRFGVkvLK/Jno+lMyGdFhS3tful39IAcFnnCHevBLtY27tlBQ5LaOYNqvgLWG4qmVCCrbn5H7D+4oRuIDwu+Q0xY6+8yD3nLUbXbsLY4C2Hn4FGADu964DeX9oL7rYVT1xeENXb8ajcXC6TpgHMQVRRUjjB+fOMb4RjFFuiFoQPggw/wD0h7ujlUqP1+f1yMPL5dBkzM=; 5:qR1AjtpwgquhKU2DKQyKq4zdryBLAA0S0VK7prZmJ+ekmqZFxtyX5AJFEw+9pVMGsDkGmUUifNX5id0LTE4gO/U0w9bROgNzPwD6yUTara13fj/QafVHrMHOI8YOdH/8Tzf4T5KdgTk+zSqAbhbGoIhjHzJL40HbuGpM6upOZ8o=; 24:5NRG1sDd0rJLJUp3fQFutuApfv0ROe6NT1NJBwaIsBUZxx9OmKDkQ6NMvr903Viu1lB4MfrXCBElx2xJbo8fLHy+VcIVzZZJLXnQcWKWIMU=; 7:DQb42gxuXGdsDW3z2J5e5GfWu9owcm0GDr4rnb9oNOiuoyhTehd1wyHFx8jDMS0LwfTte7OMk0fqQSlrlDYWHv3fldGv3bOJVqa//8HSFmj/Wpl6gVcy3tMkLKDY4cUihONBUuldv321XS6GDKndXmOV8F4Yowh20kp17gUTyD4+QTL1umLl7R4MOy6pVtxEXq+D2HVmdJVj+j+7NZVbbRmP2Nk+uLF1yilhFtcYHnc49Imx40tTg+eiOo0Wwh2F SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Sep 2016 11:39:30.3645 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN6PR03MB2436 Subject: [dpdk-dev] [PATCH v2 1/2] eal/mempool: introduce check for external mempool availability X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" External offloaded mempool may not be available always. This check enables run time verification of the presence of external mempool before the mempool ops are installed. An application built with a specific external mempool may work fine on host. But, may not work on VM, specificaly if non-hw specific interfaces are used e.g. virtio-net. This is required to make sure that same application can work in all environment for a given hw platform. The solution proposed here is that rte_mempool_set_ops_byname should return specific error in case the current execution environment is not supporting the given mempool. Thereby allowing it to fallback on software mempool implementation e.g. "ring_mp_mc" This patch introduces new optional "pool_verify" as mempool ops function to check if external mempool instance is available or not. Signed-off-by: Hemant Agrawal --- Changes in v2: * fixed the pool_verify copy in rte_mempool_register_ops --- lib/librte_mempool/rte_mempool.h | 21 +++++++++++++++++++++ lib/librte_mempool/rte_mempool_ops.c | 19 +++++++++++++++++++ lib/librte_mempool/rte_mempool_ring.c | 4 ++++ lib/librte_mempool/rte_mempool_stack.c | 3 ++- 4 files changed, 46 insertions(+), 1 deletion(-) diff --git a/lib/librte_mempool/rte_mempool.h b/lib/librte_mempool/rte_mempool.h index 0243f9e..8599df1 100644 --- a/lib/librte_mempool/rte_mempool.h +++ b/lib/librte_mempool/rte_mempool.h @@ -387,6 +387,12 @@ typedef int (*rte_mempool_dequeue_t)(struct rte_mempool *mp, */ typedef unsigned (*rte_mempool_get_count)(const struct rte_mempool *mp); +/** + * Return if the given external mempool is available for this instance. + * it is optional to implement for mempools + */ +typedef int (*rte_mempool_pool_verify)(const struct rte_mempool *mp); + /** Structure defining mempool operations structure */ struct rte_mempool_ops { char name[RTE_MEMPOOL_OPS_NAMESIZE]; /**< Name of mempool ops struct. */ @@ -395,6 +401,8 @@ struct rte_mempool_ops { rte_mempool_enqueue_t enqueue; /**< Enqueue an object. */ rte_mempool_dequeue_t dequeue; /**< Dequeue an object. */ rte_mempool_get_count get_count; /**< Get qty of available objs. */ + rte_mempool_pool_verify pool_verify; + /**< Verify if external mempool is available for usages*/ } __rte_cache_aligned; #define RTE_MEMPOOL_MAX_OPS_IDX 16 /**< Max registered ops structs */ @@ -516,6 +524,18 @@ void rte_mempool_ops_free(struct rte_mempool *mp); /** + * @internal wrapper to verify the external mempool availability + * + * @param mp + * Pointer to the memory pool. + * @return + * 0: Success; external mempool instance is available + * - <0: Error; external mempool instance is not available + */ +int +rte_mempool_ops_pool_verify(const struct rte_mempool *mp); + +/** * Set the ops of a mempool. * * This can only be done on a mempool that is not populated, i.e. just after @@ -531,6 +551,7 @@ rte_mempool_ops_free(struct rte_mempool *mp); * - 0: Success; the mempool is now using the requested ops functions. * - -EINVAL - Invalid ops struct name provided. * - -EEXIST - mempool already has an ops struct assigned. + * - -EOPNOTSUPP - mempool instance not available. */ int rte_mempool_set_ops_byname(struct rte_mempool *mp, const char *name, diff --git a/lib/librte_mempool/rte_mempool_ops.c b/lib/librte_mempool/rte_mempool_ops.c index 5f24de2..c2e765f 100644 --- a/lib/librte_mempool/rte_mempool_ops.c +++ b/lib/librte_mempool/rte_mempool_ops.c @@ -85,6 +85,7 @@ rte_mempool_register_ops(const struct rte_mempool_ops *h) ops->enqueue = h->enqueue; ops->dequeue = h->dequeue; ops->get_count = h->get_count; + ops->pool_verify = h->pool_verify; rte_spinlock_unlock(&rte_mempool_ops_table.sl); @@ -123,6 +124,18 @@ rte_mempool_ops_get_count(const struct rte_mempool *mp) return ops->get_count(mp); } +/* wrapper to check if given external mempool is available for this instance.*/ +int +rte_mempool_ops_pool_verify(const struct rte_mempool *mp) +{ + struct rte_mempool_ops *ops; + + ops = rte_mempool_get_ops(mp->ops_index); + if (ops->pool_verify) + return ops->pool_verify(mp); + return 0; +} + /* sets mempool ops previously registered by rte_mempool_register_ops. */ int rte_mempool_set_ops_byname(struct rte_mempool *mp, const char *name, @@ -146,6 +159,12 @@ rte_mempool_set_ops_byname(struct rte_mempool *mp, const char *name, if (ops == NULL) return -EINVAL; + /*verify if the given mempool is available for this instance */ + if (ops->pool_verify) { + if (ops->pool_verify(mp)) + return -EOPNOTSUPP; + } + mp->ops_index = i; mp->pool_config = pool_config; return 0; diff --git a/lib/librte_mempool/rte_mempool_ring.c b/lib/librte_mempool/rte_mempool_ring.c index b9aa64d..d86d5e0 100644 --- a/lib/librte_mempool/rte_mempool_ring.c +++ b/lib/librte_mempool/rte_mempool_ring.c @@ -126,6 +126,7 @@ static const struct rte_mempool_ops ops_mp_mc = { .enqueue = common_ring_mp_enqueue, .dequeue = common_ring_mc_dequeue, .get_count = common_ring_get_count, + .pool_verify = NULL, }; static const struct rte_mempool_ops ops_sp_sc = { @@ -135,6 +136,7 @@ static const struct rte_mempool_ops ops_sp_sc = { .enqueue = common_ring_sp_enqueue, .dequeue = common_ring_sc_dequeue, .get_count = common_ring_get_count, + .pool_verify = NULL, }; static const struct rte_mempool_ops ops_mp_sc = { @@ -144,6 +146,7 @@ static const struct rte_mempool_ops ops_mp_sc = { .enqueue = common_ring_mp_enqueue, .dequeue = common_ring_sc_dequeue, .get_count = common_ring_get_count, + .pool_verify = NULL, }; static const struct rte_mempool_ops ops_sp_mc = { @@ -153,6 +156,7 @@ static const struct rte_mempool_ops ops_sp_mc = { .enqueue = common_ring_sp_enqueue, .dequeue = common_ring_mc_dequeue, .get_count = common_ring_get_count, + .pool_verify = NULL, }; MEMPOOL_REGISTER_OPS(ops_mp_mc); diff --git a/lib/librte_mempool/rte_mempool_stack.c b/lib/librte_mempool/rte_mempool_stack.c index 5fd8af2..0198b70 100644 --- a/lib/librte_mempool/rte_mempool_stack.c +++ b/lib/librte_mempool/rte_mempool_stack.c @@ -141,7 +141,8 @@ static struct rte_mempool_ops ops_stack = { .free = stack_free, .enqueue = stack_enqueue, .dequeue = stack_dequeue, - .get_count = stack_get_count + .get_count = stack_get_count, + .pool_verify = NULL, }; MEMPOOL_REGISTER_OPS(ops_stack);