merge sched_note_spinxx into sched_note_spincommon

Signed-off-by: yinshengkai <yinshengkai@xiaomi.com>
This commit is contained in:
yinshengkai 2022-12-16 12:27:09 +08:00 committed by Xiang Xiao
parent aeed8f5d26
commit 552cf4b549
6 changed files with 91 additions and 154 deletions

View File

@ -380,46 +380,6 @@ static inline int note_isenabled_dump(void)
}
#endif
/****************************************************************************
* Name: note_spincommon
*
* Description:
* Common logic for NOTE_SPINLOCK, NOTE_SPINLOCKED, and NOTE_SPINUNLOCK
*
* Input Parameters:
* tcb - The TCB containing the information
* note - The common note structure to use
*
* Returned Value:
* None
*
****************************************************************************/
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
static void note_spincommon(FAR struct tcb_s *tcb,
FAR volatile spinlock_t *spinlock,
int type)
{
struct note_spinlock_s note;
if (!note_isenabled())
{
return;
}
/* Format the note */
note_common(tcb, &note.nsp_cmn, sizeof(struct note_spinlock_s), type);
sched_note_flatten(note.nsp_spinlock, &spinlock, sizeof(spinlock));
note.nsp_value = *(FAR uint8_t *)spinlock;
/* Add the note to circular buffer */
sched_note_add(&note, sizeof(struct note_spinlock_s));
}
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
@ -704,27 +664,43 @@ void sched_note_csection(FAR struct tcb_s *tcb, bool enter)
}
#endif
/****************************************************************************
* Name: sched_note_spinlock
*
* Description:
* Common logic for NOTE_SPINLOCK, NOTE_SPINLOCKED, and NOTE_SPINUNLOCK
*
* Input Parameters:
* tcb - The TCB containing the information
* note - The common note structure to use
*
* Returned Value:
* None
*
****************************************************************************/
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
void sched_note_spinlock(FAR struct tcb_s *tcb, FAR volatile void *spinlock)
void sched_note_spinlock(FAR struct tcb_s *tcb,
FAR volatile spinlock_t *spinlock,
int type)
{
note_spincommon(tcb, spinlock, NOTE_SPINLOCK_LOCK);
}
struct note_spinlock_s note;
void sched_note_spinlocked(FAR struct tcb_s *tcb,
FAR volatile void *spinlock)
{
note_spincommon(tcb, spinlock, NOTE_SPINLOCK_LOCKED);
}
if (!note_isenabled())
{
return;
}
void sched_note_spinunlock(FAR struct tcb_s *tcb,
FAR volatile void *spinlock)
{
note_spincommon(tcb, spinlock, NOTE_SPINLOCK_UNLOCK);
}
/* Format the note */
void sched_note_spinabort(FAR struct tcb_s *tcb, FAR volatile void *spinlock)
{
note_spincommon(tcb, spinlock, NOTE_SPINLOCK_ABORT);
note_common(tcb, &note.nsp_cmn, sizeof(struct note_spinlock_s), type);
sched_note_flatten(note.nsp_spinlock, &spinlock, sizeof(spinlock));
note.nsp_value = *(FAR uint8_t *)spinlock;
/* Add the note to circular buffer */
sched_note_add(&note, sizeof(struct note_spinlock_s));
}
#endif

View File

@ -34,56 +34,6 @@
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: note_spincommon
*
* Description:
* Common logic for NOTE_SPINLOCK, NOTE_SPINLOCKED, and NOTE_SPINUNLOCK
*
* Input Parameters:
* tcb - The TCB containing the information
* note - The common note structure to use
*
* Returned Value:
* None
*
****************************************************************************/
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
static inline void note_spincommon(FAR struct tcb_s *tcb,
FAR volatile void *spinlock,
int type)
{
FAR static const char * const tmp[] =
{
"LOCK",
"LOCKED",
"UNLOCK",
"ABORT"
};
FAR const char * msg = tmp[type - NOTE_SPINLOCK_LOCK];
#ifdef CONFIG_SMP
#if CONFIG_TASK_NAME_SIZE > 0
syslog(LOG_INFO, "CPU%d: Task %s TCB@%p spinlock@%p %s\n",
tcb->cpu, tcb->name, tcb, spinlock, msg);
#else
syslog(LOG_INFO, "CPU%d: TCB@%p spinlock@%p %s\n",
tcb->cpu, tcb, spinlock, msg);
#endif
#else
#if CONFIG_TASK_NAME_SIZE > 0
syslog(LOG_INFO, "Task %s TCB@%p spinlock@%p %s\n",
tcb->name, tcb, spinlock, msg);
#else
syslog(LOG_INFO, "TCB@%p spinlock@%p %s\n",
tcb, spinlock, msg);
#endif
#endif
}
#endif
/****************************************************************************
* Public Functions
****************************************************************************/
@ -319,29 +269,53 @@ void sched_note_csection(FAR struct tcb_s *tcb, bool enter)
}
#endif
/****************************************************************************
* Name: sched_note_spinlock
*
* Description:
* Common logic for NOTE_SPINLOCK, NOTE_SPINLOCKED, and NOTE_SPINUNLOCK
*
* Input Parameters:
* tcb - The TCB containing the information
* note - The common note structure to use
*
* Returned Value:
* None
*
****************************************************************************/
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
void sched_note_spinlock(FAR struct tcb_s *tcb,
FAR volatile void *spinlock)
FAR volatile spinlock_t *spinlock,
int type)
{
note_spincommon(tcb, spinlock, NOTE_SPINLOCK_LOCK);
}
FAR static const char * const tmp[] =
{
"LOCK",
"LOCKED",
"UNLOCK",
"ABORT"
};
void sched_note_spinlocked(FAR struct tcb_s *tcb,
FAR volatile void *spinlock)
{
note_spincommon(tcb, spinlock, NOTE_SPINLOCK_LOCKED);
}
FAR const char * msg = tmp[type - NOTE_SPINLOCK_LOCK];
void sched_note_spinunlock(FAR struct tcb_s *tcb,
FAR volatile void *spinlock)
{
note_spincommon(tcb, spinlock, NOTE_SPINLOCK_UNLOCK);
}
void sched_note_spinabort(FAR struct tcb_s *tcb,
FAR volatile void *spinlock)
{
note_spincommon(tcb, spinlock, NOTE_SPINLOCK_ABORT);
#ifdef CONFIG_SMP
#if CONFIG_TASK_NAME_SIZE > 0
syslog(LOG_INFO, "CPU%d: Task %s TCB@%p spinlock@%p %s\n",
tcb->cpu, tcb->name, tcb, spinlock, msg);
#else
syslog(LOG_INFO, "CPU%d: TCB@%p spinlock@%p %s\n",
tcb->cpu, tcb, spinlock, msg);
#endif
#else
#if CONFIG_TASK_NAME_SIZE > 0
syslog(LOG_INFO, "Task %s TCB@%p spinlock@%p %s\n",
tcb->name, tcb, spinlock, msg);
#else
syslog(LOG_INFO, "TCB@%p spinlock@%p %s\n",
tcb, spinlock, msg);
#endif
#endif
}
#endif

View File

@ -33,6 +33,7 @@
#include <stdarg.h>
#include <nuttx/sched.h>
#include <nuttx/spinlock.h>
/* For system call numbers definition */
@ -512,18 +513,10 @@ void sched_note_csection(FAR struct tcb_s *tcb, bool enter);
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
void sched_note_spinlock(FAR struct tcb_s *tcb,
FAR volatile void *spinlock);
void sched_note_spinlocked(FAR struct tcb_s *tcb,
FAR volatile void *spinlock);
void sched_note_spinunlock(FAR struct tcb_s *tcb,
FAR volatile void *spinlock);
void sched_note_spinabort(FAR struct tcb_s *tcb,
FAR volatile void *spinlock);
FAR volatile spinlock_t *spinlock,
int type);
#else
# define sched_note_spinlock(t,s)
# define sched_note_spinlocked(t,s)
# define sched_note_spinunlock(t,s)
# define sched_note_spinabort(t,s)
# define sched_note_spinlock(tcb, spinlock, type)
#endif
#ifdef CONFIG_SCHED_INSTRUMENTATION_SYSCALL
@ -695,10 +688,7 @@ void sched_note_filter_irq(FAR struct note_filter_irq_s *oldf,
# define sched_note_cpu_resumed(t)
# define sched_note_premption(t,l)
# define sched_note_csection(t,e)
# define sched_note_spinlock(t,s)
# define sched_note_spinlocked(t,s)
# define sched_note_spinunlock(t,s)
# define sched_note_spinabort(t,s)
# define sched_note_spinlock(t,s,i)
# define sched_note_syscall_enter(n,a,...)
# define sched_note_syscall_leave(n,r)
# define sched_note_irqhandler(i,h,e)

View File

@ -1037,10 +1037,7 @@ config SCHED_INSTRUMENTATION_SPINLOCKS
Enables additional hooks for spinlock state. Board-specific logic
must provide this additional logic.
void sched_note_spinlock(FAR struct tcb_s *tcb, bool state);
void sched_note_spinlocked(FAR struct tcb_s *tcb, bool state);
void sched_note_spinunlock(FAR struct tcb_s *tcb, bool state);
void sched_note_spinabort(FAR struct tcb_s *tcb, bool state);
void sched_note_spinlock(FAR struct tcb_s *tcb, FAR volatile spinlock_t *spinlock, int type)
config SCHED_INSTRUMENTATION_SYSCALL
bool "System call monitor hooks"

View File

@ -113,7 +113,7 @@ static bool irq_waitlock(int cpu)
/* Notify that we are waiting for a spinlock */
sched_note_spinlock(tcb, &g_cpu_irqlock);
sched_note_spinlock(tcb, &g_cpu_irqlock, NOTE_SPINLOCK_LOCK);
#endif
/* Duplicate the spin_lock() logic from spinlock.c, but adding the check
@ -133,7 +133,7 @@ static bool irq_waitlock(int cpu)
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
/* Notify that we have aborted the wait for the spinlock */
sched_note_spinabort(tcb, &g_cpu_irqlock);
sched_note_spinlock(tcb, &g_cpu_irqlock, NOTE_SPINLOCK_ABORT);
#endif
return false;
@ -145,7 +145,7 @@ static bool irq_waitlock(int cpu)
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
/* Notify that we have the spinlock */
sched_note_spinlocked(tcb, &g_cpu_irqlock);
sched_note_spinlock(tcb, &g_cpu_irqlock, NOTE_SPINLOCK_LOCKED);
#endif
return true;

View File

@ -68,7 +68,7 @@ void spin_lock(FAR volatile spinlock_t *lock)
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
/* Notify that we are waiting for a spinlock */
sched_note_spinlock(this_task(), lock);
sched_note_spinlock(this_task(), lock, NOTE_SPINLOCK_LOCK);
#endif
while (up_testset(lock) == SP_LOCKED)
@ -80,7 +80,7 @@ void spin_lock(FAR volatile spinlock_t *lock)
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
/* Notify that we have the spinlock */
sched_note_spinlocked(this_task(), lock);
sched_note_spinlock(this_task(), lock, NOTE_SPINLOCK_LOCKED);
#endif
SP_DMB();
}
@ -142,7 +142,7 @@ spinlock_t spin_trylock(FAR volatile spinlock_t *lock)
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
/* Notify that we are waiting for a spinlock */
sched_note_spinlock(this_task(), lock);
sched_note_spinlock(this_task(), lock, NOTE_SPINLOCK_LOCK);
#endif
if (up_testset(lock) == SP_LOCKED)
@ -150,7 +150,7 @@ spinlock_t spin_trylock(FAR volatile spinlock_t *lock)
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
/* Notify that we abort for a spinlock */
sched_note_spinabort(this_task(), &lock);
sched_note_spinlock(this_task(), lock, NOTE_SPINLOCK_ABORT);
#endif
SP_DSB();
return SP_LOCKED;
@ -159,7 +159,7 @@ spinlock_t spin_trylock(FAR volatile spinlock_t *lock)
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
/* Notify that we have the spinlock */
sched_note_spinlocked(this_task(), lock);
sched_note_spinlock(this_task(), lock, NOTE_SPINLOCK_LOCKED);
#endif
SP_DMB();
return SP_UNLOCKED;
@ -222,7 +222,7 @@ void spin_unlock(FAR volatile spinlock_t *lock)
#ifdef CONFIG_SCHED_INSTRUMENTATION_SPINLOCKS
/* Notify that we are unlocking the spinlock */
sched_note_spinunlock(this_task(), lock);
sched_note_spinlock(this_task(), lock, NOTE_SPINLOCK_UNLOCK);
#endif
SP_DMB();
@ -310,7 +310,7 @@ void spin_setbit(FAR volatile cpu_set_t *set, unsigned int cpu,
{
/* Notify that we have locked the spinlock */
sched_note_spinlocked(this_task(), orlock);
sched_note_spinlock(this_task(), orlock, NOTE_SPINLOCK_LOCKED);
}
#endif
@ -373,7 +373,7 @@ void spin_clrbit(FAR volatile cpu_set_t *set, unsigned int cpu,
{
/* Notify that we have unlocked the spinlock */
sched_note_spinunlock(this_task(), orlock);
sched_note_spinlock(this_task(), orlock, NOTE_SPINLOCK_UNLOCK);
}
#endif