From patchwork Tue Dec 10 08:06:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: SeongJae Park X-Patchwork-Id: 11281633 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 3D6A8930 for ; Tue, 10 Dec 2019 08:07:45 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 195F9206D5 for ; Tue, 10 Dec 2019 08:07:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="lPza1JEH" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 195F9206D5 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1ieaXi-0002Qj-Fx; Tue, 10 Dec 2019 08:06:50 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1ieaXh-0002QV-Ai for xen-devel@lists.xenproject.org; Tue, 10 Dec 2019 08:06:49 +0000 X-Inumbo-ID: 016881da-1b24-11ea-a914-bc764e2007e4 Received: from mail-wr1-x443.google.com (unknown [2a00:1450:4864:20::443]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 016881da-1b24-11ea-a914-bc764e2007e4; Tue, 10 Dec 2019 08:06:44 +0000 (UTC) Received: by mail-wr1-x443.google.com with SMTP id c14so18874842wrn.7 for ; Tue, 10 Dec 2019 00:06:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=QwGsEms4piE9a2DBjMxlpqS/fTzaKgAUBvTe2FzVG7A=; b=lPza1JEHlTNKLzFDCDRnVo7HF92gkuhkIa1h7FjUOXfSbg8cJNbwj22lMhzGmLWQM9 EuWz/6RijlKpCghZcVe3rWIOXVZ+A9aqVJpF6BsEL2ih8fTyYXlYEfgwFVcxcG+UZh0b In2tw6g7OqQrdDqrIU2uDeX8GfA7NdmDamY7upGqhCceTUDRnF0kmdlKLR3NJx75Co12 CMcB9hXFxUxJer4fTd1qBw5yf9v4G/6MTQPWhgB+sRzuVRo/hUuVXnquQbiWhxJixdCw 1ambSMWkD03j7VE0keCQ0T8J0Bl0P7Q38teIHMQNLfq/p+ufiRsQ8xEwzGBeKIMMBmRP bhMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=QwGsEms4piE9a2DBjMxlpqS/fTzaKgAUBvTe2FzVG7A=; b=FJamT2937Rz3dIy1JDdJAbzBq1kIvz2nMYb8JRvKBg8SjQN+F8Uo42Y3LF+dJD8R61 sPhzcEy4+/k4sq/ONvvg7I0Rl10yLwGVP46yQb/7Yz6PhGOhCT33vo95333dGnzR2Rc5 TNcqZk5WGcATnnDCEWeB3l2eyT8bbxewfmE8sDQV+25SCKMrUczvUYqxL5kBLsele04i LKI+3Lxc8qORNCViRg7Y1iiLWo109OClKplLAxttAmuWTzCwI/HEfDjy9DkQntL8WC5J D4NfPfbHykzMfJDtJkO3Z/IOYs7BIHmKOlTMhx/R2LPvPG9UHOj4NIW6ZX+9QwiVyven 2Teg== X-Gm-Message-State: APjAAAUArQhDXYIpw45CjDReVeasAk+TSaii9oldhwF8gME2btJDbz08 AmiMpkpGPJ7TJCLm+aJYF5g= X-Google-Smtp-Source: APXvYqyeW1Ot1SkJg8uOlMtOudbd9EEcZEGOP8qLc0yzxcBnOs2OKqXQe5RAMyAarTVhuIvkXVwDXw== X-Received: by 2002:adf:e812:: with SMTP id o18mr1543550wrm.127.1575965204034; Tue, 10 Dec 2019 00:06:44 -0800 (PST) Received: from localhost.localdomain (x2f7fae7.dyn.telefonica.de. [2.247.250.231]) by smtp.gmail.com with ESMTPSA id a16sm2342587wrt.37.2019.12.10.00.06.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Dec 2019 00:06:43 -0800 (PST) From: SeongJae Park X-Google-Original-From: SeongJae Park To: sjpark@amazon.com Date: Tue, 10 Dec 2019 08:06:27 +0000 Message-Id: <20191210080628.5264-2-sjpark@amazon.de> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191210080628.5264-1-sjpark@amazon.de> References: <20191210080628.5264-1-sjpark@amazon.de> Subject: [Xen-devel] [PATCH v5 1/2] xenbus/backend: Add memory pressure handler callback X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: axboe@kernel.dk, sj38.park@gmail.com, konrad.wilk@oracle.com, pdurrant@amazon.com, SeongJae Park , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, xen-devel@lists.xenproject.org, roger.pau@citrix.com MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Granting pages consumes backend system memory. In systems configured with insufficient spare memory for those pages, it can cause a memory pressure situation. However, finding the optimal amount of the spare memory is challenging for large systems having dynamic resource utilization patterns. Also, such a static configuration might lack a flexibility. To mitigate such problems, this commit adds a memory reclaim callback to 'xenbus_driver'. Using this facility, 'xenbus' would be able to monitor a memory pressure and request specific devices of specific backend drivers which causing the given pressure to voluntarily release its memory. That said, this commit simply requests every callback registered driver to release its memory for every domain, rather than issueing the requests to the drivers and the domain in charge. Such things will be done in a futur. Also, this commit focuses on memory only. However, it would be ablt to be extended for general resources. Signed-off-by: SeongJae Park Reviewed-by: Juergen Gross --- drivers/xen/xenbus/xenbus_probe_backend.c | 31 +++++++++++++++++++++++ include/xen/xenbus.h | 1 + 2 files changed, 32 insertions(+) diff --git a/drivers/xen/xenbus/xenbus_probe_backend.c b/drivers/xen/xenbus/xenbus_probe_backend.c index b0bed4faf44c..5a5ba29e39df 100644 --- a/drivers/xen/xenbus/xenbus_probe_backend.c +++ b/drivers/xen/xenbus/xenbus_probe_backend.c @@ -248,6 +248,34 @@ static int backend_probe_and_watch(struct notifier_block *notifier, return NOTIFY_DONE; } +static int xenbus_backend_reclaim(struct device *dev, void *data) +{ + struct xenbus_driver *drv; + if (!dev->driver) + return -ENOENT; + drv = to_xenbus_driver(dev->driver); + if (drv && drv->reclaim) + drv->reclaim(to_xenbus_device(dev)); + return 0; +} + +/* + * Returns 0 always because we are using shrinker to only detect memory + * pressure. + */ +static unsigned long xenbus_backend_shrink_count(struct shrinker *shrinker, + struct shrink_control *sc) +{ + bus_for_each_dev(&xenbus_backend.bus, NULL, NULL, + xenbus_backend_reclaim); + return 0; +} + +static struct shrinker xenbus_backend_shrinker = { + .count_objects = xenbus_backend_shrink_count, + .seeks = DEFAULT_SEEKS, +}; + static int __init xenbus_probe_backend_init(void) { static struct notifier_block xenstore_notifier = { @@ -264,6 +292,9 @@ static int __init xenbus_probe_backend_init(void) register_xenstore_notifier(&xenstore_notifier); + if (register_shrinker(&xenbus_backend_shrinker)) + pr_warn("shrinker registration failed\n"); + return 0; } subsys_initcall(xenbus_probe_backend_init); diff --git a/include/xen/xenbus.h b/include/xen/xenbus.h index 869c816d5f8c..cdb075e4182f 100644 --- a/include/xen/xenbus.h +++ b/include/xen/xenbus.h @@ -104,6 +104,7 @@ struct xenbus_driver { struct device_driver driver; int (*read_otherend_details)(struct xenbus_device *dev); int (*is_ready)(struct xenbus_device *dev); + unsigned (*reclaim)(struct xenbus_device *dev); }; static inline struct xenbus_driver *to_xenbus_driver(struct device_driver *drv)