From patchwork Thu Apr 27 22:03:47 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Steven Rostedt X-Patchwork-Id: 88393 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:b0ea:0:b0:3b6:4342:cba0 with SMTP id b10csp559831vqo; Thu, 27 Apr 2023 15:18:46 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ5BOey3MN1mRYo/gW2NqU+IGIx6jfEq/WLcYc8Z5+r7eSOOaLhMuLs7ppfwr1bkMkMjvadH X-Received: by 2002:a05:6a21:7893:b0:f2:c2a3:3b4 with SMTP id bf19-20020a056a21789300b000f2c2a303b4mr3965360pzc.41.1682633926718; Thu, 27 Apr 2023 15:18:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1682633926; cv=none; d=google.com; s=arc-20160816; b=B6+w7fXvbux77TdmvQDyRrxM41tezKUGEMhXwQar4I4pey1hmidLwTK1AQ8+Zoqzu1 jx+jElkN9PySK9d07ursgvWb6by6iyrg34MHng7uNOzi2C+ivo3QBHzmx0okE1OFhRbE 4JTkfjl/tpumqLnOfcPVCz9Uvc63ea6HOX5TbgLDsKYiek72AZKTkLIOczEMmJmRitdF 1RVuVFaKHu/xVOdxzUqLmWxrtFu2OMQWOIpoIog8CqpuYwTv5smjd06KxedGaau5x2cG pGKSLK19j3dMa0AAxVJfXUpmicE5YDiwsQHky8nPZgliTRDnt7Peb9W6Ccv3xLKwziA6 nK3w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:subject:cc:to:from:date; bh=/z7p2JYspL3vWDcA6eBzwwW0Inl6aVY1G0oMyZeV0Gg=; b=V3lZfYIAurLVNnDtglLTHUqTB7WXt5BXS9Os7H0svGVQBBag3g74BXAzOxPiCZlJvK ulbPxSnDMvpO7IeK2l7sX6xHo2oFMnEk6GRFsUhL1LnNMmggwuPLHAFM1ouEf0mIMzVI W4qU70pMp1/zonKZdUiZu3uga0efMsLm0UjoCP2g2TvJWcaEwaNp9OQGd92IYopfLGQx e+jL17TbBa5q9Dg0TjkCiOnfJZQWZBFL+T2jWC82qL1NmX/lc14rW9O2fiH6T7nL9CsT X2iKt6rBgAxBq0Q8+3AmyZSADa7oL3OrBiXJiCXjF2dCdmTDeBT7ytiP69JadAqeHV2n bwJQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id x5-20020a654145000000b00518521c5a33si19840804pgp.891.2023.04.27.15.18.27; Thu, 27 Apr 2023 15:18:46 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344061AbjD0WDx (ORCPT + 99 others); Thu, 27 Apr 2023 18:03:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:37488 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229724AbjD0WDw (ORCPT ); Thu, 27 Apr 2023 18:03:52 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 569D03595 for ; Thu, 27 Apr 2023 15:03:51 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id E41ED63F9F for ; Thu, 27 Apr 2023 22:03:50 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id ABD33C433EF; Thu, 27 Apr 2023 22:03:49 +0000 (UTC) Date: Thu, 27 Apr 2023 18:03:47 -0400 From: Steven Rostedt To: LKML Cc: Masami Hiramatsu , Mark Rutland , Johannes Berg Subject: [for-linus][PATCH] ring-buffer: Sync IRQ works before buffer destruction Message-ID: <20230427180347.11d459cb@gandalf.local.home> X-Mailer: Claws Mail 3.17.8 (GTK+ 2.24.33; x86_64-pc-linux-gnu) MIME-Version: 1.0 X-Spam-Status: No, score=-5.7 required=5.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,HEXHASH_WORD,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1764369552741491978?= X-GMAIL-MSGID: =?utf-8?q?1764369552741491978?= From: Johannes Berg If something was written to the buffer just before destruction, it may be possible (maybe not in a real system, but it did happen in ARCH=um with time-travel) to destroy the ringbuffer before the IRQ work ran, leading this KASAN report (or a crash without KASAN): BUG: KASAN: slab-use-after-free in irq_work_run_list+0x11a/0x13a Read of size 8 at addr 000000006d640a48 by task swapper/0 CPU: 0 PID: 0 Comm: swapper Tainted: G W O 6.3.0-rc1 #7 Stack: 60c4f20f 0c203d48 41b58ab3 60f224fc 600477fa 60f35687 60c4f20f 601273dd 00000008 6101eb00 6101eab0 615be548 Call Trace: [<60047a58>] show_stack+0x25e/0x282 [<60c609e0>] dump_stack_lvl+0x96/0xfd [<60c50d4c>] print_report+0x1a7/0x5a8 [<603078d3>] kasan_report+0xc1/0xe9 [<60308950>] __asan_report_load8_noabort+0x1b/0x1d [<60232844>] irq_work_run_list+0x11a/0x13a [<602328b4>] irq_work_tick+0x24/0x34 [<6017f9dc>] update_process_times+0x162/0x196 [<6019f335>] tick_sched_handle+0x1a4/0x1c3 [<6019fd9e>] tick_sched_timer+0x79/0x10c [<601812b9>] __hrtimer_run_queues.constprop.0+0x425/0x695 [<60182913>] hrtimer_interrupt+0x16c/0x2c4 [<600486a3>] um_timer+0x164/0x183 [...] Allocated by task 411: save_stack_trace+0x99/0xb5 stack_trace_save+0x81/0x9b kasan_save_stack+0x2d/0x54 kasan_set_track+0x34/0x3e kasan_save_alloc_info+0x25/0x28 ____kasan_kmalloc+0x8b/0x97 __kasan_kmalloc+0x10/0x12 __kmalloc+0xb2/0xe8 load_elf_phdrs+0xee/0x182 [...] The buggy address belongs to the object at 000000006d640800 which belongs to the cache kmalloc-1k of size 1024 The buggy address is located 584 bytes inside of freed 1024-byte region [000000006d640800, 000000006d640c00) Add the appropriate irq_work_sync() so the work finishes before the buffers are destroyed. Prior to the commit in the Fixes tag below, there was only a single global IRQ work, so this issue didn't exist. Link: https://lore.kernel.org/linux-trace-kernel/20230427175920.a76159263122.I8295e405c44362a86c995e9c2c37e3e03810aa56@changeid Cc: stable@vger.kernel.org Cc: Masami Hiramatsu Fixes: 15693458c4bc ("tracing/ring-buffer: Move poll wake ups into ring buffer code") Signed-off-by: Johannes Berg Signed-off-by: Steven Rostedt (Google) --- kernel/trace/ring_buffer.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 9a0cb94c3972..0d748f1f79ff 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -1767,6 +1767,8 @@ static void rb_free_cpu_buffer(struct ring_buffer_per_cpu *cpu_buffer) struct list_head *head = cpu_buffer->pages; struct buffer_page *bpage, *tmp; + irq_work_sync(&cpu_buffer->irq_work.work); + free_buffer_page(cpu_buffer->reader_page); if (head) { @@ -1873,6 +1875,8 @@ ring_buffer_free(struct trace_buffer *buffer) cpuhp_state_remove_instance(CPUHP_TRACE_RB_PREPARE, &buffer->node); + irq_work_sync(&buffer->irq_work.work); + for_each_buffer_cpu(buffer, cpu) rb_free_cpu_buffer(buffer->buffers[cpu]);