From 69e97c19ea65d1942f701db459a428e368fa0ed6 Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Tue, 16 Jun 2020 11:30:58 -0600 Subject: [PATCH] sched/sched/sched_note.c: Implement interrupt/syscall support A previous PR added interrupt and system call scheduler notes. This addess buffering support for those notes. --- include/nuttx/sched_note.h | 8 ++-- sched/Kconfig | 2 +- sched/sched/sched_note.c | 96 ++++++++++++++++++++++++++------------ 3 files changed, 69 insertions(+), 37 deletions(-) diff --git a/include/nuttx/sched_note.h b/include/nuttx/sched_note.h index 721d234427..e19919750b 100644 --- a/include/nuttx/sched_note.h +++ b/include/nuttx/sched_note.h @@ -99,7 +99,8 @@ enum note_type_e #endif #ifdef CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER , - NOTE_IRQHANDLER = 20 + NOTE_IRQ_ENTER = 20, + NOTE_IRQ_LEAVE = 21 #endif }; @@ -239,7 +240,6 @@ struct note_syscall_enter_s { struct note_common_s nsc_cmn; /* Common note parameters */ int nsc_nr; /* System call number */ - bool nsc_enter; /* true: Entering system call */ }; struct note_syscall_leave_s @@ -247,18 +247,16 @@ struct note_syscall_leave_s struct note_common_s nsc_cmn; /* Common note parameters */ uintptr_t nsc_result; /* Result of the system call */ int nsc_nr; /* System call number */ - bool nsc_enter; /* false: Leaving system call */ }; #endif /* CONFIG_SCHED_INSTRUMENTATION_SYSCALL */ #ifdef CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER -/* This is the specific form of the NOTE_IRQHANDLER note */ +/* This is the specific form of the NOTE_IRQ_ENTER/LEAVE notes */ struct note_irqhandler_s { struct note_common_s nih_cmn; /* Common note parameters */ int nih_irq; /* IRQ number */ - bool nih_enter; /* true: Entering handler */ }; #endif /* CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER */ #endif /* CONFIG_SCHED_INSTRUMENTATION_BUFFER */ diff --git a/sched/Kconfig b/sched/Kconfig index a534969d87..460b58a77f 100644 --- a/sched/Kconfig +++ b/sched/Kconfig @@ -1026,7 +1026,7 @@ config SCHED_NOTE_BUFSIZE bytes). config SCHED_NOTE_GET - bool "Callable interface to get instrumentatin data" + bool "Callable interface to get instrumentation data" default n depends on !SCHED_INSTRUMENTATION_CSECTION && (!SCHED_INSTRUMENTATION_SPINLOCK || !SMP) ---help--- diff --git a/sched/sched/sched_note.c b/sched/sched/sched_note.c index 6fcb2a5093..c952ca8972 100644 --- a/sched/sched/sched_note.c +++ b/sched/sched/sched_note.c @@ -1,35 +1,20 @@ /**************************************************************************** * sched/sched/sched_note.c * - * Copyright (C) 2016 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: + * http://www.apache.org/licenses/LICENSE-2.0 * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. * ****************************************************************************/ @@ -53,10 +38,6 @@ #ifdef CONFIG_SCHED_INSTRUMENTATION_BUFFER -/**************************************************************************** - * Pre-processor Definitions - ****************************************************************************/ - /**************************************************************************** * Private Types ****************************************************************************/ @@ -594,6 +575,59 @@ void sched_note_spinabort(FAR struct tcb_s *tcb, FAR volatile void *spinlock) } #endif +#ifdef CONFIG_SCHED_INSTRUMENTATION_SYSCALL +void sched_note_syscall_enter(int nr, int argc, ...) +{ + struct note_syscall_enter_s note; + FAR struct tcb_s *tcb = this_task(); + + /* Format the note */ + + note_common(tcb, ¬e.nsc_cmn, sizeof(struct note_syscall_enter_s), + NOTE_CSECTION_ENTER); + note.nsc_nr = nr; + + /* Add the note to circular buffer */ + + note_add((FAR const uint8_t *)¬e, sizeof(struct note_syscall_enter_s)); +} + +void sched_note_syscall_leave(int nr, uintptr_t result) +{ + struct note_syscall_leave_s note; + FAR struct tcb_s *tcb = this_task(); + + /* Format the note */ + + note_common(tcb, ¬e.nsc_cmn, sizeof(struct note_syscall_leave_s), + NOTE_CSECTION_LEAVE); + note.nsc_result = result; + note.nsc_nr = nr; + + /* Add the note to circular buffer */ + + note_add((FAR const uint8_t *)¬e, sizeof(struct note_syscall_leave_s)); +} +#endif + +#ifdef CONFIG_SCHED_INSTRUMENTATION_IRQHANDLER +void sched_note_irqhandler(int irq, FAR void *handler, bool enter) +{ + struct note_irqhandler_s note; + FAR struct tcb_s *tcb = this_task(); + + /* Format the note */ + + note_common(tcb, ¬e.nih_cmn, sizeof(struct note_irqhandler_s), + enter ? NOTE_IRQ_ENTER : NOTE_IRQ_LEAVE); + note.nih_irq = irq; + + /* Add the note to circular buffer */ + + note_add((FAR const uint8_t *)¬e, sizeof(struct note_irqhandler_s)); +} +#endif + /**************************************************************************** * Name: sched_note_get *