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) From patchwork Tue Dec 10 08:06:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: SeongJae Park X-Patchwork-Id: 11281635 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 D6AA9930 for ; Tue, 10 Dec 2019 08:07:52 +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 A7E6D20663 for ; Tue, 10 Dec 2019 08:07:52 +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="GdRAAQdC" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org A7E6D20663 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 1ieaXn-0002SV-PE; Tue, 10 Dec 2019 08:06:55 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1ieaXm-0002S7-AK for xen-devel@lists.xenproject.org; Tue, 10 Dec 2019 08:06:54 +0000 X-Inumbo-ID: 02644d1c-1b24-11ea-a914-bc764e2007e4 Received: from mail-wr1-x442.google.com (unknown [2a00:1450:4864:20::442]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 02644d1c-1b24-11ea-a914-bc764e2007e4; Tue, 10 Dec 2019 08:06:46 +0000 (UTC) Received: by mail-wr1-x442.google.com with SMTP id y17so18893460wrh.5 for ; Tue, 10 Dec 2019 00:06:46 -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=7GoRrqMVjX62ovnIfLayQu397lbmVjmI5+RiUUbRiGQ=; b=GdRAAQdC6QZDUZIYk/X86ZA51nIRrjCvroKLQhl+vQNMWYaGDanM7DGEKpwca3zPHu ppBTghPnROkT+2cwPnoApk+kexmUcttpTEOHDGjP9sFmG/0QCNJJH/HUIa3O6LUDD/n2 ITNGCFFe/LqwmGna6pPDWwfbm0NBHLkEkyStYSyeSuxKAbiVKwcijmSl/keWRtj4VY76 OmK4G2aOsbj81v5cZ52R9eLEM8Yr1vCbPCH3ZWcpi1Qdaqa6fZrLXufUfnYU5ygurCSm 607C4uLL5VEa5N8yyRUBLfDUR8Xbm8eqKjohmnY8PcNmd3MpRep9+B7y8ohOHqmeINyt BCgQ== 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=7GoRrqMVjX62ovnIfLayQu397lbmVjmI5+RiUUbRiGQ=; b=t3/iFZjikHhxTTmk8jGBDaw3XC8ARpXQKzNrqlDlu0Gr5UZbk6VYJlYVlpNmT21qS1 WQhFnpCC9QFtkD0cSkAMR/symUfdpxobc390Hbk3YkYum23mdk20hpszN6BcOqvslgyy Mbi19HWgaM3QfYMNBlRO6JNz1wI6uH23QDeqQdqFU7DqHY880ufAMwb/u0wHQYVwbSN1 oqZ6jtv199SbygObhwrLUp+TJ2K5tyZvgYhTGjbEsa4U7KQHzC3b+F4WDAilVEQUkmxy 5eR2IleZIeYbu9UsFvPpaYmAvWgFk8/vKq0Pu0Yq53qZJhAZmQ5tjEt4xoggk1uP7u2Z dedA== X-Gm-Message-State: APjAAAUl5eUDWBS1arPCOVbDFlyOF2aUedMNT88b44Wxs2rDxJuf5Aj1 1AwecB7E30aP2+XNWrQs7jU= X-Google-Smtp-Source: APXvYqzH9cYr9GL5jOU9NlCTPtbT6Sylija6v00hFlZeRgKAwbbYW8L0T8jLsHZY4duoYruQpEfytA== X-Received: by 2002:adf:f504:: with SMTP id q4mr1468459wro.299.1575965205566; Tue, 10 Dec 2019 00:06:45 -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.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Dec 2019 00:06:44 -0800 (PST) From: SeongJae Park X-Google-Original-From: SeongJae Park To: sjpark@amazon.com Date: Tue, 10 Dec 2019 08:06:28 +0000 Message-Id: <20191210080628.5264-3-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 2/2] xen/blkback: Squeeze page pools if a memory pressure is detected 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" Each `blkif` has a free pages pool for the grant mapping. The size of the pool starts from zero and be increased on demand while processing the I/O requests. If current I/O requests handling is finished or 100 milliseconds has passed since last I/O requests handling, it checks and shrinks the pool to not exceed the size limit, `max_buffer_pages`. Therefore, `blkfront` running guests can cause a memory pressure in the `blkback` running guest by attaching a large number of block devices and inducing I/O. System administrators can avoid such problematic situations by limiting the maximum number of devices each guest can attach. However, finding the optimal limit is not so easy. Improper set of the limit can results in the memory pressure or a resource underutilization. This commit avoids such problematic situations by squeezing the pools (returns every free page in the pool to the system) for a while (users can set this duration via a module parameter) if a memory pressure is detected. Discussions =========== The `blkback`'s original shrinking mechanism returns only pages in the pool, which are not currently be used by `blkback`, to the system. In other words, the pages are not mapped with foreign pages. Because this commit is changing only the shrink limit but uses the mechanism as is, this commit does not introduce improper mappings related security issues. Once a memory pressure is detected, this commit keeps the squeezing limit for a user-specified time duration. The duration should be neither too long nor too short. If it is too long, the squeezing incurring overhead can reduce the I/O performance. If it is too short, `blkback` will not free enough pages to reduce the memory pressure. This commit sets the value as `10 milliseconds` by default because it is a short time in terms of I/O while it is a long time in terms of memory operations. Also, as the original shrinking mechanism works for at least every 100 milliseconds, this could be a somewhat reasonable choice. I also tested other durations (refer to the below section for more details) and confirmed that 10 milliseconds is the one that works best with the test. That said, the proper duration depends on actual configurations and workloads. That's why this commit is allowing users to set it as their optimal value via the module parameter. Memory Pressure Test ==================== To show how this commit fixes the memory pressure situation well, I configured a test environment on a xen-running virtualization system. On the `blkfront` running guest instances, I attach a large number of network-backed volume devices and induce I/O to those. Meanwhile, I measure the number of pages that swapped in and out on the `blkback` running guest. The test ran twice, once for the `blkback` before this commit and once for that after this commit. As shown below, this commit has dramatically reduced the memory pressure: pswpin pswpout before 76,672 185,799 after 212 3,325 Optimal Aggressive Shrinking Duration ------------------------------------- To find a best squeezing duration, I repeated the test with three different durations (1ms, 10ms, and 100ms). The results are as below: duration pswpin pswpout 1 852 6,424 10 212 3,325 100 203 3,340 As expected, the memory pressure has decreased as the duration is increased, but the reduction stopped from the `10ms`. Based on this results, I chose the default duration as 10ms. Performance Overhead Test ========================= This commit could incur I/O performance degradation under severe memory pressure because the squeezing will require more page allocations per I/O. To show the overhead, I artificially made a worst-case squeezing situation and measured the I/O performance of a `blkfront` running guest. For the artificial squeezing, I set the `blkback.max_buffer_pages` using the `/sys/module/xen_blkback/parameters/max_buffer_pages` file. We set the value to `1024` and `0`. The `1024` is the default value. Setting the value as `0` is same to a situation doing the squeezing always (worst-case). For the I/O performance measurement, I use a simple `dd` command. Default Performance ------------------- [dom0]# echo 1024 > /sys/module/xen_blkback/parameters/max_buffer_pages [instance]$ for i in {1..5}; do dd if=/dev/zero of=file bs=4k count=$((256*512)); sync; done 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 11.7257 s, 45.8 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8827 s, 38.7 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8781 s, 38.7 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8737 s, 38.7 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8702 s, 38.7 MB/s Worst-case Performance ---------------------- [dom0]# echo 0 > /sys/module/xen_blkback/parameters/max_buffer_pages [instance]$ for i in {1..5}; do dd if=/dev/zero of=file bs=4k count=$((256*512)); sync; done 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 11.7257 s, 45.8 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.878 s, 38.7 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8746 s, 38.7 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8786 s, 38.7 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8749 s, 38.7 MB/s In short, even worst case squeezing makes no visible performance degradation. I think this is due to the slow speed of the I/O. In other words, the additional page allocation overhead is hidden under the much slower I/O latency. Nevertheless, pleaset note that this is just a very simple and minimal test. Reviewed-by: Juergen Gross Signed-off-by: SeongJae Park --- drivers/block/xen-blkback/blkback.c | 23 +++++++++++++++++++++-- drivers/block/xen-blkback/common.h | 1 + drivers/block/xen-blkback/xenbus.c | 3 ++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index fd1e19f1a49f..4d4dba7ea721 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -142,6 +142,22 @@ static inline bool persistent_gnt_timeout(struct persistent_gnt *persistent_gnt) HZ * xen_blkif_pgrant_timeout); } +/* Once a memory pressure is detected, squeeze free page pools for a while. */ +static int xen_blkif_buffer_squeeze_duration_ms = 10; +module_param_named(buffer_squeeze_duration_ms, + xen_blkif_buffer_squeeze_duration_ms, int, 0644); +MODULE_PARM_DESC(buffer_squeeze_duration_ms, +"Duration in ms to squeeze pages buffer when a memory pressure is detected"); + +static unsigned long xen_blk_buffer_squeeze_end; + +unsigned xen_blkbk_reclaim(struct xenbus_device *dev) +{ + xen_blk_buffer_squeeze_end = jiffies + + msecs_to_jiffies(xen_blkif_buffer_squeeze_duration_ms); + return 0; +} + static inline int get_free_page(struct xen_blkif_ring *ring, struct page **page) { unsigned long flags; @@ -656,8 +672,11 @@ int xen_blkif_schedule(void *arg) ring->next_lru = jiffies + msecs_to_jiffies(LRU_INTERVAL); } - /* Shrink if we have more than xen_blkif_max_buffer_pages */ - shrink_free_pagepool(ring, xen_blkif_max_buffer_pages); + /* Shrink the free pages pool if it is too large. */ + if (time_before(jiffies, xen_blk_buffer_squeeze_end)) + shrink_free_pagepool(ring, 0); + else + shrink_free_pagepool(ring, xen_blkif_max_buffer_pages); if (log_stats && time_after(jiffies, ring->st_print)) print_stats(ring); diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h index 1d3002d773f7..c0334cda79fe 100644 --- a/drivers/block/xen-blkback/common.h +++ b/drivers/block/xen-blkback/common.h @@ -383,6 +383,7 @@ irqreturn_t xen_blkif_be_int(int irq, void *dev_id); int xen_blkif_schedule(void *arg); int xen_blkif_purge_persistent(void *arg); void xen_blkbk_free_caches(struct xen_blkif_ring *ring); +unsigned xen_blkbk_reclaim(struct xenbus_device *dev); int xen_blkbk_flush_diskcache(struct xenbus_transaction xbt, struct backend_info *be, int state); diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c index b90dbcd99c03..de49a09e6933 100644 --- a/drivers/block/xen-blkback/xenbus.c +++ b/drivers/block/xen-blkback/xenbus.c @@ -1115,7 +1115,8 @@ static struct xenbus_driver xen_blkbk_driver = { .ids = xen_blkbk_ids, .probe = xen_blkbk_probe, .remove = xen_blkbk_remove, - .otherend_changed = frontend_changed + .otherend_changed = frontend_changed, + .reclaim = xen_blkbk_reclaim }; int xen_blkif_xenbus_init(void)