From patchwork Fri Jul 27 09:24:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Wei W" X-Patchwork-Id: 10546815 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id DECA114E0 for ; Fri, 27 Jul 2018 09:52:52 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id CE8E82863F for ; Fri, 27 Jul 2018 09:52:52 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C16412B463; Fri, 27 Jul 2018 09:52:52 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8F12D2863F for ; Fri, 27 Jul 2018 09:52:51 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CF4D06B0005; Fri, 27 Jul 2018 05:52:49 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id C2F106B0007; Fri, 27 Jul 2018 05:52:49 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AAC176B0008; Fri, 27 Jul 2018 05:52:49 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) by kanga.kvack.org (Postfix) with ESMTP id 5BEEC6B0005 for ; Fri, 27 Jul 2018 05:52:49 -0400 (EDT) Received: by mail-pg1-f199.google.com with SMTP id h5-v6so2684413pgs.13 for ; Fri, 27 Jul 2018 02:52:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=kOLno4LKhk3T/XPSnPPliijl4UUViLWBO74lue5FG5o=; b=GwLSTrPLz8JqnL6zvgvayJQRYT5GJT/K7+BQjuYBoy7uDT8w0m1IuTS2tV6NquR1b/ sNt+RbLnBGWbLjoK9LvDqDfyVAm6CdCeXfFwAVgSbkM4LX89CyMlaE8jxKc6VElgTdT/ ib/vGg13ZaT0U7NCx87a70bM899y1Nm7VU28FIiaSDxFCAMX0/EkWW8HliC0nCrjxfvT x5UM2A7szRRhpN4gReujFfOlJVx5zQU28g/D5O73FNhHnCqMTGvUuxdgehGMrmr7zLBD YCwdOJohzaPtf4RfoKU5MW4LL7UzR4p04XP1ZKmKh0PfmrowYSvjwu6d/v7enjXS7tAL /Zzg== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of wei.w.wang@intel.com designates 134.134.136.20 as permitted sender) smtp.mailfrom=wei.w.wang@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: AOUpUlF3B2nv+6B2ZPSHtqWmB9NawiCAUEpQ4N6kMCbTVAmRXvDbCLkg guJf0kj8LP2rRkk5oGOEJE+Gz3nZW/VvBW9k1/SUwhmI4fciTP60AqwjP0qd+CK7gPBWqmNxw0t GQFjeh5uV7V9xXqXV6BffiEZI44Euix7LXn2ECE4WBT1kaiP8EG0BBQRDchqIqCNTVw== X-Received: by 2002:a62:67c2:: with SMTP id t63-v6mr5993694pfj.204.1532685169081; Fri, 27 Jul 2018 02:52:49 -0700 (PDT) X-Google-Smtp-Source: AAOMgpd9wbH3CVPmZMADCNIsYlPLJtjBP6A8tmPheK+9PUGJTC4my011wQD6QETEUnbsIl3tZs/S X-Received: by 2002:a62:67c2:: with SMTP id t63-v6mr5993659pfj.204.1532685168317; Fri, 27 Jul 2018 02:52:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532685168; cv=none; d=google.com; s=arc-20160816; b=QNDpP9U1LlkojTPzey6KkjWJsbcwLtBNz7xjCSRJ/HX7kCi61HEgNZMDWYwM3UdXPt 11cTIHc0OXQf4K0JL10m1l1c071sbG4asRJPx4qbH7p0mo7x3iD6FUoMY/E7MidCDr8y vJkTBkg8ZG3RI4FcvF416d2ILid3w91ITlHaLQrpTFAIsRdAYoSR7RDD5zDQkBLUvkWy TxE1W8Vn1eLnadfGuZBnbFlkv63VDGRJshSrz6e5pBBXj9DUp5UoJSMglyBjBoViEXTu AkEhj4LT8UsTJvSdI7cwxc4lpAMTBaNC4rvaRkFx/1c74HOn6cfzYNbe6YMV7K7H/YsV 3aUw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=kOLno4LKhk3T/XPSnPPliijl4UUViLWBO74lue5FG5o=; b=zBqCq2KC6K4kB2M6PzP4wa6VzCrZbGd5aKLlgz5yAgrBSzXbZTgZS7yVz9JpPs/HWQ au5CqWJnXMhC+qBl1ccMbrsBQzOcGH8a+DZ6Co86PQayUpSoMXKAiT2bNFJgFYNIdL2Z P0tTB6Feg9roY/QtNdc9TpSpCRAwFl5msh7BMyIQ+fMDwgr+miX8SNFVrsI17p+b4GwC aiQYI95+kAiO8+fMsgoccolF63ADn1s1jx8Mid4gXCcUGj4J1ujceBbwwOh71lIe/+yW 3RvRK4wHcllceG0TGZtfrWAjVNpN9M+x9FGQTBwn6p8inUCLPHoHvlbXHlAdV8aqMaW+ pjog== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of wei.w.wang@intel.com designates 134.134.136.20 as permitted sender) smtp.mailfrom=wei.w.wang@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga02.intel.com (mga02.intel.com. [134.134.136.20]) by mx.google.com with ESMTPS id a61-v6si3476062plc.80.2018.07.27.02.52.48 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Jul 2018 02:52:48 -0700 (PDT) Received-SPF: pass (google.com: domain of wei.w.wang@intel.com designates 134.134.136.20 as permitted sender) client-ip=134.134.136.20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of wei.w.wang@intel.com designates 134.134.136.20 as permitted sender) smtp.mailfrom=wei.w.wang@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Jul 2018 02:52:48 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,408,1526367600"; d="scan'208";a="78308872" Received: from devel-ww.sh.intel.com ([10.239.48.110]) by orsmga002.jf.intel.com with ESMTP; 27 Jul 2018 02:52:46 -0700 From: Wei Wang To: virtio-dev@lists.oasis-open.org, linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-mm@kvack.org, mst@redhat.com, mhocko@kernel.org, akpm@linux-foundation.org Cc: wei.w.wang@intel.com Subject: [PATCH v2 1/2] virtio-balloon: remove BUG() in init_vqs Date: Fri, 27 Jul 2018 17:24:54 +0800 Message-Id: <1532683495-31974-2-git-send-email-wei.w.wang@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1532683495-31974-1-git-send-email-wei.w.wang@intel.com> References: <1532683495-31974-1-git-send-email-wei.w.wang@intel.com> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP It's a bit overkill to use BUG when failing to add an entry to the stats_vq in init_vqs. So remove it and just return the error to the caller to bail out nicely. Signed-off-by: Wei Wang Cc: Michael S. Tsirkin --- drivers/virtio/virtio_balloon.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index 6b237e3..9356a1a 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c @@ -455,9 +455,13 @@ static int init_vqs(struct virtio_balloon *vb) num_stats = update_balloon_stats(vb); sg_init_one(&sg, vb->stats, sizeof(vb->stats[0]) * num_stats); - if (virtqueue_add_outbuf(vb->stats_vq, &sg, 1, vb, GFP_KERNEL) - < 0) - BUG(); + err = virtqueue_add_outbuf(vb->stats_vq, &sg, 1, vb, + GFP_KERNEL); + if (err) { + dev_warn(&vb->vdev->dev, "%s: add stat_vq failed\n", + __func__); + return err; + } virtqueue_kick(vb->stats_vq); } return 0; From patchwork Fri Jul 27 09:24:55 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Wei W" X-Patchwork-Id: 10546817 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 08D2F14E0 for ; Fri, 27 Jul 2018 09:52:55 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EBDC32863F for ; Fri, 27 Jul 2018 09:52:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id DFEB62B463; Fri, 27 Jul 2018 09:52:54 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 3BDE22863F for ; Fri, 27 Jul 2018 09:52:54 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 184EE6B0008; Fri, 27 Jul 2018 05:52:52 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 10BBC6B000A; Fri, 27 Jul 2018 05:52:52 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E777F6B000C; Fri, 27 Jul 2018 05:52:51 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pl0-f70.google.com (mail-pl0-f70.google.com [209.85.160.70]) by kanga.kvack.org (Postfix) with ESMTP id 98EFA6B0008 for ; Fri, 27 Jul 2018 05:52:51 -0400 (EDT) Received: by mail-pl0-f70.google.com with SMTP id t1-v6so3224919ply.16 for ; Fri, 27 Jul 2018 02:52:51 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=nZRzJQC0I6W69KdJ/6xp2nensRSXHMZM3KlGaOIxbIQ=; b=i0QuHuSy0r3C+A9jIG6izncBvol8rI3c+9iJB8ANsMuxROjezIYKM5rT644vrT5+Ff ifSzUE3mMZJ/3bZGT47i+LndfCjXAzsw0O3LrnOWgRKjXHx9MGalb5NC6KLvJSVE9K2+ Fc8KxFiqbxC4c/MCJ/V2Kth9NR8nRU+HIZYzEKAwKZyGxceJS+A8rR+5ooT71XI3Qjgl 8FNv8Nj9PCZdpnHQNMfxAo2x5fTQqLwRgGanKwpJ8X0uARbECcMf5FkggVkJBVASL45j LPPNBxNe3LCeAvN58MYAAYov/x6hcNZirHSUECzm6cBY/sOquMY2Noeh3ZsPi61cIlE7 vFNQ== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of wei.w.wang@intel.com designates 134.134.136.20 as permitted sender) smtp.mailfrom=wei.w.wang@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: AOUpUlFZIEbM7N79CZm/sucN2LxQ9MYkueP+ZkfKvkOwDZ562NMNDxAz JiE0+DVDWRnKYRel4nstVLChDltne9dp8wDqVAsFvXzxVIC1jADjJRhhjtOjVyNh3RPvNRg0KOq OnaPLoxnfjc5e/ijpC8P/pKj4qmyVAFdAAz348MVtmmDrZiZJ9zpB2avtbygYUcFrVQ== X-Received: by 2002:a65:520d:: with SMTP id o13-v6mr5380948pgp.282.1532685171294; Fri, 27 Jul 2018 02:52:51 -0700 (PDT) X-Google-Smtp-Source: AAOMgpfwy455tYcLSS+dHt/Ek2kL6NQzsWYcHqLrlEEQ0RkbPFZXV1xCbaaZdQIZMpwLQ30fBK+W X-Received: by 2002:a65:520d:: with SMTP id o13-v6mr5380910pgp.282.1532685170501; Fri, 27 Jul 2018 02:52:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1532685170; cv=none; d=google.com; s=arc-20160816; b=lv4nKtWSLajh02bb4C/Ax90o4bonmEflz9An5St8Ye8qzhV4j1zP8ymrIe+oAcv8SK wd1N3XjQ+ag+jxA92Aoof7YIvok9gB+lYIF3cmK/JtvbVseRH9kfJ98EOw0kUBvNTMpX usJWGdF5flmAAw6kNIkXyY/GL7Y9rUyoB/xV5jQJPUzHQbS98jqdRlzj+apVO7KDVGHF IqGqjxgYqvamSvFMJrTa3RTku2agVlXh3F2PFaahAaXJ1ftkSATPUd4bKys8tNrr359E iXvlRddwjz23wa5sOqc//NWd28dxwI9k+Gh7wIpm6Tani79qTt0kh3KjZd1ex9t6LijK ujeg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=nZRzJQC0I6W69KdJ/6xp2nensRSXHMZM3KlGaOIxbIQ=; b=04mvYwn6eWJUgxrg/pL8J0EFY9VjX5xITfTQpTgnXM4H/lOJVvXhaLo2r4XAUj/Gjv pi/hASKPJ8/KyVOffQQW6Tz/Nte8jWSzQbg3n5pk/dTiJOzn+NOG9gP/CNwh9P0+oBb4 +YnttzoYcm0Qrlm6c9oZ2A0q9XewFzg+eceU+t1bMR/wwkqgFPpLhVO/vY3xgwxyX5DO gTS1AnAC+EtHgle6NvslJvAQdYVk7N6UgOQ4kboezG6hqrWKenreWEOZslTGpFaSIY44 Zh7cdnJ07TQz+n8+gXRRb9Dxftze8Ze4DGjAo8xBEeKWuAPlIeQa9vS57wCtoPiuDCsD io6w== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of wei.w.wang@intel.com designates 134.134.136.20 as permitted sender) smtp.mailfrom=wei.w.wang@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga02.intel.com (mga02.intel.com. [134.134.136.20]) by mx.google.com with ESMTPS id a61-v6si3476062plc.80.2018.07.27.02.52.50 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 27 Jul 2018 02:52:50 -0700 (PDT) Received-SPF: pass (google.com: domain of wei.w.wang@intel.com designates 134.134.136.20 as permitted sender) client-ip=134.134.136.20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of wei.w.wang@intel.com designates 134.134.136.20 as permitted sender) smtp.mailfrom=wei.w.wang@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Jul 2018 02:52:50 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.51,408,1526367600"; d="scan'208";a="78308893" Received: from devel-ww.sh.intel.com ([10.239.48.110]) by orsmga002.jf.intel.com with ESMTP; 27 Jul 2018 02:52:48 -0700 From: Wei Wang To: virtio-dev@lists.oasis-open.org, linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org, linux-mm@kvack.org, mst@redhat.com, mhocko@kernel.org, akpm@linux-foundation.org Cc: wei.w.wang@intel.com Subject: [PATCH v2 2/2] virtio_balloon: replace oom notifier with shrinker Date: Fri, 27 Jul 2018 17:24:55 +0800 Message-Id: <1532683495-31974-3-git-send-email-wei.w.wang@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1532683495-31974-1-git-send-email-wei.w.wang@intel.com> References: <1532683495-31974-1-git-send-email-wei.w.wang@intel.com> X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP The OOM notifier is getting deprecated to use for the reasons mentioned here by Michal Hocko: https://lkml.org/lkml/2018/7/12/314 This patch replaces the virtio-balloon oom notifier with a shrinker to release balloon pages on memory pressure. In addition, the bug in the replaced virtballoon_oom_notify that only VIRTIO_BALLOON_ARRAY_PFNS_MAX (i.e 256) balloon pages can be freed though the user has specified more than that number is fixed in the shrinker_scan function. Signed-off-by: Wei Wang Cc: Michael S. Tsirkin Cc: Michal Hocko Cc: Andrew Morton --- drivers/virtio/virtio_balloon.c | 115 +++++++++++++++++++++++----------------- 1 file changed, 65 insertions(+), 50 deletions(-) diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index 9356a1a..6b2229b 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include @@ -40,12 +39,12 @@ */ #define VIRTIO_BALLOON_PAGES_PER_PAGE (unsigned)(PAGE_SIZE >> VIRTIO_BALLOON_PFN_SHIFT) #define VIRTIO_BALLOON_ARRAY_PFNS_MAX 256 -#define OOM_VBALLOON_DEFAULT_PAGES 256 +#define DEFAULT_BALLOON_PAGES_TO_SHRINK 256 #define VIRTBALLOON_OOM_NOTIFY_PRIORITY 80 -static int oom_pages = OOM_VBALLOON_DEFAULT_PAGES; -module_param(oom_pages, int, S_IRUSR | S_IWUSR); -MODULE_PARM_DESC(oom_pages, "pages to free on OOM"); +static unsigned long balloon_pages_to_shrink = DEFAULT_BALLOON_PAGES_TO_SHRINK; +module_param(balloon_pages_to_shrink, ulong, 0600); +MODULE_PARM_DESC(balloon_pages_to_shrink, "pages to free on memory presure"); #ifdef CONFIG_BALLOON_COMPACTION static struct vfsmount *balloon_mnt; @@ -86,8 +85,8 @@ struct virtio_balloon { /* Memory statistics */ struct virtio_balloon_stat stats[VIRTIO_BALLOON_S_NR]; - /* To register callback in oom notifier call chain */ - struct notifier_block nb; + /* To register a shrinker to shrink memory upon memory pressure */ + struct shrinker shrinker; }; static struct virtio_device_id id_table[] = { @@ -365,38 +364,6 @@ static void update_balloon_size(struct virtio_balloon *vb) &actual); } -/* - * virtballoon_oom_notify - release pages when system is under severe - * memory pressure (called from out_of_memory()) - * @self : notifier block struct - * @dummy: not used - * @parm : returned - number of freed pages - * - * The balancing of memory by use of the virtio balloon should not cause - * the termination of processes while there are pages in the balloon. - * If virtio balloon manages to release some memory, it will make the - * system return and retry the allocation that forced the OOM killer - * to run. - */ -static int virtballoon_oom_notify(struct notifier_block *self, - unsigned long dummy, void *parm) -{ - struct virtio_balloon *vb; - unsigned long *freed; - unsigned num_freed_pages; - - vb = container_of(self, struct virtio_balloon, nb); - if (!virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_DEFLATE_ON_OOM)) - return NOTIFY_OK; - - freed = parm; - num_freed_pages = leak_balloon(vb, oom_pages); - update_balloon_size(vb); - *freed += num_freed_pages; - - return NOTIFY_OK; -} - static void update_balloon_stats_func(struct work_struct *work) { struct virtio_balloon *vb; @@ -548,6 +515,54 @@ static struct file_system_type balloon_fs = { #endif /* CONFIG_BALLOON_COMPACTION */ +static unsigned long virtio_balloon_shrinker_scan(struct shrinker *shrinker, + struct shrink_control *sc) +{ + unsigned long pages_to_free = balloon_pages_to_shrink, + pages_freed = 0; + struct virtio_balloon *vb = container_of(shrinker, + struct virtio_balloon, shrinker); + + /* + * One invocation of leak_balloon can deflate at most + * VIRTIO_BALLOON_ARRAY_PFNS_MAX balloon pages, so we call it + * multiple times to deflate pages till reaching + * balloon_pages_to_shrink pages. + */ + while (vb->num_pages && pages_to_free) { + pages_to_free = balloon_pages_to_shrink - pages_freed; + pages_freed += leak_balloon(vb, pages_to_free); + } + update_balloon_size(vb); + + return pages_freed / VIRTIO_BALLOON_PAGES_PER_PAGE; +} + +static unsigned long virtio_balloon_shrinker_count(struct shrinker *shrinker, + struct shrink_control *sc) +{ + struct virtio_balloon *vb = container_of(shrinker, + struct virtio_balloon, shrinker); + + return min_t(unsigned long, vb->num_pages, balloon_pages_to_shrink) / + VIRTIO_BALLOON_PAGES_PER_PAGE; +} + +static void virtio_balloon_unregister_shrinker(struct virtio_balloon *vb) +{ + unregister_shrinker(&vb->shrinker); +} + +static int virtio_balloon_register_shrinker(struct virtio_balloon *vb) +{ + vb->shrinker.scan_objects = virtio_balloon_shrinker_scan; + vb->shrinker.count_objects = virtio_balloon_shrinker_count; + vb->shrinker.batch = 0; + vb->shrinker.seeks = DEFAULT_SEEKS; + + return register_shrinker(&vb->shrinker); +} + static int virtballoon_probe(struct virtio_device *vdev) { struct virtio_balloon *vb; @@ -580,17 +595,10 @@ static int virtballoon_probe(struct virtio_device *vdev) if (err) goto out_free_vb; - vb->nb.notifier_call = virtballoon_oom_notify; - vb->nb.priority = VIRTBALLOON_OOM_NOTIFY_PRIORITY; - err = register_oom_notifier(&vb->nb); - if (err < 0) - goto out_del_vqs; - #ifdef CONFIG_BALLOON_COMPACTION balloon_mnt = kern_mount(&balloon_fs); if (IS_ERR(balloon_mnt)) { err = PTR_ERR(balloon_mnt); - unregister_oom_notifier(&vb->nb); goto out_del_vqs; } @@ -599,13 +607,20 @@ static int virtballoon_probe(struct virtio_device *vdev) if (IS_ERR(vb->vb_dev_info.inode)) { err = PTR_ERR(vb->vb_dev_info.inode); kern_unmount(balloon_mnt); - unregister_oom_notifier(&vb->nb); vb->vb_dev_info.inode = NULL; goto out_del_vqs; } vb->vb_dev_info.inode->i_mapping->a_ops = &balloon_aops; #endif - + /* + * We continue to use VIRTIO_BALLOON_F_DEFLATE_ON_OOM to decide if a + * shrinker needs to be registered to relieve memory pressure. + */ + if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_DEFLATE_ON_OOM)) { + err = virtio_balloon_register_shrinker(vb); + if (err) + goto out_del_vqs; + } virtio_device_ready(vdev); if (towards_target(vb)) @@ -637,8 +652,8 @@ static void virtballoon_remove(struct virtio_device *vdev) { struct virtio_balloon *vb = vdev->priv; - unregister_oom_notifier(&vb->nb); - + if (virtio_has_feature(vb->vdev, VIRTIO_BALLOON_F_DEFLATE_ON_OOM)) + virtio_balloon_unregister_shrinker(vb); spin_lock_irq(&vb->stop_update_lock); vb->stop_update = true; spin_unlock_irq(&vb->stop_update_lock);