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 A82FAC83F1B for ; Wed, 16 Jul 2025 09:20:19 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 3F1D26B0098; Wed, 16 Jul 2025 05:20:19 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 3C93B6B0099; Wed, 16 Jul 2025 05:20:19 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2B8176B009A; Wed, 16 Jul 2025 05:20:19 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 155596B0098 for ; Wed, 16 Jul 2025 05:20:19 -0400 (EDT) Received: from smtpin09.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 95CF9586E0 for ; Wed, 16 Jul 2025 09:20:18 +0000 (UTC) X-FDA: 83669581716.09.54A7F41 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf15.hostedemail.com (Postfix) with ESMTP id BDF2CA0008 for ; Wed, 16 Jul 2025 09:20:14 +0000 (UTC) Authentication-Results: imf15.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=durgLs9Z; spf=pass (imf15.hostedemail.com: domain of david@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=david@redhat.com; dmarc=pass (policy=quarantine) header.from=redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1752657616; 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:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=+nCQyLbrqF56uzu8l8npRltBfyca3bIIo0Ld15TI6FQ=; b=CI37/rrd/TZ1OUL8ttSh/iCpkhvkBk54u8hc9+0KqXmrrXdDPMnhsr0TSR9WEbK2SPSmhy +P70Mxl5D8xi/Ot/ieYKf8KzBLC0uHzsmwuoqkvGvd/Qkobe0sPHryGH1eXsq+ZdQcdrtA ZLfvXqDCCvv/EAnxFn9mOlNopPsna0E= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1752657616; a=rsa-sha256; cv=none; b=eecUHmxQdGOMeO6ga5SHLSwf2zP5sXYot8u/EsSOZoI95C8aCMgsGLI5/cJ2y2RHd9ShHN pT3iyr1nIbiIh/958qJbzTbXKRne25YeXzXdqt8+udjsA0DqZq54+FXN4tYgGlG7QGCk5q VfRaBN81r6tKtwztYqvm8kk25znTxek= ARC-Authentication-Results: i=1; imf15.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=durgLs9Z; spf=pass (imf15.hostedemail.com: domain of david@redhat.com designates 170.10.129.124 as permitted sender) smtp.mailfrom=david@redhat.com; dmarc=pass (policy=quarantine) header.from=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1752657614; h=from:from: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:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=+nCQyLbrqF56uzu8l8npRltBfyca3bIIo0Ld15TI6FQ=; b=durgLs9Z+21XFzTPNCzxcu01lTw4XOtKfW45prmoG28H0YIR3qkY9kFBAVE3zm4oyKveLo ijarFy6qR8mIRs33gWuRZG7pdjAvF/ngIrUh6s4eLWZZD2Sx6JMv7ZK9O8b99pSgPQCcYQ 2cYGOLgHDQTS1Be63egILhz8sC/oaFw= Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-583-HxCW_sZ8PFeWWtejWpThcQ-1; Wed, 16 Jul 2025 05:20:12 -0400 X-MC-Unique: HxCW_sZ8PFeWWtejWpThcQ-1 X-Mimecast-MFC-AGG-ID: HxCW_sZ8PFeWWtejWpThcQ_1752657612 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-3a4f7f1b932so3813749f8f.2 for ; Wed, 16 Jul 2025 02:20:12 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1752657611; x=1753262411; h=content-transfer-encoding:in-reply-to:organization:autocrypt :content-language:from:references:cc:to:subject:user-agent :mime-version:date:message-id:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=+nCQyLbrqF56uzu8l8npRltBfyca3bIIo0Ld15TI6FQ=; b=pBDLxLw4yUs3IWs86Fowk95Qy6SeQIjvE2SyenHtvDX7XQFzcBcQ2NpiJ/ZNxZVj5w gOUfQoD6eSL3QZnEiyqELw/nNZZPElfnodcpmBXtYJJoWJseyVX8QcXX6AzSit6sQTWx cFRbKtJjv3Nx597Cu+NlMGgvAob7DeDdPeNWXyfAYki7+CCgmeIgNwtslp1u6hvze9PR Zsv/i1Mk1S/a4zR4ysqJpy0n2C3KXpKVtpIB8BWq4Ptb5bUSK4QoKAfxbz0EwN1lKGJL blvGHFEBUaAOOjVjHqar0KFbkF2vr2lu7MR0emEIZps1/MDpyLU8yXldIrk7R6hhRdZN /kPg== X-Gm-Message-State: AOJu0YyAdrW9+Z8bI8LRNJ1L30ft/tdKP1nOckGqeu2hLVJ5OV5XlX/q M2YFsyh8/uHVMlg1eqQDVYbwmWoEn4Up3y3qj/0gvksJmEGQ/wR9FI7EU+K0aCdjjSge1yoE2W1 6UMzGzj2SmbnUH9TGmmiaS+gMoblGnl3TxgUB7r8XvzYE3tYBoWeI X-Gm-Gg: ASbGncuLDXcvMhy/7ju322W0hgi4DwXwQvk2sicg4L8V/aG8RyGzRVg1z/FZ9PHMUun yI+d/03PdcQRhluvhU/GQkj48kpqDY9/dTen6Z7dXbLd8GWhMPd5MAnk3U6DmiOsdTvC7nJfFvI 2lLXQKh6OIqutR3XypUNsa41n4eWhJ+mJf5zVrEPc6hiibR8v0rvquZ2+j6daKjlxQVW37czKua gE29yBXDa7vin74JQXMxqVhVzkfQ2x6GkrEssal5Qfc7LO+M3BHEURHrQfeOYncI0rVX81eSRZb Qa/a/yYvx3d5q5DpoR8xgcVXuk64dm+w2TRR2mV04nJA+Jc0JEcc9wj7l/gL6IqJSqmsmtuBURU gi8/UYwF0gb5UAR5QTr1FsLNBQYDSl0eddGEuTOitIndlKYBu5XWbn+HEKBACUPS2Ynw= X-Received: by 2002:a05:6000:2285:b0:3b5:e077:af24 with SMTP id ffacd0b85a97d-3b60e4c1ce3mr1470786f8f.14.1752657611591; Wed, 16 Jul 2025 02:20:11 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH6qHrmC5ATxyN1HnzC/DjhJUHQpLMYbPplZZwihmnu7BYDcugiGrXJL7u6VZEcxNSuLhCudQ== X-Received: by 2002:a05:6000:2285:b0:3b5:e077:af24 with SMTP id ffacd0b85a97d-3b60e4c1ce3mr1470742f8f.14.1752657611096; Wed, 16 Jul 2025 02:20:11 -0700 (PDT) Received: from ?IPV6:2003:d8:2f1d:ed00:1769:dd7c:7208:eb33? (p200300d82f1ded001769dd7c7208eb33.dip0.t-ipconnect.de. [2003:d8:2f1d:ed00:1769:dd7c:7208:eb33]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3b5e8e0d727sm17495646f8f.51.2025.07.16.02.20.10 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 16 Jul 2025 02:20:10 -0700 (PDT) Message-ID: <5cadce02-cd80-4aa2-a078-6335beeb8a92@redhat.com> Date: Wed, 16 Jul 2025 11:20:09 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH 2/3] selftests/mm: put general ksm operation into vm_util To: Wei Yang , akpm@linux-foundation.org Cc: linux-mm@kvack.org, Lorenzo Stoakes , Rik van Riel , "Liam R . Howlett" , Vlastimil Babka , Harry Yoo References: <20250716082710.2801-1-richard.weiyang@gmail.com> <20250716082710.2801-3-richard.weiyang@gmail.com> From: David Hildenbrand Autocrypt: addr=david@redhat.com; keydata= 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 g3eXuA== Organization: Red Hat In-Reply-To: <20250716082710.2801-3-richard.weiyang@gmail.com> X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: 6IuJcpeIuwJKsoRrwuzn0JZDvmoUX17dBxoD166rdu4_1752657612 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: BDF2CA0008 X-Rspam-User: X-Rspamd-Server: rspam09 X-Stat-Signature: ob51uy8snfz7pm3r6enq3szqnw1rifgi X-HE-Tag: 1752657614-312676 X-HE-Meta: U2FsdGVkX1+tfRaL2spLMU/BNYq/XKVeu31nkwI7kwY45hMtBAqGFNwUqQjUJx3sQ5/51F8m31CeMkf/6b1JhwHm3mUQOzPW30GBGPMCj1iuE9+tGdRzFGbynX6Sk+ZtKuPCzttPCKbIM7dytTtAU43g1cm3+2jYAzRzxFC3c6MrAb6zJhBHfsMZ1b9sdqYsFOak1TT9oW2nM7TNkyuhj/I1OcJA1w/9r9yL38tJKIkFItaPhO+MLqUsuwuyAc7hOhnFYHLtsksnV3vLRknpierXy9BZkbf3AOV6OOR9FeUEl2a+HCnOuqamP0PfOw2vtPGzJUqy7cmmSbuXdN/V110LedWtaIP2vO9cKlLu0g+eRLzoJeYNSKIyOwLedWIo2lONSNA+3imlX57Pwu6Afw2gRMvQZ/RpqpzJMuZAg6z2b8kyGGIyJqCtt4nBs02Vycd9nULBYqVkh2f/qd+qlvOvd7IvPgmuajAwlT9LBYJO2gtOyx7Gs24w2C5yyy5ds1UbKcIIKAQbs0XqQ3vC53Ecamf2g3O/iIemM9cpdzI1lcmFKb/8WOw10yp+/HDy0LJB6k8r1Em/WHeVj6bOBksKl0Xw/5+WePcGtQhjfmdf/GcpoXhQvwY/Jz/ru0wkkzTIwEt+m8CwsW74XlNnA3ERBCawypy15Zc+6Zs7WGOCvba4/JNuldKihL32ZXVQ5kaIrwgVAuM94ix8JY0R2JfqdVyczrJpr6krPosvCOiJdYfrYBP1YPpCsSa/zoNMpD08/c/hrdzeCPl8Kg/DIbIDySGn/br5AuGWH0C5GqtAERxWFzL+ShQJtE6plfL3ggrS14kU4Ny37whfhPjMQdVIcfAJb4ctqph6+8lubdsMosdi350xuWyKXiMP5FHfae6ttkkCA+XmAY5RzpMFe5d4hySXwZ1dgyG/UpZzQHT2oWYWtx9C/xaH+Ca8GcGSXwhP44WRBeKfIw3FO2V 2bCUz2nM yNMKW38FIc5XtBl9PegziGQQKctplSw3WQYgJenXHWQsQE21CkOHWx0eXW5BZLCYHOAvzz2hl9HY2zhlhw95QREGstfbD9BNLdh3H1UBb7em0qrw6Sn5FhXVEBakOtfSEeMMs62sxj6BKBcciIcNyLQzw47e0tfRKtmtveLum5lxHU0DsHMsdbLr7yTidFSNyNP6F 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: On 16.07.25 10:27, Wei Yang wrote: > There are some general ksm operations could be used by other related > test case. Put them into vm_util for common use. > > This is a preparation patch for later use. > > Signed-off-by: Wei Yang > Suggested-by: David Hildenbrand > Cc: David Hildenbrand > Cc: Lorenzo Stoakes > Cc: Rik van Riel > Cc: Liam R. Howlett > Cc: Vlastimil Babka > Cc: Harry Yoo > > --- > v1: open/close fd in function itself instead of pass as parameter > --- > .../selftests/mm/ksm_functional_tests.c | 95 ++------------- > tools/testing/selftests/mm/vm_util.c | 111 ++++++++++++++++++ > tools/testing/selftests/mm/vm_util.h | 7 ++ > 3 files changed, 126 insertions(+), 87 deletions(-) > > diff --git a/tools/testing/selftests/mm/ksm_functional_tests.c b/tools/testing/selftests/mm/ksm_functional_tests.c > index 6da5c3340e10..0b151f3a29dc 100644 > --- a/tools/testing/selftests/mm/ksm_functional_tests.c > +++ b/tools/testing/selftests/mm/ksm_functional_tests.c > @@ -38,11 +38,6 @@ enum ksm_merge_mode { > }; > > static int mem_fd; > -static int ksm_fd; > -static int ksm_full_scans_fd; > -static int proc_self_ksm_stat_fd; > -static int proc_self_ksm_merging_pages_fd; > -static int ksm_use_zero_pages_fd; > static int pagemap_fd; > static size_t pagesize; > > @@ -73,62 +68,6 @@ static bool range_maps_duplicates(char *addr, unsigned long size) > return false; > } > > -static long get_my_ksm_zero_pages(void) > -{ > - char buf[200]; > - char *substr_ksm_zero; > - size_t value_pos; > - ssize_t read_size; > - unsigned long my_ksm_zero_pages; > - > - if (proc_self_ksm_stat_fd < 0) > - return 0; > - > - read_size = pread(proc_self_ksm_stat_fd, buf, sizeof(buf) - 1, 0); > - 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; > -} > - > -static long get_my_merging_pages(void) > -{ > - char buf[10]; > - ssize_t ret; > - > - 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); > - if (ret <= 0) > - return -errno; > - buf[ret] = 0; > - > - return strtol(buf, NULL, 10); > -} > - > -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? > { > 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()? Probably we should just use ksm_stop_and_unmerge() and remove ksm_unmerge(). 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; } > - 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. > 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", > - O_RDONLY); > - ksm_use_zero_pages_fd = open("/sys/kernel/mm/ksm/use_zero_pages", O_RDWR); > } > > 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) > +{ > + 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; > + > + 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 -- Cheers, David / dhildenb