Received: by 10.223.176.5 with SMTP id f5csp587898wra; Sat, 27 Jan 2018 06:02:18 -0800 (PST) X-Google-Smtp-Source: AH8x2274Yhs8c8SA0ubEznx0Ws+B2uehqFP7/lr5AvrOJN6meOUTkFZMDQNzO8eOQUKflxr6GzK+ X-Received: by 10.99.182.6 with SMTP id j6mr17967252pgf.221.1517061738028; Sat, 27 Jan 2018 06:02:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517061737; cv=none; d=google.com; s=arc-20160816; b=ttAjNvZkvUVSl96fiaz2gLC2Qnbn0L/N39vSVIpCmSYvk071ImppMGItqr4q6Zupab Z/82PGYOlgRLLcjQn8tyS1N9pNp8TTlGPQGwR/vjmkuonQMfbzLrM/Lyd2QPoaop8Okr DFceMkK/hbjE9qFRSjFOXlE9GYpduFI/BQbvxnuR1RtDX3EJnmn5jmsd4fPRYHg+h+MC 9zaJU3YgFfW9qR0FogwdtfI3TMAhoSwbkru4CmusdqGSyFhGl01ym6AyccYJv6Ckw1OR D71dnZO5AzpJkHe19+BYNYyDyhp+Iok6TcKj9nq7juDdcl3W4W0OTw2/eR8mqOL3l+rp hUxA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:content-transfer-encoding :dlp-reaction:dlp-version:dlp-product:content-language :accept-language:in-reply-to:references:message-id:date:thread-index :thread-topic:subject:cc:to:from:arc-authentication-results; bh=Q1ozb+4i+QjrQ4yhZwMLTVVLPChF5o7xQy62DWkStpM=; b=j2sr90slFsHy2MjUcTN4vNZFwZHcRUDDP/AnXRN+mkOBzgj6NuwYtSbua+OK+oc9My fXTMzPtJmXfZwQEmT5dDbp1wlDFWoshHk/0SucnV11Xi9HgB/zBXNoaOYCrHsIGknnQg m+WC9Q3yXkWR4+uyZ94xKlJ3o15uDwZQx9VsESW5ZSkFIcPDqxyuwuC2aWeMcRZk+rh6 bm54UfpQ7uvCUyKMNmZxeLE3yDnPlYx+BzmYkrZa7gMAUlbwZ/OqSQNLZHjeLivhN2KY /DkI/S3pJ2Y94Kr+/sndLals6WsVRGFTAJ2Y7mV+A1d+zBhnprYkVfeTRhze5ZLlEOAj lpOA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id s10si4425831pgv.654.2018.01.27.06.02.03; Sat, 27 Jan 2018 06:02:17 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752866AbeA0OBF convert rfc822-to-8bit (ORCPT + 99 others); Sat, 27 Jan 2018 09:01:05 -0500 Received: from mga06.intel.com ([134.134.136.31]:18760 "EHLO mga06.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751540AbeA0OBD (ORCPT ); Sat, 27 Jan 2018 09:01:03 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Jan 2018 06:01:02 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,422,1511856000"; d="scan'208";a="14751262" Received: from fmsmsx107.amr.corp.intel.com ([10.18.124.205]) by fmsmga002.fm.intel.com with ESMTP; 27 Jan 2018 06:01:02 -0800 Received: from fmsmsx153.amr.corp.intel.com (10.18.125.6) by fmsmsx107.amr.corp.intel.com (10.18.124.205) with Microsoft SMTP Server (TLS) id 14.3.319.2; Sat, 27 Jan 2018 06:01:02 -0800 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by FMSMSX153.amr.corp.intel.com (10.18.125.6) with Microsoft SMTP Server (TLS) id 14.3.319.2; Sat, 27 Jan 2018 06:01:01 -0800 Received: from shsmsx101.ccr.corp.intel.com ([169.254.1.192]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.145]) with mapi id 14.03.0319.002; Sat, 27 Jan 2018 22:01:00 +0800 From: "Wang, Wei W" To: "Michael S. Tsirkin" CC: "virtio-dev@lists.oasis-open.org" , "linux-kernel@vger.kernel.org" , "virtualization@lists.linux-foundation.org" , "kvm@vger.kernel.org" , "linux-mm@kvack.org" , "mhocko@kernel.org" , "akpm@linux-foundation.org" , "pbonzini@redhat.com" , "liliang.opensource@gmail.com" , "yang.zhang.wz@gmail.com" , "quan.xu0@gmail.com" , "nilal@redhat.com" , "riel@redhat.com" Subject: RE: [PATCH v24 1/2] mm: support reporting free page blocks Thread-Topic: [PATCH v24 1/2] mm: support reporting free page blocks Thread-Index: AQHTlQLHX0WLqDggdUyY4fn0grJ+UqOEFDWAgAFtc4CAADrtgIAB+8fA Date: Sat, 27 Jan 2018 14:00:58 +0000 Message-ID: <286AC319A985734F985F78AFA26841F7393ED3D4@SHSMSX101.ccr.corp.intel.com> References: <1516790562-37889-1-git-send-email-wei.w.wang@intel.com> <1516790562-37889-2-git-send-email-wei.w.wang@intel.com> <20180125152933-mutt-send-email-mst@kernel.org> <5A6AA08B.2080508@intel.com> <20180126155224-mutt-send-email-mst@kernel.org> In-Reply-To: <20180126155224-mutt-send-email-mst@kernel.org> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiN2JlYzNhZWUtOWYxYS00ODIwLWFiMmItZjFhMThiZTc3OWJhIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE2LjUuOS4zIiwiVHJ1c3RlZExhYmVsSGFzaCI6InlCaW9qVXFtbXlaWEIwSkFHZGZnblVKb3drWE9veXNKckxNeWhGeU5tU0U9In0= x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.0.0.116 dlp-reaction: no-action x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 8BIT MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Friday, January 26, 2018 11:00 PM, Michael S. Tsirkin wrote: > On Fri, Jan 26, 2018 at 11:29:15AM +0800, Wei Wang wrote: > > On 01/25/2018 09:41 PM, Michael S. Tsirkin wrote: > > > On Wed, Jan 24, 2018 at 06:42:41PM +0800, Wei Wang wrote: > > > > This patch adds support to walk through the free page blocks in > > > > the system and report them via a callback function. Some page > > > > blocks may leave the free list after zone->lock is released, so it > > > > is the caller's responsibility to either detect or prevent the use of such > pages. > > > > > > > > One use example of this patch is to accelerate live migration by > > > > skipping the transfer of free pages reported from the guest. A > > > > popular method used by the hypervisor to track which part of > > > > memory is written during live migration is to write-protect all > > > > the guest memory. So, those pages that are reported as free pages > > > > but are written after the report function returns will be captured > > > > by the hypervisor, and they will be added to the next round of memory > transfer. > > > > > > > > Signed-off-by: Wei Wang > > > > Signed-off-by: Liang Li > > > > Cc: Michal Hocko > > > > Cc: Michael S. Tsirkin > > > > Acked-by: Michal Hocko > > > > --- > > > > include/linux/mm.h | 6 ++++ > > > > mm/page_alloc.c | 91 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > > > > 2 files changed, 97 insertions(+) > > > > > > > > diff --git a/include/linux/mm.h b/include/linux/mm.h index > > > > ea818ff..b3077dd 100644 > > > > --- a/include/linux/mm.h > > > > +++ b/include/linux/mm.h > > > > @@ -1938,6 +1938,12 @@ extern void free_area_init_node(int nid, > unsigned long * zones_size, > > > > unsigned long zone_start_pfn, unsigned long *zholes_size); > > > > extern void free_initmem(void); > > > > +extern void walk_free_mem_block(void *opaque, > > > > + int min_order, > > > > + bool (*report_pfn_range)(void *opaque, > > > > + unsigned long pfn, > > > > + unsigned long num)); > > > > + > > > > /* > > > > * Free reserved pages within range [PAGE_ALIGN(start), end & > PAGE_MASK) > > > > * into the buddy system. The freed pages will be poisoned with > > > > pattern diff --git a/mm/page_alloc.c b/mm/page_alloc.c index > > > > 76c9688..705de22 100644 > > > > --- a/mm/page_alloc.c > > > > +++ b/mm/page_alloc.c > > > > @@ -4899,6 +4899,97 @@ void show_free_areas(unsigned int filter, > nodemask_t *nodemask) > > > > show_swap_cache_info(); > > > > } > > > > +/* > > > > + * Walk through a free page list and report the found pfn range > > > > +via the > > > > + * callback. > > > > + * > > > > + * Return false if the callback requests to stop reporting. > > > > +Otherwise, > > > > + * return true. > > > > + */ > > > > +static bool walk_free_page_list(void *opaque, > > > > + struct zone *zone, > > > > + int order, > > > > + enum migratetype mt, > > > > + bool (*report_pfn_range)(void *, > > > > + unsigned long, > > > > + unsigned long)) > > > > +{ > > > > + struct page *page; > > > > + struct list_head *list; > > > > + unsigned long pfn, flags; > > > > + bool ret; > > > > + > > > > + spin_lock_irqsave(&zone->lock, flags); > > > > + list = &zone->free_area[order].free_list[mt]; > > > > + list_for_each_entry(page, list, lru) { > > > > + pfn = page_to_pfn(page); > > > > + ret = report_pfn_range(opaque, pfn, 1 << order); > > > > + if (!ret) > > > > + break; > > > > + } > > > > + spin_unlock_irqrestore(&zone->lock, flags); > > > > + > > > > + return ret; > > > > +} > > > There are two issues with this API. One is that it is not > > > restarteable: if you return false, you start from the beginning. So > > > no way to drop lock, do something slow and then proceed. > > > > > > Another is that you are using it to report free page hints. > > > Presumably the point is to drop these pages - keeping them near head > > > of the list and reusing the reported ones will just make everything > > > slower invalidating the hint. > > > > > > How about rotating these pages towards the end of the list? > > > Probably not on each call, callect reported pages and then move them > > > to tail when we exit. > > > > > > I'm not sure how this would help. For example, we have a list of 2M > > free page blocks: > > A-->B-->C-->D-->E-->F-->G--H > > > > After reporting A and B, and put them to the end and exit, when the > > caller comes back, > > 1) if the list remains unchanged, then it will be > > C-->D-->E-->F-->G-->H-->A-->B > > Right. So here we can just scan until we see A, right? It's a harder question > what to do if A and only A has been consumed. We don't want B to be sent > twice ideally. OTOH maybe that isn't a big deal if it's only twice. Host might > know page is already gone - how about host gives us a hint after using the > buffer? > > > 2) If worse, all the blocks have been split into smaller blocks and > > used after the caller comes back. > > > > where could we continue? > > I'm not sure. But an alternative appears to be to hold a lock and just block > whoever wanted to use any pages. Yes we are sending hints faster but > apparently something wanted these pages, and holding the lock is interfering > with this something. > > > > > The reason to think about "restart" is the worry about the virtqueue > > is full, right? But we've agreed that losing some hints to report > > isn't important, and in practice, the virtqueue won't be full as the > > host side is faster. > > It would be more convincing if we sent e.g. higher order pages first. As it is - it > won't take long to stuff ring full of 4K pages and it seems highly unlikely that > host won't ever be scheduled out. Yes, actually we've already sent higher order pages first, please check this patch, we have: for (order = MAX_ORDER - 1; order >= min_order; order--) --> start from high order blocks. > > Can we maybe agree on what kind of benchmark makes sense for this work? > I'm concerned that we are laser focused on just how long does it take to > migrate ignoring e.g. slowdowns after migration. Testing the time of linux compilation during migration? or what benchmark do you have in mind? We can compare how long it takes during legacy live migration and live migration with this feature? If you really worry about this, we could also provide an configure option, e.g. under /sys/, for the guest to decide whether to enable or disable reporting free page hints to the host at any time. If disabled, in the balloon driver we skip the calling of walk_free_mem_block(). > > I'm concerned that actions on the free list may cause more controversy > > though it might be safe to do from some aspect, and would be hard to > > end debating. If possible, we could go with the most prudent approach > > for now, and have more discussions in future improvement patches. What > > would you think? > > Well I'm not 100% about restartability. But keeping pages freed by host near > head of the list looks kind of wrong. > Try to float a patch on top for the rotation and see what happens? I didn't get it, "pages freed by host", what does that mean? Best, Wei