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 12DA0C3ABBC for ; Fri, 9 May 2025 17:35:07 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id AD8C26B0095; Fri, 9 May 2025 13:35:06 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A87586B0099; Fri, 9 May 2025 13:35:06 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 929D96B009A; Fri, 9 May 2025 13:35:06 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 6EFC86B0095 for ; Fri, 9 May 2025 13:35:06 -0400 (EDT) Received: from smtpin21.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id A97D01402BD for ; Fri, 9 May 2025 17:35:06 +0000 (UTC) X-FDA: 83424070212.21.510254A Received: from mail-qt1-f177.google.com (mail-qt1-f177.google.com [209.85.160.177]) by imf20.hostedemail.com (Postfix) with ESMTP id C206C1C000B for ; Fri, 9 May 2025 17:35:04 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=VAhvM6km; spf=pass (imf20.hostedemail.com: domain of surenb@google.com designates 209.85.160.177 as permitted sender) smtp.mailfrom=surenb@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=1746812104; 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=CIkCe9tXdEfgYVe9tLomnSmEe3kS+xmHSnDX7Y3SnYM=; b=FspRErEcGmb57qcxs398AgVWv/42HLNONPkgGmfqhO3uyKiQbxbnNuFE58pWki0Uv4SQCJ /8ewZLwnU+KXj7A+Gh0EyTuBZLGyxfUb8uyHrMRV0a4bYae1UrjJuUGY/YE+Y/yp2/8dp3 0ApZbSBeVvt5odhtfENckcRvyT6vg6k= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=pass header.d=google.com header.s=20230601 header.b=VAhvM6km; spf=pass (imf20.hostedemail.com: domain of surenb@google.com designates 209.85.160.177 as permitted sender) smtp.mailfrom=surenb@google.com; dmarc=pass (policy=reject) header.from=google.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1746812104; a=rsa-sha256; cv=none; b=BUEX06I2bmWURCvQNpW+zoNoTNUGf2JcfwXIMlGX9e27gU2ChobHj4UOlAH+YJRVAj9A5f wEjMf2Opg0lPFd5LDe2EMf9dKmjMCvw8YV91f2Zddl6UzAMjIWw/IUwjrjlR+QOJqBdCUR sC86dnxh/h0GJ+iiW6A2aPJ6T3+fHEo= Received: by mail-qt1-f177.google.com with SMTP id d75a77b69052e-47e9fea29easo16481cf.1 for ; Fri, 09 May 2025 10:35:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1746812104; x=1747416904; darn=kvack.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=CIkCe9tXdEfgYVe9tLomnSmEe3kS+xmHSnDX7Y3SnYM=; b=VAhvM6kmxgtw7uK8nOiuNh9jz57TvwgKL0V2kiEcL0vVOQSjwnbGet6HBaxE+PG5Zp LYooEgRsgjlyg3/De6ekbPQ5jiv7Xi+Q5aX8TCojQnKnfAEDUO8fSBGdFKGGyrkzdJr9 oITH+OumaVTyrXPuUoVoi39nUtUZJF3D1UNW3b31aea8WV8+Wr4pHZpf0QVYtxSZpfcn ouxrsD0uk392WmtHCI0WsrnVOuIXbjnl8L2oXsxeNQX7v7WCaL6asii2ZI+vdFxEfO9w Jre92cHDoQOsW1Cgq3W6yjDufVVpb8X0hcrKsaln3E1Mstr8kIxumCDKG+TQNDPUBY17 BxaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1746812104; x=1747416904; h=content-transfer-encoding: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=CIkCe9tXdEfgYVe9tLomnSmEe3kS+xmHSnDX7Y3SnYM=; b=btbS09Kuw2fOS2FoxOtwP3LIwMhgAuMSIYR1SzzzIaTkYRpeHafYGSbEDJ9nVLgjO7 EBDtYth8SEYBVwufZCfvz5XEsx01vK0hL/KMQYyBLSccLZOk7cJ/qJxOk8mG7h9kxKQy C9FUzgACHcbqJuY1gPz9U/lxskIDC9zuszHMLhsnbgxkkjL3Wz309dh3n5XFTzKa4tbB 8++gGSO33lfEGHabX6TFSmLJaBE+FtKR/PQmyy4wz1Isnri09aASM8qfDO3rKyfU8qEX rRDfQCN5Pi+0EKPCFVni6T0rPo5eEuMk1DXB3JyZ7DgjdP5whKXeTgIa3R8+FatYgadL dQ9Q== X-Forwarded-Encrypted: i=1; AJvYcCVbHuOzAaQeMIFa59Y6nL8SxBUfpm9zp1OGdi7BJo+Cod6VYWU7WNLQ1wo1nRHWwD2hPO/tnHNZnA==@kvack.org X-Gm-Message-State: AOJu0Yz6tqBQjlDN0k2bFgvAd+o6cuNn/WVqKZXvLi2p4pmj3S7B+9ui VfrsnjMtLB7LzJSNxLWtTq6uasWSRt3A5FIBPLkUbiGnQCVCX6yKxpA5W61WBE0o3fBgze+pEIl twwsGjqzM8E7Y/ZUIntzwLphzt1puIjWglN9X X-Gm-Gg: ASbGnct4XG+3EXLJ3EgivWtgX1YX4F9VLfHk4XZn+bO2QqdM0f3NSl6/aEgYz9jDx9R KqQ/mjt+1mUbHEvtIBGCdvRUlfAW/+EMhZEnFimWoqSsN12emt0u1l60BQpO2jB+BZ3CvY1RcnN 60EDLmpPdFnXnZ2xW6Ew7E X-Google-Smtp-Source: AGHT+IH8Xy2HBEJ82GMCKTkv/CJFKbtHGcCHeTxlfIi1y+HIKKLDQPCnKjy8d4byjPN+TnQ6yRviiUQEKT470Rnq+sE= X-Received: by 2002:ac8:5791:0:b0:467:84a1:df08 with SMTP id d75a77b69052e-49453cc119amr4308291cf.23.1746812103452; Fri, 09 May 2025 10:35:03 -0700 (PDT) MIME-Version: 1.0 References: <20250507175500.204569-1-00107082@163.com> <20250509055313.922707-1-00107082@163.com> In-Reply-To: <20250509055313.922707-1-00107082@163.com> From: Suren Baghdasaryan Date: Fri, 9 May 2025 10:34:52 -0700 X-Gm-Features: AX0GCFsrftStf3N1kFowX3FDWZVqX0vh6hL2IafetFBZ5KCFRTaNPIArfw3BkWQ Message-ID: Subject: Re: [PATCH 2/2] alloc_tag: keep codetag iterator cross read() calls To: David Wang <00107082@163.com> Cc: kent.overstreet@linux.dev, akpm@linux-foundation.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Rspam-User: X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: C206C1C000B X-Stat-Signature: m7o4ckz3ta146rgyd5u5yj9yhwexi5ro X-HE-Tag: 1746812104-575866 X-HE-Meta: U2FsdGVkX18JlfBQVz2AINDy8LKYIgBuYBwsb7WoEQ6UD330IEVyhYIENQjmvgQ+7XpKuCbY18F1CLnaeKhosmHnP9/RxaF3rTqlPQzDSqH5pGZHuK+Tb3bUAMzWVADCI6yDqXYMPgSJ3wbkJxvVz7m2Lf0qaliXlGBKrUe704ZVSwR8evTY9V8upp/Oso5nWg6z+KxQXDTC56+5nav18VDmjuVYLLRGsi8PwJ8D2kv4OjwTSVCrNtrr7kmqR4XsK9YE/Fq4r1PvR6V0I9pdMgqsTINJEykGwlNmmm7EyTEORjxio1i+iY+y0ZJ5uAioiPOSFSZhNNtg5161cWidLRTZM/QVw5kF2bKNCD/SYEXO9X0SV5yuPycMHEc/gxlJ3uw9P5Ve7QcHw6Fq7P1+OGXrOmItSyLzX5heQh8+nwqGIUZPbO1U6dPa1h4ywTxJZ9yHGsCtil1sJ06dZgz/svmapsts/IytmJrWlE/PHNDCTxNsrOTvmaB0Q+OyLhtsFU+mkCeff5M2qH2E6TqqjGRTI6a9PRx5MR+eBUQTH0bpgdH6gqM/2v5CKtijsz5zU4N/aC+2WfgaHZWSqQG/+zFkLsnTl+ewRX+Hut2rVz2EixXBSFlJYe8u52EvTs9O/iACSY+Jxralw6P9HdOMI60UFXyLhv11KZkJcZiANyXqiCYOX9LUwn0ebShDcTKXF2ky5qaisBUrJI8M8ATlG2psLaR8juNXQrKMQcJKYS+nwV+oyl240uFkRe/Xl48h4CTpycgJzvXP/qpd3YF50NXbbpT6RwkBDSreeWhAF9DE3MlMisuml2KaFS01uL20Od1BlLyuRO6eXpPDLpjn/FeWLJRFq5EzOCspa/bW+wCwxq3vJSUAyPsUQG3z38zQ8Q2qs7/Nt4dYpT7RQgCuG9oEVHwKFBw71dnWE6NRIhqC70oCqTcS2SVM6vU6Ak2vZiZKotvaQh0u4VHZ7bA a/8k3HJ4 X+54yps9HU31oCmlo3//wl5YsNBpnCrbqixZpov+Xwa80NmNNfV/BqdgzZp2Yvu2r3BFPDVeKq9wGbPqnunECxaMSupcutMFIY6uR5rlZpZWQHDOjaRuG1d2mtXGBILyApQxoOsZtsxfm/5SU5oRu8ilpJxW3RAAAHoAXGZ9E7N+UKZjiWS5K2uKJrDWK6Cj9AtpyUI1CvO+wLi1yo1mWpo1Qcyy6HxXBTiTeOCFEHxkmmBbXiY9ASuiNYISMgAYXgrVZvz6yo9atKMhZehtAvJ6dsgdXS/5T0BIKAAfSRQHMTyKz9P16a+OrSFRymmRHwR1ajG8kaSubHWOo66szNY1/eL3EH/hEDVBgF3jcNHFktom5pyGW0KJe1g== 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 Thu, May 8, 2025 at 10:53=E2=80=AFPM David Wang <00107082@163.com> wrote= : > > When reading /proc/allocinfo, for each read syscall, seq_file would > invoke start/stop callbacks. In start callback, a memory is alloced > to store iterator and the iterator would start from beginning to > walk to current read position. > > seq_file read() takes at most 4096 bytes, even if read with a larger > user space buffer, meaning read out all of /proc/allocinfo, tens of read > syscalls are needed. For example, a 306036 bytes allocinfo files need > 76 reads: > > $ sudo cat /proc/allocinfo | wc > 3964 16678 306036 > $ sudo strace -T -e read cat /proc/allocinfo > ... > read(3, " 4096 1 arch/x86/k"..., 131072) =3D 4063 <0.00006= 2> > ... > read(3, " 0 0 sound/core"..., 131072) =3D 4021 <0.00015= 0> > ... > For those n=3D3964 lines, each read takes about m=3D3964/76=3D52 lines, > since iterator restart from beginning for each read(), > it would move forward > m steps on 1st read > 2*m steps on 2nd read > 3*m steps on 3rd read > ... > n steps on last read > As read() along, more iterator steps make read() calls slower and > slower. Adding those up, codetag iterator moves about O(n*n/m) steps, > making data structure traversal take significant part of the whole readin= g. > Profiling when stress reading /proc/allocinfo confirms it: > > vfs_read(99.959% 1677299/1677995) > proc_reg_read_iter(99.856% 1674881/1677299) > seq_read_iter(99.959% 1674191/1674881) > allocinfo_start(75.664% 1266755/1674191) > codetag_next_ct(79.217% 1003487/1266755) <--- > srso_return_thunk(1.264% 16011/1266755) > __kmalloc_cache_noprof(0.102% 1296/1266755) > ... > allocinfo_show(21.287% 356378/1674191) > allocinfo_next(1.530% 25621/1674191) > allocinfo_start() takes about 75% of seq_read(). > > A private data alloced at open() time can be used to carry iterator > alive across read() calls, and avoid the memory allocation and > iterator reset for each read(). This way, only O(1) memory allocation > and O(n) steps iterating, and `time` shows performance improvement > from ~7ms to ~4ms. > Profiling with the change: > > vfs_read(99.865% 1581073/1583214) > proc_reg_read_iter(99.485% 1572934/1581073) > seq_read_iter(99.846% 1570519/1572934) > allocinfo_show(87.428% 1373074/1570519) > seq_buf_printf(83.695% 1149196/1373074) > seq_buf_putc(1.917% 26321/1373074) > _find_next_bit(1.531% 21023/1373074) > ... > codetag_to_text(0.490% 6727/1373074) > ... > allocinfo_next(6.275% 98543/1570519) > ... > allocinfo_start(0.369% 5790/1570519) > ... > allocinfo_start taks less than 1%. > > Signed-off-by: David Wang <00107082@163.com> I think you will be posting another version to address comments in the first patch, but for this patch feel free to add: Acked-by: Suren Baghdasaryan Thanks! > --- > lib/alloc_tag.c | 29 ++++++++++------------------- > 1 file changed, 10 insertions(+), 19 deletions(-) > > diff --git a/lib/alloc_tag.c b/lib/alloc_tag.c > index 25ecc1334b67..fdd5887769a6 100644 > --- a/lib/alloc_tag.c > +++ b/lib/alloc_tag.c > @@ -45,21 +45,16 @@ struct allocinfo_private { > static void *allocinfo_start(struct seq_file *m, loff_t *pos) > { > struct allocinfo_private *priv; > - struct codetag *ct; > loff_t node =3D *pos; > > - priv =3D kzalloc(sizeof(*priv), GFP_KERNEL); > - m->private =3D priv; > - if (!priv) > - return NULL; > - > - priv->print_header =3D (node =3D=3D 0); > + priv =3D (struct allocinfo_private *)m->private; > codetag_lock_module_list(alloc_tag_cttype, true); > - priv->iter =3D codetag_get_ct_iter(alloc_tag_cttype); > - while ((ct =3D codetag_next_ct(&priv->iter)) !=3D NULL && node) > - node--; > - > - return ct ? priv : NULL; > + if (node =3D=3D 0) { > + priv->print_header =3D true; > + priv->iter =3D codetag_get_ct_iter(alloc_tag_cttype); > + codetag_next_ct(&priv->iter); > + } > + return priv->iter.ct ? priv : NULL; > } > > static void *allocinfo_next(struct seq_file *m, void *arg, loff_t *pos) > @@ -76,12 +71,7 @@ static void *allocinfo_next(struct seq_file *m, void *= arg, loff_t *pos) > > static void allocinfo_stop(struct seq_file *m, void *arg) > { > - struct allocinfo_private *priv =3D (struct allocinfo_private *)m-= >private; > - > - if (priv) { > - codetag_lock_module_list(alloc_tag_cttype, false); > - kfree(priv); > - } > + codetag_lock_module_list(alloc_tag_cttype, false); > } > > static void print_allocinfo_header(struct seq_buf *buf) > @@ -249,7 +239,8 @@ static void __init procfs_init(void) > if (!mem_profiling_support) > return; > > - if (!proc_create_seq(ALLOCINFO_FILE_NAME, 0400, NULL, &allocinfo_= seq_op)) { > + if (!proc_create_seq_private(ALLOCINFO_FILE_NAME, 0400, NULL, &al= locinfo_seq_op, > + sizeof(struct allocinfo_private), NU= LL)) { > pr_err("Failed to create %s file\n", ALLOCINFO_FILE_NAME)= ; > shutdown_mem_profiling(false); > } > -- > 2.39.2 >