From nobody Sun Feb 8 18:10:43 2026 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1563432835; cv=none; d=zoho.com; s=zohoarc; b=AZjFk3szLoHy2u3ePJ5jlnD/LCMEwwjVUIg/qGHmi5vgbdhRtkwfgj6r+VED6vObBeP67XMYxVcH4UF1Y80J8eg49GxY82BTxBd42IkWmCa8BWKEJe+2PLBBX4seLnxUk2Uo8zq6XrhPTC4FWkLSWImWhxmgtPywaeWtvH2nJpE= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1563432835; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=f8H05K9Oke8JZJFTZMKtjbUU4QZFwwTEDgUj/B5aVFQ=; b=AVzMCFLzFXYS5lleMVoIYlIE9Y22uyxFtw++x0HlzVEFRJpu4qUjf57v34DBq3asOZw/TVv4gHSEaiPJ9VvswcI0yoG7lJnIypQustLBlj6uhwNJSZmQhAa8zLLz/8+wJnrvQRH/xR3RMySLt1fnGsJHR7TFqLep6htGtQybKXc= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1563432835441901.1703612702585; Wed, 17 Jul 2019 23:53:55 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1ho0HH-0003iM-3c; Thu, 18 Jul 2019 06:52:31 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1ho0HF-0003i6-A8 for xen-devel@lists.xenproject.org; Thu, 18 Jul 2019 06:52:29 +0000 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 9ac8c197-a928-11e9-8980-bc764e045a96; Thu, 18 Jul 2019 06:52:27 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id B747EAE1B; Thu, 18 Jul 2019 06:52:26 +0000 (UTC) X-Inumbo-ID: 9ac8c197-a928-11e9-8980-bc764e045a96 X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Juergen Gross To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org Date: Thu, 18 Jul 2019 08:52:21 +0200 Message-Id: <20190718065222.31310-2-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190718065222.31310-1-jgross@suse.com> References: <20190718065222.31310-1-jgross@suse.com> Subject: [Xen-devel] [PATCH 1/2] xen/gntdev: replace global limit of mapped pages by limit per call 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: Juergen Gross , Boris Ostrovsky , Stefano Stabellini MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" Today there is a global limit of pages mapped via /dev/xen/gntdev set to 1 million pages per default. There is no reason why that limit is existing, as total number of foreign mappings is limited by the hypervisor anyway and preferring kernel mappings over userspace ones doesn't make sense. Additionally checking of that limit is fragile, as the number of pages to map via one call is specified in a 32-bit unsigned variable which isn't tested to stay within reasonable limits (the only test is the value to be <=3D zero, which basically excludes only calls without any mapping requested). So trying to map e.g. 0xffff0000 pages while already nearly 1000000 pages are mapped will effectively lower the global number of mapped pages such that a parallel call mapping a reasonable amount of pages can succeed in spite of the global limit being violated. So drop the global limit and introduce per call limit instead. Signed-off-by: Juergen Gross Reviewed-by: Oleksandr Andrushchenko --- drivers/xen/gntdev-common.h | 2 +- drivers/xen/gntdev-dmabuf.c | 11 +++-------- drivers/xen/gntdev.c | 22 ++++++---------------- 3 files changed, 10 insertions(+), 25 deletions(-) diff --git a/drivers/xen/gntdev-common.h b/drivers/xen/gntdev-common.h index 2f8b949c3eeb..0e5d4660e7b8 100644 --- a/drivers/xen/gntdev-common.h +++ b/drivers/xen/gntdev-common.h @@ -87,7 +87,7 @@ void gntdev_add_map(struct gntdev_priv *priv, struct gntd= ev_grant_map *add); =20 void gntdev_put_map(struct gntdev_priv *priv, struct gntdev_grant_map *map= ); =20 -bool gntdev_account_mapped_pages(int count); +bool gntdev_test_page_count(unsigned int count); =20 int gntdev_map_grant_pages(struct gntdev_grant_map *map); =20 diff --git a/drivers/xen/gntdev-dmabuf.c b/drivers/xen/gntdev-dmabuf.c index 2c4f324f8626..63f0857bf62d 100644 --- a/drivers/xen/gntdev-dmabuf.c +++ b/drivers/xen/gntdev-dmabuf.c @@ -446,7 +446,7 @@ dmabuf_exp_alloc_backing_storage(struct gntdev_priv *pr= iv, int dmabuf_flags, { struct gntdev_grant_map *map; =20 - if (unlikely(count <=3D 0)) + if (unlikely(gntdev_test_page_count(count))) return ERR_PTR(-EINVAL); =20 if ((dmabuf_flags & GNTDEV_DMA_FLAG_WC) && @@ -459,11 +459,6 @@ dmabuf_exp_alloc_backing_storage(struct gntdev_priv *p= riv, int dmabuf_flags, if (!map) return ERR_PTR(-ENOMEM); =20 - if (unlikely(gntdev_account_mapped_pages(count))) { - pr_debug("can't map %d pages: over limit\n", count); - gntdev_put_map(NULL, map); - return ERR_PTR(-ENOMEM); - } return map; } =20 @@ -771,7 +766,7 @@ long gntdev_ioctl_dmabuf_exp_from_refs(struct gntdev_pr= iv *priv, int use_ptemod, if (copy_from_user(&op, u, sizeof(op)) !=3D 0) return -EFAULT; =20 - if (unlikely(op.count <=3D 0)) + if (unlikely(gntdev_test_page_count(op.count))) return -EINVAL; =20 refs =3D kcalloc(op.count, sizeof(*refs), GFP_KERNEL); @@ -818,7 +813,7 @@ long gntdev_ioctl_dmabuf_imp_to_refs(struct gntdev_priv= *priv, if (copy_from_user(&op, u, sizeof(op)) !=3D 0) return -EFAULT; =20 - if (unlikely(op.count <=3D 0)) + if (unlikely(gntdev_test_page_count(op.count))) return -EINVAL; =20 gntdev_dmabuf =3D dmabuf_imp_to_refs(priv->dmabuf_priv, diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c index 4c339c7e66e5..23e21a9aedf7 100644 --- a/drivers/xen/gntdev.c +++ b/drivers/xen/gntdev.c @@ -57,12 +57,10 @@ MODULE_AUTHOR("Derek G. Murray , " "Gerd Hoffmann "); MODULE_DESCRIPTION("User-space granted page access driver"); =20 -static int limit =3D 1024*1024; -module_param(limit, int, 0644); +static unsigned int limit =3D 64*1024; +module_param(limit, uint, 0644); MODULE_PARM_DESC(limit, "Maximum number of grants that may be mapped by " - "the gntdev device"); - -static atomic_t pages_mapped =3D ATOMIC_INIT(0); + "one mapping request"); =20 static int use_ptemod; #define populate_freeable_maps use_ptemod @@ -74,9 +72,9 @@ static struct miscdevice gntdev_miscdev; =20 /* ------------------------------------------------------------------ */ =20 -bool gntdev_account_mapped_pages(int count) +bool gntdev_test_page_count(unsigned int count) { - return atomic_add_return(count, &pages_mapped) > limit; + return !count || count > limit; } =20 static void gntdev_print_maps(struct gntdev_priv *priv, @@ -244,8 +242,6 @@ void gntdev_put_map(struct gntdev_priv *priv, struct gn= tdev_grant_map *map) if (!refcount_dec_and_test(&map->users)) return; =20 - atomic_sub(map->count, &pages_mapped); - if (map->notify.flags & UNMAP_NOTIFY_SEND_EVENT) { notify_remote_via_evtchn(map->notify.event); evtchn_put(map->notify.event); @@ -677,7 +673,7 @@ static long gntdev_ioctl_map_grant_ref(struct gntdev_pr= iv *priv, if (copy_from_user(&op, u, sizeof(op)) !=3D 0) return -EFAULT; pr_debug("priv %p, add %d\n", priv, op.count); - if (unlikely(op.count <=3D 0)) + if (unlikely(gntdev_test_page_count(op.count))) return -EINVAL; =20 err =3D -ENOMEM; @@ -685,12 +681,6 @@ static long gntdev_ioctl_map_grant_ref(struct gntdev_p= riv *priv, if (!map) return err; =20 - if (unlikely(gntdev_account_mapped_pages(op.count))) { - pr_debug("can't map: over limit\n"); - gntdev_put_map(NULL, map); - return err; - } - if (copy_from_user(map->grants, &u->refs, sizeof(map->grants[0]) * op.count) !=3D 0) { gntdev_put_map(NULL, map); --=20 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel From nobody Sun Feb 8 18:10:43 2026 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) client-ip=192.237.175.120; envelope-from=xen-devel-bounces@lists.xenproject.org; helo=lists.xenproject.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org ARC-Seal: i=1; a=rsa-sha256; t=1563432840; cv=none; d=zoho.com; s=zohoarc; b=cMOId1GNB6n6quywe1jS7T7bTCjoGRNbYeqhT/JEBaJ3oK5JfHem6TWjXGXEYonMAvAF1vMG7BDduIpwrNFqTVbmiDCY2V2QlGGgGf65uS6rH4x9kUdMRFrquhI6+6cmfmBGm4zyw0a4F8b/q+xtl+x6oMtnZiS7JECB2Uh/9us= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1563432840; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=zgu7Bd/u72f6gY4i+1Zxydum69HJf8TYcU9r9cCFZWk=; b=ZU8mcOlMqsolw7LH1ncb7VMpQNgrXJTYpF//vyahcN/QQsvmkxhGgFb9b49Vq17HPFghz4hNnHPveI3uKxrJK3F5rjDcHsKoBrkdpabzkAzrQxTvOEEH3WnoCxMV12N2L8jCuRdrEv8zlIevt05Y5A7tnMRN7a9GWw6qn1nWEUY= ARC-Authentication-Results: i=1; mx.zoho.com; spf=none (zoho.com: 192.237.175.120 is neither permitted nor denied by domain of lists.xenproject.org) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) by mx.zohomail.com with SMTPS id 1563432840403792.1987269412526; Wed, 17 Jul 2019 23:54:00 -0700 (PDT) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1ho0HG-0003iG-RP; Thu, 18 Jul 2019 06:52:30 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1ho0HF-0003i7-Ai for xen-devel@lists.xenproject.org; Thu, 18 Jul 2019 06:52:29 +0000 Received: from mx1.suse.de (unknown [195.135.220.15]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTPS id 9ac8f834-a928-11e9-8980-bc764e045a96; Thu, 18 Jul 2019 06:52:27 +0000 (UTC) Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id E1D4BAE47; Thu, 18 Jul 2019 06:52:26 +0000 (UTC) X-Inumbo-ID: 9ac8f834-a928-11e9-8980-bc764e045a96 X-Virus-Scanned: by amavisd-new at test-mx.suse.de From: Juergen Gross To: xen-devel@lists.xenproject.org, linux-kernel@vger.kernel.org Date: Thu, 18 Jul 2019 08:52:22 +0200 Message-Id: <20190718065222.31310-3-jgross@suse.com> X-Mailer: git-send-email 2.16.4 In-Reply-To: <20190718065222.31310-1-jgross@suse.com> References: <20190718065222.31310-1-jgross@suse.com> Subject: [Xen-devel] [PATCH 2/2] xen/gntdev: switch from kcalloc() to kvcalloc() 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: Juergen Gross , Boris Ostrovsky , Stefano Stabellini MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" With sufficient many pages to map gntdev can reach order 9 allocation sizes. As there is no need to have physically contiguous buffers switch to kvcalloc() in order to avoid failing allocations. Signed-off-by: Juergen Gross Reviewed-by: Oleksandr Andrushchenko --- drivers/xen/gntdev.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c index 23e21a9aedf7..961aa778312b 100644 --- a/drivers/xen/gntdev.c +++ b/drivers/xen/gntdev.c @@ -115,14 +115,14 @@ static void gntdev_free_map(struct gntdev_grant_map *= map) gnttab_free_pages(map->count, map->pages); =20 #ifdef CONFIG_XEN_GRANT_DMA_ALLOC - kfree(map->frames); + kvfree(map->frames); #endif - kfree(map->pages); - kfree(map->grants); - kfree(map->map_ops); - kfree(map->unmap_ops); - kfree(map->kmap_ops); - kfree(map->kunmap_ops); + kvfree(map->pages); + kvfree(map->grants); + kvfree(map->map_ops); + kvfree(map->unmap_ops); + kvfree(map->kmap_ops); + kvfree(map->kunmap_ops); kfree(map); } =20 @@ -136,12 +136,12 @@ struct gntdev_grant_map *gntdev_alloc_map(struct gntd= ev_priv *priv, int count, if (NULL =3D=3D add) return NULL; =20 - add->grants =3D kcalloc(count, sizeof(add->grants[0]), GFP_KERNEL); - add->map_ops =3D kcalloc(count, sizeof(add->map_ops[0]), GFP_KERNEL); - add->unmap_ops =3D kcalloc(count, sizeof(add->unmap_ops[0]), GFP_KERNEL); - add->kmap_ops =3D kcalloc(count, sizeof(add->kmap_ops[0]), GFP_KERNEL); - add->kunmap_ops =3D kcalloc(count, sizeof(add->kunmap_ops[0]), GFP_KERNEL= ); - add->pages =3D kcalloc(count, sizeof(add->pages[0]), GFP_KERNEL); + add->grants =3D kvcalloc(count, sizeof(add->grants[0]), GFP_KERNEL); + add->map_ops =3D kvcalloc(count, sizeof(add->map_ops[0]), GFP_KERNEL); + add->unmap_ops =3D kvcalloc(count, sizeof(add->unmap_ops[0]), GFP_KERNEL); + add->kmap_ops =3D kvcalloc(count, sizeof(add->kmap_ops[0]), GFP_KERNEL); + add->kunmap_ops =3D kvcalloc(count, sizeof(add->kunmap_ops[0]), GFP_KERNE= L); + add->pages =3D kvcalloc(count, sizeof(add->pages[0]), GFP_KERNEL); if (NULL =3D=3D add->grants || NULL =3D=3D add->map_ops || NULL =3D=3D add->unmap_ops || @@ -160,8 +160,8 @@ struct gntdev_grant_map *gntdev_alloc_map(struct gntdev= _priv *priv, int count, if (dma_flags & (GNTDEV_DMA_FLAG_WC | GNTDEV_DMA_FLAG_COHERENT)) { struct gnttab_dma_alloc_args args; =20 - add->frames =3D kcalloc(count, sizeof(add->frames[0]), - GFP_KERNEL); + add->frames =3D kvcalloc(count, sizeof(add->frames[0]), + GFP_KERNEL); if (!add->frames) goto err; =20 --=20 2.16.4 _______________________________________________ Xen-devel mailing list Xen-devel@lists.xenproject.org https://lists.xenproject.org/mailman/listinfo/xen-devel