From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E363FC1B0D8 for ; Mon, 7 Dec 2020 11:35:24 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 586EF23340 for ; Mon, 7 Dec 2020 11:35:24 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 586EF23340 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id E3E6C8D001D; Mon, 7 Dec 2020 06:35:23 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id E14828D0001; Mon, 7 Dec 2020 06:35:23 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D312B8D001D; Mon, 7 Dec 2020 06:35:23 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0187.hostedemail.com [216.40.44.187]) by kanga.kvack.org (Postfix) with ESMTP id BB1EE8D0001 for ; Mon, 7 Dec 2020 06:35:23 -0500 (EST) Received: from smtpin01.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 7F71433CD for ; Mon, 7 Dec 2020 11:35:23 +0000 (UTC) X-FDA: 77566280526.01.hen07_320aa71273de Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin01.hostedemail.com (Postfix) with ESMTP id 5CA2110046469 for ; Mon, 7 Dec 2020 11:35:23 +0000 (UTC) X-HE-Tag: hen07_320aa71273de X-Filterd-Recvd-Size: 9054 Received: from mail-pg1-f194.google.com (mail-pg1-f194.google.com [209.85.215.194]) by imf06.hostedemail.com (Postfix) with ESMTP for ; Mon, 7 Dec 2020 11:35:22 +0000 (UTC) Received: by mail-pg1-f194.google.com with SMTP id e2so317037pgi.5 for ; Mon, 07 Dec 2020 03:35:22 -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 :mime-version:content-transfer-encoding; bh=amXRNC1mfdywzpWrbOff714/vb9YHjvjsXiNQKXcqcA=; b=k6DezM51fJayfcLxJQektp8YJvDSsBbz0aVlfSnHNBt+2Wxn4RS9e6sNgSGv12LZdn fScIMhUj9dLNh7Arm9VHs4vEpVXoSPwObS0+Csb8MMe9MYzmH6dg0lqwqyG6nAde1wOi 34bTopBZUATvrIHVmW1MmgCkKXfJgTCxl5kBjmRFwuXuFss9pzdJv061rMlRT0sR6cvm QdbctetT25eotvN/DrxAcuWPDaSg3ZFzoyaDSMKXEBdg8nUVJsjJWPK3XNCksnNUGHkB SEu+RmRnibNi7ublI6HydqMUjgwWBf6MWZu/qay+0SGsOUxJkYzQEZGovb73STeCAsJh 9Bug== 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:mime-version:content-transfer-encoding; bh=amXRNC1mfdywzpWrbOff714/vb9YHjvjsXiNQKXcqcA=; b=rb7Oxqjzq9vD5i3Hkxr3/ucZncUeLA1Dgs0Zmqd6Lzy4OAWdtasKQuNimC9cQMelVS tXWbhpuGJAqZV9ZKpJTW27Dx2qC8vb2okQh7ewhMu83zI2DL8V7eXWZH+gjtSH3h8tvn 7HNAU6FLzU5yVooBU+ap1YweHsiUC26b6WmsyeT3BEWMrBh2t5qLe1ZdoceG0gyfm3wG rbEKaIMMuOIWOlQ0IfkpYq/MUYzgm3ZsEVyXyBg5PqoIyZuDKWSZASrtU+TG0G+X3avX VYSKIunfgdsR/vqrfbmYspM4DIYTRXMLLJ2srCyCl+23mLJ1mgSKMFcBqP4jiZXMDm7G IMXQ== X-Gm-Message-State: AOAM532BTZXkUn7DIGAFIvLa2eWJGSRgywO7NiDnIG6rg9hTi2bbiwde d7d556wNfktFFb3Gg7rqHwi49u+saf0= X-Google-Smtp-Source: ABdhPJzktfbAut0a4U/9/77Kk3IPuy2wYdqsh6ukZ0LN08xk9L3dyRMq6PVyY4Nz0UXg4U/HCNjWVQ== X-Received: by 2002:a17:902:b101:b029:da:c50e:cd56 with SMTP id q1-20020a170902b101b02900dac50ecd56mr15820085plr.59.1607340921829; Mon, 07 Dec 2020 03:35:21 -0800 (PST) Received: from localhost.localdomain ([203.205.141.39]) by smtp.gmail.com with ESMTPSA id d4sm14219822pfo.127.2020.12.07.03.35.18 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Mon, 07 Dec 2020 03:35:21 -0800 (PST) From: yulei.kernel@gmail.com X-Google-Original-From: yuleixzhang@tencent.com To: linux-mm@kvack.org, akpm@linux-foundation.org, linux-fsdevel@vger.kernel.org, kvm@vger.kernel.org, linux-kernel@vger.kernel.org, naoya.horiguchi@nec.com, viro@zeniv.linux.org.uk, pbonzini@redhat.com Cc: joao.m.martins@oracle.com, rdunlap@infradead.org, sean.j.christopherson@intel.com, xiaoguangrong.eric@gmail.com, kernellwp@gmail.com, lihaiwei.kernel@gmail.com, Yulei Zhang , Chen Zhuo Subject: [RFC V2 30/37] dmem: introduce dmem_bitmap_alloc() and dmem_bitmap_free() Date: Mon, 7 Dec 2020 19:31:23 +0800 Message-Id: <6eca6b9b58b3cf9a52c8227ee92d9b926c249f0b.1607332046.git.yuleixzhang@tencent.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable 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: From: Yulei Zhang If dmem contained in dmem region is too large and dmemfs is mounted as 4K pagesize, size of bitmap in this dmem region maybe exceed maximal available memory of kzalloc(). It would cause kzalloc() fail. So introduce dmem_bitmap_alloc() and use vzalloc() if bitmap is larger th= an PAGE_SIZE as vzalloc() will get sparse page. Signed-off-by: Chen Zhuo Signed-off-by: Yulei Zhang --- fs/inode.c | 6 +++++ include/linux/fs.h | 1 + mm/dmem.c | 69 ++++++++++++++++++++++++++++++++++--------------= ------ 3 files changed, 50 insertions(+), 26 deletions(-) diff --git a/fs/inode.c b/fs/inode.c index 9d78c37..9b6363d3 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -210,6 +210,12 @@ int inode_init_always(struct super_block *sb, struct= inode *inode) } EXPORT_SYMBOL(inode_init_always); =20 +struct inode *alloc_inode_nonrcu(void) +{ + return kmem_cache_alloc(inode_cachep, GFP_KERNEL); +} +EXPORT_SYMBOL(alloc_inode_nonrcu); + void free_inode_nonrcu(struct inode *inode) { kmem_cache_free(inode_cachep, inode); diff --git a/include/linux/fs.h b/include/linux/fs.h index 8667d0c..bc7a89c 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -2937,6 +2937,7 @@ static inline bool is_zero_ino(ino_t ino) extern void __destroy_inode(struct inode *); extern struct inode *new_inode_pseudo(struct super_block *sb); extern struct inode *new_inode(struct super_block *sb); +extern struct inode *alloc_inode_nonrcu(void); extern void free_inode_nonrcu(struct inode *inode); extern int should_remove_suid(struct dentry *); extern int file_remove_privs(struct file *); diff --git a/mm/dmem.c b/mm/dmem.c index eb6df70..50cdff9 100644 --- a/mm/dmem.c +++ b/mm/dmem.c @@ -17,6 +17,7 @@ #include #include #include +#include =20 #define CREATE_TRACE_POINTS #include @@ -362,9 +363,38 @@ static int __init dmem_node_init(struct dmem_node *d= node) return 0; } =20 +static unsigned long *dmem_bitmap_alloc(unsigned long pages, + unsigned long *static_bitmap) +{ + unsigned long *bitmap, size; + + size =3D BITS_TO_LONGS(pages) * sizeof(long); + if (size <=3D sizeof(*static_bitmap)) + bitmap =3D static_bitmap; + else if (size <=3D PAGE_SIZE) + bitmap =3D kzalloc(size, GFP_KERNEL); + else + bitmap =3D vzalloc(size); + + return bitmap; +} + +static void dmem_bitmap_free(unsigned long pages, + unsigned long *bitmap, + unsigned long *static_bitmap) +{ + unsigned long size; + + size =3D BITS_TO_LONGS(pages) * sizeof(long); + if (size > PAGE_SIZE) + vfree(bitmap); + else if (bitmap !=3D static_bitmap) + kfree(bitmap); +} + static void __init dmem_region_uinit(struct dmem_region *dregion) { - unsigned long nr_pages, size, *bitmap =3D dregion->error_bitmap; + unsigned long nr_pages, *bitmap =3D dregion->error_bitmap; =20 if (!bitmap) return; @@ -374,9 +404,7 @@ static void __init dmem_region_uinit(struct dmem_regi= on *dregion) =20 WARN_ON(!nr_pages); =20 - size =3D BITS_TO_LONGS(nr_pages) * sizeof(long); - if (size > sizeof(dregion->static_bitmap)) - kfree(bitmap); + dmem_bitmap_free(nr_pages, bitmap, &dregion->static_error_bitmap); dregion->error_bitmap =3D NULL; } =20 @@ -405,19 +433,15 @@ static void __init dmem_uinit(void) =20 static int __init dmem_region_init(struct dmem_region *dregion) { - unsigned long *bitmap, size, nr_pages; + unsigned long *bitmap, nr_pages; =20 nr_pages =3D __phys_to_pfn(dregion->reserved_end_addr) - __phys_to_pfn(dregion->reserved_start_addr); =20 - size =3D BITS_TO_LONGS(nr_pages) * sizeof(long); - if (size <=3D sizeof(dregion->static_error_bitmap)) { - bitmap =3D &dregion->static_error_bitmap; - } else { - bitmap =3D kzalloc(size, GFP_KERNEL); - if (!bitmap) - return -ENOMEM; - } + bitmap =3D dmem_bitmap_alloc(nr_pages, &dregion->static_error_bitmap); + if (!bitmap) + return -ENOMEM; + dregion->error_bitmap =3D bitmap; return 0; } @@ -472,7 +496,7 @@ static int __init dmem_late_init(void) static int dmem_alloc_region_init(struct dmem_region *dregion, unsigned long *dpages) { - unsigned long start, end, *bitmap, size; + unsigned long start, end, *bitmap; =20 start =3D DMEM_PAGE_UP(dregion->reserved_start_addr); end =3D DMEM_PAGE_DOWN(dregion->reserved_end_addr); @@ -481,14 +505,9 @@ static int dmem_alloc_region_init(struct dmem_region= *dregion, if (!*dpages) return 0; =20 - size =3D BITS_TO_LONGS(*dpages) * sizeof(long); - if (size <=3D sizeof(dregion->static_bitmap)) - bitmap =3D &dregion->static_bitmap; - else { - bitmap =3D kzalloc(size, GFP_KERNEL); - if (!bitmap) - return -ENOMEM; - } + bitmap =3D dmem_bitmap_alloc(*dpages, &dregion->static_bitmap); + if (!bitmap) + return -ENOMEM; =20 dregion->bitmap =3D bitmap; dregion->next_free_pos =3D 0; @@ -582,7 +601,7 @@ static void dmem_uinit_check_alloc_bitmap(struct dmem= _region *dregion) =20 static void dmem_alloc_region_uinit(struct dmem_region *dregion) { - unsigned long dpages, size, *bitmap =3D dregion->bitmap; + unsigned long dpages, *bitmap =3D dregion->bitmap; =20 if (!bitmap) return; @@ -592,9 +611,7 @@ static void dmem_alloc_region_uinit(struct dmem_regio= n *dregion) =20 dmem_uinit_check_alloc_bitmap(dregion); =20 - size =3D BITS_TO_LONGS(dpages) * sizeof(long); - if (size > sizeof(dregion->static_bitmap)) - kfree(bitmap); + dmem_bitmap_free(dpages, bitmap, &dregion->static_bitmap); dregion->bitmap =3D NULL; } =20 --=20 1.8.3.1