From patchwork Fri Sep 16 16:46:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hemant Agrawal X-Patchwork-Id: 15877 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 327BF2C0A; Fri, 16 Sep 2016 13:12:38 +0200 (CEST) Received: from NAM02-CY1-obe.outbound.protection.outlook.com (mail-cys01nam02on0048.outbound.protection.outlook.com [104.47.37.48]) by dpdk.org (Postfix) with ESMTP id 6BB182BA4 for ; Fri, 16 Sep 2016 13:12:36 +0200 (CEST) Received: from BN6PR03CA0052.namprd03.prod.outlook.com (10.173.137.14) by DM5PR03MB2443.namprd03.prod.outlook.com (10.168.233.13) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.629.8; Fri, 16 Sep 2016 11:12:35 +0000 Received: from BL2FFO11FD049.protection.gbl (2a01:111:f400:7c09::120) by BN6PR03CA0052.outlook.office365.com (2603:10b6:404:4c::14) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id 15.1.619.10 via Frontend Transport; Fri, 16 Sep 2016 11:12:35 +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 BL2FFO11FD049.mail.protection.outlook.com (10.173.161.211) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.619.6 via Frontend Transport; Fri, 16 Sep 2016 11:12:34 +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 u8GBCUTE026936; Fri, 16 Sep 2016 04:12:31 -0700 From: Hemant Agrawal To: CC: , , , Hemant Agrawal Date: Fri, 16 Sep 2016 22:16:34 +0530 Message-ID: <1474044395-11627-1-git-send-email-hemant.agrawal@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1473959607-1951-1-git-send-email-hemant.agrawal@nxp.com> References: <1473959607-1951-1-git-send-email-hemant.agrawal@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131184979548058180; (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)(1110001)(1109001)(339900001)(189002)(199003)(7846002)(92566002)(50226002)(47776003)(2906002)(5003940100001)(229853001)(626004)(33646002)(104016004)(106466001)(2351001)(85426001)(2950100001)(105606002)(87936001)(5660300001)(68736007)(4326007)(81156014)(81166006)(76176999)(50986999)(97736004)(86362001)(8676002)(586003)(77096005)(50466002)(110136003)(19580395003)(48376002)(189998001)(8936002)(36756003)(11100500001)(356003)(8666005)(305945005)(19580405001)(7059030); DIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR03MB2443; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BL2FFO11FD049; 1:rQ70NT4qEGeeISTdAXqXwnQCgJ/n0cF3v1hoZrR5CdE9KCTgzn4CMryYu3/0A0Ti3v402sI+hhP8M2STPOoJFIXLZnpqwFlRFhBpP6cBhTKcMlfHL5Ezj7/iLLneYtTfKQ95G2gE0ZucOWygfvVOfSGy4Mj8i9l4eie+OyWZpV3pCM5dvvtL10fjeEl1y6ibJRsLwqfViNtrGSJFnDPGHQjY7/NkNESnM25q8/FHEqVjE7Y8XFw9hnsCjhYvGg6mJEIlRYmP4tXu2pdw9fGptCjEiFkEma3+EjqNsl00ObnEaVd4NTESf6/FNbYBG+PS5D885g9cObK0GWDI8LoIiiG5Za+3rRMmMUmG/A6APZOjB4TfJL/AH+GPMMHBQS5VBpWhaPY44qD3h55M1+RLDYErEPymikN0hJaSKfzoNiq0CkvnVrRFKQDvaETDRpOA+2NPjVboy+v8bfx8OZzTHdv7XBUeXuqnfVFru/Vk5nxmFegzXOCB0qdx64SiYz2ax0VRfjQ2sKWloywj7mFsRbsPjFzdF9AnaIqp0qYvvlQdOQyYN0G1ipPr30PrcYutS4ovK21GwhoSiv2bj29qYdSSTULm4t6uaFDqI3SvnyByITb3TmODOeBV3xMABs5D4D2Oe5XjyD5R/Ix4pSOFINM44DyFRSR8hEzuptwkhVkkf+hcg6cdCaXAAkITWz2sDgWO5fynC+jStgvEDU3Vm0/JbTrNy4+FVSQetH9fDCb+ShkJO0KQ1gEKqXLwvV5no9haXmyrbPGlpo9FpKGQUw== MIME-Version: 1.0 X-MS-Office365-Filtering-Correlation-Id: 73affc7f-eee9-4d53-3244-08d3de225c4b X-Microsoft-Exchange-Diagnostics: 1; DM5PR03MB2443; 2:ujMHW9Uwy3rAEF0YHnJVEe+QMxZYS44Dbs+HbAVSB0vSjVWxCCqTuTQ8X8m5h4m7+3wwbEcufg5p7SsjOt2Lg4A6sPC2D+FeRG5HJ5k/8674sHSh4BiEn6mKf1LUli+s1OnzeGqnF85gDE+ZOgpbglbR46Bfkzsj06QYSFlWqH8omMjWwg+g34rEeANWnT5p; 3:0+9HtssTg0DvWhRTy4trwdCgiqnlRmElYdRSusWy8ytj5mZd69rUqepgUg2Cv8akvORWPqt7GHm5VX6dp/ia+yqbhRfKoe+sHMERjWY6R04BxL5TT2avbC+P21buQTJRVyQFCkUsG8qdkL/HTGwPW3s+eMiqbpc8FJZR5Gl03UrduyitbdL6ztHolgywGdiCKvh/TljzzzmiNwmIANE6Eeu3wlTS2S9EK/4QkMj+sgQ=; 25:IF/7djeohoi6n1c7p/hDknirqu0Uv2Ckd0y06A4wS3pPOgdH6EMEZizunSWUDlvLYRPjSm9boBUoPV/NZRdN1eiXDwdAmf7sNK61Ks0/74zS6pBaec2weaSVvXZNa6dY2a/AqprLNjQVUfpsGswQKW3wvmqLvqeQpDooTtgRx0cZRFH+2hyHZiLMcgykHXnmMT3c0eCXXXqWdtnVKleEGEOk4zH7iimUuRAh6XQ7SnWR7WR23wmpE/Gaud8zlIRNNWm6Dxmpaju6gf1Ffv1tKqx7Pwyg8Ld+F+t6cLiB9p5daviyviyySMtMOym7JsrCcLtOVOSo9ro1sL6djp1s+AL5Kol1L3bzHZ6MGBNfv6fFo4kVyJ0l6HHpUEJnyu295h8F8N803+2Ps9XzzJODt7G8LBMhC3sy9rA1NGC9778= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM5PR03MB2443; X-Microsoft-Exchange-Diagnostics: 1; DM5PR03MB2443; 31:iXOyEOuZgWJUDsORdpYFLyUZxoDYaTdSZUZ7VH6OmvkVt3nuSUYOsZX/YqKUtpWUpjQ1Y//71fKkesK51QOTjQZ0o9NFF6pD34nmrMUjyuR9HKoG6ycbBBPxAtcv9xEqrkHJplye0C9JsxayEabtYG/A7uo6XCkiwPJoc6drmp6Gt138jpqFAXzSJYFVywuKRZafNj0EN8euH0YdmGdYodv1bAiNVtT2lmbEO9OSYyw=; 4://qzPAzhNaV4Uqi8PBVhQQLQW3LsAlFtOb1njbZS/rkhXpvdye/r+4Gfq7z94fdoLe9xUnv9KF592fgTv0W6J0H9QT6tjN3MYgxypF7ygVxABseptbW7z9FvcsO3b4j9JgL/dNboJJ5rZET3hyX/2UdMJJpvUekY5HaJZZ3kW0cgNlHKkL4jaSIKfOG9DRoXLVdw3H5V5Od2AlGTTZPo9uf+OPr/SGGzoThNsRu9Ni0KVScdcmH4Q8kFc84Ywkov9HDg39PWvZSoMjConWJSzZ8chhRPcy37tJMpm++xV6NLaUtKL5DKAK8gF14fPcjYfzhN9CXYPUaHY6nfMtGOxcj4lxgY3rvfpuUJfONtgScT07KGJTAGG1O7XqN4R5yg2Xb+Cri1migsoSp/e3LftbxzY9nnBEhBgEtILGyUjunTRKky6x0fNJPIIv0aWpuolX66rwf8ddRejuEpw/Sc7MXcWRMVl/kW7tADTuRCiSBEh935GAXlzB8On+El6x3G6MYrmH9G/7dfw+2T9Ez3ALP6tlI+MvQBO7mssJnKTfU= 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)(8121501046)(5005006)(13018025)(13017025)(13015025)(13024025)(13023025)(3002001)(10201501046)(6055026); SRVR:DM5PR03MB2443; BCL:0; PCL:0; RULEID:(400006); SRVR:DM5PR03MB2443; X-Forefront-PRVS: 0067A8BA2A X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DM5PR03MB2443; 23:pE0pRaTXlQ1v9wcHi+44zah8GfpFB8ZS3dTnqLB9d?= =?us-ascii?Q?fNzvTCTT7WSn3vQkYrc9pjon4QN4MOS340g1YWA/mkdppV30Qb3R/nwW9fES?= =?us-ascii?Q?tCQMTSLDbpQTgEB4lgGOw3evsRCTCOSorY1cYc0d5NNw8WrH/gbdC3vPodI4?= =?us-ascii?Q?67umoLk3yt8uxB98cd9gAgL+UOR2tIBZz3vUkGBr/U2TUdvt+2G5u3U1a+az?= =?us-ascii?Q?okvF22tH/zZxvwS/6S/q7PLoIf1sVjAr84TU9ZRrGjwCU/xxPWMGfZ737syg?= =?us-ascii?Q?Nc/D0/D9v1HGLb19baqzM4p7SC3NeHgPB8HEAqOUTuAA3JggNMTtonwEraTf?= =?us-ascii?Q?JTvedCQHfjO7OugZn8HJPvNfBJyXmyxOxyJZvlIAjxpOLmpBPMOiYpmRibtT?= =?us-ascii?Q?Fpisn9S7VQ7q6sWVze0MH8v31BXgqJQ3aiIt/yoal67YarTeXSzPpqbmL1ej?= =?us-ascii?Q?y3H+cxjiteBd5AaDFTPbjP7Y+/t2FV8NCUTSpjihKDPBE2MLUw/0u/XA43i3?= =?us-ascii?Q?xPLZpl7WKFeGxhkdTxonZRaaQoy+Ys3FOPMpQK8tn6xmmPcVA1u9m0ozDrPH?= =?us-ascii?Q?cMINrTXWyJ5fbPrHMYEH3Xn8aOum4kFPUAlk4Y4REcXChTsT6+e+Q0cj6ZLr?= =?us-ascii?Q?q3u5y0nAQjbt/Khaw9LDk0YoQ+AWaay2kYsVJSi+SYugbdyOi+r+KrFvH1KD?= =?us-ascii?Q?7sVE+jiJ2M+mIEoHOpFN2dmq6tSX3N/+U+U2NipRQir75czNCanWPetM31Sg?= =?us-ascii?Q?umPf3oKh+32E7dxZIHuma8aMRsHCH2DnPVdE+5oY0EweJirHbDAKJthCN0ML?= =?us-ascii?Q?Pbum4wzFFIJU2gyIUtv3KG8KFzBdzZ6yPbjeOXl3cze35Ql9IyO8Bvko2IiG?= =?us-ascii?Q?ktU7T35X/L68GIpXLMY+wKdDArcFBCdKCXqVVLdy9eyzZ4UqspNwsr3BvBHn?= =?us-ascii?Q?tg0CkkT1n8xbIknKiXe7x1hC7WvK/Ko0O28AonsP9W6mqKIn6vhLGr+9IUlZ?= =?us-ascii?Q?hSeJCWbeIYkBzLe8PsP7YTQGy/f6YiePIsRcu4zSUGo18fXHWaM3LwWKq8lU?= =?us-ascii?Q?z3qyldtgxT8H+FaHMYytsD8yVRWeVimFy3vDLE957BfuQ3fba3TtsN9s4M/+?= =?us-ascii?Q?sFIXDBc8Uh8wQtcVW+ZdAToVjggHqCp+ZqzFelW1aY+h/c32F89X0gOxWoCs?= =?us-ascii?Q?91KWnAYMn0gY34=3D?= X-Microsoft-Exchange-Diagnostics: 1; DM5PR03MB2443; 6:JpBUEuYy2xjek/RGL03LkC6N+sSmcnzOOYayXrTenE9zMvrvoBL9+gniQJcdzw/wKsP4qPbMyWHTEZkq9/+SeO4RCxt0OGNqT+WMb/JWTNcpIW+lyL7MHdvPR4SsBfpKnFKw8xBl42HRbyGf5paQOmzhLNY5S4aApn+tKgZArzimJ/Nfr6yJy8yG+J14XntwMyPVHylNTwxk81vIHYyWNzHwz+3qOknrYUwyZR/Ga41qUjMi717LUI9Csc0AJqb5fR+ZSjmZvasqAQ1bK9V6W1FH4s/oSpg5p2euH+dI0E0=; 5:ZED8rvoPm4NmPSQhSYXJHnbjCGiJ/AvCeiIE7G1VS0ihpYSoYoJV3+gNvhEQ3BBI+U6EK5mUtOcsEKEXMi2DuZzICO80SspdVchbq6gfXXydJmv8xBo1JLZavtD/ym6FYckloQsq4XN2iw1rPglTue5KKbHgYK+AkeQydEbfxJ4=; 24:OYpACPcbLDE2ux6Kieb3ofRjHI+tY+e9Iz0IsiYqrsrYNTbO7IQHP/ovs7YYGd3Utk+3taQjlK9oN9TSvmkdEjMJXZx3rLSWV1yGHzURlB0=; 7:V+qH7dRnQhcqtuMiefx5rPfr3/CThvFgpzDjmZYrzsiiQh5ntsxx99eVpLVeYKCAwp0bfgZZGqxEJoChS8bpAuiVkhdWCWPXSYbB5cvncJ6PN0xe50fQlchOiripjtrYHien1835YcHGw3om5HGM2x8xTjRAbyWGEzTHiVmcyWiAuWkNALsURN/TfrcLA6XR8BMgxeVrPSi9Ey+FsJZSCc0q7kn0emx9WbCk79BNbXymdQQ5hOop0ujoH6dntlrL SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Sep 2016 11:12:34.6342 (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: DM5PR03MB2443 Subject: [dpdk-dev] [PATCH v3 1/2] eal/mempool: check for external mempool support 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 "supported" 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 Changes in v3: * rename the pool_verify to supported as per David's review comment. --- 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..322f177 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 supported for this instance. + * it is optional to implement for mempools + */ +typedef int (*rte_mempool_supported)(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_supported supported; + /**< Verify if external mempool is supported 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 supported + * - <0: Error; external mempool instance is not supported + */ +int +rte_mempool_ops_supported(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 supported. */ 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..4554062 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->supported = h->supported; 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 supported for this instance.*/ +int +rte_mempool_ops_supported(const struct rte_mempool *mp) +{ + struct rte_mempool_ops *ops; + + ops = rte_mempool_get_ops(mp->ops_index); + if (ops->supported) + return ops->supported(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 supported for this instance */ + if (ops->supported) { + if (ops->supported(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..fc3db30 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, + .supported = 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, + .supported = 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, + .supported = 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, + .supported = 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..42ccb89 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, + .supported = NULL, }; MEMPOOL_REGISTER_OPS(ops_stack);