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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0320DC6FD1F for ; Tue, 19 Mar 2024 17:26:30 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5AB976B0085; Tue, 19 Mar 2024 13:26:30 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 55B186B0088; Tue, 19 Mar 2024 13:26:30 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3FF0E6B0089; Tue, 19 Mar 2024 13:26:30 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 30C706B0085 for ; Tue, 19 Mar 2024 13:26:30 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id ABB97C0A07 for ; Tue, 19 Mar 2024 17:26:29 +0000 (UTC) X-FDA: 81914467698.15.134EF48 Received: from mail-pf1-f194.google.com (mail-pf1-f194.google.com [209.85.210.194]) by imf28.hostedemail.com (Postfix) with ESMTP id B1BEBC0015 for ; Tue, 19 Mar 2024 17:26:27 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=RUjYyyBl; spf=pass (imf28.hostedemail.com: domain of gourry.memverge@gmail.com designates 209.85.210.194 as permitted sender) smtp.mailfrom=gourry.memverge@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1710869187; 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=mICNFxVbuAWoATTcVLf7/7w/j3oPrAjNRgOFqEMU8tA=; b=Clody6BtkEqiRxuMvx97rX+Wc/x913lr+czR34PAob8cOV5g8v9OWec58dFPgngfQn/YeL wDKK8eo3qpuWXUKkwFJu7eJEmtHLMbf7xNeNjyR8fhGAJumoGb3Lrncdk2IYf7LkAYuYek ETvHLRWiuLURCy/AHyfQEXNvYfIMC74= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1710869187; a=rsa-sha256; cv=none; b=pVDsG8Hg9JmexTIkyLrr8zB0d5Tnvl4WSwxyESJX69NlnTM2mAlyx4E1APcaYb5ZQWjnSy g7+/4eE6PtIevAtvQF1WpyVBtEWdhIXt8JhAcVLe0MMrLZ+9n6acWkEAo9Z70V2YC5gQZ7 5q7bgg5wfGnYibwDctOasua7DqvQa1U= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=RUjYyyBl; spf=pass (imf28.hostedemail.com: domain of gourry.memverge@gmail.com designates 209.85.210.194 as permitted sender) smtp.mailfrom=gourry.memverge@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-pf1-f194.google.com with SMTP id d2e1a72fcca58-6e6c0098328so4786291b3a.3 for ; Tue, 19 Mar 2024 10:26:27 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1710869186; x=1711473986; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=mICNFxVbuAWoATTcVLf7/7w/j3oPrAjNRgOFqEMU8tA=; b=RUjYyyBl0owBpwn0hTHlSlzqatEvMn6UuSMs3UIScHbjpBkvRv1P6EWsXa3JhMn/qp ai2tuXkrpqXHPviP0M52r5wCHWUBQUKCGZ1FS809ocWzUqgByzbJjxB/UBtsFXg0ZScZ MM0x+8R3mnAnYIwNnXaXnd3gO4NykjEgSKdroJXiQa4SSqwaazPL5HgAQAsW0BieBlnY ExTIAoiz7kB56RbufwJgR3HLJIDcMgDTUTYqddtcoAUAhnkeSFEKjFRza2bPWhi3qru9 3fjkmzDSKDki6VjXolie5MIr9yxHvD9tXT9X+DTGNsZkGx2VrZ8KzAPKdYsbDAj6xFr3 E3IQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1710869186; x=1711473986; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=mICNFxVbuAWoATTcVLf7/7w/j3oPrAjNRgOFqEMU8tA=; b=MxAeZo1YbKb9H0Vrbfmuicae3U3n9oV0brH/KChN1tGvCb6I1o5APei1jxQOHixhIa DnLhjiof1wHeUaWVUyAfhTvPWd+FwbFibjeVxp0RQuLTaBGDntux2umY9pk7YOL8n6/b AMEnko35cDiQV32Dzv09J8MJbPyyjzxpNasK81Cz3l29TxW6aTUhuQssQ/2cAK0OYi3H mqQIQEhUtM76c2SZrwMh8CXqNJAzdqjsr1rLmLfwbLuQjuCxv7zqkfMNMDqyKYEI4INw LgVfsUMwbz6RXtQjzxJxa9dKYZKhk5XCC0HTxYPq9NVr1uKpeWlHtmCoRwtVie8fKHO3 i7mg== X-Gm-Message-State: AOJu0YzkiJrLJD1JOEAR0niRYKIZ8zZUgNvF2ZN/8EUXgLUUoZNVpqzO Cp7T27bo5hrnMZyXx8vd3OYCKahyBXqixzqiDp8FGys8U3cchxLWLDOo+OzIvQ== X-Google-Smtp-Source: AGHT+IEkv9g+J0IjH2Wlhic/LwJ5mFDbtJLCc/rqi59tk5VwUYFC/wW8XfNIU6Pv1Kca1IuACtmZRQ== X-Received: by 2002:a05:6a00:99c:b0:6e6:976d:7f53 with SMTP id u28-20020a056a00099c00b006e6976d7f53mr3783163pfg.16.1710869186329; Tue, 19 Mar 2024 10:26:26 -0700 (PDT) Received: from fedora.mshome.net (pool-173-79-56-208.washdc.fios.verizon.net. [173.79.56.208]) by smtp.gmail.com with ESMTPSA id i20-20020aa787d4000000b006e57247f4e5sm10038173pfo.8.2024.03.19.10.26.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 19 Mar 2024 10:26:26 -0700 (PDT) From: Gregory Price X-Google-Original-From: Gregory Price To: linux-mm@kvack.org Cc: linux-api@vger.kernel.org, linux-arch@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-kernel@vger.kernel.org, ying.huang@intel.com, dan.j.williams@intel.com, honggyu.kim@sk.com, corbet@lwn.net, arnd@arndb.de, luto@kernel.org, akpm@linux-foundation.org, shuah@kernel.org, Gregory Price Subject: [RFC v3 3/3] ktest: sys_move_phys_pages ktest Date: Tue, 19 Mar 2024 13:26:09 -0400 Message-Id: <20240319172609.332900-4-gregory.price@memverge.com> X-Mailer: git-send-email 2.39.1 In-Reply-To: <20240319172609.332900-1-gregory.price@memverge.com> References: <20240319172609.332900-1-gregory.price@memverge.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Stat-Signature: fjaockr83d9japjkattyp789ohfag491 X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: B1BEBC0015 X-Rspam-User: X-HE-Tag: 1710869187-929714 X-HE-Meta: U2FsdGVkX19qz9zq7BRc4dNnti0V9Pf0ZjhK8RJporMU6dGVUyKTqHI7A+iwJ7eShG73CVTK3MCMA1OtSgJRkgMZNwAzogyVVAVcOpokHC6e8ALtQzjKmrgcQ6fgA6G1ihAkD2xJ24khj+y17YQSLtesWgsxleHCBzBi49CURewG7omxUUAQV+LDsVnOSpV4ZDKTPhN76EsZevCAAdaSYwaO+GpmXp4QH6OhkagahrdjbNEdErs09ibOVjasi9sUczivsix7gl967mFyyrKA7Y9ODDiRviu9+/nj+K6CWVPHo7ubW3IpyUCrbJExD+ghabvC8uC0ZNjejbtdeaVx64vFKGuwZt4V5o9DVDCNnBzJjcFjf/+lXR2hqf9CgtYOZqMc6qhRx6LThzEpUWWQUUFokYlst6ZxX77V0mbJjZhwAlxEVH2g0ssB7imqdkRlwjF+ub/QWkSQFELhYcBjK+xfR7jaxM08zYuDBvvODXpsbrdL7ta5iSDF6PEzghuGKMRQ2YGTw/D2lgy3/Uegsp3Fe/IW48y8wgNVBAHLuMtp8vbu8P8xFEtM88xsOPRU1FcXZS3JAlVg8ihsjCdvMBY7+L5n9aFY6U5PP7mV1w5DQoA3C+Oy+Pqs42OXjHPnXJU5f7jtVBF/9h+hP0Bw5H8Yfxkm5WZ3/nSQCj5t0hCn+o2XIytnKP53qxEWDYwaVNdR9CZpkunKGPWjyHs/PfAgKEiDJ2n87k8V/FO5R53E/lsZ4eeNj5sQBPC/aPAOCE2WmQAQx/WdvSarxMxVMrHdXkabT2T8CAohYppasiD7vEHjN5doibJ6isGMY7JqbL0/6LR72bdnkG0tr371WBG8Q5PCeRVgBF5nPnOj4btP8CBtIC2G2CmoEMhCC7YrJaDWD4mawk16a5KMVz+u6wbspzSE5/lGl7uTmvINO7QAXgdQPsuWxzyqmN+FxrLsbZACgB17zsY+XzfvpGD 3XZKYHbm H0U82lz+YS2SWTtntvqbmrUkZ1kCwiQsGPQ6DYFn5fjNIVTb4UHV7hN7ADilz5oaztkrkFnCEhB7InRzubMnxcAgneR8ewx4gVlAFZHwzwmu4pa9CTmBZTYDFn7m81PtyGmk8ptE6yM7/MFgRGbR2JVVXPFDrWOA6niJTiyyqO//Y9XUghvjWA5xpqH+lmJh6Ur0sruv3U7zheWntvzAAID/B9jIhrW+98vVpyleuxH0VIMhB8GKZLAC0L1VH4PaafBEnPuoUkOSOIg+9GZYElprvMLcoUdA4+0zFTU/4o/ZbGIUCe8iuRd/e3fsfKWh2gSUyoqpOZ86hRHuaM42QqMfJFXD6HJK5+9yxg+Arb2dCLTNYkGUUtDurFNB2JyW/fDqUdgRmGl+zKE2Q+9kveFbbGtGKHC4aT07wbs6+AvP6iw0mzERpr2S1ZPJwQq6PKCRcErKY8V1ce57fODN2RTm2E1PUDolu3CCj9G1U1lN0XRer5o4i6sD/h03CbS9KbC1Up0L192AmTJM= 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: List-Subscribe: List-Unsubscribe: Implement simple ktest that looks up the physical address via /proc/self/pagemap and migrates the page based on that information. Signed-off-by: Gregory Price --- tools/testing/selftests/mm/migration.c | 99 ++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/tools/testing/selftests/mm/migration.c b/tools/testing/selftests/mm/migration.c index 6908569ef406..c005c98dbdc1 100644 --- a/tools/testing/selftests/mm/migration.c +++ b/tools/testing/selftests/mm/migration.c @@ -5,6 +5,8 @@ */ #include "../kselftest_harness.h" +#include +#include #include #include #include @@ -14,11 +16,17 @@ #include #include #include +#include #define TWOMEG (2<<20) #define RUNTIME (20) +#define GET_BIT(X, Y) ((X & ((uint64_t)1<> Y) +#define GET_PFN(X) (X & 0x7FFFFFFFFFFFFFull) #define ALIGN(x, a) (((x) + (a - 1)) & (~((a) - 1))) +#define PAGEMAP_ENTRY 8 +const int __endian_bit = 1; +#define is_bigendian() ((*(char *)&__endian_bit) == 0) FIXTURE(migration) { @@ -94,6 +102,45 @@ int migrate(uint64_t *ptr, int n1, int n2) return 0; } +int migrate_phys(uint64_t paddr, int n1, int n2) +{ + int ret, tmp; + int status = 0; + struct timespec ts1, ts2; + + if (clock_gettime(CLOCK_MONOTONIC, &ts1)) + return -1; + + while (1) { + if (clock_gettime(CLOCK_MONOTONIC, &ts2)) + return -1; + + if (ts2.tv_sec - ts1.tv_sec >= RUNTIME) + return 0; + + /* + * FIXME: move_phys_pages was syscall 462 during RFC. + * Update this when an official syscall number is adopted + * and the libnuma interface is implemented. + */ + ret = syscall(462, 1, (void **) &paddr, &n2, &status, + MPOL_MF_MOVE_ALL); + if (ret) { + if (ret > 0) + printf("Didn't migrate %d pages\n", ret); + else + perror("Couldn't migrate pages"); + return -2; + } + + tmp = n2; + n2 = n1; + n1 = tmp; + } + + return 0; +} + void *access_mem(void *ptr) { volatile uint64_t y = 0; @@ -199,4 +246,56 @@ TEST_F_TIMEOUT(migration, private_anon_thp, 2*RUNTIME) ASSERT_EQ(pthread_cancel(self->threads[i]), 0); } +/* + * Same as the basic migration, but test move_phys_pages. + */ +TEST_F_TIMEOUT(migration, phys_addr, 2*RUNTIME) +{ + uint64_t *ptr; + uint64_t pagemap_val, paddr, file_offset; + unsigned char c_buf[PAGEMAP_ENTRY]; + int i, c, status; + FILE *f; + + if (self->nthreads < 2 || self->n1 < 0 || self->n2 < 0) + SKIP(return, "Not enough threads or NUMA nodes available"); + + ptr = mmap(NULL, TWOMEG, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + ASSERT_NE(ptr, MAP_FAILED); + + memset(ptr, 0xde, TWOMEG); + + /* PFN of ptr from /proc/self/pagemap */ + f = fopen("/proc/self/pagemap", "rb"); + file_offset = ((uint64_t)ptr) / getpagesize() * PAGEMAP_ENTRY; + status = fseek(f, file_offset, SEEK_SET); + ASSERT_EQ(status, 0); + for (i = 0; i < PAGEMAP_ENTRY; i++) { + c = getc(f); + ASSERT_NE(c, EOF); + /* handle endiand differences */ + if (is_bigendian()) + c_buf[i] = c; + else + c_buf[PAGEMAP_ENTRY - i - 1] = c; + } + fclose(f); + + for (i = 0; i < PAGEMAP_ENTRY; i++) + pagemap_val = (pagemap_val << 8) + c_buf[i]; + + ASSERT_TRUE(GET_BIT(pagemap_val, 63)); + /* This reports a pfn, we need to shift this by page size */ + paddr = GET_PFN(pagemap_val) << __builtin_ctz(getpagesize()); + + for (i = 0; i < self->nthreads - 1; i++) + if (pthread_create(&self->threads[i], NULL, access_mem, ptr)) + perror("Couldn't create thread"); + + ASSERT_EQ(migrate_phys(paddr, self->n1, self->n2), 0); + for (i = 0; i < self->nthreads - 1; i++) + ASSERT_EQ(pthread_cancel(self->threads[i]), 0); +} + TEST_HARNESS_MAIN -- 2.39.1