From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757107AbcH2Wgb (ORCPT ); Mon, 29 Aug 2016 18:36:31 -0400 Received: from mail-db5eur01on0094.outbound.protection.outlook.com ([104.47.2.94]:2369 "EHLO EUR01-DB5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1757030AbcH2Wg2 (ORCPT ); Mon, 29 Aug 2016 18:36:28 -0400 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ktkhai@virtuozzo.com; Subject: [PATCH RFC 2/2] net: Iterate over present cpus only during ipstats calculation From: Kirill Tkhai To: , CC: , , , , , , , Date: Mon, 29 Aug 2016 22:04:09 +0300 Message-ID: <147249744991.18175.5029608970474229005.stgit@pro> In-Reply-To: <147249730528.18175.4772805024092024580.stgit@pro> References: <147249730528.18175.4772805024092024580.stgit@pro> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: AM5PR0601CA0027.eurprd06.prod.outlook.com (10.173.86.141) To VI1PR0802MB2143.eurprd08.prod.outlook.com (10.172.12.12) X-MS-Office365-Filtering-Correlation-Id: f4767f0e-1416-48b6-d26e-08d3d03f4507 X-Microsoft-Exchange-Diagnostics: 1;VI1PR0802MB2143;2:z5PbYL8bckt40NYTmrCRYKl1v0mRUYJBvvTAWv8Z7GUJIH0Vt88kDy9rEw6GJH4A5UdSDGRkC0l2DBxSPMHHMXccTq30TIiBCm0y/+XZ8rJrf+m185cuKX23Ye/tpajo9PFLoWk8AURHGhCrgC40P3maRwjn6iUZkjsKCsa/S/ZaniTJLPPDnwa7YNYCp2M6;3:1PxM5QeuI0TNX2aHd/abg01+VoVOcTdFK6AYLXW05gh+D+3Ak7u9lxvU97w7yLWNDGMibBgElk3neKQAYJAgMkwXWMRzBucUwLDdVrVveXf5zohp3YqZ0CoyT5EQbCAI X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0802MB2143; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0802MB2143;25:4Ke0Do3SMMpXSgvh+z5/bUt136LLqjqRdSI2aymU6cpRvTpJyC0GYyGdr/aPH9y2MAPmUnSIV/lMRQokwEpDJVaOe3EuNfuxjKnpJxk0Pnw/DdIngfutZAI0JBPA6HNu4uPnVcqxWvy+/80lFygdCvf+jZfbnyy3FyoN/XSva3CuE/po2SF/a7ScgaAlYBJK+sYxU9BXYoqmfjESr16KLKHvnAl1MS4G4cwkwPE9/3hj4eiu8YP/b/l7aTLfycwGUjeqNaBEOYE20LIoj7HiAeIHY57/HLJXMqJ8t9rsQemW0GnegclcFGM6jE3NIJVe/l4IG1b2CcqZ+ga6Uhaz+g2UtBTsDpdm02Af1f2PnecOSAvSY58kL2fDmT5F0aPv+x+oLZS1VozEpcxiKM8SfpOw/O0sNKf+1o2PD1jTD5cA2ebihOVTY4p4FKm62QNiGO42lvA9ZQpb7UWgHgAYSG8icIsBhbHCiRilXy9HAluLhw7M+H1DC7Hi3VEd/dQsEa6jGzaAt8AAaRzZYUlB2DfE6jCUwo+xVLKPwCLWd3t5jtDSzoUbxdd/NAMqmClogT0gyxqAiGLdXAqMNRWPfMY2asz4Ac5D7/KG+roaqsjIAu3G6GNssSZAaWbSMHzwZTqY9LVRJVWEPg7gYVZl3zktagsWrJB12taer3haJOJtMXQswVdwRqgkX2IDnRj2BkDAi/3Zl5bKn78inn8qow==;31:Zmb48Zaih5KPmP/zd1MR+YI0ogdNjibart8k+9OFxysY/ta5VWZf+kjsxx66AcRdTChPJvsmx7mT6wgrubbZ6/sI3dtGaH+RM7f8FdrAqnFw5o4pbmzpC3eO059A30w5MG5GZscDc9fquN6q55N7dzQNI0v83LxU/paML9qTI5XYBURhbbSVGsTuL9HnSgBJoaheLEMAO6JhZJWKSQXTyx/Y4PU+ZhzdtUBhV1THw2s= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6043046)(6042046);SRVR:VI1PR0802MB2143;BCL:0;PCL:0;RULEID:;SRVR:VI1PR0802MB2143; X-Microsoft-Exchange-Diagnostics: 1;VI1PR0802MB2143;4:B+26d7oKM2Fq3f33YGbw4OTFfFH5H+ZFrLAHx7Lc82fVBNP0bbN29hARyQNrMY4ic0EStCUhy6FkgtmQ/wpmRjOnnQqQRbRy7wPnpmUB87waKUNb/1Kz6iigCpOEHNM5Bs20lQsVSGHMV87sVCGG4jBtA1o/mXOhjcuwqZCvHI6VGwjUaoxOjSoMRqwvgUZ2TS5ZH1Gd4AcwPWYF9LsXaCC9xzDCe+vA3yfxnM92Y9UH38/SyseZG25yOAtTkGvxsqavWK5t6ldCVY8kGl3jLbuz+5HN3i9EkrNMn64NjJ3tDePx8vDNB4qHFfHh0RTysAKSp1yoVMZgcZ1BtbBe+PCVwNKs6kPfJp529rBgUo/kn+POPgniWydk2ZH90lUzUNHZPFrdFPvj59uiS5CXsNy+5wmoDSDOS9Yty2xuSPg= X-Forefront-PRVS: 0049B3F387 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6049001)(7916002)(189002)(199003)(586003)(3846002)(229853001)(230700001)(7846002)(7736002)(97736004)(101416001)(19580395003)(107886002)(19580405001)(103116003)(50986999)(5001770100001)(76176999)(5660300001)(105586002)(33646002)(50466002)(4001350100001)(189998001)(54356999)(68736007)(9686002)(23676002)(83506001)(66066001)(47776003)(4326007)(305945005)(42186005)(106356001)(92566002)(2950100001)(4001430100002)(2906002)(81166006)(33716001)(77096005)(8676002)(6116002)(86362001)(81156014)(217873001);DIR:OUT;SFP:1102;SCL:1;SRVR:VI1PR0802MB2143;H:[127.0.1.1];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtWSTFQUjA4MDJNQjIxNDM7MjM6cGN3MTZMZmtPWEtFR3V0N0tGWHZuTnhl?= =?utf-8?B?eExyaE9GaEJMNkZhNzE2bW4vNUpObWIxRytEZjNVUTJNVWZsL2IvZFhTMUdB?= =?utf-8?B?V1hBWGQrd0ZPUGJQR0thcjRmRzBSaVFqODYvclJWNGtaRnp1ajBqM1lmSXpx?= =?utf-8?B?a0xtdVhNZm5LOWd5cDFvYm1pZWFrWG1KcXFrTlRqMmVSdEJZK09LYU9OWjJh?= =?utf-8?B?UzZFdWxRSFJDNlVjaVRiWjJOd0JNYUpiM0FkSkRQVFlEZVFsNjJ3a2NxeVEz?= =?utf-8?B?N3BLTUF1bWlweUl2YVZtbDUrd2p4a2QzS2hCcHR3Z3FOT0FGTkliRG9xa1ZB?= =?utf-8?B?SUtoRm01aFlna3krK0FlcThtVG1meUF0RC9zZmRnNnlETHRMRXE1R1pDZVBZ?= =?utf-8?B?ODJCSFNnRGhoV0lBR0EyM1VJaFNPVjhLcXFHdFVTUnlaejRnOTBnQWNqMUxC?= =?utf-8?B?cytJbXN4Uk9WSmxvUVBtMVNQRUhiK1pZWDZkMTlNYjA5S0FSalRYNmtNc0E1?= =?utf-8?B?WFFYY0NxcDNkM2ZMUVhiQ3B0cG13aGxOdkhnTkdLbXd0aTVhdjdkTmd3bFVz?= =?utf-8?B?UDNwVVVoOUlJcDdSczRvbm0zYXU4aTZwK0tzMGZoY0Rib1IvZEZPVEIzRThS?= =?utf-8?B?WjREYzA4NHJKUkw1V0NxMWJyaXRsWXI4WjJaZE5BQ2dtL0h6bnJvdlFLRGYw?= =?utf-8?B?c21oNHM4NDJnRGRtY2YveldaN3RsUFZ6QVo5U1FCdTY2cUJJZ1BsazQvSzFV?= =?utf-8?B?bkpqemhCM1d1TmlrZDRRT1NoZ1JHRjNQanFleUdCMTJCVWJVcGxoRWhjN2ty?= =?utf-8?B?K050NXFFV2hCTnJFMnA0NnBIOXd5Uzc4MkZ6MGxNTE5nQ25HQVE4a1ZIVzl5?= =?utf-8?B?M21Rb2hnYjR1U09WQVhNeUNvTkx3anVlTWZZR0FTb3YvMUNlMnFFU09paURu?= =?utf-8?B?bFEralVURGNobExmeDZlODRpQ3N3Sy9ab2xLdm5rOUUyWVh6TU43SjJ5enJ1?= =?utf-8?B?djZ5Wk5KRzJhazh4RnRHRVVzeWFBS2lyTVJiSTBFb2lMUEFaZFJkdWdObWt0?= =?utf-8?B?Smk0aXZnV04zT1BhaHAxRlFzVDVBeDN2S1dwQUt2M2xZWlFoQVFUZ3NCdmlS?= =?utf-8?B?aldCZW5lR3BiTS81VlJyL1AxMEhVbmVoNnphYU9wcVRQSzRWMTdkU3BsNklh?= =?utf-8?B?R1pGd3Z5cGhwRlpBZlhndXZwSWpydGRGamdJZU4vZTQyaWhSbGtET1JyRWZi?= =?utf-8?B?akllM21HbURSUXZFbEx4eDJhOTIwV0UvSWU1N3QvYzh5STJyWTBsVHZKZGkx?= =?utf-8?B?Q0lPVCtBMXZVeXJIeW9sUk5BeWpxM25GcVZlUVdkUzhVK2RXa2xWOFRudGM4?= =?utf-8?B?WmlIcG1zeEx5djBsa1VQZm02RkVLTWRVN3pscm5BMmVpZHpHRHBNZ0l2RW9U?= =?utf-8?B?STZpYnZ2TkZCMFljT3A2MXpYS2Q0ZWJJRU04RkNZcUxmUzN6MWpJTG1iWkQ4?= =?utf-8?B?a0NlTkMvVURlM1lnYlczQmtWcWxXWGJ0MVgxL0FBVEpReWRuZWZBaUovMS9k?= =?utf-8?B?a1FTazRWUERwdHlLSGtDZEc0ZjFLa2J4NWJsU3crbHhlNzZhVXRrVkZmU05D?= =?utf-8?B?ZGNNZW55d2hGWTFnaEtucVBYbllJK1FJM2htS2hBNzYreFFlUXJnMHBSSy9D?= =?utf-8?Q?STaQaXv7RjEytxP25jYGoIkpY4atj7YX4EsLcJVzd?= X-Microsoft-Exchange-Diagnostics: 1;VI1PR0802MB2143;6:kG1eVCJ35YwMGS1ZUlnFVZ0Ad0HJOqBtuyuRjyk41ukaiQJdwb4T/OLE9awKmUNKRoiUjulf/cx3irvkHDi6sn6rJdYKOgF+5dpCN1F1KUllqzeYijrrRm+EUcLI1i4Et1WBW2RhXDbqy9/E1AvZIANZha7w5YSgpPONLMKEffBiLQeLEHNs3V8yqKY340a7jMluS1e+U3HtkCNZ1d5VDgoYFcLqniDjPPm+t7xMvuECLTGfflifvr0BmBB69m8Y0CehAwujWSRtl3z8xMJZ98pZooOjvp6XP7skvzDiG8k52wEW6qEx5xoi8FwrsxZu;5:3FQrCwuS9wfQzv5nh4hgcLQnQjt7k5PyCRzeceI2j4WZzjk5X1gQaMxaFiXBFqdn2R447Vlbs84+s7PCOghjnuob4lKGb/YV4NrR/rft1YnTDqskRfaO+i8xw+5ZPjfvNp2DSxRUDKbxmGlxzwiPTw==;24:tQlZnkF/17DeOq0+DpRuVpfJfECNohXjTtU7jhQWc8vft7FcZCUN/aeho52lfcEOvULjY0BFhx2+4GKqOrZ4flMLEUyjtrJtKWztOoF5gmk=;7:pnyalIrBUu+gWNKdSHOBgfKJW0u+u9m0xi6RpbhRl1BuiOegItOGM3+OTDdqN2Nxyp4ZRf+gEHNBq09a27iEQCAq/kOkI7Ce4j3gPIpUBq4QRRSjVHcQImH4vcm85y86NrJdwT/ROsePZYunSKdofG3am7RXcI/KlN4fO7mV3fCDuOqa5y+PRf19mCmsfCq8P3EQkfaRdCwNpzLL7atlUxMXvG65NDEBvcR91asPUMPU4QjvY0PuvXnHSSM+zXPe SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;VI1PR0802MB2143;20:agwQfWc2Vq3BNJFTF+B3mcnxCXyFAqSL/liCwi4TOUrWULORFExrpN5xiZGzZ6CMiEwK4z+JKXrSUG2fA17QiHzcXmH08r8rJJEAZ7qc4v404sclbu40o4SM6dnrpVO5f7063JXqmwdrz3ag+6tq/uD0CUittbYnvNLsuXRoSG4= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Aug 2016 19:04:14.0712 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0802MB2143 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Use net_stats callback to iterate only present cpus mask. This gives a signify performance growth on configurations with large number of possible cpus. Signed-off-by: Kirill Tkhai --- net/ipv6/addrconf.c | 4 +++- net/ipv6/af_inet6.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index df8425f..2ab088d 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -4970,10 +4970,12 @@ static inline void __snmp6_fill_stats64(u64 *stats, void __percpu *mib, memset(buff, 0, sizeof(buff)); buff[0] = IPSTATS_MIB_MAX; - for_each_possible_cpu(c) { + preempt_disable(); + for_each_present_cpu(c) { for (i = 1; i < IPSTATS_MIB_MAX; i++) buff[i] += snmp_get_cpu_field64(mib, c, i, syncpoff); } + preempt_enable(); memcpy(stats, buff, IPSTATS_MIB_MAX * sizeof(u64)); memset(&stats[IPSTATS_MIB_MAX], 0, pad); diff --git a/net/ipv6/af_inet6.c b/net/ipv6/af_inet6.c index 46ad699..1c7a431 100644 --- a/net/ipv6/af_inet6.c +++ b/net/ipv6/af_inet6.c @@ -61,6 +61,7 @@ #include #endif #include +#include #include #include @@ -785,6 +786,55 @@ static void ipv6_cleanup_mibs(struct net *net) kfree(net->mib.icmpv6msg_statistics); } +static void in6_move_stats(int src_cpu, void __percpu *mib, int max) +{ + int i, target_cpu; + u64 *ptr, v; + + target_cpu = cpumask_first(cpu_online_mask); + + BUG_ON(target_cpu > nr_cpu_ids || src_cpu != smp_processor_id()); + + for (i = 1; i < max; i++) { + ptr = ((u64 *)per_cpu_ptr(mib, src_cpu)) + i; + v = *ptr; + *ptr = 0; + + ptr = ((u64 *)per_cpu_ptr(mib, target_cpu)) + i; + *ptr += v; + } +} + +static int ipv6_stats_cb(int cpu) +{ + struct net_device *dev; + struct inet6_dev *idev; + struct net *net; + + WARN_ON(!irqs_disabled()); + + rcu_read_lock(); + write_lock(&dev_base_lock); + + for_each_net(net) { + if (!maybe_get_net(net)) + continue; + for_each_netdev(net, dev) { + idev = in6_dev_get(dev); + if (!idev) + continue; + in6_move_stats(cpu, idev->stats.ipv6, IPSTATS_MIB_MAX); + in6_dev_put(idev); + } + put_net(net); + } + + write_unlock(&dev_base_lock); + rcu_read_unlock(); + + return 0; +} + static int __net_init inet6_net_init(struct net *net) { int err = 0; @@ -986,6 +1036,10 @@ static int __init inet6_init(void) if (err) goto pingv6_fail; + err = register_net_stats_cb(ipv6_stats_cb); + if (err) + goto net_stats_fail; + err = calipso_init(); if (err) goto calipso_fail; @@ -1003,6 +1057,8 @@ static int __init inet6_init(void) calipso_exit(); #endif calipso_fail: + unregister_net_stats_cb(ipv6_stats_cb); +net_stats_fail: pingv6_exit(); pingv6_fail: ipv6_packet_cleanup();