Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp3511938pxj; Tue, 15 Jun 2021 02:32:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxi8+oQkN0mbPq6cpdiF57DyhHwcxSNT1NsdnNOCx3hm4X/7Q0tyB4NQUClfUQT128IhkIv X-Received: by 2002:a05:6402:2710:: with SMTP id y16mr4115193edd.101.1623749556668; Tue, 15 Jun 2021 02:32:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623749556; cv=none; d=google.com; s=arc-20160816; b=Q3W3jxyxjG69ojEguXGcf1sLxmKFl/bRbob0pVR0Hm9Bcqj8xKb0p5G7W1xtK+oDU7 zqJ89SzVPsbZl/wKPDjOBmntA/6FQvmgywcPFT7MPumE9zkYycgGleOmEzHskbvBwheD MlBpgYxnbArNO0edxga5nXvCBSzfxnf/wmKdlganw72BmTeVa2VZYlsyOItznpviDav2 vsEVCles4/J25CZtpLHkQ63yHbitxOLCGMhMcUd1kQKhYcIc7kov8AIJG7+LsTF2UrBq pvOSBZ2X0rW0zfKEtLGvMfQtOrPLozD63N1puxT2FbqBdbWWZD+RxTqpgPkybMQWGKJB fprg== 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 :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=stvg0megILuPd6NvgqVa+NZDpI9rrbcItm0z8KhGLwc=; b=PCDG1XtfP2KPrJsBsv6FMAAJE4PP8whOKK4W4Tg56nhOiAR6sz+22aqP36jb3Y7poJ w957zGdwrG1PNfimlKV6SAjhzI25xZauqa+DS7A3Q2TrVWYJ0xWqqYdML8MZMVyKkGU2 dJV5GXWRIKfVhNkiIidK5VdrnPt1c0r2iEy1Ulhz6kdj3BOohpUcpU52pcPZN3v+aRmb rWnspnlwB8kdDa3Tr75vFFcvy8uMPuN/+PvojFxfF2FUrl6dwy3EPs/aFporxGsFWuUN ALXDE2Pz+bHKfkq154tjhgW0jTEiv05/kdxhGt4kQ7uGqB1uIKOX8ZVFYYlR+eoVAClh rIiw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=JYrn1HsI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id u5si13779643ejn.571.2021.06.15.02.32.14; Tue, 15 Jun 2021 02:32:36 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=JYrn1HsI; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231372AbhFOJc2 (ORCPT + 99 others); Tue, 15 Jun 2021 05:32:28 -0400 Received: from us-smtp-delivery-124.mimecast.com ([216.205.24.124]:47079 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231536AbhFOJcM (ORCPT ); Tue, 15 Jun 2021 05:32:12 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1623749408; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=stvg0megILuPd6NvgqVa+NZDpI9rrbcItm0z8KhGLwc=; b=JYrn1HsI2SpCwoPXc53JlOjsRsfp4cvfa7qY1SHB7WzNJtZv+iZb3oYPX74200+uh9XyFd 1dlXmGSKSuL8S2Zy9f4LZ4RUOuscDAcolgl89CwIpyPKRjcVkwrkfZUSDvKkUeyyLov0QD nrIo49sP80KP5veexUkcaJUQSNdKNb4= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-587-33FR3KMCMFCN2ejGc2sfpQ-1; Tue, 15 Jun 2021 05:30:06 -0400 X-MC-Unique: 33FR3KMCMFCN2ejGc2sfpQ-1 Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id B6FFE101C8A8; Tue, 15 Jun 2021 09:30:04 +0000 (UTC) Received: from x1.com (ovpn-113-40.rdu2.redhat.com [10.10.113.40]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7D4D35D6AD; Tue, 15 Jun 2021 09:30:00 +0000 (UTC) From: Daniel Bristot de Oliveira To: Steven Rostedt Cc: Phil Auld , Sebastian Andrzej Siewior , Kate Carcia , Daniel Bristot de Oliveira , Jonathan Corbet , Ingo Molnar , Peter Zijlstra , Thomas Gleixner , Alexandre Chartre , Clark Willaims , John Kacur , Juri Lelli , Borislav Petkov , "H. Peter Anvin" , x86@kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH V4 12/12] trace/osnoise: Support hotplug operations Date: Tue, 15 Jun 2021 11:28:51 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Enable and disable osnoise/timerlat thread during on CPU hotplug online and offline operations respectivelly. Cc: Jonathan Corbet Cc: Steven Rostedt Cc: Ingo Molnar Cc: Peter Zijlstra Cc: Thomas Gleixner Cc: Alexandre Chartre Cc: Clark Willaims Cc: John Kacur Cc: Juri Lelli Cc: Borislav Petkov Cc: "H. Peter Anvin" Cc: x86@kernel.org Cc: linux-doc@vger.kernel.org Cc: linux-kernel@vger.kernel.org Signed-off-by: Daniel Bristot de Oliveira --- kernel/trace/trace_osnoise.c | 133 +++++++++++++++++++++++++++-------- 1 file changed, 103 insertions(+), 30 deletions(-) diff --git a/kernel/trace/trace_osnoise.c b/kernel/trace/trace_osnoise.c index 2c1e2a074b1e..e8f057a3bdc3 100644 --- a/kernel/trace/trace_osnoise.c +++ b/kernel/trace/trace_osnoise.c @@ -1399,22 +1399,67 @@ static int timerlat_main(void *data) #endif /* CONFIG_TIMERLAT_TRACER */ /* - * stop_per_cpu_kthread - stop per-cpu threads + * stop_kthread - stop a workload thread + */ +static void stop_kthread(unsigned int cpu) +{ + struct task_struct *kthread; + + kthread = per_cpu(per_cpu_osnoise_var, cpu).kthread; + if (kthread) + kthread_stop(kthread); + per_cpu(per_cpu_osnoise_var, cpu).kthread = NULL; +} + +/* + * stop_per_cpu_kthread - Stop per-cpu threads * * Stop the osnoise sampling htread. Use this on unload and at system * shutdown. */ static void stop_per_cpu_kthreads(void) { - struct task_struct *kthread; int cpu; - for_each_online_cpu(cpu) { - kthread = per_cpu(per_cpu_osnoise_var, cpu).kthread; - if (kthread) - kthread_stop(kthread); - per_cpu(per_cpu_osnoise_var, cpu).kthread = NULL; + get_online_cpus(); + + for_each_online_cpu(cpu) + stop_kthread(cpu); + + put_online_cpus(); +} + +/* + * start_kthread - Start a workload tread + */ +static int start_kthread(unsigned int cpu) +{ + struct task_struct *kthread; + char comm[24]; + void *main = osnoise_main; + +#ifdef CONFIG_TIMERLAT_TRACER + if (osnoise_data.timerlat_tracer) { + snprintf(comm, 24, "timerlat/%d", cpu); + main = timerlat_main; + } else { + snprintf(comm, 24, "osnoise/%d", cpu); + } +#else + snprintf(comm, 24, "osnoise/%d", cpu); +#endif + kthread = kthread_create_on_cpu(main, NULL, cpu, comm); + + if (IS_ERR(kthread)) { + pr_err(BANNER "could not start sampling thread\n"); + stop_per_cpu_kthreads(); + return -ENOMEM; } + + per_cpu(per_cpu_osnoise_var, cpu).kthread = kthread; + wake_up_process(kthread); + + return 0; } /* @@ -1426,9 +1471,7 @@ static void stop_per_cpu_kthreads(void) static int start_per_cpu_kthreads(struct trace_array *tr) { struct cpumask *current_mask = &save_cpumask; - struct task_struct *kthread; - char comm[24]; - void *main = osnoise_main; + int retval; int cpu; get_online_cpus(); @@ -1440,34 +1483,52 @@ static int start_per_cpu_kthreads(struct trace_array *tr) * And the CPU is online. */ cpumask_and(current_mask, cpu_online_mask, current_mask); - put_online_cpus(); - for_each_online_cpu(cpu) + for_each_possible_cpu(cpu) per_cpu(per_cpu_osnoise_var, cpu).kthread = NULL; for_each_cpu(cpu, current_mask) { -#ifdef CONFIG_TIMERLAT_TRACER - if (osnoise_data.timerlat_tracer) { - snprintf(comm, 24, "timerlat/%d", cpu); - main = timerlat_main; - } else { - snprintf(comm, 24, "osnoise/%d", cpu); - } -#else - snprintf(comm, 24, "osnoise/%d", cpu); -#endif - kthread = kthread_create_on_cpu(main, NULL, cpu, comm); - - if (IS_ERR(kthread)) { - pr_err(BANNER "could not start sampling thread\n"); + retval = start_kthread(cpu); + if (retval) { stop_per_cpu_kthreads(); - return -ENOMEM; + return retval; } - - per_cpu(per_cpu_osnoise_var, cpu).kthread = kthread; - wake_up_process(kthread); } + put_online_cpus(); + + return 0; +} + +/* + * osnoise_cpu_init - CPU hotplug online callback function + */ +static int osnoise_cpu_init(unsigned int cpu) +{ + struct trace_array *tr = osnoise_trace; + + if (!osnoise_busy) + return 0; + + if (!cpumask_test_cpu(cpu, &osnoise_cpumask)) + return 0; + + if (!cpumask_test_cpu(cpu, tr->tracing_cpumask)) + return 0; + + return start_kthread(cpu); +} + +/* + * osnoise_cpu_die - CPU hotplug offline callback function + */ +static int osnoise_cpu_die(unsigned int cpu) +{ + if (!osnoise_busy) + return 0; + + stop_kthread(cpu); + return 0; } @@ -1566,7 +1627,14 @@ osnoise_cpus_write(struct file *filp, const char __user *ubuf, size_t count, osnoise_tracer_stop(tr); mutex_lock(&interface_lock); + /* + * osnoise_cpumask is ready by CPU hotplug operations. + */ + get_online_cpus(); + cpumask_copy(&osnoise_cpumask, osnoise_cpumask_new); + + put_online_cpus(); mutex_unlock(&interface_lock); if (running) @@ -1924,6 +1992,11 @@ __init static int init_osnoise_tracer(void) } #endif + ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "trace/osnoise:online", + osnoise_cpu_init, osnoise_cpu_die); + if (ret < 0) + pr_warn(BANNER "Error to init cpu hotplug support\n"); + init_tracefs(); return 0; -- 2.31.1