Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753051AbcDFUI7 (ORCPT ); Wed, 6 Apr 2016 16:08:59 -0400 Received: from mail-bl2on0118.outbound.protection.outlook.com ([65.55.169.118]:48832 "EHLO na01-bl2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751304AbcDFUI6 (ORCPT ); Wed, 6 Apr 2016 16:08:58 -0400 Authentication-Results: kernel.org; dkim=none (message not signed) header.d=none;kernel.org; dmarc=none action=none header.from=hpe.com; Message-ID: <57056907.20705@hpe.com> Date: Wed, 6 Apr 2016 15:52:39 -0400 From: Waiman Long User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.12) Gecko/20130109 Thunderbird/10.0.12 MIME-Version: 1.0 To: Tejun Heo CC: "Theodore Ts'o" , Andreas Dilger , Christoph Lameter , , , Scott J Norton , Douglas Hatch , Toshimitsu Kani Subject: Re: [PATCH 2/3] percpu_stats: Simple per-cpu statistics count helper functions References: <1459566578-30221-1-git-send-email-Waiman.Long@hpe.com> <1459566578-30221-3-git-send-email-Waiman.Long@hpe.com> <20160404160228.GW7822@mtj.duckdns.org> In-Reply-To: <20160404160228.GW7822@mtj.duckdns.org> Content-Type: text/plain; charset="ISO-8859-1"; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [72.71.243.60] X-ClientProxiedBy: CY1PR14CA0011.namprd14.prod.outlook.com (10.163.13.149) To CS1PR84MB0311.NAMPRD84.PROD.OUTLOOK.COM (10.162.190.29) X-MS-Office365-Filtering-Correlation-Id: 6290dfb2-f169-4947-13ac-08d35e550763 X-Microsoft-Exchange-Diagnostics: 1;CS1PR84MB0311;2:wGQqPzUwblJLWAsh89lnYQIG+wtceRou5qPmN5E9C001VT1Enhh2jeFW5TSqu5LDnWR1Dq6DmXNxjVWXK1iN86dnwiBGS3eysHBBo/hteNU5w/tU2E1NW78NxYIfkr9aw+04021S5ycx/b1bTqLUPuPMUmQ00aDQ1wo+p4L5muezTkwOQO1Z51q2585o7IMn;3:ZPYMOHNmS4koVITnh+OSW0itYAKpdrOD0JBMII+qLuglhlGlmoQzqWJeO/2mpZI/GAc2ovkyHYhZLdzbSzvqT4ITV9KPEzBX2FlWSVh6HzHjVLqywcwSAbxvo3YePVQz;25:l29bLqaiZOgyaCSqJnPdL0Ivrf6V79v9vg0YAaY7eJlduERSzlT9igGSAzKXmvxWTOMKFYb15hXgU+h4uRG69o3GPzj/ZBUrHjQodvNrOcwW0jmvu42mWnEbeI6fET0dXDHrI4e2O4Lf7Prj8hYx5vHGuWHPFSEarUTjQi4avHLUvJ3hQaKK0hBNqLpnIYIeNkmPjoWTlVhPIoKAY5PqsBK/krYv2EkaPWdT8yxiH5lSwtPCToAiQjmX0oN9MFme5IDcUroI3WqoNrwUXyXNXgEZvRT2WF0k6408Q6LVzo6m0qQuZmveDaCi9aVnNkelT7fDyH8lWxANNxVqYRo6kV48Gy4Y2qJ/xryoyJvaZGjaoJucajonv6npJnf0sFqqZAgPHKvNsxigmCRUPE+V1tc9E7A/69UdzlFOAtUPzhRHx/vLGlNJkf4xdJr9+rGmsp/GNoXq+UT5n4xT14BjyYYqLcSzWJLu6boFZygj9vYntUKhh8NKykytb3d4sp+8uKWHvo8Df4qVKRfi+USfedM6jdmbyxIhri8mqXGTGj43Pe844bleavxAowUYC/wbMrYXEaee4XjNg7JPtyc12w== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0311; X-LD-Processed: 105b2061-b669-4b31-92ac-24d304d195dc,ExtAddr X-Microsoft-Exchange-Diagnostics: 1;CS1PR84MB0311;20:ihvy14iymXfnLEdTNDBRGhDI4nDX7LiD3hoRdG04M8KttaaaDCjavQLiqgnDVE7FXLtq68P7iJSG09oUKrhB335sX67UKJE7Qk0vQFRYHGNBa0s+7ZJDKwZCNrHc9M1HCGOzqwsso5rFhTENR56GKy1d6756Bx59TSsET/4UP6Or1sqiR4wJVrDIuR1MF7Ul6A6huWaM8En2ioQZFx8fKG4OzNmFDfGFGnsBaUSbnUdRmYqymoK2uDD8hJ3+R/sP1n2QjWtaM0qfGEdBX332ITo1XnBm2wTxvsXD1ayDdjwr/UreGBANu9moc3HWujGB26niEYeNdPR2eZvUTgTkcg==;4:iKZVpF88pPf3Ha+YIgf3IYG0Jy/SnyFNkCRvqjDurxhnoXhvOX7jtqJkIDe8AnMKwJYeLWfYANYhcdgk7sioyVf7PMClajNYfWKPN51xOHf20/kIvgUMX5e1tBqr9aPj2CZZJ0oA8X8pQmYdktmMxAIJkS9R2B61hZgNbEn6L59DKBFzS0WjsxAvZ3mT+Pi2BFLskNsa+Qlgp8GiFWb4oUz0aZfu5tUdo8tRkFlVZ/xGAEUXzWh4wPXn/W6vm4ASzef5niZLf1Nan98UwAY2QTUeqRzqBSvtI9cFo7uNBuOsj2XQsjhc/qacMi654h27pwQgMd8FeFXM5L30H+k1wr6BEmwme1Dz8E6B+3bC1fE8vALcRnu7kBVLBcJWuNNyTBBzxjU2ZYgEKHEPKT9ouw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6055026);SRVR:CS1PR84MB0311;BCL:0;PCL:0;RULEID:;SRVR:CS1PR84MB0311; X-Forefront-PRVS: 0904004ECB X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10019020)(4630300001)(6009001)(6049001)(377454003)(24454002)(42186005)(64126003)(2950100001)(586003)(65956001)(50466002)(54356999)(76176999)(122286003)(65806001)(23756003)(66066001)(47776003)(81166005)(5008740100001)(83506001)(3846002)(230700001)(5004730100002)(110136002)(2906002)(189998001)(92566002)(6116002)(117636001)(4326007)(65816999)(117156001)(4001350100001)(50986999)(77096005)(86362001)(1096002)(36756003)(62816006);DIR:OUT;SFP:1102;SCL:1;SRVR:CS1PR84MB0311;H:[192.168.142.152];FPR:;SPF:None;MLV:sfv;LANG:en; X-Microsoft-Exchange-Diagnostics: =?iso-8859-1?Q?1;CS1PR84MB0311;23:kfb2slY1Fwz2bHanEediW5J17imhiYbg+KAMDY4?= =?iso-8859-1?Q?AtatUBzqZAPbSk1TPc1Wky1gMffii+agdaMGN7FyqRiY6k0UEx1aOr6zDE?= =?iso-8859-1?Q?Zmdndgzfsv36OgiJYiCg5uVwxRADO2QKhma5oiaW9Z/0roS0lLilrUXP6K?= =?iso-8859-1?Q?6vIlEJ/whWK1CwUfptbVJqfLWh2IQuB4laUWW+49WBI7lGIFdvQPTpjjXr?= =?iso-8859-1?Q?reNWyRvcN2s0jkmR/F748jFiEx+rA9yGHE/nEqAFAdyv4hbVGWmM8y/be3?= =?iso-8859-1?Q?UnRVKnwYtuOp5a3X3y8RbgXB5jVQhZLR2O8HpULrq07C/R0i2TXi1F2Ui5?= =?iso-8859-1?Q?VEZoyo1/GqDFoGt1uLUY0NDnMKQKhKzXDP06KA6/R7U6UZrvF+fMBOXbtq?= =?iso-8859-1?Q?G4fI2YubsFC8ymYYeT9y6ZFKXgndQ8Gj9f+2ao2Ky/dpbJR9HgPRGo1Udq?= =?iso-8859-1?Q?Isq9Q4tN0nDIEnrR5RSEwfGAoBLshK2qlkg34EZ6dsTP+vkgIVPAu8W7g3?= =?iso-8859-1?Q?JgADKZHnUVLr5b6dkaIgQoGSIhLaL0e/7YNJ/HtVUwrUvUn3KUrqL7xFv/?= =?iso-8859-1?Q?lEju9XNvd2YXglLXwl6n4L67QQh87vHJlIGHQZ0W+5F2QXMBmhKJJ+Q0Jv?= =?iso-8859-1?Q?oGAcYnMSlLhPY88x5c5m/k8aZDOap8iAUYpes9gx/PaGlq86fayrttKQYW?= =?iso-8859-1?Q?o+nXWAFiwCDZ3sDoVIw/9jzI8ZQEyZy62SHtAH5+YeR8qn4JEa8QIhyKQ0?= =?iso-8859-1?Q?7F9oTl30j5ufPH0DbtBrb1OAN5Gjw9nxSfmrtTXYi+UYNIFiSxVfh7xK1c?= =?iso-8859-1?Q?PNpVqSG8yl1L4l5JuNhOReFzXR5zb3gGVLMoPmr5FIskLyVMZNe5JvZ7a1?= =?iso-8859-1?Q?tVYatz/tRkS1WtW/t3FH9M2Prv/XT9oYNlZcVnSF4WAcHoWtF/UuIkccst?= =?iso-8859-1?Q?fVmCYlD32qO/sp+z8WBKbAmLa0zgpeY+h/IzkitKayiJr585iju9S60JaB?= =?iso-8859-1?Q?Csln07MX0MbMKiChaKQ3Dr83b9O8rJje8IITEP5D+HBQydwUsKsS3yVZEC?= =?iso-8859-1?Q?sjYojpM9hhwosS/zZfjw9sN5uyAWtZBl8Vhn4dbJkE=3D?= X-Microsoft-Exchange-Diagnostics: 1;CS1PR84MB0311;5:bwi/Qx+tu7LMDq2/yUndTZVMukl1raohcGLD285VFTCZe1kp+LMEu1H/OV7dJMSESt2nSGP89T4ppYaa/VU87FKo26OOQlqKWRKrlAB6Rm76Qt3Lg0sKql699OZ8xHfZsicQV7L1/BTJbym2xv4gNw==;24:cZrJIb/fKtG4bwbro+Ef3Lj2y5XuJzBq56u2W/vO4QlzRcdjJbV54Q4KFb19YWidP7sxg1jYyxO0P1oEsSkx0zg4U2+ZM+Bw+tvsvRdYsqY= SpamDiagnosticOutput: 1:23 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: hpe.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 06 Apr 2016 19:52:45.9147 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CS1PR84MB0311 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2804 Lines: 111 On 04/04/2016 12:02 PM, Tejun Heo wrote: > Hello, > > On Fri, Apr 01, 2016 at 11:09:37PM -0400, Waiman Long wrote: > ... >> +struct percpu_stats { >> + unsigned long __percpu *stats; > I'm not sure ulong is the best choice here. Atomic reads on 32bit are > nice but people often need 64bit counters for stats. It probably is a > better idea to use u64_stats_sync. > >> +/* >> + * Reset the all statistics counts to 0 in the percpu_stats structure > Proper function description please. > >> + */ >> +static inline void percpu_stats_reset(struct percpu_stats *pcs) > Why is this function inline? > >> +{ >> + int cpu; >> + >> + for_each_possible_cpu(cpu) { >> + unsigned long *pstats = per_cpu_ptr(pcs->stats, cpu); > ^^ >> + int stat; >> + >> + for (stat = 0; stat< pcs->nstats; stat++, pstats++) >> + *pstats = 0; >> + } >> + >> + /* >> + * If a statistics count is in the middle of being updated, it >> + * is possible that the above clearing may not work. So we need >> + * to double check again to make sure that the counters are really >> + * cleared. Still there is a still a very small chance that the >> + * second clearing does not work. >> + */ >> + for_each_possible_cpu(cpu) { >> + unsigned long *pstats = per_cpu_ptr(pcs->stats, cpu); >> + int stat; >> + >> + for (stat = 0; stat< pcs->nstats; stat++, pstats++) >> + if (*pstats) >> + *pstats = 0; >> + } > I don't think this is acceptable. > >> +} >> + >> +static inline int percpu_stats_init(struct percpu_stats *pcs, int num) >> +{ >> + pcs->nstats = num; >> + pcs->stats = __alloc_percpu(sizeof(unsigned long) * num, >> + __alignof__(unsigned long)); >> + if (!pcs->stats) >> + return -ENOMEM; >> + >> + percpu_stats_reset(pcs); >> + return 0; >> +} >> + >> +static inline void percpu_stats_destroy(struct percpu_stats *pcs) >> +{ >> + free_percpu(pcs->stats); >> + pcs->stats = NULL; >> + pcs->nstats = 0; >> +} > Why inline the above functions? > >> +static inline void >> +__percpu_stats_add(struct percpu_stats *pcs, int stat, int cnt) >> +{ >> + unsigned long *pstat; >> + >> + if ((unsigned int)stat>= pcs->nstats) >> + return; > This is a critical bug. Please don't fail silently. BUG_ON(), > please. Sure. > >> + preempt_disable(); >> + pstat = this_cpu_ptr(&pcs->stats[stat]); >> + *pstat += cnt; >> + preempt_enable(); >> +} > this_cpu_add() is atomic w.r.t. local operations. Will use this_cpu_add(). >> +static inline unsigned long >> +percpu_stats_sum(struct percpu_stats *pcs, int stat) >> +{ >> + int cpu; >> + unsigned long sum = 0; >> + >> + if ((unsigned int)stat>= pcs->nstats) >> + return sum; > Ditto. > >> + for_each_possible_cpu(cpu) >> + sum += per_cpu(pcs->stats[stat], cpu); >> + return sum; >> +} > Thanks. > Cheers, Longman