From patchwork Tue Jan 12 16:56:17 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vitaly Kuznetsov X-Patchwork-Id: 8019251 Return-Path: X-Original-To: patchwork-xen-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 74742BEEE5 for ; Tue, 12 Jan 2016 16:59:17 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8A799203E6 for ; Tue, 12 Jan 2016 16:59:16 +0000 (UTC) Received: from lists.xen.org (lists.xenproject.org [50.57.142.19]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 74D11203E1 for ; Tue, 12 Jan 2016 16:59:15 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aJ2FK-0007Zv-7h; Tue, 12 Jan 2016 16:56:38 +0000 Received: from mail6.bemta4.messagelabs.com ([85.158.143.247]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aJ2FI-0007Z7-RJ for xen-devel@lists.xenproject.org; Tue, 12 Jan 2016 16:56:37 +0000 Received: from [85.158.143.35] by server-2.bemta-4.messagelabs.com id BD/E3-08977-44035965; Tue, 12 Jan 2016 16:56:36 +0000 X-Env-Sender: vkuznets@redhat.com X-Msg-Ref: server-9.tower-21.messagelabs.com!1452617793!9693184!1 X-Originating-IP: [209.132.183.28] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogMjA5LjEzMi4xODMuMjggPT4gNTQwNjQ=\n X-StarScan-Received: X-StarScan-Version: 7.35.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 53280 invoked from network); 12 Jan 2016 16:56:35 -0000 Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by server-9.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 12 Jan 2016 16:56:35 -0000 Received: from int-mx13.intmail.prod.int.phx2.redhat.com (int-mx13.intmail.prod.int.phx2.redhat.com [10.5.11.26]) by mx1.redhat.com (Postfix) with ESMTPS id 67A43552FB; Tue, 12 Jan 2016 16:56:33 +0000 (UTC) Received: from vitty.brq.redhat.com (vitty.brq.redhat.com [10.34.26.3]) by int-mx13.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u0CGuIU1023846; Tue, 12 Jan 2016 11:56:29 -0500 From: Vitaly Kuznetsov To: linux-mm@kvack.org Date: Tue, 12 Jan 2016 17:56:17 +0100 Message-Id: <1452617777-10598-3-git-send-email-vkuznets@redhat.com> In-Reply-To: <1452617777-10598-1-git-send-email-vkuznets@redhat.com> References: <1452617777-10598-1-git-send-email-vkuznets@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.26 Cc: Naoya Horiguchi , linux-doc@vger.kernel.org, Jonathan Corbet , Boris Ostrovsky , Greg Kroah-Hartman , Daniel Kiper , Kay Sievers , linux-kernel@vger.kernel.org, Tang Chen , xen-devel@lists.xenproject.org, Igor Mammedov , David Vrabel , David Rientjes , Xishi Qiu , Dan Williams , "K. Y. Srinivasan" , Mel Gorman , Andrew Morton Subject: [Xen-devel] [PATCH v4 2/2] xen_balloon: support memory auto onlining policy X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add support for the newly added kernel memory auto onlining policy to Xen ballon driver. Suggested-by: Daniel Kiper Signed-off-by: Vitaly Kuznetsov --- drivers/xen/Kconfig | 20 +++++++++++++------- drivers/xen/balloon.c | 30 +++++++++++++++++++----------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/drivers/xen/Kconfig b/drivers/xen/Kconfig index 73708ac..098ab49 100644 --- a/drivers/xen/Kconfig +++ b/drivers/xen/Kconfig @@ -37,23 +37,29 @@ config XEN_BALLOON_MEMORY_HOTPLUG Memory could be hotplugged in following steps: - 1) dom0: xl mem-max + 1) domU: ensure that memory auto online policy is in effect by + checking /sys/devices/system/memory/auto_online_blocks file + (should be 'online'). + + 2) dom0: xl mem-max where is >= requested memory size, - 2) dom0: xl mem-set + 3) dom0: xl mem-set where is requested memory size; alternatively memory could be added by writing proper value to /sys/devices/system/xen_memory/xen_memory0/target or /sys/devices/system/xen_memory/xen_memory0/target_kb on dumU, - 3) domU: for i in /sys/devices/system/memory/memory*/state; do \ - [ "`cat "$i"`" = offline ] && echo online > "$i"; done + Alternatively, if memory auto onlining was not requested at step 1 + the newly added memory can be manually onlined in domU by doing the + following: - Memory could be onlined automatically on domU by adding following line to udev rules: + for i in /sys/devices/system/memory/memory*/state; do \ + [ "`cat "$i"`" = offline ] && echo online > "$i"; done - SUBSYSTEM=="memory", ACTION=="add", RUN+="/bin/sh -c '[ -f /sys$devpath/state ] && echo online > /sys$devpath/state'" + or by adding the following line to udev rules: - In that case step 3 should be omitted. + SUBSYSTEM=="memory", ACTION=="add", RUN+="/bin/sh -c '[ -f /sys$devpath/state ] && echo online > /sys$devpath/state'" config XEN_BALLOON_MEMORY_HOTPLUG_LIMIT int "Hotplugged memory limit (in GiB) for a PV guest" diff --git a/drivers/xen/balloon.c b/drivers/xen/balloon.c index 890c3b5..68f0aa2 100644 --- a/drivers/xen/balloon.c +++ b/drivers/xen/balloon.c @@ -284,7 +284,7 @@ static void release_memory_resource(struct resource *resource) kfree(resource); } -static enum bp_state reserve_additional_memory(void) +static enum bp_state reserve_additional_memory(bool online) { long credit; struct resource *resource; @@ -338,7 +338,18 @@ static enum bp_state reserve_additional_memory(void) } #endif - rc = add_memory_resource(nid, resource, false); + /* + * add_memory_resource() will call online_pages() which in its turn + * will call xen_online_page() callback causing deadlock if we don't + * release balloon_mutex here. It is safe because there can only be + * one balloon_process() running at a time and balloon_mutex is + * internal to Xen driver, generic memory hotplug code doesn't mess + * with it. + */ + mutex_unlock(&balloon_mutex); + rc = add_memory_resource(nid, resource, online); + mutex_lock(&balloon_mutex); + if (rc) { pr_warn("Cannot add additional memory (%i)\n", rc); goto err; @@ -562,14 +573,11 @@ static void balloon_process(struct work_struct *work) credit = current_credit(); - if (credit > 0) { - if (balloon_is_inflated()) - state = increase_reservation(credit); - else - state = reserve_additional_memory(); - } - - if (credit < 0) + if (credit > 0 && balloon_is_inflated()) + state = increase_reservation(credit); + else if (credit > 0) + state = reserve_additional_memory(memhp_auto_online); + else if (credit < 0) state = decrease_reservation(-credit, GFP_BALLOON); state = update_schedule(state); @@ -599,7 +607,7 @@ static int add_ballooned_pages(int nr_pages) enum bp_state st; if (xen_hotplug_unpopulated) { - st = reserve_additional_memory(); + st = reserve_additional_memory(false); if (st != BP_ECANCELED) { mutex_unlock(&balloon_mutex); wait_event(balloon_wq,