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 88F95A034F; Wed, 10 Nov 2021 11:07:01 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0C9264068B; Wed, 10 Nov 2021 11:07:01 +0100 (CET) Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-eopbgr60071.outbound.protection.outlook.com [40.107.6.71]) by mails.dpdk.org (Postfix) with ESMTP id 1FC2640683 for ; Wed, 10 Nov 2021 11:06:59 +0100 (CET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LY4p64c/P8LN3L/SCcOnsV2Ls6hNP4Xf/COtPlJkEc1hY2qpO+75JZVfGyku8Gf9ZcYhXa+zdDjRh6arAACvuSnEaICMwwDj3j5IdQF07SMEtAp2YTGdzxdf0FjNaGnj7wiZCFO1wzQeFrcC9I9Wj4Yo2LoCynRPyTt+K66Rb9UsICRXLgjSK+12892NMdJeIsRvDLqKKMqDz0XSVaT+o7B9PxaAu7+3/z2JIYrYw/BcJxGnHuNWZi6EkD+VrM5VNrSS3R04bHOVJB3pmT0d7P2hsrRa6NHxEjdRWXH6lhP8eDxKdPBVxhGkXdphRjvsBCb2Nw7vXF5fPm4wYO9aYg== 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=NPbbJNqm1mGzF4ksyoZ8NMagRxtOTrITQl+QFaFxZoU=; b=O6caRYnpgujt/HDnAAWvxm84HXVnHofU2C03rRuFCydeEdGHEIZSGItDQpd+j5dw81jIbzeG+Uk2aYWf8X/ANNFkE/IUu1ObcGHHhinw3lJWG3nlDCBCQ1DkbyzkT/YyiiPwUucNzlRmi9RZZNEDPVaBMyJJzkkg3128Nu8rie0dfQBflowEopf7VWKdKuDH98Jx4tHaATBkbnGYLPm4dXI5AS0wtNW1wBFyyhL1rJD8gRvN/daNmwJZQbESbDBz267OlzlLfka64OD5acDIkTQEBVz+G76KdfdYShP+KpLn/JCJpApWk3b6ustHnBi7ShFa/xqFgF3gRYvtThfu7A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 192.176.1.74) smtp.rcpttodomain=dpdk.org smtp.mailfrom=ericsson.com; dmarc=pass (p=reject sp=reject pct=100) action=none header.from=ericsson.com; dkim=none (message not signed); arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ericsson.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=NPbbJNqm1mGzF4ksyoZ8NMagRxtOTrITQl+QFaFxZoU=; b=sDF2Y5oRstGI7mjL5DWRqDDXYs7HmiCLWzUR+QS4wOuzfDInk2LmbBOPioBSJ5y/myFOjOvvo5efHJt6y/WxgOyPQzZdAv8UOZw/a6EyGBw3RD1mwyeGPvlYiEjfoqenDEBKnB/EzRW92J3Is/K4Fmx27wugICsX1SOrTXhTOL0= Received: from AM5PR0601CA0064.eurprd06.prod.outlook.com (2603:10a6:206::29) by AM8PR07MB8075.eurprd07.prod.outlook.com (2603:10a6:20b:3da::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4669.8; Wed, 10 Nov 2021 10:06:56 +0000 Received: from VE1EUR02FT017.eop-EUR02.prod.protection.outlook.com (2603:10a6:206:0:cafe::82) by AM5PR0601CA0064.outlook.office365.com (2603:10a6:206::29) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4690.15 via Frontend Transport; Wed, 10 Nov 2021 10:06:56 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 192.176.1.74) smtp.mailfrom=ericsson.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ericsson.com; Received-SPF: Pass (protection.outlook.com: domain of ericsson.com designates 192.176.1.74 as permitted sender) receiver=protection.outlook.com; client-ip=192.176.1.74; helo=oa.msg.ericsson.com; Received: from oa.msg.ericsson.com (192.176.1.74) by VE1EUR02FT017.mail.protection.outlook.com (10.152.12.98) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.20.4669.10 via Frontend Transport; Wed, 10 Nov 2021 10:06:56 +0000 Received: from ESESBMB504.ericsson.se (153.88.183.171) by ESESBMR501.ericsson.se (153.88.183.129) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2242.12; Wed, 10 Nov 2021 11:06:53 +0100 Received: from ESESSMB504.ericsson.se (153.88.183.165) by ESESBMB504.ericsson.se (153.88.183.171) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2242.12; Wed, 10 Nov 2021 11:06:53 +0100 Received: from seliiuapp00218.seli.gic.ericsson.se (153.88.183.153) by smtp.internal.ericsson.com (153.88.183.192) with Microsoft SMTP Server id 15.1.2242.12 via Frontend Transport; Wed, 10 Nov 2021 11:06:53 +0100 Received: from localhost.localdomain (seliicwb00002.seli.gic.ericsson.se [10.156.25.100]) by seliiuapp00218.seli.gic.ericsson.se (Postfix) with ESMTP id 92DE7601AD; Wed, 10 Nov 2021 11:06:53 +0100 (CET) From: =?UTF-8?q?Mattias=20R=C3=B6nnblom?= To: , Jerin Jacob , "Sunil Kumar Kori" CC: , Pavan Nikhilesh Bhagavatula , Hemant Agrawal , Nipun Gupta , , Thomas Monjalon , "David Marchand" , , "Erik Gabriel Carrillo" , , Ferruh Yigit , Akhil Goyal , =?UTF-8?q?Mattias=20R=C3=B6nnblom?= Date: Wed, 10 Nov 2021 11:06:50 +0100 Message-ID: <20211110100650.21113-1-mattias.ronnblom@ericsson.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: References: MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5779cea5-da86-451e-0a76-08d9a431d3c8 X-MS-TrafficTypeDiagnostic: AM8PR07MB8075: X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:7691; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZizM27jvJao1P5AAQ3prrwrBdpwmcg7SHHNIIdwk29Eafao95+6PojRVdK//XFEzZIbTIk/NA3+sl8h+jtdBQsQSo4k1m56s82j3DbhHs1Y1/ZC6zGp2rlB+TGInFMkVadnHzRoQFSR5K5zvnLYpqNh1newrzAhDG4zXUWWSuv1qota4RNhBpzbHF0IGgAhfWGiDNl+OwUXHaaTtdXhUpTPVP4AbIgA7X9UkyX7afsaNGK3spPEjgjDUSbDioGefB4wPkZJ/a/A5JSpnAke+uaTID+1eym5JeQy9r6PXBEGqc7GG/3Pyq+UC/a+HxUBOO9mrjxP25hGD4+wCfDGsXlYP4VpDox7RO5WbS2BwimJVxrBROK4cnDeJ/hck/Xxu8k8iu9bLP0POuMeqiFshizBYUFNrABgGVvPnySME3JCHXIavbspcZYP4SSSQldHDBXh/6Sd63dftubc6ARCL5jd38k0WZsmIHS+IdyLru672dLtaexZs8E5GD5mAnhDx0DosdgqzOMjxDfhQMoFo3xuRY8NRz5FMVV5i9BoBJ/DeHTX5RNZA4MMo8+6bMnrHMw9ZyyB7uL4h9lKRwCkyFJ+GEGhYKgQOU1RyMfMSDgm0FHZ0/qJFLUnDgTlxQ/RuMmh0eBIv02y7+8LztYCONeUVut1Tp4d//ERKh/DZjImfsQ8p6sRwXKVbJ6E4xvbPTYAIlwrXRIJ+pPc5tSx3Og== X-Forefront-Antispam-Report: CIP:192.176.1.74; CTRY:SE; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:oa.msg.ericsson.com; PTR:office365.se.ericsson.net; CAT:NONE; SFS:(4636009)(46966006)(36840700001)(47076005)(508600001)(2906002)(186003)(70586007)(316002)(8936002)(26005)(7416002)(66574015)(6266002)(83380400001)(36756003)(54906003)(4326008)(5660300002)(82960400001)(36860700001)(8676002)(356005)(2616005)(82310400003)(110136005)(336012)(86362001)(1076003)(7636003)(70206006)(107886003); DIR:OUT; SFP:1101; X-OriginatorOrg: ericsson.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Nov 2021 10:06:56.2281 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5779cea5-da86-451e-0a76-08d9a431d3c8 X-MS-Exchange-CrossTenant-Id: 92e84ceb-fbfd-47ab-be52-080c6b87953f X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=92e84ceb-fbfd-47ab-be52-080c6b87953f; Ip=[192.176.1.74]; Helo=[oa.msg.ericsson.com] X-MS-Exchange-CrossTenant-AuthSource: VE1EUR02FT017.eop-EUR02.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM8PR07MB8075 Subject: [dpdk-dev] [PATCH v2] eventdev: negate maintenance capability flag 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 Sender: "dev" Replace RTE_EVENT_DEV_CAP_REQUIRES_MAINT, which signaled the need for the application to call rte_event_maintain(), with RTE_EVENT_DEV_CAP_MAINTENANCE_FREE, which does the opposite (i.e., signifies that the event device does not require maintenance). This approach is more in line with how other eventdev hardware and/or software limitations are handled in the Eventdev API. v2: New flag was not properly set in opdl_evdev.c Signed-off-by: Mattias Rönnblom --- doc/guides/eventdevs/dsw.rst | 4 ++-- drivers/event/cnxk/cnxk_eventdev.c | 3 ++- drivers/event/dlb2/dlb2.c | 3 ++- drivers/event/dpaa/dpaa_eventdev.c | 3 ++- drivers/event/dpaa2/dpaa2_eventdev.c | 3 ++- drivers/event/dsw/dsw_evdev.c | 3 +-- drivers/event/octeontx/ssovf_evdev.c | 3 ++- drivers/event/octeontx2/otx2_evdev.c | 3 ++- drivers/event/opdl/opdl_evdev.c | 3 ++- drivers/event/skeleton/skeleton_eventdev.c | 3 ++- drivers/event/sw/sw_evdev.c | 3 ++- lib/eventdev/rte_eventdev.h | 19 ++++++++++--------- 12 files changed, 31 insertions(+), 22 deletions(-) diff --git a/doc/guides/eventdevs/dsw.rst b/doc/guides/eventdevs/dsw.rst index 18f7e9588f..5c6b51f65f 100644 --- a/doc/guides/eventdevs/dsw.rst +++ b/doc/guides/eventdevs/dsw.rst @@ -44,8 +44,8 @@ Port Maintenance ~~~~~~~~~~~~~~~~ The distributed software eventdev uses an internal signaling scheme -between the ports to achieve load balancing. Therefore, it sets the -``RTE_EVENT_DEV_CAP_REQUIRES_MAINT`` flag. +between the ports to achieve load balancing. Therefore, it does not +set the ``RTE_EVENT_DEV_CAP_MAINTENANCE_FREE`` flag. During periods when the application thread using a particular port is neither attempting to enqueue nor to dequeue events, it must diff --git a/drivers/event/cnxk/cnxk_eventdev.c b/drivers/event/cnxk/cnxk_eventdev.c index 50d5c351bc..f7a5026250 100644 --- a/drivers/event/cnxk/cnxk_eventdev.c +++ b/drivers/event/cnxk/cnxk_eventdev.c @@ -119,7 +119,8 @@ cnxk_sso_info_get(struct cnxk_sso_evdev *dev, RTE_EVENT_DEV_CAP_RUNTIME_PORT_LINK | RTE_EVENT_DEV_CAP_MULTIPLE_QUEUE_PORT | RTE_EVENT_DEV_CAP_NONSEQ_MODE | - RTE_EVENT_DEV_CAP_CARRY_FLOW_ID; + RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | + RTE_EVENT_DEV_CAP_MAINTENANCE_FREE; } int diff --git a/drivers/event/dlb2/dlb2.c b/drivers/event/dlb2/dlb2.c index 0dbe85762c..16e9764dbf 100644 --- a/drivers/event/dlb2/dlb2.c +++ b/drivers/event/dlb2/dlb2.c @@ -66,7 +66,8 @@ static struct rte_event_dev_info evdev_dlb2_default_info = { RTE_EVENT_DEV_CAP_BURST_MODE | RTE_EVENT_DEV_CAP_DISTRIBUTED_SCHED | RTE_EVENT_DEV_CAP_IMPLICIT_RELEASE_DISABLE | - RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES), + RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES | + RTE_EVENT_DEV_CAP_MAINTENANCE_FREE), }; struct process_local_port_data diff --git a/drivers/event/dpaa/dpaa_eventdev.c b/drivers/event/dpaa/dpaa_eventdev.c index eec4bc62b7..ff6cc0be18 100644 --- a/drivers/event/dpaa/dpaa_eventdev.c +++ b/drivers/event/dpaa/dpaa_eventdev.c @@ -356,7 +356,8 @@ dpaa_event_dev_info_get(struct rte_eventdev *dev, RTE_EVENT_DEV_CAP_BURST_MODE | RTE_EVENT_DEV_CAP_MULTIPLE_QUEUE_PORT | RTE_EVENT_DEV_CAP_NONSEQ_MODE | - RTE_EVENT_DEV_CAP_CARRY_FLOW_ID; + RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | + RTE_EVENT_DEV_CAP_MAINTENANCE_FREE; } static int diff --git a/drivers/event/dpaa2/dpaa2_eventdev.c b/drivers/event/dpaa2/dpaa2_eventdev.c index 710156ad14..4d94c315d2 100644 --- a/drivers/event/dpaa2/dpaa2_eventdev.c +++ b/drivers/event/dpaa2/dpaa2_eventdev.c @@ -408,7 +408,8 @@ dpaa2_eventdev_info_get(struct rte_eventdev *dev, RTE_EVENT_DEV_CAP_MULTIPLE_QUEUE_PORT | RTE_EVENT_DEV_CAP_NONSEQ_MODE | RTE_EVENT_DEV_CAP_QUEUE_ALL_TYPES | - RTE_EVENT_DEV_CAP_CARRY_FLOW_ID; + RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | + RTE_EVENT_DEV_CAP_MAINTENANCE_FREE; } diff --git a/drivers/event/dsw/dsw_evdev.c b/drivers/event/dsw/dsw_evdev.c index 5ff8fcc6a9..ffabf0d23d 100644 --- a/drivers/event/dsw/dsw_evdev.c +++ b/drivers/event/dsw/dsw_evdev.c @@ -222,8 +222,7 @@ dsw_info_get(struct rte_eventdev *dev __rte_unused, RTE_EVENT_DEV_CAP_DISTRIBUTED_SCHED| RTE_EVENT_DEV_CAP_NONSEQ_MODE| RTE_EVENT_DEV_CAP_MULTIPLE_QUEUE_PORT| - RTE_EVENT_DEV_CAP_CARRY_FLOW_ID| - RTE_EVENT_DEV_CAP_REQUIRES_MAINT + RTE_EVENT_DEV_CAP_CARRY_FLOW_ID }; } diff --git a/drivers/event/octeontx/ssovf_evdev.c b/drivers/event/octeontx/ssovf_evdev.c index 366b6d356b..9e14e35d10 100644 --- a/drivers/event/octeontx/ssovf_evdev.c +++ b/drivers/event/octeontx/ssovf_evdev.c @@ -155,7 +155,8 @@ ssovf_info_get(struct rte_eventdev *dev, struct rte_event_dev_info *dev_info) RTE_EVENT_DEV_CAP_RUNTIME_PORT_LINK | RTE_EVENT_DEV_CAP_MULTIPLE_QUEUE_PORT | RTE_EVENT_DEV_CAP_NONSEQ_MODE | - RTE_EVENT_DEV_CAP_CARRY_FLOW_ID; + RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | + RTE_EVENT_DEV_CAP_MAINTENANCE_FREE; } diff --git a/drivers/event/octeontx2/otx2_evdev.c b/drivers/event/octeontx2/otx2_evdev.c index f26bed334f..ccf28b678b 100644 --- a/drivers/event/octeontx2/otx2_evdev.c +++ b/drivers/event/octeontx2/otx2_evdev.c @@ -505,7 +505,8 @@ otx2_sso_info_get(struct rte_eventdev *event_dev, RTE_EVENT_DEV_CAP_RUNTIME_PORT_LINK | RTE_EVENT_DEV_CAP_MULTIPLE_QUEUE_PORT | RTE_EVENT_DEV_CAP_NONSEQ_MODE | - RTE_EVENT_DEV_CAP_CARRY_FLOW_ID; + RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | + RTE_EVENT_DEV_CAP_MAINTENANCE_FREE; } static void diff --git a/drivers/event/opdl/opdl_evdev.c b/drivers/event/opdl/opdl_evdev.c index 5007e9a7bf..15c10240b0 100644 --- a/drivers/event/opdl/opdl_evdev.c +++ b/drivers/event/opdl/opdl_evdev.c @@ -375,7 +375,8 @@ opdl_info_get(struct rte_eventdev *dev, struct rte_event_dev_info *info) .max_event_port_enqueue_depth = MAX_OPDL_CONS_Q_DEPTH, .max_num_events = OPDL_INFLIGHT_EVENTS_TOTAL, .event_dev_cap = RTE_EVENT_DEV_CAP_BURST_MODE | - RTE_EVENT_DEV_CAP_CARRY_FLOW_ID, + RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | + RTE_EVENT_DEV_CAP_MAINTENANCE_FREE, }; *info = evdev_opdl_info; diff --git a/drivers/event/skeleton/skeleton_eventdev.c b/drivers/event/skeleton/skeleton_eventdev.c index af0efb3302..bf3b01ebc8 100644 --- a/drivers/event/skeleton/skeleton_eventdev.c +++ b/drivers/event/skeleton/skeleton_eventdev.c @@ -102,7 +102,8 @@ skeleton_eventdev_info_get(struct rte_eventdev *dev, dev_info->event_dev_cap = RTE_EVENT_DEV_CAP_QUEUE_QOS | RTE_EVENT_DEV_CAP_BURST_MODE | RTE_EVENT_DEV_CAP_EVENT_QOS | - RTE_EVENT_DEV_CAP_CARRY_FLOW_ID; + RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | + RTE_EVENT_DEV_CAP_MAINTENANCE_FREE; } static int diff --git a/drivers/event/sw/sw_evdev.c b/drivers/event/sw/sw_evdev.c index 070a4802e9..808f59d1e5 100644 --- a/drivers/event/sw/sw_evdev.c +++ b/drivers/event/sw/sw_evdev.c @@ -609,7 +609,8 @@ sw_info_get(struct rte_eventdev *dev, struct rte_event_dev_info *info) RTE_EVENT_DEV_CAP_RUNTIME_PORT_LINK | RTE_EVENT_DEV_CAP_MULTIPLE_QUEUE_PORT | RTE_EVENT_DEV_CAP_NONSEQ_MODE | - RTE_EVENT_DEV_CAP_CARRY_FLOW_ID), + RTE_EVENT_DEV_CAP_CARRY_FLOW_ID | + RTE_EVENT_DEV_CAP_MAINTENANCE_FREE), }; *info = evdev_sw_info; diff --git a/lib/eventdev/rte_eventdev.h b/lib/eventdev/rte_eventdev.h index e026486ca5..4119f51fa0 100644 --- a/lib/eventdev/rte_eventdev.h +++ b/lib/eventdev/rte_eventdev.h @@ -299,13 +299,14 @@ struct rte_event; * the content of this field is implementation dependent. */ -#define RTE_EVENT_DEV_CAP_REQUIRES_MAINT (1ULL << 10) -/**< Event device requires calls to rte_event_maintain() during - * periods when neither rte_event_dequeue_burst() nor - * rte_event_enqueue_burst() are called on a port. This will allow the - * event device to perform internal processing, such as flushing - * buffered events, return credits to a global pool, or process - * signaling related to load balancing. +#define RTE_EVENT_DEV_CAP_MAINTENANCE_FREE (1ULL << 10) +/**< Event device *does not* require calls to rte_event_maintain(). + * An event device that does not set this flag requires calls to + * rte_event_maintain() during periods when neither + * rte_event_dequeue_burst() nor rte_event_enqueue_burst() are called + * on a port. This will allow the event device to perform internal + * processing, such as flushing buffered events, return credits to a + * global pool, or process signaling related to load balancing. */ /* Event device priority levels */ @@ -2082,8 +2083,8 @@ rte_event_dequeue_burst(uint8_t dev_id, uint8_t port_id, struct rte_event ev[], /** * Maintain an event device. * - * This function is only relevant for event devices which have the - * @ref RTE_EVENT_DEV_CAP_REQUIRES_MAINT flag set. Such devices + * This function is only relevant for event devices which do not have + * the @ref RTE_EVENT_DEV_CAP_MAINTENANCE_FREE flag set. Such devices * require an application thread using a particular port to * periodically call rte_event_maintain() on that port during periods * which it is neither attempting to enqueue events to nor dequeue -- 2.25.1