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 AF43DA0547; Tue, 26 Oct 2021 22:30:21 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7856140E0F; Tue, 26 Oct 2021 22:30:21 +0200 (CEST) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by mails.dpdk.org (Postfix) with ESMTP id AC74A407FF for ; Tue, 26 Oct 2021 22:30:19 +0200 (CEST) X-IronPort-AV: E=McAfee;i="6200,9189,10149"; a="253550547" X-IronPort-AV: E=Sophos;i="5.87,184,1631602800"; d="scan'208";a="253550547" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Oct 2021 13:30:13 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.87,184,1631602800"; d="scan'208";a="572633728" Received: from orsmsx603.amr.corp.intel.com ([10.22.229.16]) by FMSMGA003.fm.intel.com with ESMTP; 26 Oct 2021 13:30:13 -0700 Received: from orsmsx606.amr.corp.intel.com (10.22.229.19) by ORSMSX603.amr.corp.intel.com (10.22.229.16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.12; Tue, 26 Oct 2021 13:30:12 -0700 Received: from ORSEDG602.ED.cps.intel.com (10.7.248.7) by orsmsx606.amr.corp.intel.com (10.22.229.19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2242.12 via Frontend Transport; Tue, 26 Oct 2021 13:30:12 -0700 Received: from NAM10-BN7-obe.outbound.protection.outlook.com (104.47.70.104) by edgegateway.intel.com (134.134.137.103) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2242.12; Tue, 26 Oct 2021 13:30:12 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=NLQIVjrkPk97G1KUSaOizjronMnWI0XodSUh4Ct1kVhG1K56u+6aVTk6OWmeuHpJQhud0AJL5M5AkXgAAbHx/1L2jbUVf69f2l7szvC6tipBwiRaADF+uM28XRKQhnFwFqyF7aDMCHDvk7nVzPOJlCeIanPUVchQBU7ThS+gZeZU/hDyT1KXUry5eJAcx3LozzmDgOXdQMXNH/FayZn6BwijBISrRjy+I/VKitWz53Yr/YYRZyK9XM4veQ0jTEpsOKuC3Rmb+qjKWp1xSeB4iVJO0GbAGf2Xfn4ft5WPTarXJGC2drsvYStijm9vxH5o+u0Wuv6yGLyLoNepF+f7wA== 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=bk8Oy6gdG0VjtZGvCAT8V7o93AH/727Zh+sgZlhB5qk=; b=lZ2H7DMYKGIwRpp1e7eWz0FhP6BcN1g59BAIl1y38C4qXMRyQflIq2gVxuPsCxsbkBHX2A/gfJLKHYFIgna6TVKd/i+elUXxw3B604xCZP66NBzGXRoY1gqphbHHmvWhY3q2+4cA//Px8OUntQOmWDCVTDu2duedkl26sCqBhEkXdSl5QiCgHWM1Lppcbg6ugBdK3RM+5/NmMBuVAafhor/y5OofVE6hktzh8DY+0tGe6czvjXSuUzuXRpNIURjS6OK3BI37FUaD1otzEru8SPDV6leuDhmSLj0SnkgXoU+SySo6+z47C6ZRaiLT5JX7lZGT+RFerD/lrVzXaUkRXA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=intel.onmicrosoft.com; s=selector2-intel-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=bk8Oy6gdG0VjtZGvCAT8V7o93AH/727Zh+sgZlhB5qk=; b=FKbmDItnBmgHJlfgxOIulqhzmX01RczXP7QsMCdX9/m9PwO+R0Q+3i9grkxGxfWbQrABlXgLtce1Xf9ynzlVOHkEnvQBZ2eJypwth4tzEDra64wD6T+2Pbg8O7vOHbSFWsyEJLTIIuD/V+gqp13SpMUJJZyrnkVBYA02RLbWDek= Authentication-Results: networkplumber.org; dkim=none (message not signed) header.d=none;networkplumber.org; dmarc=none action=none header.from=intel.com; Received: from SA2PR11MB5020.namprd11.prod.outlook.com (2603:10b6:806:11f::16) by SA1PR11MB5898.namprd11.prod.outlook.com (2603:10b6:806:229::6) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4628.16; Tue, 26 Oct 2021 20:30:10 +0000 Received: from SA2PR11MB5020.namprd11.prod.outlook.com ([fe80::e54d:4547:c437:dfe]) by SA2PR11MB5020.namprd11.prod.outlook.com ([fe80::e54d:4547:c437:dfe%7]) with mapi id 15.20.4628.020; Tue, 26 Oct 2021 20:30:10 +0000 To: Thomas Monjalon CC: , , , , , References: <1634842469-27119-1-git-send-email-vladimir.medvedkin@intel.com> <1634842469-27119-6-git-send-email-vladimir.medvedkin@intel.com> <34793174.9LTJZ4FjZS@thomas> From: "Medvedkin, Vladimir" Message-ID: Date: Tue, 26 Oct 2021 22:29:57 +0200 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0 Thunderbird/78.14.0 In-Reply-To: <34793174.9LTJZ4FjZS@thomas> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-ClientProxiedBy: DB6PR0402CA0012.eurprd04.prod.outlook.com (2603:10a6:4:91::22) To SA2PR11MB5020.namprd11.prod.outlook.com (2603:10b6:806:11f::16) MIME-Version: 1.0 Received: from [192.55.54.51] (192.55.54.51) by DB6PR0402CA0012.eurprd04.prod.outlook.com (2603:10a6:4:91::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4628.16 via Frontend Transport; Tue, 26 Oct 2021 20:30:05 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2eb22c10-477f-479e-4a86-08d998bf67da X-MS-TrafficTypeDiagnostic: SA1PR11MB5898: X-LD-Processed: 46c98d88-e344-4ed4-8496-4ed7712e255d,ExtAddr X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:6108; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: YkdAQxeDOqCTKnmtg0UDZ1MyAb64FI/J6NQhfBwUuJmlEoPfZ0QQ6vD9TkBZ/1WjWMoZbcda+vwFJ+yJkX0zRRsvX9iOJBmyHSmPzjW4+sJsseaWtRruGHBQHoV0uyaw4u7Gmj8l41FUU6zWgEdL8JGhb+ZNCekp55wreA8NZEJH8rqkBiMsalLjuKMB4r3OB8FddffiCRdpkFXx62WM767j/c0Qtfa60HyzirIhzy33L03T7syuTaWWUiYLQrD58TOp+DS/pBbHPrtpnXMy2F3RNaCBN/naENhsQgZAawFnSqfQOsZNg+qQpLzoDHtVbYcrqDsNxOQCi2edB7oCR+BetWxUKptTQL1KwwYQxJk9bGy+xCkW6zhms6nIOXOfnyTS8F8theZKXgF8si/MnsTJjDg/J44iQVNskmUB/awxkoreB3zhw9i5SguO/ve0hDSGhZ65FctnGhEORVpAi4OqGmh3M7CYT7OrNXraGJFiqfn56A+G4XncIraGKc7F0DdskZPOSdfN8Q0kELGZ6d5EQ8ROolg4VwrvttAg9N4sN/2YHS1AhD9pE+OLvTpNP5jBZWzF2LVLOOz9iZ80a7mYYS9119eJh7jToIg9ua+dkpVG/J82pkLflVqZwORStFvQ/3abL1DhXdMecPGZqeIzRw8yuDeMHAM6vEa0+s4so8/Bq1AJBG4GSInE5zj06XBeoTvizqnvhy85exjREk2LXDDND+7TvuZf/ONP10vpTmz8z86roo+sHkjFjXg0 X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SA2PR11MB5020.namprd11.prod.outlook.com; PTR:; CAT:NONE; SFS:(366004)(31686004)(4326008)(316002)(53546011)(26005)(82960400001)(6486002)(6706004)(86362001)(186003)(66946007)(6916009)(5660300002)(31696002)(8676002)(16576012)(8936002)(83380400001)(2906002)(6666004)(956004)(66476007)(2616005)(36756003)(66556008)(38100700002)(508600001)(3940600001)(43740500002)(45980500001); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?cEN0UUVGNkJBYjhweGZsK2I4cHJ1c1BLTTNJV2t1YVA4QzdQVGJCRUNSMm95?= =?utf-8?B?M1JMS2xIVmhBcWtpVTQ0RjhMYkM2MGhEVjJ3K2J5VnlhdEZZekZickJSZ1NQ?= =?utf-8?B?VW5hTVZORjNTS2Y0c1JIQUdJOWFBaVdSRHFObXowbFFaOUZNa3BxZXA0UDBN?= =?utf-8?B?NS92Y1NXNllOdmduS0phNzB6R0E2ek9XWWI1RDdaVHZKV25idXNnY2pPeW1K?= =?utf-8?B?bDZjOXhGcStxNHV5N2xWZ0lmMndMK3h1azdaU2l6TlJyVkVlQmc5VTZrcUlY?= =?utf-8?B?YTBvMmJzVzYzQ1prYmhkK1VJcXpJRndma2NXbndDRzlUZVpCcnhjMEltZmIr?= =?utf-8?B?Y3c4YjQ1akFtVDQ0dmtyNS82SzY1Vm5hc1h1QXNNZkRFeWwxRnd4RFhiUmtJ?= =?utf-8?B?dkV3a01RMTVxSVdYeUs4cDdMY0F3RDBTTFZoQStVNzN2QTNxaG1lZS9uZVFH?= =?utf-8?B?OXoyaGNmVjFIY1BiWU5JN3F5KzBXOVBPcnU2RGx0dGJNZXdKVWRpRnNsV1dy?= =?utf-8?B?cElkcHRTL0VnM3pMVUgrSWU3Z0Q2VnJ1eXJHNjlxcWFmUG9nVnpCWGNiZDZJ?= =?utf-8?B?U0M0MVd0Rm5meVk0L1RrRjU0d0xFUk5mYlI5UGxsSzJIZlFmbHIwcXFOeDQw?= =?utf-8?B?eFBQRXA4ODlhbjZlY3BPK0kzVmJ6UjVPUmd2T3p2VkVBUEZjNFFxdVpVcVNl?= =?utf-8?B?OHBPeTdZNldHcEpGVXBFSTVNWHBXMzhxRXgzTDJPYXlNZW5vWEpLQlBZNTVZ?= =?utf-8?B?M3VoUjB5dGFaNzFoSXM3c1NZUEVNdFdJOUFBaGtPM1NiWkl1K1ZHMWZra245?= =?utf-8?B?UWZqMXpLV2FTTnVKblNiV3FuN0ozWW5FUTEvVmtXVjEwUU53dlNWUytSRkRV?= =?utf-8?B?UHdwWUl4RjlnZ3VMbG4xKy9KVlVFMnJsS0JOZFZWQlpmRmlVbVdYZUUvdlVh?= =?utf-8?B?cDdWV2NKTUJoSmNpeUtTT0ttbUcvV0ZEaEh1TTc0MW8zcG9EYmFHYzF6THE1?= =?utf-8?B?SmtLVTdDa3BZOVZGbjJUdjNiNEliWm9UK014T3lITGE0NHV1THZrMmwrZmZ0?= =?utf-8?B?dEppamw1ZWN0OWxUbUZON3g5NEdOQkI2OXdGYnhkOG8vem5hTjdRVVBxVlk1?= =?utf-8?B?YVpoamtBQmdOdnZSYW5KQXphTnMzWFJIWENyT1BVU1BVbkJ1bEpnbCtBY2Np?= =?utf-8?B?YUwzNjQ5aGU3Vmc3SzExZGNkTjhnM2FZRXVXb2JEc0ZSeWRYUmE0QXo4Z3pZ?= =?utf-8?B?bHhuMVRFSWNzMG1xdHhjSllHZHZXc3dYOUthcCsrSjFCNlZYdmJNMkFBcmxQ?= =?utf-8?B?UVJ2cTVGRlE1dW1wUzBKMm5GeE9ubkhZWmRYZ0RBaDZMdmh3VllrVkdNOGl4?= =?utf-8?B?UWlmbEw0M2ZMSy9XenJXQ0NQRlc3MFVtR3BEMXBkcE1LTHE2T2wyU0JrM1Ix?= =?utf-8?B?MG9vRG9TRWhuSmVFOThVVnpxdm9nVjJTRWR6eFRRQUhua2lBYVNOUm1rd01V?= =?utf-8?B?Zkt4R1FhL1J2RDQxc2JGdm91YTNLdkZCSkJMaUppbVkvTEhJNnphNFpWU0gz?= =?utf-8?B?ekNtQlh6YUROSW0yOEpqMGV6SWlxZUlNOWFubytzT2FsTm9OQWhENG83UEpm?= =?utf-8?B?Uk02T1c1TkNJQkdJN2NveEt5MjVmb0ZEai9NSmYya3ptL0lKSXB2TDYwZ0pR?= =?utf-8?B?Vjl6RmNycHl2MWI5L05mSDNZb1orSGNILzJncDBVaXZoQTRaWUNHaTk1TTRH?= =?utf-8?B?bjAvYWtrT2p1aFBnbC9DZ1RzSlhuN1RFTGtCbEZUdFcxZFpsZFRjQWFaOTJK?= =?utf-8?B?cUFidllTNWVlMmx0dGdDcDZSeE5qU3BjdEp6RUkxSmNSL1pyTFdPdDZCMm1w?= =?utf-8?B?d1gwNXNrTGZYcFpVaXBqZWdzUHRLOTRnMVRIa3ZzUUdwTUM4bVY5dkM1aG10?= =?utf-8?B?dWVZM0t6Q3JBQlYvcWM1bmhHOXdPZmpjNXZxZE5USS9tSE9QQXV6aEhiRzQz?= =?utf-8?B?QUoxcTRDeU50QlZNZU1vcXVOSUpIVm5tQlZCMGlFTC9XcWRsZXNQWDNNdE5p?= =?utf-8?B?Rk5SaGxRbkFlNEQxbWhaNk1Xc0h5cGZQWXArL1lrTDZtYVVlM052NzYyUmNR?= =?utf-8?B?MmJad3pLNXFFYXBiZWFXZUhEOGprYmhFNWw2S2I0dFhwa244Umh3WUVneDZi?= =?utf-8?B?SnVtdnhRUUtTZGl0OEZJUlJGekQrZENPeDRvWE9sb2xyUk5yalZEd29qS2M3?= =?utf-8?B?VHlIbGhOMUFZS0EzamFGU1NRRkd3PT0=?= X-MS-Exchange-CrossTenant-Network-Message-Id: 2eb22c10-477f-479e-4a86-08d998bf67da X-MS-Exchange-CrossTenant-AuthSource: SA2PR11MB5020.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Oct 2021 20:30:10.1137 (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: 2jRAthgLtZMlVEpnf6D1IwPyIlvrrp6JksMsPAtMdzosPE+gxjgqtJZa3md4yx9PH+gRnKA5tr2dA80/5eahFIypqy1YDE++cfVS1HC7jqs= X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR11MB5898 X-OriginatorOrg: intel.com Subject: Re: [dpdk-dev] [PATCH v5 5/5] test/thash: add performance tests for the Toeplitz hash 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" Hi Thomas, Thanks for the review, I'll address your comments in v6. Please find my comment below On 25/10/2021 19:02, Thomas Monjalon wrote: > 21/10/2021 20:54, Vladimir Medvedkin: >> This patch adds performance tests for different implementations >> of the Toeplitz hash function. > > Please name them. > >> Signed-off-by: Vladimir Medvedkin > > There are some garbage, > >> @@ -320,6 +321,7 @@ perf_test_names = [ >> 'hash_readwrite_lf_perf_autotest', >> 'trace_perf_autotest', >> 'ipsec_perf_autotest', >> + 'thash_perf_autotest', > > here (tabs instead of space) > >> driver_test_names = [ >> diff --git a/app/test/test_thash_perf.c b/app/test/test_thash_perf.c >> new file mode 100644 >> index 0000000..fb66e20 >> --- /dev/null >> +++ b/app/test/test_thash_perf.c >> @@ -0,0 +1,120 @@ >> +/* SPDX-License-Identifier: BSD-3-Clause >> + * Copyright(c) 2021 Intel Corporation >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> + >> +#include >> +#include >> +#include >> +#include >> + >> +#include "test.h" >> + >> +#define ITERATIONS (1 << 15) >> +#define BATCH_SZ (1 << 10) >> + >> +#define IPV4_2_TUPLE_LEN (8) >> +#define IPV4_4_TUPLE_LEN (12) >> +#define IPV6_2_TUPLE_LEN (32) >> +#define IPV6_4_TUPLE_LEN (36) >> + >> + >> +static uint8_t default_rss_key[] = { >> + 0x6d, 0x5a, 0x56, 0xda, 0x25, 0x5b, 0x0e, 0xc2, >> + 0x41, 0x67, 0x25, 0x3d, 0x43, 0xa3, 0x8f, 0xb0, >> + 0xd0, 0xca, 0x2b, 0xcb, 0xae, 0x7b, 0x30, 0xb4, >> + 0x77, 0xcb, 0x2d, 0xa3, 0x80, 0x30, 0xf2, 0x0c, >> + 0x6a, 0x42, 0xb7, 0x3b, 0xbe, 0xac, 0x01, 0xfa, >> +}; >> + >> +static void >> +run_thash_test(unsigned int tuple_len) >> +{ >> + uint32_t *tuples[BATCH_SZ]; >> + unsigned int i, j; >> + uint64_t start_tsc, end_tsc; >> + uint32_t len = RTE_ALIGN_CEIL(tuple_len, sizeof(uint32_t)); >> + volatile uint32_t hash = 0; >> + uint32_t bulk_hash[BATCH_SZ] = { 0 }; >> + >> + for (i = 0; i < BATCH_SZ; i++) { >> + tuples[i] = rte_zmalloc(NULL, len, 0); >> + for (j = 0; j < len / sizeof(uint32_t); j++) >> + tuples[i][j] = rte_rand(); >> + } >> + >> + start_tsc = rte_rdtsc_precise(); >> + for (i = 0; i < ITERATIONS; i++) { >> + for (j = 0; j < BATCH_SZ; j++) { >> + hash ^= rte_softrss(tuples[j], len / sizeof(uint32_t), >> + default_rss_key); >> + } >> + } >> + end_tsc = rte_rdtsc_precise(); >> + >> + printf("Average rte_softrss() takes \t\t%.1f cycles for key len %d\n", >> + (double)(end_tsc - start_tsc) / (double)(ITERATIONS * >> + BATCH_SZ), len); >> + >> + start_tsc = rte_rdtsc_precise(); >> + for (i = 0; i < ITERATIONS; i++) { >> + for (j = 0; j < BATCH_SZ; j++) { >> + hash ^= rte_softrss_be(tuples[j], len / >> + sizeof(uint32_t), default_rss_key); >> + } >> + } >> + end_tsc = rte_rdtsc_precise(); >> + >> + printf("Average rte_softrss_be() takes \t\t%.1f cycles for key len %d\n", >> + (double)(end_tsc - start_tsc) / (double)(ITERATIONS * >> + BATCH_SZ), len); > > The function could stop here (one function per type of implementation). > Could you please clarify what do you mean? The function stops here if the machine do not support GFNI, and this is done intentionally. On machine without GFNI it tests only scalar implementations for every given length. >> + >> + if (!rte_thash_gfni_supported()) >> + return; >> + >> + uint64_t rss_key_matrixes[RTE_DIM(default_rss_key)]; >> + >> + rte_thash_complete_matrix(rss_key_matrixes, default_rss_key, >> + RTE_DIM(default_rss_key)); >> + >> + start_tsc = rte_rdtsc_precise(); >> + for (i = 0; i < ITERATIONS; i++) { >> + for (j = 0; j < BATCH_SZ; j++) >> + hash ^= rte_thash_gfni(rss_key_matrixes, >> + (uint8_t *)tuples[j], len); >> + } >> + end_tsc = rte_rdtsc_precise(); >> + >> + printf("Average rte_thash_gfni takes \t\t%.1f cycles for key len %d\n", >> + (double)(end_tsc - start_tsc) / (double)(ITERATIONS * >> + BATCH_SZ), len); >> + >> + start_tsc = rte_rdtsc_precise(); >> + for (i = 0; i < ITERATIONS; i++) >> + rte_thash_gfni_bulk(rss_key_matrixes, len, (uint8_t **)tuples, >> + bulk_hash, BATCH_SZ); >> + >> + end_tsc = rte_rdtsc_precise(); >> + >> + printf("Average rte_thash_gfni_x2 takes \t%.1f cycles for key len %d\n", > > and here, the function name is not updated. > >> + (double)(end_tsc - start_tsc) / (double)(ITERATIONS * >> + BATCH_SZ), len); >> + > > useless blank line > >> +} > > > -- Regards, Vladimir