Received: by 2002:a89:413:0:b0:1fd:dba5:e537 with SMTP id m19csp931233lqs; Fri, 14 Jun 2024 09:32:45 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCXF1D5yNlh2jq+42GTRESOIv7lO6u/DCTV5bZZahLbd9fwxRRENwt+ICS0/fl1rwwI0Mq73J40OPP3VxiCr99PFPZWvHB49uhVmC/rK2Q== X-Google-Smtp-Source: AGHT+IEjbpyCP3HwNYNUmJ15AlMmYKR/6Y8Nceo8/4uliceH9LVtyZSjzDHfbHjvK7kqW5DHfJuZ X-Received: by 2002:a05:6358:249b:b0:19f:315e:c83 with SMTP id e5c5f4694b2df-19fa9dd945bmr383376755d.2.1718382765134; Fri, 14 Jun 2024 09:32:45 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1718382765; cv=pass; d=google.com; s=arc-20160816; b=Dce+ZFoD5Bu1F57awLfSeWw3sfLh5u3LeuCmpAnDoaEBkGLs6tYHLTtEDxy3m9djsI 0llVr+XzWJNP+qlY0VyBNoKbKvUDm+dLFDGGinilI/bhZVQRQoYqcn/Q4Ny36cq864kT RjyymqSOU+OilesVhx5YzqFLdyHgohpBUhIEuBjZCA2pdJqDftHR+aTkT1lB0KRmuglJ s55ESEzhhpWL8iD/BW29Dj+e8fxVKceRAlZ26Ue9i8GkkrQry5ZDUx8/sEa1GiehJd/Y a8Nws4LC1Rent8/fLQAU8sKMRf4Zg6ToluBfEjMUdpOYEfHGnTVLVltcOUwNeHCBFb0t FhIA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=mime-version:list-unsubscribe:list-subscribe:list-id:precedence :references:subject:cc:to:from:date:user-agent:message-id; bh=nlmh6bmb78BAyGz8ufjYJ5WvBuv3Os+eBdQ9COom2Aw=; fh=4qVY7B0xz5PwYfS+x42NM1D+M4UIyKd8/MMRJ4SOHBM=; b=fIwixQI6rPGtYJ2Ivkj+qiJHmvTD9GmH31cs2WpJh8hHF1LFbM085irMmg+zLQ/4Dp LKICB9Ucm+dzSdWm2TMKEca7kYy3gY1cpdo2TBv4yP56neFvwMACuKquo5sF1m/o4Y1p YxOcIFam/T7eX7ZnFYH7cvGHSpNWpV3G62zvkB6aygo2VHmAgmYmXA8HAzFucbmquG0u JdCjmWn5aUiv+K5hoHnljcBDoLiVyTsnflVmnhkA8kAYKYymopKSri3tDiejlsGgAeOx HlURQ5F78dxe/To87fIAYqh+T4V25W06rlJ4Ze1rPCFur56hguGG82e9KtpYR/Qfc/1Z CaLQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of linux-kernel+bounces-215256-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-215256-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id 41be03b00d2f7-6fee67b8590si1507220a12.824.2024.06.14.09.32.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Jun 2024 09:32:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-215256-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; arc=pass (i=1); spf=pass (google.com: domain of linux-kernel+bounces-215256-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-215256-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id D08DA2814BA for ; Fri, 14 Jun 2024 16:32:21 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id F142B19FA9A; Fri, 14 Jun 2024 16:30:51 +0000 (UTC) Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2A35A1990BE for ; Fri, 14 Jun 2024 16:30:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718382649; cv=none; b=GF3o185sGIHhTUWmuugETnErOJjGyR6qx7bnIoZRGn4o+rzZQN55XhRFkJvA9VT9hQAXxvji7GSax6zGu5e+B2ux03ExhiTeEHaBDrlV8FiZfKb2i8VAQ+7eL6ye5Cr/d3Z5u1TrydaZCcGuf8AXZlYhNR450Xru8XCPQBxUS6g= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1718382649; c=relaxed/simple; bh=Dn4Ux4T+OAUwHCqvI/33LakzR4aBRHi7lR376LsB8DY=; h=Message-ID:Date:From:To:Cc:Subject:References:MIME-Version: Content-Type; b=oZTmvzGdkUVG94Oi+w740QA6tLLXuQiC2l74Q4zDyGrvoFjvJrxu2QVdhPm+Gxt57qoT7yESxWO2iWJfXDxZwGuYbo3X4NIWYGhuYENxhJ61jBuGJieORAcmsmomfiURw6/+SaJfpUIUrulHHm7XrDr9IpvYR8xI6hAz27c6B5I= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 90094C4AF52; Fri, 14 Jun 2024 16:30:48 +0000 (UTC) Received: from rostedt by gandalf with local (Exim 4.97) (envelope-from ) id 1sI9pX-00000001rsv-2ZNr; Fri, 14 Jun 2024 12:31:11 -0400 Message-ID: <20240614163111.473960851@goodmis.org> User-Agent: quilt/0.68 Date: Fri, 14 Jun 2024 12:30:23 -0400 From: Steven Rostedt To: linux-kernel@vger.kernel.org Cc: Masami Hiramatsu , Mark Rutland , Mathieu Desnoyers , Andrew Morton , linux-mm@kvack.org, Vincent Donnefort , Joel Fernandes , Daniel Bristot de Oliveira , Ingo Molnar , Peter Zijlstra , Thomas Gleixner , Vineeth Pillai , Youssef Esmat , Beau Belgrave , Alexander Graf , Baoquan He , Borislav Petkov , "Paul E. McKenney" , David Howells , Mike Rapoport , Dave Hansen , Tony Luck , Guenter Roeck , Ross Zwisler , Kees Cook Subject: [for-next][PATCH 08/13] tracing: Add option to use memmapped memory for trace boot instance References: <20240614163015.456541709@goodmis.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 From: "Steven Rostedt (Google)" Add an option to the trace_instance kernel command line parameter that allows it to use the reserved memory from memmap boot parameter. memmap=12M$0x284500000 trace_instance=boot_mapped@0x284500000:12M The above will reserves 12 megs at the physical address 0x284500000. The second parameter will create a "boot_mapped" instance and use the memory reserved as the memory for the ring buffer. That will create an instance called "boot_mapped": /sys/kernel/tracing/instances/boot_mapped Note, because the ring buffer is using a defined memory ranged, it will act just like a memory mapped ring buffer. It will not have a snapshot buffer, as it can't swap out the buffer. The snapshot files as well as any tracers that uses a snapshot will not be present in the boot_mapped instance. Link: https://lkml.kernel.org/r/20240612232026.329660169@goodmis.org Cc: linux-mm@kvack.org Cc: Masami Hiramatsu Cc: Mark Rutland Cc: Mathieu Desnoyers Cc: Andrew Morton Cc: Vincent Donnefort Cc: Joel Fernandes Cc: Daniel Bristot de Oliveira Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Vineeth Pillai Cc: Youssef Esmat Cc: Beau Belgrave Cc: Alexander Graf Cc: Baoquan He Cc: Borislav Petkov Cc: "Paul E. McKenney" Cc: David Howells Cc: Mike Rapoport Cc: Dave Hansen Cc: Tony Luck Cc: Guenter Roeck Cc: Ross Zwisler Cc: Kees Cook Signed-off-by: Steven Rostedt (Google) --- .../admin-guide/kernel-parameters.txt | 9 +++ kernel/trace/trace.c | 75 +++++++++++++++++-- 2 files changed, 78 insertions(+), 6 deletions(-) diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt index b600df82669d..ff26b6094e79 100644 --- a/Documentation/admin-guide/kernel-parameters.txt +++ b/Documentation/admin-guide/kernel-parameters.txt @@ -6754,6 +6754,15 @@ the same thing would happen if it was left off). The irq_handler_entry event, and all events under the "initcall" system. + If memory has been reserved (see memmap for x86), the instance + can use that memory: + + memmap=12M$0x284500000 trace_instance=boot_map@0x284500000:12M + + The above will create a "boot_map" instance that uses the physical + memory at 0x284500000 that is 12Megs. The per CPU buffers of that + instance will be split up accordingly. + trace_options=[option-list] [FTRACE] Enable or disable tracer options at boot. The option-list is a comma delimited list of options diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 622fe670949d..dfde26aa3211 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -9504,6 +9504,31 @@ static int instance_mkdir(const char *name) return ret; } +static u64 map_pages(u64 start, u64 size) +{ + struct page **pages; + phys_addr_t page_start; + unsigned int page_count; + unsigned int i; + void *vaddr; + + page_count = DIV_ROUND_UP(size, PAGE_SIZE); + + page_start = start; + pages = kmalloc_array(page_count, sizeof(struct page *), GFP_KERNEL); + if (!pages) + return 0; + + for (i = 0; i < page_count; i++) { + phys_addr_t addr = page_start + i * PAGE_SIZE; + pages[i] = pfn_to_page(addr >> PAGE_SHIFT); + } + vaddr = vmap(pages, page_count, VM_MAP, PAGE_KERNEL); + kfree(pages); + + return (u64)(unsigned long)vaddr; +} + /** * trace_array_get_by_name - Create/Lookup a trace array, given its name. * @name: The name of the trace array to be looked up/created. @@ -10350,6 +10375,7 @@ __init static void enable_instances(void) { struct trace_array *tr; char *curr_str; + char *name; char *str; char *tok; @@ -10358,19 +10384,56 @@ __init static void enable_instances(void) str = boot_instance_info; while ((curr_str = strsep(&str, "\t"))) { + unsigned long start = 0; + unsigned long size = 0; + unsigned long addr = 0; tok = strsep(&curr_str, ","); + name = strsep(&tok, "@"); + if (tok) { + start = memparse(tok, &tok); + if (!start) { + pr_warn("Tracing: Invalid boot instance address for %s\n", + name); + continue; + } + } - if (IS_ENABLED(CONFIG_TRACER_MAX_TRACE)) - do_allocate_snapshot(tok); + if (start) { + if (*tok != ':') { + pr_warn("Tracing: No size specified for instance %s\n", name); + continue; + } + tok++; + size = memparse(tok, &tok); + if (!size) { + pr_warn("Tracing: Invalid boot instance size for %s\n", + name); + continue; + } + addr = map_pages(start, size); + if (addr) { + pr_info("Tracing: mapped boot instance %s at physical memory 0x%lx of size 0x%lx\n", + name, start, size); + } else { + pr_warn("Tracing: Failed to map boot instance %s\n", name); + continue; + } + } else { + /* Only non mapped buffers have snapshot buffers */ + if (IS_ENABLED(CONFIG_TRACER_MAX_TRACE)) + do_allocate_snapshot(name); + } - tr = trace_array_get_by_name(tok, NULL); + tr = trace_array_create_systems(name, NULL, addr, size); if (!tr) { - pr_warn("Failed to create instance buffer %s\n", curr_str); + pr_warn("Tracing: Failed to create instance buffer %s\n", curr_str); continue; } - /* Allow user space to delete it */ - trace_array_put(tr); + + /* Only allow non mapped buffers to be deleted */ + if (!start) + trace_array_put(tr); while ((tok = strsep(&curr_str, ","))) { early_enable_events(tr, tok, true); -- 2.43.0