From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S933266AbcBDHHR (ORCPT ); Thu, 4 Feb 2016 02:07:17 -0500 Received: from mail-wm0-f48.google.com ([74.125.82.48]:35141 "EHLO mail-wm0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756653AbcBDHHN (ORCPT ); Thu, 4 Feb 2016 02:07:13 -0500 MIME-Version: 1.0 In-Reply-To: <56B2744D.6080202@hpe.com> References: <1451549374-30875-1-git-send-email-ling.ma.program@gmail.com> <20160105211834.GR6344@twins.programming.kicks-ass.net> <20160105214227.3a2adcd2@lxorguk.ukuu.org.uk> <20160106081643.GS6344@twins.programming.kicks-ass.net> <20160106082106.GU6373@twins.programming.kicks-ass.net> <20160106112450.6c5ad08b@lxorguk.ukuu.org.uk> <20160112135016.247c6ca5@lxorguk.ukuu.org.uk> <569E5816.6000909@hpe.com> <56B2744D.6080202@hpe.com> Date: Thu, 4 Feb 2016 15:07:11 +0800 Message-ID: Subject: Re: [RFC PATCH] alispinlock: acceleration from lock integration on multi-core platform From: Ling Ma To: Waiman Long Cc: One Thousand Gnomes , Peter Zijlstra , mingo@redhat.com, linux-kernel@vger.kernel.org, akpm@linux-foundation.org, Ling Content-Type: multipart/mixed; boundary=001a113ead283141ee052aec6215 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org --001a113ead283141ee052aec6215 Content-Type: text/plain; charset=UTF-8 > I have 2 major comments here. First of all, you should break up your patch > into smaller ones. Large patch like the one in the tar ball is hard to > review. Ok, we will do it. >Secondly, you are modifying over 1000 lines of code in mm/slab.c > with some modest increase in performance. That can be hard to justify. Maybe > you should find other use cases that involve less changes, but still have > noticeable performance improvement. That will make it easier to be accepted. In order to be justified the attachment in this letter include 3 files: 1. user space code (thread.c), which can cause lots of hot kernel spinlock from __kmalloc and kfree on multi-core platform 2. ali_work_queue.patch , the kernel patch for 4.3.0-rc4, when we run user space code (thread.c) based on the patch, the synchronous operation consumption from __kmalloc and kfree is about 15% on Intel E5-2699V3 3. org_spin_lock.patch, which is based on above ali_work_queue.patch, when we run user space code thread.c based on the patch, the synchronous operation consumption from __kmalloc and kfree is about 25% on Intel E5-2699V3 the main difference between ali_work_queue.patch and org_spin_lock.patch as below: diff --git a/mm/slab.h b/mm/slab.h ... - ali_spinlock_t list_lock; + spinlock_t list_lock; ... diff --git a/mm/slab.c b/mm/slab.c ... - alispinlock(lock, &info); + spin_lock((spinlock_t *)lock); + fn(para); + spin_unlock((spinlock_t *)lock); ... The above operations remove all performance noise from program modification. We run user space code thread.c with ali_work_queue.patch, and org_spin_lock.patch respectively the output from thread.c as below: ORG NEW 38923684 43380604 38100464 44163011 37769241 43354266 37908638 43554022 37900994 43457066 38495073 43421394 37340217 43146352 38083979 43506951 37713263 43775215 37749871 43487289 37843224 43366055 38173823 43270225 38303612 43214675 37886717 44083950 37736455 43060728 37529307 44607597 38862690 43541484 37992824 44749925 38013454 43572225 37783135 45240502 37745372 44712540 38721413 43584658 38097842 43235392 ORG NEW TOTAL 874675292 1005486126 So the data tell us the new mechanism can improve performance 14% ( 1005486126/874675292) , and the operation can be justified fairly. Thanks Ling 2016-02-04 5:42 GMT+08:00 Waiman Long : > On 02/02/2016 11:40 PM, Ling Ma wrote: >> >> Longman, >> >> The attachment include user space code(thread.c), and kernel >> patch(ali_work_queue.patch) based on 4.3.0-rc4, >> we replaced all original spinlock (list_lock) in slab.h/c with the >> new mechanism. >> >> The thread.c in user space caused lots of hot kernel spinlock from >> __kmalloc and kfree, >> perf top -d1 shows ~25% before ali_work_queue.patch,after appending >> this patch , >> the synchronous operation consumption from __kmalloc and kfree is >> reduced from 25% to ~15% on Intel E5-2699V3 >> (we also observed the output from user space code (thread.c) is >> improved clearly) > > > I have 2 major comments here. First of all, you should break up your patch > into smaller ones. Large patch like the one in the tar ball is hard to > review. Secondly, you are modifying over 1000 lines of code in mm/slab.c > with some modest increase in performance. That can be hard to justify. Maybe > you should find other use cases that involve less changes, but still have > noticeable performance improvement. That will make it easier to be accepted. > > Cheers, > Longman > > --001a113ead283141ee052aec6215 Content-Type: application/x-bzip2; name="ali_work_queue.tar.bz2" Content-Disposition: attachment; filename="ali_work_queue.tar.bz2" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ik7wefom0 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 --001a113ead283141ee052aec6215--