From mboxrd@z Thu Jan 1 00:00:00 1970 From: Joonas Lahtinen Subject: Re: [PATCH v2 2/3] mm/vmap: Add a notifier for when we run out of vmap address space Date: Tue, 05 Apr 2016 11:01:02 +0300 Message-ID: <1459843262.5564.4.camel@linux.intel.com> References: <1459777603-23618-1-git-send-email-chris@chris-wilson.co.uk> <1459777603-23618-3-git-send-email-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTP id 7DAC26E6F2 for ; Tue, 5 Apr 2016 08:00:14 +0000 (UTC) In-Reply-To: <1459777603-23618-3-git-send-email-chris@chris-wilson.co.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Chris Wilson , intel-gfx@lists.freedesktop.org Cc: linux-kernel@vger.kernel.org, Roman Peniaev , linux-mm@kvack.org, David Rientjes , Andrew Morton , Mel Gorman List-Id: intel-gfx@lists.freedesktop.org T24gbWEsIDIwMTYtMDQtMDQgYXQgMTQ6NDYgKzAxMDAsIENocmlzIFdpbHNvbiB3cm90ZToKPiB2 bWFwcyBhcmUgdGVtcG9yYXJ5IGtlcm5lbCBtYXBwaW5ncyB0aGF0IG1heSBiZSBvZiBsb25nIGR1 cmF0aW9uLgo+IFJldXNpbmcgYSB2bWFwIG9uIGFuIG9iamVjdCBpcyBwcmVmZXJyYWJsZSBmb3Ig YSBkcml2ZXIgYXMgdGhlIGNvc3Qgb2YKPiBzZXR0aW5nIHVwIHRoZSB2bWFwIGNhbiBvdGhlcndp c2UgZG9taW5hdGUgdGhlIG9wZXJhdGlvbiBvbiB0aGUgb2JqZWN0Lgo+IEhvd2V2ZXIsIHRoZSB2 bWFwIGFkZHJlc3Mgc3BhY2UgaXMgcmF0aGVyIGxpbWl0ZWQgb24gMzJiaXQgc3lzdGVtcyBhbmQK PiBzbyB3ZSBhZGQgYSBub3RpZmljYXRpb24gZm9yIHZtYXAgcHJlc3N1cmUgaW4gb3JkZXIgZm9y IHRoZSBkcml2ZXIgdG8KPiByZWxlYXNlIGFueSBjYWNoZWQgdm1hcHBpbmdzLgo+IAo+IFRoZSBp bnRlcmZhY2UgaXMgc3R5bGVkIGFmdGVyIHRoZSBvb20tbm90aWZpZXIgd2hlcmUgdGhlIGNhbGxl ZXMgYXJlCj4gcGFzc2VkIGEgcG9pbnRlciB0byBhbiB1bnNpZ25lZCBsb25nIGNvdW50ZXIgZm9y IHRoZW0gdG8gaW5kaWNhdGUgaWYgdGhleQo+IGhhdmUgZnJlZWQgYW55IHNwYWNlLgo+IAo+IHYy OiBHdWFyZCB0aGUgYmxvY2tpbmcgbm90aWZpZXIgY2FsbCB3aXRoIGdmcGZsYWdzX2FsbG93X2Js b2NraW5nKCkKPiB2MzogQ29ycmVjdCB0eXBvIGluIGZvcndhcmQgZGVjbGFyYXRpb24gYW5kIG1v dmUgdG8gaGVhZCBvZiBmaWxlCj4gCj4gU2lnbmVkLW9mZi1ieTogQ2hyaXMgV2lsc29uIDxjaHJp c0BjaHJpcy13aWxzb24uY28udWs+Cj4gQ2M6IEFuZHJldyBNb3J0b24gPGFrcG1AbGludXgtZm91 bmRhdGlvbi5vcmc+Cj4gQ2M6IERhdmlkIFJpZW50amVzIDxyaWVudGplc0Bnb29nbGUuY29tPgo+ IENjOiBSb21hbiBQZW5pYWV2IDxyLnBlbmlhZXZAZ21haWwuY29tPgo+IENjOiBNZWwgR29ybWFu IDxtZ29ybWFuQHRlY2hzaW5ndWxhcml0eS5uZXQ+Cj4gQ2M6IGxpbnV4LW1tQGt2YWNrLm9yZwo+ IENjOiBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnCj4gQWNrZWQtYnk6IEFuZHJldyBNb3J0 b24gPGFrcG1AbGludXgtZm91bmRhdGlvbi5vcmc+ICMgZm9yIGluY2x1c2lvbiB2aWEgRFJNCj4g Q2M6IEpvb25hcyBMYWh0aW5lbiA8am9vbmFzLmxhaHRpbmVuQGxpbnV4LmludGVsLmNvbT4KClJl dmlld2VkLWJ5OiBKb29uYXMgTGFodGluZW4gPGpvb25hcy5sYWh0aW5lbkBsaW51eC5pbnRlbC5j b20+Cgo+IENjOiBUdnJ0a28gVXJzdWxpbiA8dHZydGtvLnVyc3VsaW5AaW50ZWwuY29tPgo+IC0t LQo+IMKgaW5jbHVkZS9saW51eC92bWFsbG9jLmggfMKgwqA0ICsrKysKPiDCoG1tL3ZtYWxsb2Mu Y8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwgMjcgKysrKysrKysrKysrKysrKysrKysrKysrKysr Cj4gwqAyIGZpbGVzIGNoYW5nZWQsIDMxIGluc2VydGlvbnMoKykKPiAKPiBkaWZmIC0tZ2l0IGEv aW5jbHVkZS9saW51eC92bWFsbG9jLmggYi9pbmNsdWRlL2xpbnV4L3ZtYWxsb2MuaAo+IGluZGV4 IGQxZjFkMzM4YWYyMC4uOGI1MWRmM2FiMzM0IDEwMDY0NAo+IC0tLSBhL2luY2x1ZGUvbGludXgv dm1hbGxvYy5oCj4gKysrIGIvaW5jbHVkZS9saW51eC92bWFsbG9jLmgKPiBAQCAtOCw2ICs4LDcg QEAKPiDCoCNpbmNsdWRlIAo+IMKgCj4gwqBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3Q7CQkvKiB2bWEg ZGVmaW5pbmcgdXNlciBtYXBwaW5nIGluIG1tX3R5cGVzLmggKi8KPiArc3RydWN0IG5vdGlmaWVy X2Jsb2NrOwkJLyogaW4gbm90aWZpZXIuaCAqLwo+IMKgCj4gwqAvKiBiaXRzIGluIGZsYWdzIG9m IHZtYWxsb2MncyB2bV9zdHJ1Y3QgYmVsb3cgKi8KPiDCoCNkZWZpbmUgVk1fSU9SRU1BUAkJMHgw MDAwMDAwMQkvKiBpb3JlbWFwKCkgYW5kIGZyaWVuZHMgKi8KPiBAQCAtMTg3LDQgKzE4OCw3IEBA IHBjcHVfZnJlZV92bV9hcmVhcyhzdHJ1Y3Qgdm1fc3RydWN0ICoqdm1zLCBpbnQgbnJfdm1zKQo+ IMKgI2RlZmluZSBWTUFMTE9DX1RPVEFMIDBVTAo+IMKgI2VuZGlmCj4gwqAKPiAraW50IHJlZ2lz dGVyX3ZtYXBfcHVyZ2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7Cj4gK2lu dCB1bnJlZ2lzdGVyX3ZtYXBfcHVyZ2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpu Yik7Cj4gKwo+IMKgI2VuZGlmIC8qIF9MSU5VWF9WTUFMTE9DX0ggKi8KPiBkaWZmIC0tZ2l0IGEv bW0vdm1hbGxvYy5jIGIvbW0vdm1hbGxvYy5jCj4gaW5kZXggYWU3ZDIwYjQ0N2ZmLi4yOTM4ODlk N2Y0ODIgMTAwNjQ0Cj4gLS0tIGEvbW0vdm1hbGxvYy5jCj4gKysrIGIvbW0vdm1hbGxvYy5jCj4g QEAgLTIxLDYgKzIxLDcgQEAKPiDCoCNpbmNsdWRlIAo+IMKgI2luY2x1ZGUgCj4gwqAjaW5jbHVk ZSAKPiArI2luY2x1ZGUgCj4gwqAjaW5jbHVkZSAKPiDCoCNpbmNsdWRlIAo+IMKgI2luY2x1ZGUg Cj4gQEAgLTM0NCw2ICszNDUsOCBAQCBzdGF0aWMgdm9pZCBfX2luc2VydF92bWFwX2FyZWEoc3Ry dWN0IHZtYXBfYXJlYSAqdmEpCj4gwqAKPiDCoHN0YXRpYyB2b2lkIHB1cmdlX3ZtYXBfYXJlYV9s YXp5KHZvaWQpOwo+IMKgCj4gK3N0YXRpYyBCTE9DS0lOR19OT1RJRklFUl9IRUFEKHZtYXBfbm90 aWZ5X2xpc3QpOwo+ICsKPiDCoC8qCj4gwqAgKiBBbGxvY2F0ZSBhIHJlZ2lvbiBvZiBLVkEgb2Yg dGhlIHNwZWNpZmllZCBzaXplIGFuZCBhbGlnbm1lbnQsIHdpdGhpbiB0aGUKPiDCoCAqIHZzdGFy dCBhbmQgdmVuZC4KPiBAQCAtMzYzLDYgKzM2Niw4IEBAIHN0YXRpYyBzdHJ1Y3Qgdm1hcF9hcmVh ICphbGxvY192bWFwX2FyZWEodW5zaWduZWQgbG9uZyBzaXplLAo+IMKgCUJVR19PTihvZmZzZXRf aW5fcGFnZShzaXplKSk7Cj4gwqAJQlVHX09OKCFpc19wb3dlcl9vZl8yKGFsaWduKSk7Cj4gwqAK PiArCW1pZ2h0X3NsZWVwX2lmKGdmcGZsYWdzX2FsbG93X2Jsb2NraW5nKGdmcF9tYXNrKSk7Cj4g Kwo+IMKgCXZhID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgdm1hcF9hcmVhKSwKPiDCoAkJ CWdmcF9tYXNrICYgR0ZQX1JFQ0xBSU1fTUFTSywgbm9kZSk7Cj4gwqAJaWYgKHVubGlrZWx5KCF2 YSkpCj4gQEAgLTQ2OCw2ICs0NzMsMTYgQEAgb3ZlcmZsb3c6Cj4gwqAJCXB1cmdlZCA9IDE7Cj4g wqAJCWdvdG8gcmV0cnk7Cj4gwqAJfQo+ICsKPiArCWlmIChnZnBmbGFnc19hbGxvd19ibG9ja2lu ZyhnZnBfbWFzaykpIHsKPiArCQl1bnNpZ25lZCBsb25nIGZyZWVkID0gMDsKPiArCQlibG9ja2lu Z19ub3RpZmllcl9jYWxsX2NoYWluKCZ2bWFwX25vdGlmeV9saXN0LCAwLCAmZnJlZWQpOwo+ICsJ CWlmIChmcmVlZCA+IDApIHsKPiArCQkJcHVyZ2VkID0gMDsKPiArCQkJZ290byByZXRyeTsKPiAr CQl9Cj4gKwl9Cj4gKwo+IMKgCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCj4gwqAJCXByX3dhcm4o InZtYXAgYWxsb2NhdGlvbiBmb3Igc2l6ZSAlbHUgZmFpbGVkOiB1c2Ugdm1hbGxvYz0gdG8gaW5j cmVhc2Ugc2l6ZVxuIiwKPiDCoAkJCXNpemUpOwo+IEBAIC00NzUsNiArNDkwLDE4IEBAIG92ZXJm bG93Ogo+IMKgCXJldHVybiBFUlJfUFRSKC1FQlVTWSk7Cj4gwqB9Cj4gwqAKPiAraW50IHJlZ2lz dGVyX3ZtYXBfcHVyZ2Vfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKPiArewo+ ICsJcmV0dXJuIGJsb2NraW5nX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZ2bWFwX25vdGlmeV9s aXN0LCBuYik7Cj4gK30KPiArRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfdm1hcF9wdXJnZV9u b3RpZmllcik7Cj4gKwo+ICtpbnQgdW5yZWdpc3Rlcl92bWFwX3B1cmdlX25vdGlmaWVyKHN0cnVj dCBub3RpZmllcl9ibG9jayAqbmIpCj4gK3sKPiArCXJldHVybiBibG9ja2luZ19ub3RpZmllcl9j aGFpbl91bnJlZ2lzdGVyKCZ2bWFwX25vdGlmeV9saXN0LCBuYik7Cj4gK30KPiArRVhQT1JUX1NZ TUJPTF9HUEwodW5yZWdpc3Rlcl92bWFwX3B1cmdlX25vdGlmaWVyKTsKPiArCj4gwqBzdGF0aWMg dm9pZCBfX2ZyZWVfdm1hcF9hcmVhKHN0cnVjdCB2bWFwX2FyZWEgKnZhKQo+IMKgewo+IMKgCUJV R19PTihSQl9FTVBUWV9OT0RFKCZ2YS0+cmJfbm9kZSkpOwotLSAKSm9vbmFzIExhaHRpbmVuCk9w ZW4gU291cmNlIFRlY2hub2xvZ3kgQ2VudGVyCkludGVsIENvcnBvcmF0aW9uCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxp c3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNr dG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf0-f171.google.com (mail-pf0-f171.google.com [209.85.192.171]) by kanga.kvack.org (Postfix) with ESMTP id 4A3FE6B0005 for ; Tue, 5 Apr 2016 04:00:15 -0400 (EDT) Received: by mail-pf0-f171.google.com with SMTP id c20so5933227pfc.1 for ; Tue, 05 Apr 2016 01:00:15 -0700 (PDT) Received: from mga03.intel.com (mga03.intel.com. [134.134.136.65]) by mx.google.com with ESMTP id 14si6569699pfp.31.2016.04.05.01.00.14 for ; Tue, 05 Apr 2016 01:00:14 -0700 (PDT) Message-ID: <1459843262.5564.4.camel@linux.intel.com> Subject: Re: [PATCH v2 2/3] mm/vmap: Add a notifier for when we run out of vmap address space From: Joonas Lahtinen Date: Tue, 05 Apr 2016 11:01:02 +0300 In-Reply-To: <1459777603-23618-3-git-send-email-chris@chris-wilson.co.uk> References: <1459777603-23618-1-git-send-email-chris@chris-wilson.co.uk> <1459777603-23618-3-git-send-email-chris@chris-wilson.co.uk> Content-Type: text/plain; charset="UTF-8" Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: owner-linux-mm@kvack.org List-ID: To: Chris Wilson , intel-gfx@lists.freedesktop.org Cc: Andrew Morton , David Rientjes , Roman Peniaev , Mel Gorman , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Tvrtko Ursulin On ma, 2016-04-04 at 14:46 +0100, Chris Wilson wrote: > vmaps are temporary kernel mappings that may be of long duration. > Reusing a vmap on an object is preferrable for a driver as the cost of > setting up the vmap can otherwise dominate the operation on the object. > However, the vmap address space is rather limited on 32bit systems and > so we add a notification for vmap pressure in order for the driver to > release any cached vmappings. > > The interface is styled after the oom-notifier where the callees are > passed a pointer to an unsigned long counter for them to indicate if they > have freed any space. > > v2: Guard the blocking notifier call with gfpflags_allow_blocking() > v3: Correct typo in forward declaration and move to head of file > > Signed-off-by: Chris Wilson > Cc: Andrew Morton > Cc: David Rientjes > Cc: Roman Peniaev > Cc: Mel Gorman > Cc: linux-mm@kvack.org > Cc: linux-kernel@vger.kernel.org > Acked-by: Andrew Morton # for inclusion via DRM > Cc: Joonas Lahtinen Reviewed-by: Joonas Lahtinen > Cc: Tvrtko Ursulin > --- > A include/linux/vmalloc.h |A A 4 ++++ > A mm/vmalloc.cA A A A A A A A A A A A | 27 +++++++++++++++++++++++++++ > A 2 files changed, 31 insertions(+) > > diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h > index d1f1d338af20..8b51df3ab334 100644 > --- a/include/linux/vmalloc.h > +++ b/include/linux/vmalloc.h > @@ -8,6 +8,7 @@ > A #include > A > A struct vm_area_struct; /* vma defining user mapping in mm_types.h */ > +struct notifier_block; /* in notifier.h */ > A > A /* bits in flags of vmalloc's vm_struct below */ > A #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ > @@ -187,4 +188,7 @@ pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms) > A #define VMALLOC_TOTAL 0UL > A #endif > A > +int register_vmap_purge_notifier(struct notifier_block *nb); > +int unregister_vmap_purge_notifier(struct notifier_block *nb); > + > A #endif /* _LINUX_VMALLOC_H */ > diff --git a/mm/vmalloc.c b/mm/vmalloc.c > index ae7d20b447ff..293889d7f482 100644 > --- a/mm/vmalloc.c > +++ b/mm/vmalloc.c > @@ -21,6 +21,7 @@ > A #include > A #include > A #include > +#include > A #include > A #include > A #include > @@ -344,6 +345,8 @@ static void __insert_vmap_area(struct vmap_area *va) > A > A static void purge_vmap_area_lazy(void); > A > +static BLOCKING_NOTIFIER_HEAD(vmap_notify_list); > + > A /* > A * Allocate a region of KVA of the specified size and alignment, within the > A * vstart and vend. > @@ -363,6 +366,8 @@ static struct vmap_area *alloc_vmap_area(unsigned long size, > A BUG_ON(offset_in_page(size)); > A BUG_ON(!is_power_of_2(align)); > A > + might_sleep_if(gfpflags_allow_blocking(gfp_mask)); > + > A va = kmalloc_node(sizeof(struct vmap_area), > A gfp_mask & GFP_RECLAIM_MASK, node); > A if (unlikely(!va)) > @@ -468,6 +473,16 @@ overflow: > A purged = 1; > A goto retry; > A } > + > + if (gfpflags_allow_blocking(gfp_mask)) { > + unsigned long freed = 0; > + blocking_notifier_call_chain(&vmap_notify_list, 0, &freed); > + if (freed > 0) { > + purged = 0; > + goto retry; > + } > + } > + > A if (printk_ratelimit()) > A pr_warn("vmap allocation for size %lu failed: use vmalloc= to increase size\n", > A size); > @@ -475,6 +490,18 @@ overflow: > A return ERR_PTR(-EBUSY); > A } > A > +int register_vmap_purge_notifier(struct notifier_block *nb) > +{ > + return blocking_notifier_chain_register(&vmap_notify_list, nb); > +} > +EXPORT_SYMBOL_GPL(register_vmap_purge_notifier); > + > +int unregister_vmap_purge_notifier(struct notifier_block *nb) > +{ > + return blocking_notifier_chain_unregister(&vmap_notify_list, nb); > +} > +EXPORT_SYMBOL_GPL(unregister_vmap_purge_notifier); > + > A static void __free_vmap_area(struct vmap_area *va) > A { > A BUG_ON(RB_EMPTY_NODE(&va->rb_node)); -- Joonas Lahtinen Open Source Technology Center Intel Corporation -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757472AbcDEIAR (ORCPT ); Tue, 5 Apr 2016 04:00:17 -0400 Received: from mga04.intel.com ([192.55.52.120]:50704 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752736AbcDEIAP (ORCPT ); Tue, 5 Apr 2016 04:00:15 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.24,443,1455004800"; d="scan'208";a="925623741" Message-ID: <1459843262.5564.4.camel@linux.intel.com> Subject: Re: [PATCH v2 2/3] mm/vmap: Add a notifier for when we run out of vmap address space From: Joonas Lahtinen To: Chris Wilson , intel-gfx@lists.freedesktop.org Cc: Andrew Morton , David Rientjes , Roman Peniaev , Mel Gorman , linux-mm@kvack.org, linux-kernel@vger.kernel.org, Tvrtko Ursulin Date: Tue, 05 Apr 2016 11:01:02 +0300 In-Reply-To: <1459777603-23618-3-git-send-email-chris@chris-wilson.co.uk> References: <1459777603-23618-1-git-send-email-chris@chris-wilson.co.uk> <1459777603-23618-3-git-send-email-chris@chris-wilson.co.uk> Organization: Intel Finland Oy - BIC 0357606-4 - Westendinkatu 7, 02160 Espoo Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.18.5.2 (3.18.5.2-1.fc23) Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On ma, 2016-04-04 at 14:46 +0100, Chris Wilson wrote: > vmaps are temporary kernel mappings that may be of long duration. > Reusing a vmap on an object is preferrable for a driver as the cost of > setting up the vmap can otherwise dominate the operation on the object. > However, the vmap address space is rather limited on 32bit systems and > so we add a notification for vmap pressure in order for the driver to > release any cached vmappings. > > The interface is styled after the oom-notifier where the callees are > passed a pointer to an unsigned long counter for them to indicate if they > have freed any space. > > v2: Guard the blocking notifier call with gfpflags_allow_blocking() > v3: Correct typo in forward declaration and move to head of file > > Signed-off-by: Chris Wilson > Cc: Andrew Morton > Cc: David Rientjes > Cc: Roman Peniaev > Cc: Mel Gorman > Cc: linux-mm@kvack.org > Cc: linux-kernel@vger.kernel.org > Acked-by: Andrew Morton # for inclusion via DRM > Cc: Joonas Lahtinen Reviewed-by: Joonas Lahtinen > Cc: Tvrtko Ursulin > --- >  include/linux/vmalloc.h |  4 ++++ >  mm/vmalloc.c            | 27 +++++++++++++++++++++++++++ >  2 files changed, 31 insertions(+) > > diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h > index d1f1d338af20..8b51df3ab334 100644 > --- a/include/linux/vmalloc.h > +++ b/include/linux/vmalloc.h > @@ -8,6 +8,7 @@ >  #include >   >  struct vm_area_struct; /* vma defining user mapping in mm_types.h */ > +struct notifier_block; /* in notifier.h */ >   >  /* bits in flags of vmalloc's vm_struct below */ >  #define VM_IOREMAP 0x00000001 /* ioremap() and friends */ > @@ -187,4 +188,7 @@ pcpu_free_vm_areas(struct vm_struct **vms, int nr_vms) >  #define VMALLOC_TOTAL 0UL >  #endif >   > +int register_vmap_purge_notifier(struct notifier_block *nb); > +int unregister_vmap_purge_notifier(struct notifier_block *nb); > + >  #endif /* _LINUX_VMALLOC_H */ > diff --git a/mm/vmalloc.c b/mm/vmalloc.c > index ae7d20b447ff..293889d7f482 100644 > --- a/mm/vmalloc.c > +++ b/mm/vmalloc.c > @@ -21,6 +21,7 @@ >  #include >  #include >  #include > +#include >  #include >  #include >  #include > @@ -344,6 +345,8 @@ static void __insert_vmap_area(struct vmap_area *va) >   >  static void purge_vmap_area_lazy(void); >   > +static BLOCKING_NOTIFIER_HEAD(vmap_notify_list); > + >  /* >   * Allocate a region of KVA of the specified size and alignment, within the >   * vstart and vend. > @@ -363,6 +366,8 @@ static struct vmap_area *alloc_vmap_area(unsigned long size, >   BUG_ON(offset_in_page(size)); >   BUG_ON(!is_power_of_2(align)); >   > + might_sleep_if(gfpflags_allow_blocking(gfp_mask)); > + >   va = kmalloc_node(sizeof(struct vmap_area), >   gfp_mask & GFP_RECLAIM_MASK, node); >   if (unlikely(!va)) > @@ -468,6 +473,16 @@ overflow: >   purged = 1; >   goto retry; >   } > + > + if (gfpflags_allow_blocking(gfp_mask)) { > + unsigned long freed = 0; > + blocking_notifier_call_chain(&vmap_notify_list, 0, &freed); > + if (freed > 0) { > + purged = 0; > + goto retry; > + } > + } > + >   if (printk_ratelimit()) >   pr_warn("vmap allocation for size %lu failed: use vmalloc= to increase size\n", >   size); > @@ -475,6 +490,18 @@ overflow: >   return ERR_PTR(-EBUSY); >  } >   > +int register_vmap_purge_notifier(struct notifier_block *nb) > +{ > + return blocking_notifier_chain_register(&vmap_notify_list, nb); > +} > +EXPORT_SYMBOL_GPL(register_vmap_purge_notifier); > + > +int unregister_vmap_purge_notifier(struct notifier_block *nb) > +{ > + return blocking_notifier_chain_unregister(&vmap_notify_list, nb); > +} > +EXPORT_SYMBOL_GPL(unregister_vmap_purge_notifier); > + >  static void __free_vmap_area(struct vmap_area *va) >  { >   BUG_ON(RB_EMPTY_NODE(&va->rb_node)); -- Joonas Lahtinen Open Source Technology Center Intel Corporation