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 4D5EDC83F1B for ; Thu, 17 Jul 2025 02:45:11 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B23848D0006; Wed, 16 Jul 2025 22:45:10 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id AD4738D0001; Wed, 16 Jul 2025 22:45:10 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A11558D0006; Wed, 16 Jul 2025 22:45:10 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 927AD8D0001 for ; Wed, 16 Jul 2025 22:45:10 -0400 (EDT) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 2538312DDF9 for ; Thu, 17 Jul 2025 02:45:10 +0000 (UTC) X-FDA: 83672214780.01.748A1EC Received: from mail-ej1-f47.google.com (mail-ej1-f47.google.com [209.85.218.47]) by imf19.hostedemail.com (Postfix) with ESMTP id 1FE8F1A0004 for ; Thu, 17 Jul 2025 02:45:07 +0000 (UTC) Authentication-Results: imf19.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=cmZBd9f0; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf19.hostedemail.com: domain of richard.weiyang@gmail.com designates 209.85.218.47 as permitted sender) smtp.mailfrom=richard.weiyang@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752720308; a=rsa-sha256; cv=none; b=ES1lQzgsPFCaAWflxq93OO5i4JemCxDP3xBfdZl+pb0A7hw559XVH4eORB3AogzjkUxlVf IxWU18IRU+nuQJTolAOyjcnAD8UjESUWk0yumXFE3fnntLTI6NxzvZUlDe2ttF2cQ8R3Sv uvbMcAFuFyXSldUT1b13mVo9GDZZDH0= ARC-Authentication-Results: i=1; imf19.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=cmZBd9f0; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf19.hostedemail.com: domain of richard.weiyang@gmail.com designates 209.85.218.47 as permitted sender) smtp.mailfrom=richard.weiyang@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752720308; h=from:from:sender:reply-to: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=4Ac0k30GIOGlgjmffxCyxBX/ZTb7s4FbPDzMWWgsD64=; b=A0xfv1U9zBGkNuyOz7Evje7aaaj2+2q++p5vAvuEAhllgXj+VhI6pNTE3aCH37nNrd8N+f lm2EyYi0rOs8IgozmCN99UnmtJqJ/IuRyGpv5AJbuUAA7OKlRPpuPJsy4Bo5kg4HDHUcyL DU1Whh+8QgqKwT6bODrE1b0BAHn4/CY= Received: by mail-ej1-f47.google.com with SMTP id a640c23a62f3a-ae0dd7ac1f5so78515966b.2 for ; Wed, 16 Jul 2025 19:45:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1752720306; x=1753325106; darn=kvack.org; h=user-agent:in-reply-to:content-disposition:mime-version:references :reply-to:message-id:subject:cc:to:from:date:from:to:cc:subject:date :message-id:reply-to; bh=4Ac0k30GIOGlgjmffxCyxBX/ZTb7s4FbPDzMWWgsD64=; b=cmZBd9f0qnZtWnG7H77W0ghwVWYTlxcqTjhVbAtsGfvNOKYSa9At67lt4RYdsSB5d/ JDpNGv3SjqDv0m9ZtdaHLPR4TQXsYEUc1MC9S10QU951LPekRlYio1aeRaITw1R9s7mL OXLfBqxpVdMSmWBtczWujIpBsZEP3Q/tWIgK5kQDvt58wg1lS7p3ix0aWrZOMK5xsupz dvwKAFb1iepwy2C1yH1U7n3DxV1OrSLkc7GXcESkafF/vFD9Y5tX7CoL853T5ZvdjlXc hlaDMmQENdY4zbkuNp36CrNmKIcv46Q+24yjLBtLi0TestrX7AuzHOkKH35JZid4Lmni BYdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752720306; x=1753325106; h=user-agent:in-reply-to:content-disposition:mime-version:references :reply-to:message-id:subject:cc:to:from:date:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=4Ac0k30GIOGlgjmffxCyxBX/ZTb7s4FbPDzMWWgsD64=; b=gSMHxMJqTYDIe4HgTOMY89+J0LXGUlKbK/FwYpiPrr1ejTbVPN3CQqGHHYY3zqWkGR ag3IoQyZFATwnvDQjnW1sPFyazKWGuFgxs92JFd8tpwMHyIy8ZdPMjQ74GAHkFkPy7+6 F21fbTT/6FpLYjmIbQUZarLxkelZ2rgPC8X8Qt0dFzA+rlPtPQNmAHNDyld1ivI1qhwk Z0WNxS+TjnrgkkNAuqV+btk7JeuXOFkrGvqiI2/69DW5mIWCj8BtgVchfi5n9C+eHLGn vwfE3YOw/3UQ/9M84DD7v+u0N6YiLY9/TtM0p6JUqwsJ8Bx+eM1hfLdZe7gw+pnlimoA r2iA== X-Forwarded-Encrypted: i=1; AJvYcCXMTCGzJdAv6vvltrVnLnf16Uud8M2oRrLKd8Exrprrt2fCoEiln9GL58js24iAaYuwOxC73dI++g==@kvack.org X-Gm-Message-State: AOJu0Yz43Yp+DVsMe3oztOrCejBPW9SL1DKhXSLA00N+MoNPI+w2eOqE sDjFWv3rrInkMxcHupSRERESYpZvpiTT1h5deQp60PMCd7Xpp6YmD8E1 X-Gm-Gg: ASbGncvAuFJRbUqo7W7eyKax9waKAogtBuacjJB4R5173V49NiObXHu/0ii/kYnDb2X AtK5TSNSUwkz1JB5dTFoUh7Ge1fngmrgT4FE5MkyU3WtR2Vxd1dE10qk3KpbLDsfYi9PiXbi+nF FR7hPGLA4hsynsnhBrt6q5TMygNAMOlIgC1cgCVn3ddcLTEM4/Bv/JKi2cZqoXMVnOZL++7q/j2 BRptOhNwf+rgrFol/lTGubSgAun0tofyXm2ictSwEXRu8Mci/eKcgApK7CEx3Hjl31SKQWg1Om3 Ssgo/R6jvVxwhIFBaBqIorNCMZgzS4Wh8o2GtOFwVBqkmMyuih2L1DIrr87penj6lgXP7ySFz/0 auTqZgTRyHQ1H3Z6CfOfqZg== X-Google-Smtp-Source: AGHT+IEaRJ2jFVIkbyiBAR8RX98a/9ZbeW1Kordz4gC5ghtc8p2eW9fqJSxhX3ZkI5RvEIwBybe6VA== X-Received: by 2002:a17:906:d25f:b0:ae0:d4f2:dff3 with SMTP id a640c23a62f3a-ae9c9bd3985mr487782566b.58.1752720306162; Wed, 16 Jul 2025 19:45:06 -0700 (PDT) Received: from localhost ([185.92.221.13]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ae6e82dede9sm1270277966b.167.2025.07.16.19.45.05 (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Wed, 16 Jul 2025 19:45:05 -0700 (PDT) Date: Thu, 17 Jul 2025 02:45:04 +0000 From: Wei Yang To: David Hildenbrand Cc: Wei Yang , akpm@linux-foundation.org, linux-mm@kvack.org, Lorenzo Stoakes , Rik van Riel , "Liam R . Howlett" , Vlastimil Babka , Harry Yoo Subject: Re: [PATCH 2/3] selftests/mm: put general ksm operation into vm_util Message-ID: <20250717024504.3b4q3i6uuzd4nr2w@master> Reply-To: Wei Yang References: <20250716082710.2801-1-richard.weiyang@gmail.com> <20250716082710.2801-3-richard.weiyang@gmail.com> <5cadce02-cd80-4aa2-a078-6335beeb8a92@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5cadce02-cd80-4aa2-a078-6335beeb8a92@redhat.com> User-Agent: NeoMutt/20170113 (1.7.2) X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 1FE8F1A0004 X-Stat-Signature: w1zqexxtcu6bssaitmjix9p85eo969jm X-Rspam-User: X-HE-Tag: 1752720307-428167 X-HE-Meta: U2FsdGVkX19biHxAnkcUsxGbFaII/0cvEiq1GeVtFowgS0z3ujDxbjJZ1sITY3obB3BIa/wxVfarx6+kQe3aGaBnnPHLQpmArJ5UyZHV81sJhIviGR1Y96B0JO5M6uRmm+9eW3e8jWnWtkvbSgcfvltXWIA1+T1daKF1IFB9tjGnJJZdBvqhHvjSu/GD2HvU6EtnDvfybCWpJW+68pMit/Jk7lXopMU+LDO3UPaqxoMmt8ujqAqr/2yaedPQ7iLei0iIGb6iyCRddihID/JlJCxXC7Ul7zKQ2zwQ4o4ITBL63n2jZ3YYlKt2HRga3cMKhI7SjP/o21aeZfjhdDr22JqJjz974K3vmOVFig1Die3I+OY7kNkiSFmWq40kWifeZVrAUFfPkGBUGAnF8GsceEZYFvnNczoD0ixGZRkQyI0GtwwFGIpSJH1zP8I6LM5Cb2u6m9vmXAAChP4GlSOdmF+6BQ5hYLaZp3AMwUz3PuRgrOzrvduOqwjNnRH0nhUhSj6v0clV1pLf8ZEs55EH3BDZ+/YF3UrFosV8udJAipYLdwAoQfGZFyf+Uhk9k+0/85au2t0g1wzkTvhl5RO6QhCuqP+U2dQNlLW2CkaFyyZC74onhw5fhaW/kH/2pxTakgRWrp3YPM5O8liBWECP9ogds6Z+PHvafjUgWf35VVx2GcHRDp8G8rvPOV73MbA5BE6G4kOv4XRnXtEpzzHh0KJN3/UjpOuuqXrW+bdDgE8Fur0ARTDN3rKH+bo0XvAGROMSOFhHnc+PLk6HeKoNuGussLh8jdWlJt6TxXuG+o/0/m2y3GC90IFsK1ySIb4Gj+OVcBD0cz5DqVKO4Sg05mJK8sov5B0qtTrcLfddnJOU5lvUi06b/0h3NUpRieTaza3qvpOLgcoPjVDUxZ8U9aJJ0c/hliTexvz4a88zuiizJBT0TRdmrxSxqwhU2iC3GxHPgmPFzAj7p4F3pOi 8Taqh2yg 2rRI2FqT05xNXooYZu6LD7SNA/3ZCpI/6VisRwXO+QIHFbg74W/OX2g8cUaXFjP4GAvV6ftlzTaoBpnACOfcrUM9xAvBviBv1A3nW1N6yvthd/D6RWqLyQXod77SbIXTrWT+YUyt2YiOTSpehuOBSf7j5VupxqgdRCKYKk+wo6ov5+oBXEPoJMD+7qnUMIPGG4Bm7DIvOwVDHjG+AgrI6Btntj1Ic83pEfVNUdY3+n/X8DxpkHOn9oqAk+hsB3bcK9K9ZMBWH2yvsEnWsU6du4SnPIJMJXX3mNhePDfi2VyRkix0mpmjCzjknoJZX4VouTlHbDG3cUOyYBZrmsO9ap9jC+5Px+EDi45KAdOrfzEqM4tSVHZUcsy0Vqr5LkufhcSwVgXD1FZS4M6QRL8vIOZv05hRoj+PQsa+HQi5kLhGw1BJFdnX0yaLr/8wTHRevr5PX/u/7W7b5sYMklrpQ+BneOfG2q/9NwR+ncUXUQ4Y006UFbtgMWdREIFcEaBI/kbj0m0w7qkHfnAgdhDQih3khHdl9Kw1jG/Xc+Fm14xgEB1/gpTKaVu/V/oN8r4JnHWENvWccciQHOmzyFzUxFRG5y92TR+B6oEMDe4jnwpPZORJCqwYTz/o8/GM0U2ZnrT9RYLQtzr/QibtLfmoKUaYNfNJBjrPyNTK8PQ8+k6uW1qj0TQ2oc6CYNNKvsFnNI2zvDtGJTxOeWtwnXoG84V7cwHOc9DqZY0QLXzuu4lfEANOfE6Z4HhhlZQ== 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: Thanks for the detailed comment. On Wed, Jul 16, 2025 at 11:20:09AM +0200, David Hildenbrand wrote: >On 16.07.25 10:27, Wei Yang wrote: [...] >> -static long ksm_get_full_scans(void) >> -{ >> - char buf[10]; >> - ssize_t ret; >> - >> - ret = pread(ksm_full_scans_fd, buf, sizeof(buf) - 1, 0); >> - if (ret <= 0) >> - return -errno; >> - buf[ret] = 0; >> - >> - return strtol(buf, NULL, 10); >> -} >> - >> static int ksm_merge(void) > >Should ksm_merge() get factored out as well? > Reasonable, will factor out. While one thing interesting is if it scan 2 full round, the ksm case in patch 3 would fail sometimes. But I don't see the failure in ksm_functional_test here. >> { >> long start_scans, end_scans; >> @@ -137,7 +76,7 @@ static int ksm_merge(void) >> start_scans = ksm_get_full_scans(); >> if (start_scans < 0) >> return start_scans; >> - if (write(ksm_fd, "1", 1) != 1) >> + if (ksm_start_and_merge()) >> return -errno; >> do { >> end_scans = ksm_get_full_scans(); >> @@ -150,7 +89,7 @@ static int ksm_merge(void) >> static int ksm_unmerge(void) >> { >> - if (write(ksm_fd, "2", 1) != 1) >> + if (ksm_stop_and_unmerge()) >> return -errno; >> return 0; > >What's the reason of gaving ksm_unmerge() and ksm_stop_and_unmerge()? > My plan is there are two pairs of helper: ksm_merge() <-> ksm_unmerge() ksm_start_and_merge() <-> ksm_stop_and_unmerge() >Probably we should just use ksm_stop_and_unmerge() and remove ksm_unmerge(). > Looks reasonable, will remove it. So how about leave three helpers: ksm_merge() ksm_start() ksm_stop_and_unmerge() Would this be better? >See below regarding letting ksm_stop_and_unmerge() and friends return -errno in case of error. > >> } >> @@ -168,7 +107,7 @@ static char *__mmap_and_merge_range(char val, unsigned long size, int prot, >> return err_map; >> } >> - if (get_my_merging_pages() > 0) { >> + if (ksm_get_self_merging_pages() > 0) { >> ksft_print_msg("Still pages merged\n"); >> return err_map; >> } >> @@ -227,7 +166,7 @@ static char *__mmap_and_merge_range(char val, unsigned long size, int prot, >> * Check if anything was merged at all. Ignore the zero page that is >> * accounted differently (depending on kernel support). >> */ >> - if (val && !get_my_merging_pages()) { >> + if (val && !ksm_get_self_merging_pages()) { >> ksft_print_msg("No pages got merged\n"); >> goto unmap; >> } >> @@ -286,15 +225,7 @@ static void test_unmerge_zero_pages(void) >> ksft_print_msg("[RUN] %s\n", __func__); >> - if (proc_self_ksm_stat_fd < 0) { >> - ksft_test_result_skip("open(\"/proc/self/ksm_stat\") failed\n"); >> - return; >> - } > >See below: probably we should do a test read so we know the file exists and >can be read. So we don't get misleading errors later on older kernels. > >if (ksm_get_self_zero_pages() < 0) { > ksft_test_result_skip("accessing \"/proc/self/ksm_stat\" failed\n"); > return; >} Agree > >> - if (ksm_use_zero_pages_fd < 0) { >> - ksft_test_result_skip("open \"/sys/kernel/mm/ksm/use_zero_pages\" failed\n"); >> - return; >> - } >> - if (write(ksm_use_zero_pages_fd, "1", 1) != 1) { >> + if (ksm_use_zero_pages()) { >> ksft_test_result_skip("write \"/sys/kernel/mm/ksm/use_zero_pages\" failed\n"); >> return; >> } >> @@ -306,7 +237,7 @@ static void test_unmerge_zero_pages(void) >> /* Check if ksm_zero_pages is updated correctly after KSM merging */ >> pages_expected = size / pagesize; >> - if (pages_expected != get_my_ksm_zero_pages()) { >> + if (pages_expected != ksm_get_self_zero_pages()) { >> ksft_test_result_fail("'ksm_zero_pages' updated after merging\n"); >> goto unmap; >> } >> @@ -319,7 +250,7 @@ static void test_unmerge_zero_pages(void) >> /* Check if ksm_zero_pages is updated correctly after unmerging */ >> pages_expected /= 2; >> - if (pages_expected != get_my_ksm_zero_pages()) { >> + if (pages_expected != ksm_get_self_zero_pages()) { >> ksft_test_result_fail("'ksm_zero_pages' updated after unmerging\n"); >> goto unmap; >> } >> @@ -329,7 +260,7 @@ static void test_unmerge_zero_pages(void) >> *((unsigned int *)&map[offs]) = offs; >> /* Now we should have no zeropages remaining. */ >> - if (get_my_ksm_zero_pages()) { >> + if (ksm_get_self_zero_pages()) { >> ksft_test_result_fail("'ksm_zero_pages' updated after write fault\n"); >> goto unmap; >> } >> @@ -685,19 +616,9 @@ static void init_global_file_handles(void) >> mem_fd = open("/proc/self/mem", O_RDWR); >> if (mem_fd < 0) >> ksft_exit_fail_msg("opening /proc/self/mem failed\n"); >> - ksm_fd = open("/sys/kernel/mm/ksm/run", O_RDWR); >> - if (ksm_fd < 0) >> - ksft_exit_skip("open(\"/sys/kernel/mm/ksm/run\") failed\n"); >> - ksm_full_scans_fd = open("/sys/kernel/mm/ksm/full_scans", O_RDONLY); >> - if (ksm_full_scans_fd < 0) >> - ksft_exit_skip("open(\"/sys/kernel/mm/ksm/full_scans\") failed\n"); > >For these skip cases, we should probably do a test access. > >if (ksm_stop_and_unmerge() < 0) > ksft_exit_skip("accessing \"/sys/kernel/mm/ksm/run\\") failed\n"); >if (ksm_get_full_scans() < 0) > ksft_exit_skip("accessing \"/sys/kernel/mm/ksm/full_scans\") failed\n"); > >So we later now that the files actually do exist and can be opened+written. > Agree > >> pagemap_fd = open("/proc/self/pagemap", O_RDONLY);> if (pagemap_fd < 0) >> ksft_exit_skip("open(\"/proc/self/pagemap\") failed\n"); >> - proc_self_ksm_stat_fd = open("/proc/self/ksm_stat", O_RDONLY); >> - proc_self_ksm_merging_pages_fd = open("/proc/self/ksm_merging_pages", And I think we may do similar thing here. if (ksm_get_self_merging_pages() < 0) ksft_exit_skip("accessing \"/proc/self/ksm_merging_pages\") failed\n"); >> - O_RDONLY); >> - ksm_use_zero_pages_fd = open("/sys/kernel/mm/ksm/use_zero_pages", O_RDWR); proc_self_ksm_stat_fd and ksm_use_zero_pages_fd is only used in test_unmerge_zero_pages(). So we can test and skip only there. For proc_self_ksm_merging_pages_fd, it is used in all tests except test_prctl(). Check ahead maybe helpful. >> } >> int main(int argc, char **argv) >> diff --git a/tools/testing/selftests/mm/vm_util.c b/tools/testing/selftests/mm/vm_util.c >> index 9dafa7669ef9..14973d957c9a 100644 >> --- a/tools/testing/selftests/mm/vm_util.c >> +++ b/tools/testing/selftests/mm/vm_util.c >> @@ -555,3 +555,114 @@ bool detect_huge_zeropage(void) >> close(fd); >> return enabled; >> } >> + >> +long ksm_get_self_zero_pages() > >For all these functions without parameters: > >(void) > Thanks will add it. >> +{ >> + int proc_self_ksm_stat_fd; >> + char buf[200]; >> + char *substr_ksm_zero; >> + size_t value_pos; >> + ssize_t read_size; >> + unsigned long my_ksm_zero_pages; >> + >> + proc_self_ksm_stat_fd = open("/proc/self/ksm_stat", O_RDONLY); >> + if (proc_self_ksm_stat_fd < 0) >> + return 0; >> + >> + read_size = pread(proc_self_ksm_stat_fd, buf, sizeof(buf) - 1, 0); >> + close(proc_self_ksm_stat_fd); >> + if (read_size < 0) >> + return -errno; >> + >> + buf[read_size] = 0; >> + >> + substr_ksm_zero = strstr(buf, "ksm_zero_pages"); >> + if (!substr_ksm_zero) >> + return 0; >> + >> + value_pos = strcspn(substr_ksm_zero, "0123456789"); >> + my_ksm_zero_pages = strtol(substr_ksm_zero + value_pos, NULL, 10); >> + >> + return my_ksm_zero_pages; >> +} >> + >> +long ksm_get_self_merging_pages() >> +{ >> + int proc_self_ksm_merging_pages_fd; >> + char buf[10]; >> + ssize_t ret; >> + >> + proc_self_ksm_merging_pages_fd = open("/proc/self/ksm_merging_pages", >> + O_RDONLY); >> + if (proc_self_ksm_merging_pages_fd < 0) >> + return proc_self_ksm_merging_pages_fd; >> + >> + ret = pread(proc_self_ksm_merging_pages_fd, buf, sizeof(buf) - 1, 0); >> + close(proc_self_ksm_merging_pages_fd); >> + if (ret <= 0) >> + return -errno; >> + buf[ret] = 0; >> + >> + return strtol(buf, NULL, 10); >> +} >> + >> +long ksm_get_full_scans() >> +{ >> + int ksm_full_scans_fd; >> + char buf[10]; >> + ssize_t ret; >> + >> + ksm_full_scans_fd = open("/sys/kernel/mm/ksm/full_scans", O_RDONLY); >> + if (ksm_full_scans_fd < 0) >> + return ksm_full_scans_fd; >> + >> + ret = pread(ksm_full_scans_fd, buf, sizeof(buf) - 1, 0); >> + close(ksm_full_scans_fd); >> + if (ret <= 0) >> + return -errno; >> + buf[ret] = 0; >> + >> + return strtol(buf, NULL, 10); >> +} >> + >> +int ksm_use_zero_pages() >> +{ >> + int ksm_use_zero_pages_fd; >> + ssize_t ret; >> + >> + ksm_use_zero_pages_fd = open("/sys/kernel/mm/ksm/use_zero_pages", O_RDWR); >> + if (ksm_use_zero_pages_fd < 0) >> + return -1; > >For all these functions, we should not require the caller to lookup errno but >instead return it. > > return -errno; > Agree on the -errno thing, will change in all places. >> + >> + ret = write(ksm_use_zero_pages_fd, "1", 1); >> + close(ksm_use_zero_pages_fd); >> + return ret == 1 ? 0 : ret; > >return ret == 1 ? 0 : -errno; > >> +} >> + >> +int ksm_start_and_merge() >> +{ >> + int ksm_fd; >> + ssize_t ret; >> + >> + ksm_fd = open("/sys/kernel/mm/ksm/run", O_RDWR); >> + if (ksm_fd < 0) >> + return -1; > >Same comments regarding errno. > >> + >> + ret = write(ksm_fd, "1", 1); >> + close(ksm_fd); >> + return ret == 1 ? 0 : ret; > >double space > >> +} >> + >> +int ksm_stop_and_unmerge() >> +{ >> + int ksm_fd; >> + ssize_t ret; >> + >> + ksm_fd = open("/sys/kernel/mm/ksm/run", O_RDWR); >> + if (ksm_fd < 0) >> + return -1; >> + >> + ret = write(ksm_fd, "2", 1); >> + close(ksm_fd); >> + return ret == 1 ? 0 : ret; > >double space > Shame on me :-( > > >-- >Cheers, > >David / dhildenb -- Wei Yang Help you, Help me