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 859FBC3271F for ; Thu, 4 Jul 2024 07:10:33 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 131F36B00B5; Thu, 4 Jul 2024 03:10:33 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 0BB906B00B6; Thu, 4 Jul 2024 03:10:33 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id E75F46B00B7; Thu, 4 Jul 2024 03:10:32 -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 C623E6B00B5 for ; Thu, 4 Jul 2024 03:10:32 -0400 (EDT) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 64E33160BF2 for ; Thu, 4 Jul 2024 07:10:32 +0000 (UTC) X-FDA: 82301197104.15.9191F03 Received: from mail-qt1-f170.google.com (mail-qt1-f170.google.com [209.85.160.170]) by imf17.hostedemail.com (Postfix) with ESMTP id A854740021 for ; Thu, 4 Jul 2024 07:10:30 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=OJR6+AyC; spf=pass (imf17.hostedemail.com: domain of davidgow@google.com designates 209.85.160.170 as permitted sender) smtp.mailfrom=davidgow@google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1720077006; 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-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=i1fmrEJmmHrepG+LpUoBgng23KLLDGUaBZc1sSBo6B0=; b=FdYtiPv2v6PXuYrbfCHODct/oZWPKPcZ0m9n19/ggKJ8NPX/ASGQS6rD+BczPRevTi2B7K ZEaR2eoadj09gV7gXkkcqHmkeEUJ8fGHa7oIymMUtQC4m+rDQCaJQbL7lny7plPRaQk55f +pxJDo8DR2evsVQPc2/aT2hpRf2qsZ8= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1720077006; a=rsa-sha256; cv=none; b=V1ttvKElaF3oJnyuFMG6syMwEvcahXP5YmLr1W1nGFpuhFNus6DcZfQV/4UXynhr7Lkf0e mNF8TQZzQS8y363AEJobUlwyaPki1TDAGbUrKqzg9SjiK3oty45rLfB7oQuihwWColTSAr b3Jw3ifcqy3QLKNKkZO8mbQ4h4PTVx8= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=OJR6+AyC; spf=pass (imf17.hostedemail.com: domain of davidgow@google.com designates 209.85.160.170 as permitted sender) smtp.mailfrom=davidgow@google.com; dmarc=pass (policy=reject) header.from=google.com Received: by mail-qt1-f170.google.com with SMTP id d75a77b69052e-447bee1aef5so180651cf.1 for ; Thu, 04 Jul 2024 00:10:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1720077030; x=1720681830; darn=kvack.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=i1fmrEJmmHrepG+LpUoBgng23KLLDGUaBZc1sSBo6B0=; b=OJR6+AyC3891ImB5qPz6/k38eL8C5+Tg/doGtzCQsx7y1KobKtdDwe3OkRrZC87UD4 SNwGhJX6OlXMylkg07z3I2I00f/THI1ec7pKOJAq6iOOtFuv/ReAEf7OnE6YGckj5EwO J9Kb7mZXTyB9p5gskn8OsxuQ1r3811IyJYsUMwA3fWPWXHy8qx6ru7dOB2TDhrc9tYW6 91pYpIf/gmsLs2ZwlG10yCOqvn2L8+vBCac7RXDXyQeWn8Nn8izcCZticHXKSvsQl4FJ 8rAymgmg2QdCJY65D78BBHYeDQ/mn7YR0r/keySgHTQNOr97MpUrpyq41JBvqTuX72fV B1vg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1720077030; x=1720681830; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=i1fmrEJmmHrepG+LpUoBgng23KLLDGUaBZc1sSBo6B0=; b=VNQA792dM/jqGFX8wG/3GuFlVf2JSZRp1UiPit2PMaHKLsLTRTgJSWZQDNTouu759V 9zLmgeReIT81fdd9QALk/8RZaU6SXl2/+rV5sY4+HXtm5qmXG+9H+FMs/rnQUpw64IQU xyC168AAMEDlOJAB3FEn3QJ8E7Gkkrx0Qhsqe69jTC6M3Oa1bqQG0psKqxjEGitaQjkn GbvpcooTR3pDRVlVsDRdcMMflc8dGTzL6a4HB6Q4MBQqUCq9KD64mZfNuF7EAxDKzQZQ qSVJDOJ+J9q0wcoPHWp70tR98iGWpjGbRofHNd30Op5kk76FiZS/uPnjagBNsbJ0A3IP hONA== X-Forwarded-Encrypted: i=1; AJvYcCWim/7boHbWZeaNCsw1JDxnAgujBLBZULkDXleCEyHbVMRcEeRe1deUAD2zp7/C+gkos1+eGUBsFWijWpiRgBqvaRc= X-Gm-Message-State: AOJu0YyKck6c8qHTXGamFNP9F+9DDGnLcr/Mapv34j0UeNKsF+hWAIUO 8lj/LJRZil6G5r4943hcIlECeIOBSi1AZ1KV1p6hLb6ptzt4HloFaNReyripCMvQ866JdjizSy5 8r/eyByUDD6nNXP5gdtWEeWXlhScwj/LoaDPN X-Google-Smtp-Source: AGHT+IFvuRzd63Pu6wp4YjsjI4rrjnpAGKl7fdaYiicdv0lxlQM8WTpWdWOgF4fksHss6qgvj8OcH9/AJ3AK6OWFCoA= X-Received: by 2002:a05:622a:448b:b0:444:f66a:c199 with SMTP id d75a77b69052e-447c9044f60mr1830111cf.26.1720077029463; Thu, 04 Jul 2024 00:10:29 -0700 (PDT) MIME-Version: 1.0 References: <1a41caa5-561e-415f-85f3-01b52b233506@lucifer.local> <20240703225636.90190-1-sj@kernel.org> In-Reply-To: <20240703225636.90190-1-sj@kernel.org> From: David Gow Date: Thu, 4 Jul 2024 15:10:16 +0800 Message-ID: Subject: Re: [PATCH 0/7] Make core VMA operations internal and testable To: SeongJae Park Cc: Lorenzo Stoakes , Andrew Morton , linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, "Liam R . Howlett" , Vlastimil Babka , Matthew Wilcox , Alexander Viro , Christian Brauner , Jan Kara , Eric Biederman , Kees Cook , Suren Baghdasaryan , Shuah Khan , Brendan Higgins , Rae Moar Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; boundary="0000000000005cd41d061c66a404" X-Rspam-User: X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: A854740021 X-Stat-Signature: a34d8u9a17qozdm64yqqi6xjashyo4da X-HE-Tag: 1720077030-50361 X-HE-Meta: U2FsdGVkX19XgrRenRckWf1PaJWLs3OiDE/Aeglr8LKjcErKKbnTjYbGyDNNA61it/9H54D+p2Uma4+F/giooUF6jdGIXERe/Xw31Sa/v+pZXok2icKVZB6gRWItZJrxA4DYaePSixGS8k1tMaRkHoryqZNfyEvMTdpz4n63VvCTRG4ECf9Mt++Dmix1yyrzgih2PcKAPHYVC4KMcipwuWdqjFDV2CJNvVP597saWPh9PjvvjYj/TKpQDsstMpSz5+k8WZGcbV4P7WlozAGnj63kipwBdEk4buA/EL9+0cd4xFvdKrdqfxJV28tEIVKLlEAN1hn5DWcugqqYvKAhcCk8x3DqBI6y+I0j6Fllfbe0usi5riq6G9+LKdd13fz02br+SGqDdDx45UWQTMOvxx/ZQc+yR+vp/kK2QM6nG7E4W03NR22SigCDvtPd1TtqdRcKIhXmaGJKvfL3ajEK/bm2cOzd6xcuRnTnkjAoom9jDcyKIj7OXU3mGQm8fIdY4nruZdiP8kNGUIh3b0aEiVtvMXIl2XpJ8f4JtUCQoTxbJY5NEkXXHQ9xNuPAU8J541sz7b9F6qe1kFuKNc95YdcKITLYa8+U6vEFpbxD2ZEWfiYtQsEqdokOn+OKuxX4Ou28agByokXd08w2P4w/JswpjM2TJPY6mfWgi/ppgxwCyPNnrETmrOI1rKfrlCyR2jYJnzw0wFUZx9c0TmvuASyVejtHFYCYpHKXpmaFnXSjxtjKL4gWshh5OjdsNk6te9G8Wo3CFDiOOfi4KskTzjHXInaaTgxvAyvNa5CqyKGvya5rI66ik0J/pJA+QCHT2sLW8S6RNn21k6DIqValu8fDYLcNB58Z4pawSOtUYDKs4ODz2O0cwDwJb6rtXqkxiXZ8ZM35Qpvgx+9LeC8HR9fcBbEGCyFb4/NpjgOiQ1EK4N2q0glWP0aqJqt+U8ahFjbjskzSor8A4v0Ms9i rMkPmRXs POVfcotdeGKgXK+sTkZYDg+O3M36Ck/NSW4011cpwTQntqRaN5yxf/AC33ZexU9gCOx7r9kDXtgVgUcompOFk14E2klgT8Ti+KkKCwekGR0OExIfJbGW3CbmKymdcjNkN4/GSwENoltsZXb4LynFO/66wOY5MRO2rLGHU3acS4C2m8XitGlSv4IKpXIDknCXCOSiEhco6Y/zDtwJoIF0fn1JNq6BUS3GnU3ULhWENaL+zFRKePuXL9NlSllCi2ACXbplua6pG0KeQM2ujEsXNeq7H9Y8wJe0x/Vtmewx28c0CKyI4MO5HXxio/D+rXsWx1fT/4exmkmtVOHlHCym702PStD/RnwPZDUl8KTVUog8j1jhFXcU+vu/nl63OC1r/115JfkgdwyY15d1/1GmwZdEokDw75/w/1JFcX2YohJIjusjzSIYXZoaGiLmJD+68KY2D 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: --0000000000005cd41d061c66a404 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Thanks, SJ. While I'd love to have the VMA tests be KUnit tests (and there are several advantages, particularly for tooling and automation), I do think the more self-contained userspace tests are great in circumstances like this where the code is self-contained enough to make it possible. Ideally, we'd have some standards and helpers to make these consistent =E2=80=94 kselftest and KUnit are both not quite perf= ect for this case =E2=80=94 but I don't think we should hold up a useful set of changes so we can write a whole new framework. (Personally, I think a userspace implementation of a subset of KUnit or a KUnit-like API would be useful, see below.) On Thu, 4 Jul 2024 at 06:56, SeongJae Park wrote: > > On Wed, 3 Jul 2024 21:33:00 +0100 Lorenzo Stoakes wrote: > > > On Wed, Jul 03, 2024 at 01:26:53PM GMT, Andrew Morton wrote: > > > On Wed, 3 Jul 2024 12:57:31 +0100 Lorenzo Stoakes wrote: > > > [... snip ...] > Also, I haven't had enough time to read the patches in detail but just th= e > cover letter a little bit. My humble impression from that is that this m= ight > better to eventually be kunit tests. I know there was a discussion with = Kees > on RFC v1 [1] which you kindly explained why you decide to implement this= in > user space. To my understanding, at least some of the problems are not r= eal > problems. For two things as examples, > > 1. I understand that you concern the test speed [2]. I think Kunit could= be > slower than the dedicated user space tests, but to my experience, it's no= t that > bad when using the default UML-based execution. KUnit/UML can be quite fast, but I do agree that a totally isolated test will be faster. > 2. My next humble undrestanding is that you want to test functions that y= ou > don't want to export [2,3] to kernel modules. To my understanding it's n= ot > limited on Kunit. I'm testing such DAMON functions using KUnit by includ= ing > test code in the c file but protecting it via a config. For an example, = please > refer to DAMON_KUNIT_TEST. > > I understand above are only small parts of the reason for your decision, = and > some of those would really unsupported by Kunit. In the case, I think ad= ding > this user space tests as is is good. Nonetheless, I think it would be go= od to > hear some comments from Kunit developers. IMHO, letting them know the > limitations will hopefully help setting their future TODO items. Cc-ing > Brendan, David and Rae for that. There are a few different ways of working around this, including the '#include the source' method, and conditionally exporting symbols to a separate namespace (e.g., using VISIBLE_IF_KUNIT and EXPORT_SYMBOL_IF_KUNIT()). Obviously, it's always going to be slightly nasty, but I don't think KUnit will fundamentally be uglier than any other similar hack. > > To recap, I have no strong opinions about this patch, but I think knowing= how > Selftests and KUnit developers think could be helpful. > > More generally, we've seen quite a few cases where we want to compile a small chunk of kernel code and some tests as a userspace binary, for a few different reasons, including: - Improved speed/debuggability from being a "normal" userspace binary - The desire to test userspace code which lives in the kernel tree (e.g., the perf tool) - Smaller reproducable test cases to give to other parties (e.g., compiler developers) So I think there's definitely a case for having these sorts of tests, it'd just be nice to be as consistent as we can. There are a few existing patches out there (most recently [1]) which implement a subset of the KUnit API in userspace, which has the twin advantages of making test code more consistent overall, and allowing some tests to be available both as KUnit tests and separate userspace tests (so we get the best of both worlds). Having a standard 'userspace kunit' implementation is definitely something I've thought about before, so I'll probably play around with that when I get some time. Otherwise, if Shuah's okay with it, having these userspace tests be selftests seems at the very least an appropriate stopgap measure, which gets us some tooling and CI. I've always thought of selftests as "testing the running kernel", rather than the tree under test, but as long as it's clear that this is happening, there's no technical reason to avoid it,. Cheers, -- David [1]: https://lore.kernel.org/all/20240625211803.2750563-5-willy@infradead.o= rg/ --0000000000005cd41d061c66a404 Content-Type: application/pkcs7-signature; name="smime.p7s" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="smime.p7s" Content-Description: S/MIME Cryptographic Signature MIIPqgYJKoZIhvcNAQcCoIIPmzCCD5cCAQExDzANBglghkgBZQMEAgEFADALBgkqhkiG9w0BBwGg gg0EMIIEtjCCA56gAwIBAgIQeAMYYHb81ngUVR0WyMTzqzANBgkqhkiG9w0BAQsFADBMMSAwHgYD VQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UE AxMKR2xvYmFsU2lnbjAeFw0yMDA3MjgwMDAwMDBaFw0yOTAzMTgwMDAwMDBaMFQxCzAJBgNVBAYT AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSowKAYDVQQDEyFHbG9iYWxTaWduIEF0bGFz IFIzIFNNSU1FIENBIDIwMjAwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvLe9xPU9W dpiHLAvX7kFnaFZPuJLey7LYaMO8P/xSngB9IN73mVc7YiLov12Fekdtn5kL8PjmDBEvTYmWsuQS 6VBo3vdlqqXZ0M9eMkjcKqijrmDRleudEoPDzTumwQ18VB/3I+vbN039HIaRQ5x+NHGiPHVfk6Rx c6KAbYceyeqqfuJEcq23vhTdium/Bf5hHqYUhuJwnBQ+dAUcFndUKMJrth6lHeoifkbw2bv81zxJ I9cvIy516+oUekqiSFGfzAqByv41OrgLV4fLGCDH3yRh1tj7EtV3l2TngqtrDLUs5R+sWIItPa/4 AJXB1Q3nGNl2tNjVpcSn0uJ7aFPbAgMBAAGjggGKMIIBhjAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0l BBYwFAYIKwYBBQUHAwIGCCsGAQUFBwMEMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFHzM CmjXouseLHIb0c1dlW+N+/JjMB8GA1UdIwQYMBaAFI/wS3+oLkUkrk1Q+mOai97i3Ru8MHsGCCsG AQUFBwEBBG8wbTAuBggrBgEFBQcwAYYiaHR0cDovL29jc3AyLmdsb2JhbHNpZ24uY29tL3Jvb3Ry MzA7BggrBgEFBQcwAoYvaHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNvbS9jYWNlcnQvcm9vdC1y My5jcnQwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9yb290LXIz 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 JEfDtvHU6wy3MSBE3/TrMFcGA1UdIARQME4wCQYHZ4EMAQUBATBBBgkrBgEEAaAyASgwNDAyBggr BgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wDAYDVR0TAQH/ BAIwADCBmgYIKwYBBQUHAQEEgY0wgYowPgYIKwYBBQUHMAGGMmh0dHA6Ly9vY3NwLmdsb2JhbHNp Z24uY29tL2NhL2dzYXRsYXNyM3NtaW1lY2EyMDIwMEgGCCsGAQUFBzAChjxodHRwOi8vc2VjdXJl Lmdsb2JhbHNpZ24uY29tL2NhY2VydC9nc2F0bGFzcjNzbWltZWNhMjAyMC5jcnQwHwYDVR0jBBgw FoAUfMwKaNei6x4schvRzV2Vb4378mMwRgYDVR0fBD8wPTA7oDmgN4Y1aHR0cDovL2NybC5nbG9i YWxzaWduLmNvbS9jYS9nc2F0bGFzcjNzbWltZWNhMjAyMC5jcmwwDQYJKoZIhvcNAQELBQADggEB AGwXYwvLVjByVooZ+uKzQVW2nnClCIizd0jfARuMRTPNAWI2uOBSKoR0T6XWsGsVvX1vBF0FA+a9 DQOd8GYqzEaKOiHDIjq/o455YXkiKhPpxDSIM+7st/OZnlkRbgAyq4rAhAjbZlceKp+1vj0wIvCa 4evQZvJNnJvTb4Vcnqf4Xg2Pl57hSUAgejWvIGAxfiAKG8Zk09I9DNd84hucIS2UIgoRGGWw3eIg GQs0EfiilyTgsH8iMOPqUJ1h4oX9z1FpaiJzfxcvcGG46SCieSFP0USs9aMl7GeERue37kBf14Pd kOYIfx09Pcv/N6lHV6kXlzG0xeUuV3RxtLtszQgxggJqMIICZgIBATBoMFQxCzAJBgNVBAYTAkJF MRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMSowKAYDVQQDEyFHbG9iYWxTaWduIEF0bGFzIFIz IFNNSU1FIENBIDIwMjACEAFsPHWl8lqMEwx3lAnpufYwDQYJYIZIAWUDBAIBBQCggdQwLwYJKoZI hvcNAQkEMSIEILO2dCVvPVz+qtILjt7+iN79ZxGVUffilaCbP4x4tYPgMBgGCSqGSIb3DQEJAzEL BgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTI0MDcwNDA3MTAzMFowaQYJKoZIhvcNAQkPMVww WjALBglghkgBZQMEASowCwYJYIZIAWUDBAEWMAsGCWCGSAFlAwQBAjAKBggqhkiG9w0DBzALBgkq hkiG9w0BAQowCwYJKoZIhvcNAQEHMAsGCWCGSAFlAwQCATANBgkqhkiG9w0BAQEFAASCAQAMavB4 1h5njIvmCiQ3Klrc3pzEWAIPuuUs+zmjwqdFDNeOKmlaswHb4/b5E88QEM21YtWdRgKFTMfB1ZVn wWFaeBrx69k70IxFhHz4Z7PogmAaRdjwSVsUWkxr9vObaKy7s62qMAbJZR+7jxDwNVAtOHkrluDB NzbRFijy3//EjDdyk2akuvhZWy4jTBOC2elMr27Fyq57Fcw7AkD/rKxMjLjTF+2MBoryx6byZQfy r6fcEg6qKbFYZInyNRkbSrOWFcjXbJng98wpDkf9T4K6Gbh0Uo6S1WwW6j/t/oIVPuWNBAGGJYQD ccsFmY4Ha6Q5uezGZ7bg2mGEuBBituGA --0000000000005cd41d061c66a404--