From patchwork Tue Jul 18 08:28:58 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vivek Kasireddy X-Patchwork-Id: 13316892 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 312EDEB64DD for ; Tue, 18 Jul 2023 08:50:34 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id BCC338D0006; Tue, 18 Jul 2023 04:50:33 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id B540F8D0001; Tue, 18 Jul 2023 04:50:33 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9A69C8D0006; Tue, 18 Jul 2023 04:50:33 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 8836A8D0001 for ; Tue, 18 Jul 2023 04:50:33 -0400 (EDT) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 562298020E for ; Tue, 18 Jul 2023 08:50:33 +0000 (UTC) X-FDA: 81024111546.23.DBD3DE5 Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by imf21.hostedemail.com (Postfix) with ESMTP id 0E1D81C0012 for ; Tue, 18 Jul 2023 08:50:29 +0000 (UTC) Authentication-Results: imf21.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=dAcmUn1+; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf21.hostedemail.com: domain of vivek.kasireddy@intel.com designates 192.55.52.93 as permitted sender) smtp.mailfrom=vivek.kasireddy@intel.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1689670230; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=mBzz7iuolg7oU1O/8ynhclkvcO661FMmUU3asIkzWhQ=; b=KKq4ZxiNhyXeQdaKzo8U62vNLeTdaBb94jlxuusIJMZUDSnFVqjj1cO4bOsO7fUHIvez8P heo0k0Dxo40H31MxKML8kyncwAlH7YiWg13/RIWeIrFfekQ7zDXdi+3QCmlVOJuiTuCPG+ WzmZWDe3FqR7pfvqe8LsFkaxATlQwo0= ARC-Authentication-Results: i=1; imf21.hostedemail.com; dkim=pass header.d=intel.com header.s=Intel header.b=dAcmUn1+; dmarc=pass (policy=none) header.from=intel.com; spf=pass (imf21.hostedemail.com: domain of vivek.kasireddy@intel.com designates 192.55.52.93 as permitted sender) smtp.mailfrom=vivek.kasireddy@intel.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1689670230; a=rsa-sha256; cv=none; b=CMd0KxbklSE/0wykywbogjv7Ph776Dvq3AQ5Yf1O0daSp86npL16TuX1zwMW8KC3nYYlJr XsW7n65zcGL4TK4HPXdYjn2DPz6jIr4aSHvBh9L8/uQvBexNQv7hSfITPBEm47qq9v8Bto qorEhkziqm2PqTrXFjUXkg25npxHzDc= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1689670230; x=1721206230; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=fMX2BBj+J9tuSKUq1MbJBSXs8cZcPuxmqmzRIg8h3FQ=; b=dAcmUn1+K4tip3mWovmeDgCzqJf1EqIjm3+LbED7LCbyshS6o3gYEr4R 3TSjSIY6Gs/8gDLqQ1iCDKwsIJy/wqf82Gtef7ZQRSRH225IJkhlYX5S6 Q0YH/GaFLsPOnsgabHnK5Rr/DiFPhqj5aGgx8pkcj+oJR55473xTaDOo1 wag0UkzEVz/QuYtnW0hf4I7jZXehhmPAwkBSLytP+9hFSH81XOVV5KrC5 6PA3eit7JJby08a4qieTNi1v1l14GuR12JAf5h+IUdwKh9nNOPrGXG28S 3vpl34flGfQCvN6Qx8me3vn8+Ijff9p8wheycL+X15maysaxvn5RaWbT1 A==; X-IronPort-AV: E=McAfee;i="6600,9927,10774"; a="363616494" X-IronPort-AV: E=Sophos;i="6.01,213,1684825200"; d="scan'208";a="363616494" Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jul 2023 01:50:23 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10774"; a="837205688" X-IronPort-AV: E=Sophos;i="6.01,213,1684825200"; d="scan'208";a="837205688" Received: from vkasired-desk2.fm.intel.com ([10.105.128.127]) by fmsmga002-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jul 2023 01:50:23 -0700 From: Vivek Kasireddy To: dri-devel@lists.freedesktop.org, linux-mm@kvack.org Cc: Vivek Kasireddy , Mike Kravetz , Shuah Khan , David Hildenbrand , Hugh Dickins , Peter Xu , Jason Gunthorpe , Gerd Hoffmann , Dongwon Kim , Junxiao Chang Subject: [RFC v1 3/3] selftests/dma-buf/udmabuf: Add tests for huge pages and FALLOC_FL_PUNCH_HOLE Date: Tue, 18 Jul 2023 01:28:58 -0700 Message-Id: <20230718082858.1570809-4-vivek.kasireddy@intel.com> X-Mailer: git-send-email 2.39.2 In-Reply-To: <20230718082858.1570809-1-vivek.kasireddy@intel.com> References: <20230718082858.1570809-1-vivek.kasireddy@intel.com> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 0E1D81C0012 X-Stat-Signature: 415im6mdrhz9ecred9shyczn4e87c9x6 X-HE-Tag: 1689670229-884281 X-HE-Meta: U2FsdGVkX19ynFVNK2SxIZ4JcXdLmJBlfr/tkDi92x0wRHKwdGnkT3yAZjF3vQLphLQeEPYRNTs2tgw1DRwJwz5BK0DHMcKA+O3WsJJIuzE7/uqslfwPzqnUEtbUK5dNFP7Co8OLdoIG/ifxzP9FlY7KYzAXiuqJKol13oWns8MuVRwH6GEq0Qi+h6MktUA5oeXgkw3z8cJZS9QrY9INNOLjUWXu9cFW0Ry3yu3iO+MORUQaVCAVyo7LH/R9HuFVie9hWWR2rdstnQ1NRCH1xsImqq0wVU7iyO4mNBbi1LyUlMj18JRQqIYLbP/5JgD1GxjmWjJqnZ+N+krTLM/4OwkrzlJUksEXZaxY/+weYP02HCGTavdSyCQ1xDGP5SZSqpH0LixsaejWhi6nKXAne6zDTis7kPjDvipjC//wFczWeDC5XDpz3f2E2Nrn8YrG2SMq+cANPUCh+850+XGvV+FvYWIzYBl7aPXk9NE8IN2JRBD8j3nYoKOClGfV6poWxYm2xXz0QwiRy3oUmrfEsKDiWHngRAoNrCFBPcLe0L4si5yX92KZAtP4Mj4vx5KZ9j7m1dyouNcIZwgVzjQ1oROIR6OqDfgrQx+JbBH8eIOFupfw9mkNEoWNH5FR0S2GvIpapfgW+9GhxIw0mEtKQOWV4Wj5XAgZnBDptOO5vIvm/CK5vVZvJp/gZl+x+eVVVKMyi2TAES1fv+eAr+HCwthR44RtsvcorLeDuyKgTbEVvNX9gpcc+1MMfiyMv6LPUCkjJ5H5nTHtJV0Zip5ptfSkO2XdnI7FFkMWLG5btzlIHmIpsbHThPRqN6cQgse7AfBj3l4wwu4/y4FmyXLEOFFT6TaPPGZW/X1j8izWuIhrvBijLUV/PEWYtf5CTdh31JyOA9Hqqv1dmUrjOep0WPTlUKVLZ9S9mWDE4sFKfhU10614Y+gBzH91cNxgD11Wi7S9e9d+Xv5G/iEOB6z 54aB8wjp fK6VuHHXF29a3c6Rn9YYk4PmDVH4HDJ/cQ38ASKDSsfmH1NiNNbz0gQkSmj0RtrGygq4zVMagpzjMXNlxzr89rMSjL+9dlpLXAIJiOGwnpexZ6OqeljpOcIbeu8KU0P4VLqcsBLw8UuucU27OpnEUESPLGsBW8UHVvual0s59bP3Wq0rRiqpNczEAooKS6O5HeEkodx/zdE7PzWMWMVT6zDFMhzlLtV6uC+W8Iw6ttLL/psNjbxAvUn3tukhHla7EuUiULTEDpl6NxubsttbDEK0/O32TlQImafRLFmAyXbIdKV5j27lF8VrxXHZAZlAg3qdFVus/d2tOkzozdLfZiRFDtF+QQuHoIofMzpvP2JlPGM8= 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: The new tests added in this patch try to mimic the situation that happens when a hole is punched in the memfd associated with Guest RAM that is managed by a VMM such as Qemu. The main goal of these tests is to ensure that the udmabuf driver updates its list of pages when newer Guest writes overlap with the region of the mapping where a hole had been punched previously. Based-on-patch-by: Mike Kravetz Cc: Shuah Khan Cc: David Hildenbrand Cc: Mike Kravetz Cc: Hugh Dickins Cc: Peter Xu Cc: Jason Gunthorpe Cc: Gerd Hoffmann Cc: Dongwon Kim Cc: Junxiao Chang Signed-off-by: Vivek Kasireddy --- .../selftests/drivers/dma-buf/udmabuf.c | 165 +++++++++++++++++- 1 file changed, 161 insertions(+), 4 deletions(-) diff --git a/tools/testing/selftests/drivers/dma-buf/udmabuf.c b/tools/testing/selftests/drivers/dma-buf/udmabuf.c index c812080e304e..bee966444e9e 100644 --- a/tools/testing/selftests/drivers/dma-buf/udmabuf.c +++ b/tools/testing/selftests/drivers/dma-buf/udmabuf.c @@ -9,26 +9,144 @@ #include #include #include +#include #include #include +#include #include #include #define TEST_PREFIX "drivers/dma-buf/udmabuf" #define NUM_PAGES 4 +#define NUM_ENTRIES 4 +#define MEMFD_SIZE 1024 /* in pages */ -static int memfd_create(const char *name, unsigned int flags) +static unsigned int page_size; + +static int create_memfd_with_seals(off64_t size, bool hpage) { - return syscall(__NR_memfd_create, name, flags); + int memfd, ret; + unsigned int flags = MFD_ALLOW_SEALING; + + if (hpage) + flags |= MFD_HUGETLB; + + memfd = memfd_create("udmabuf-test", flags); + if (memfd < 0) { + printf("%s: [skip,no-memfd]\n", TEST_PREFIX); + exit(77); + } + + ret = fcntl(memfd, F_ADD_SEALS, F_SEAL_SHRINK); + if (ret < 0) { + printf("%s: [skip,fcntl-add-seals]\n", TEST_PREFIX); + exit(77); + } + + ret = ftruncate(memfd, size); + if (ret == -1) { + printf("%s: [FAIL,memfd-truncate]\n", TEST_PREFIX); + exit(1); + } + + return memfd; +} + +static int create_udmabuf_list(int devfd, int memfd, off64_t memfd_size) +{ + struct udmabuf_create_list *list; + int ubuf_fd, i; + + list = malloc(sizeof(struct udmabuf_create_list) + + sizeof(struct udmabuf_create_item) * NUM_ENTRIES); + if (!list) { + printf("%s: [FAIL, udmabuf-malloc]\n", TEST_PREFIX); + exit(1); + } + + for (i = 0; i < NUM_ENTRIES; i++) { + list->list[i].memfd = memfd; + list->list[i].offset = i * (memfd_size / NUM_ENTRIES); + list->list[i].size = getpagesize() * NUM_PAGES; + } + + list->count = NUM_ENTRIES; + list->flags = UDMABUF_FLAGS_CLOEXEC; + ubuf_fd = ioctl(devfd, UDMABUF_CREATE_LIST, list); + free(list); + if (ubuf_fd < 0) { + printf("%s: [FAIL, udmabuf-create]\n", TEST_PREFIX); + exit(1); + } + + return ubuf_fd; +} + +static void write_to_memfd(void *addr, off64_t size, char chr) +{ + int i; + + for (i = 0; i < size / page_size; i++) { + *((char *)addr + (i * page_size)) = chr; + } +} + +static void *mmap_fd(int fd, off64_t size) +{ + void *addr; + + addr = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (addr == MAP_FAILED) { + printf("%s: ubuf_fd mmap fail\n", TEST_PREFIX); + exit(1); + } + + return addr; +} + +static void punch_hole(int memfd, int num_pages) +{ + int ret; + + ret = fallocate(memfd, FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE, + 0, page_size * num_pages); + if (ret) { + printf("%s: memfd punch hole failed\n", TEST_PREFIX); + exit(1); + } +} + +static int compare_chunks(void *addr1, void *addr2, off64_t memfd_size) +{ + off64_t off; + int i = 0, j, k = 0, ret = 0; + char char1, char2; + + while (i < NUM_ENTRIES) { + off = i * (memfd_size / NUM_ENTRIES); + for (j = 0; j < NUM_PAGES; j++, k++) { + char1 = *((char *)addr1 + off + (j * getpagesize())); + char2 = *((char *)addr2 + (k * getpagesize())); + if (char1 != char2) { + ret = -1; + goto err; + } + } + i++; + } +err: + munmap(addr1, memfd_size); + munmap(addr2, NUM_ENTRIES * NUM_PAGES * getpagesize()); + return ret; } int main(int argc, char *argv[]) { struct udmabuf_create create; int devfd, memfd, buf, ret; - off_t size; - void *mem; + off64_t size; + void *addr1, *addr2; devfd = open("/dev/udmabuf", O_RDWR); if (devfd < 0) { @@ -90,6 +208,9 @@ int main(int argc, char *argv[]) } /* should work */ + page_size = getpagesize(); + addr1 = mmap_fd(memfd, size); + write_to_memfd(addr1, size, 'a'); create.memfd = memfd; create.offset = 0; create.size = size; @@ -98,6 +219,42 @@ int main(int argc, char *argv[]) printf("%s: [FAIL,test-4]\n", TEST_PREFIX); exit(1); } + munmap(addr1, size); + close(buf); + close(memfd); + + /* should work (punch hole)*/ + size = MEMFD_SIZE * page_size; + memfd = create_memfd_with_seals(size, false); + addr1 = mmap_fd(memfd, size); + write_to_memfd(addr1, size, 'a'); + buf = create_udmabuf_list(devfd, memfd, size); + addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES * getpagesize()); + punch_hole(memfd, MEMFD_SIZE / 3); + write_to_memfd(addr1, size, 'b'); + ret = compare_chunks(addr1, addr2, size); + if (ret < 0) { + printf("%s: [FAIL,test-5]\n", TEST_PREFIX); + exit(1); + } + close(buf); + close(memfd); + + /* should work (huge pages + punch hole)*/ + page_size = getpagesize() * 512; /* 2 MB */ + size = MEMFD_SIZE * page_size; + memfd = create_memfd_with_seals(size, true); + addr1 = mmap_fd(memfd, size); + write_to_memfd(addr1, size, 'a'); + buf = create_udmabuf_list(devfd, memfd, size); + addr2 = mmap_fd(buf, NUM_PAGES * NUM_ENTRIES * getpagesize()); + punch_hole(memfd, MEMFD_SIZE / 3); + write_to_memfd(addr1, size, 'b'); + ret = compare_chunks(addr1, addr2, size); + if (ret < 0) { + printf("%s: [FAIL,test-6]\n", TEST_PREFIX); + exit(1); + } fprintf(stderr, "%s: ok\n", TEST_PREFIX); close(buf);