From patchwork Fri Sep 22 21:11:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Roesch X-Patchwork-Id: 143669 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:172:b0:3f2:4152:657d with SMTP id h50csp5873861vqi; Fri, 22 Sep 2023 14:24:28 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFh5PN90jUl7s3AOp3Mh5DfHrvS08748Tg4oxlVV1la7Ft/7kar2gESdC1Twd9WFBWfNU3J X-Received: by 2002:a17:902:d2d1:b0:1c0:d17a:bfe9 with SMTP id n17-20020a170902d2d100b001c0d17abfe9mr837604plc.46.1695417868181; Fri, 22 Sep 2023 14:24:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695417868; cv=none; d=google.com; s=arc-20160816; b=YmWEMRlxKJeQs7EmsR8YXEn6fq/gnAdcd/eFWOmU3/X7qDPnYH83tIFb57D2pC+oLb 3A8vaGn5BBdP9fsyFRyFUfmBBjaM5umaCCaLLU+wFRgFBLubScpEMt4KmtranA4Rf2d1 14SlyDUGiQtDEYENe8ORfXRtaYaG/ocF9lMdJHKaqVflAw82wJNWDt7XYHok+VqfS/Uh /nm8zezT8QcUoYFzRSh0Rv26M/DOVaLfwXZwOidjImIRhqeA8virCIVrWltgXFT7FBv+ zGTHmKcN2L1aHuZ/WdJp4AMkxtDsaznhhrFoX2e89jV2PUoYQb74mr5QnMuSBefKMtzd Kj0A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=7iTDGizWpIb8FZfB8TU7wmmmnqqKOWotVSPof36YeIg=; fh=trQN94Iqca1GMQF1AkSOofuqg8pe0AKHPTTlJaXdYFw=; b=uE+7jm+lLCAoprpcw2n+RoRXcTFjAQCSvhmSHHNGagH4se4kfq1VNSxa6XQpC9a4+5 oWIjOm4GI1QYDvSE9LnelCQpqUiwFC1qmtrKYc63BdjOMPB2FApJ4D6hoW7roex/gL2Z dCOc+hcsOldhftD6J4MU5D09WR1/CLTXZR+vy03nXX1TuiwIOgFXa8L1m9TFd6fdGk8O 4WDkYtId+2Sm+EUNTsx2T6E3iTPinTD9rTTB7sLbeVazcVU7L3Hl0zJ77jsL/RqXzejw kRIQN9Y2cYnGs4zl3E9/3rMJvcbEb8NBKF2rLcn/kpyRvO/H+7BCbY32OHvvwLkE7ZMT C82Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from howler.vger.email (howler.vger.email. [23.128.96.34]) by mx.google.com with ESMTPS id ka3-20020a170903334300b001bddcd8c6acsi4306103plb.311.2023.09.22.14.24.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Sep 2023 14:24:28 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) client-ip=23.128.96.34; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.34 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id D9266858E8EE; Fri, 22 Sep 2023 14:12:20 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229903AbjIVVMT (ORCPT + 28 others); Fri, 22 Sep 2023 17:12:19 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38980 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229866AbjIVVML (ORCPT ); Fri, 22 Sep 2023 17:12:11 -0400 Received: from 66-220-144-179.mail-mxout.facebook.com (66-220-144-179.mail-mxout.facebook.com [66.220.144.179]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4C5AEFB for ; Fri, 22 Sep 2023 14:12:05 -0700 (PDT) Received: by devbig1114.prn1.facebook.com (Postfix, from userid 425415) id 7D7E9C60DC4C; Fri, 22 Sep 2023 14:11:49 -0700 (PDT) From: Stefan Roesch To: kernel-team@fb.com Cc: shr@devkernel.io, akpm@linux-foundation.org, david@redhat.com, hannes@cmpxchg.org, riel@surriel.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org, Carl Klemm Subject: [PATCH v4 1/2] mm/ksm: support fork/exec for prctl Date: Fri, 22 Sep 2023 14:11:40 -0700 Message-Id: <20230922211141.320789-2-shr@devkernel.io> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20230922211141.320789-1-shr@devkernel.io> References: <20230922211141.320789-1-shr@devkernel.io> MIME-Version: 1.0 X-Spam-Status: No, score=-0.1 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_BLOCKED,RDNS_DYNAMIC,SPF_HELO_PASS,SPF_NEUTRAL, TVD_RCVD_IP autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Fri, 22 Sep 2023 14:12:20 -0700 (PDT) X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1777774486330530305 X-GMAIL-MSGID: 1777774486330530305 Today we have two ways to enable KSM: 1) madvise system call This allows to enable KSM for a memory region for a long time. 2) prctl system call This is a recent addition to enable KSM for the complete process. In addition when a process is forked, the KSM setting is inherited. This change only affects the second case. One of the use cases for (2) was to support the ability to enable KSM for cgroups. This allows systemd to enable KSM for the seed process. By enabling it in the seed process all child processes inherit the setting. This works correctly when the process is forked. However it doesn't support fork/exec workflow. From the previous cover letter: .... Use case 3: With the madvise call sharing opportunities are only enabled for the current process: it is a workload-local decision. A considerable number of sharing opportunities may exist across multiple workloads or jobs (if they are part of the same security domain). Only a higler level entity like a job scheduler or container can know for certain if its running one or more instances of a job. That job scheduler however doesn't have the necessary internal workload knowledge to make targeted madvise calls. .... In addition it can also be a bit surprising that fork keeps the KSM setting and fork/exec does not. Signed-off-by: Stefan Roesch Fixes: d7597f59d1d3 ("mm: add new api to enable ksm per process") Reviewed-by: David Hildenbrand Reported-by: Carl Klemm Tested-by: Carl Klemm --- include/linux/sched/coredump.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/include/linux/sched/coredump.h b/include/linux/sched/coredump.h index 0ee96ea7a0e9..205aa9917394 100644 --- a/include/linux/sched/coredump.h +++ b/include/linux/sched/coredump.h @@ -87,8 +87,11 @@ static inline int get_dumpable(struct mm_struct *mm) #define MMF_DISABLE_THP_MASK (1 << MMF_DISABLE_THP) +#define MMF_VM_MERGE_ANY 29 +#define MMF_VM_MERGE_ANY_MASK (1 << MMF_VM_MERGE_ANY) + #define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK |\ - MMF_DISABLE_THP_MASK | MMF_HAS_MDWE_MASK) + MMF_DISABLE_THP_MASK | MMF_HAS_MDWE_MASK |\ + MMF_VM_MERGE_ANY_MASK) -#define MMF_VM_MERGE_ANY 29 #endif /* _LINUX_SCHED_COREDUMP_H */ From patchwork Fri Sep 22 21:11:41 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Roesch X-Patchwork-Id: 143665 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:172:b0:3f2:4152:657d with SMTP id h50csp5868958vqi; Fri, 22 Sep 2023 14:13:18 -0700 (PDT) X-Google-Smtp-Source: AGHT+IFyPOij9a7ThYJyWawtArpbeHhqFHFMRLIb9tJApcVb75WJcqEz2z9VnAThZ2/rcB+El/a8 X-Received: by 2002:a05:6a20:13d3:b0:155:2359:e28c with SMTP id ho19-20020a056a2013d300b001552359e28cmr744091pzc.9.1695417198338; Fri, 22 Sep 2023 14:13:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695417198; cv=none; d=google.com; s=arc-20160816; b=VPzvQGask3Ct7N38aeAGcX3OLMKlf4liRZ3Pp9R07r5xFzi7kC9DnndsUFrb3b6Wjp LvEqbcrnuTY74R6fzWRM3pBY1A86AVHi4rkW7Jt/q8YrW7Esd8g6Z/02od6+L7vVhXXZ bUZR6oNCGf/Ou/h97UjHdxhn77TeaTlBAMPj/cQmLAfDH5WEVd0uC+ryDxSyUfhWaGSO tJGXvboSVzJLRtYXTY3rjjVfAv9CMnjq3zarmxA9waSfbu47VpIiVlhrk2cuT92UlVzJ QaxFHn5g7CSWVnnwEc1wNAewyEb5XlcYA3YNHYlOfkgsXivx/o4l6Zs3yCXEnw6Q6w22 XHEw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=ivbfTSqiGJDKhzmVN6iFRasV8Zko5oH9CCWYtxUwt+M=; fh=sS+J4OyOC0EcVLWJpS3mBHGeO+0+dYZJ+ImCUfzsrH4=; b=lQAqMjvx6ya5moLmqKpH7XkU/Vj9UhPa0YJkHQWT60RKDR1m01kt1r3RdHvVv+Ywgx gsT4BOc9IzodNQk88NieOLb7ly8X2v0Md/1xiazf00/knc/9KY+LrusNXZoLzzkJCwOE 0OAHjhM0v1Zcj9jQwj/JHRfsaZ+xYZBY0agtmu39kfqHz1ME79115fyrYTcc0oun7buO TdndnhEC7FEKjRiLW/0FfLnOVJfY+1C2ir+vpjcv1efeg6RSzCVPOB9MzBRok3gp9Ygz zAiN2BSTBBZDOqUBrETgsq5q63JSPg6+tubC58V9UjIgSlPE+rLcbCevUScqurHD0TyJ 0N5g== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from pete.vger.email (pete.vger.email. [23.128.96.36]) by mx.google.com with ESMTPS id q3-20020a170902dac300b001b82a4d3ea7si5128945plx.249.2023.09.22.14.13.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Sep 2023 14:13:18 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) client-ip=23.128.96.36; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.36 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by pete.vger.email (Postfix) with ESMTP id CDE938228800; Fri, 22 Sep 2023 14:12:44 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at pete.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229889AbjIVVMR (ORCPT + 28 others); Fri, 22 Sep 2023 17:12:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51274 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229798AbjIVVMK (ORCPT ); Fri, 22 Sep 2023 17:12:10 -0400 Received: from 66-220-144-178.mail-mxout.facebook.com (66-220-144-178.mail-mxout.facebook.com [66.220.144.178]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id CEF8BE8 for ; Fri, 22 Sep 2023 14:12:03 -0700 (PDT) Received: by devbig1114.prn1.facebook.com (Postfix, from userid 425415) id 9BCBFC60DC4E; Fri, 22 Sep 2023 14:11:50 -0700 (PDT) From: Stefan Roesch To: kernel-team@fb.com Cc: shr@devkernel.io, akpm@linux-foundation.org, david@redhat.com, hannes@cmpxchg.org, riel@surriel.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH v4 2/2] mm/ksm: Test case for prctl fork/exec workflow Date: Fri, 22 Sep 2023 14:11:41 -0700 Message-Id: <20230922211141.320789-3-shr@devkernel.io> X-Mailer: git-send-email 2.39.3 In-Reply-To: <20230922211141.320789-1-shr@devkernel.io> References: <20230922211141.320789-1-shr@devkernel.io> MIME-Version: 1.0 X-Spam-Status: No, score=2.8 required=5.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RCVD_IN_SBL_CSS,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on pete.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (pete.vger.email [0.0.0.0]); Fri, 22 Sep 2023 14:12:44 -0700 (PDT) X-Spam-Level: ** X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1777773784225235025 X-GMAIL-MSGID: 1777773784225235025 This adds a new test case to the ksm functional tests to make sure that the KSM setting is inherited by the child process when doing a fork/exec. Signed-off-by: Stefan Roesch Reviewed-by: David Hildenbrand --- .../selftests/mm/ksm_functional_tests.c | 66 ++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/mm/ksm_functional_tests.c b/tools/testing/selftests/mm/ksm_functional_tests.c index 901e950f9138..fbff0dd09191 100644 --- a/tools/testing/selftests/mm/ksm_functional_tests.c +++ b/tools/testing/selftests/mm/ksm_functional_tests.c @@ -26,6 +26,7 @@ #define KiB 1024u #define MiB (1024 * KiB) +#define FORK_EXEC_CHILD_PRG_NAME "ksm_fork_exec_child" static int mem_fd; static int ksm_fd; @@ -479,6 +480,64 @@ static void test_prctl_fork(void) ksft_test_result_pass("PR_SET_MEMORY_MERGE value is inherited\n"); } +static int ksm_fork_exec_child(void) +{ + /* Test if KSM is enabled for the process. */ + return prctl(PR_GET_MEMORY_MERGE, 0, 0, 0, 0) == 1; +} + +static void test_prctl_fork_exec(void) +{ + int ret, status; + pid_t child_pid; + + ksft_print_msg("[RUN] %s\n", __func__); + + ret = prctl(PR_SET_MEMORY_MERGE, 1, 0, 0, 0); + if (ret < 0 && errno == EINVAL) { + ksft_test_result_skip("PR_SET_MEMORY_MERGE not supported\n"); + return; + } else if (ret) { + ksft_test_result_fail("PR_SET_MEMORY_MERGE=1 failed\n"); + return; + } + + child_pid = fork(); + if (child_pid == -1) { + ksft_test_result_skip("fork() failed\n"); + return; + } else if (child_pid == 0) { + char *prg_name = "./ksm_functional_tests"; + char *argv_for_program[] = { prg_name, FORK_EXEC_CHILD_PRG_NAME }; + + execv(prg_name, argv_for_program); + return; + } + + if (waitpid(child_pid, &status, 0) > 0) { + if (WIFEXITED(status)) { + status = WEXITSTATUS(status); + if (status) { + ksft_test_result_fail("KSM not enabled\n"); + return; + } + } else { + ksft_test_result_fail("program didn't terminate normally\n"); + return; + } + } else { + ksft_test_result_fail("waitpid() failed\n"); + return; + } + + if (prctl(PR_SET_MEMORY_MERGE, 0, 0, 0, 0)) { + ksft_test_result_fail("PR_SET_MEMORY_MERGE=0 failed\n"); + return; + } + + ksft_test_result_pass("PR_SET_MEMORY_MERGE value is inherited\n"); +} + static void test_prctl_unmerge(void) { const unsigned int size = 2 * MiB; @@ -536,9 +595,13 @@ static void test_prot_none(void) int main(int argc, char **argv) { - unsigned int tests = 7; + unsigned int tests = 8; int err; + if (argc > 1 && !strcmp(argv[1], FORK_EXEC_CHILD_PRG_NAME)) { + exit(ksm_fork_exec_child() == 1 ? 0 : 1); + } + #ifdef __NR_userfaultfd tests++; #endif @@ -576,6 +639,7 @@ int main(int argc, char **argv) test_prctl(); test_prctl_fork(); + test_prctl_fork_exec(); test_prctl_unmerge(); err = ksft_get_fail_cnt();