sched: remove csection in event

We hope to replace the large lock with a small lock to improve concurrency performance.

Signed-off-by: hujun5 <hujun5@xiaomi.com>
This commit is contained in:
hujun5
2025-03-07 15:27:44 +08:00
committed by GUIDINGLI
parent 3629a3b5a1
commit 4cea148088
4 changed files with 18 additions and 33 deletions
+4 -2
View File
@@ -31,6 +31,7 @@
#include <nuttx/list.h> #include <nuttx/list.h>
#include <nuttx/semaphore.h> #include <nuttx/semaphore.h>
#include <nuttx/spinlock.h>
/**************************************************************************** /****************************************************************************
* Pre-processor Definitions * Pre-processor Definitions
@@ -70,8 +71,9 @@ struct nxevent_wait_s
struct nxevent_s struct nxevent_s
{ {
struct list_node list; /* Waiting list of nxevent_wait_t */ struct list_node list; /* Waiting list of nxevent_wait_t */
volatile nxevent_mask_t events; /* Pending Events */ volatile nxevent_mask_t events; /* Pending Events */
spinlock_t lock; /* Spinlock */
}; };
#ifdef CONFIG_FS_NAMED_EVENTS #ifdef CONFIG_FS_NAMED_EVENTS
+1
View File
@@ -49,5 +49,6 @@
void nxevent_init(FAR nxevent_t *event, nxevent_mask_t events) void nxevent_init(FAR nxevent_t *event, nxevent_mask_t events)
{ {
event->events = events; event->events = events;
spin_lock_init(&event->lock);
list_initialize(&event->list); list_initialize(&event->list);
} }
+3 -28
View File
@@ -32,23 +32,6 @@
* Private Functions * Private Functions
****************************************************************************/ ****************************************************************************/
/****************************************************************************
* Name: nxevent_sem_post
****************************************************************************/
static inline_function int nxevent_sem_post(FAR sem_t *sem)
{
int semcount;
nxsem_get_value(sem, &semcount);
if (semcount < 1)
{
return nxsem_post(sem);
}
return 0;
}
/**************************************************************************** /****************************************************************************
* Public Functions * Public Functions
****************************************************************************/ ****************************************************************************/
@@ -98,7 +81,7 @@ int nxevent_post(FAR nxevent_t *event, nxevent_mask_t events,
return -EINVAL; return -EINVAL;
} }
flags = enter_critical_section(); flags = spin_lock_irqsave_nopreempt(&event->lock);
if ((eflags & NXEVENT_POST_SET) != 0) if ((eflags & NXEVENT_POST_SET) != 0)
{ {
@@ -113,12 +96,6 @@ int nxevent_post(FAR nxevent_t *event, nxevent_mask_t events,
{ {
postall = ((eflags & NXEVENT_POST_ALL) != 0); postall = ((eflags & NXEVENT_POST_ALL) != 0);
/* Hold schedule lock here to avoid context switch if post high
* priority task.
*/
sched_lock();
list_for_every_entry_safe(&event->list, wait, tmp, list_for_every_entry_safe(&event->list, wait, tmp,
nxevent_wait_t, node) nxevent_wait_t, node)
{ {
@@ -129,7 +106,7 @@ int nxevent_post(FAR nxevent_t *event, nxevent_mask_t events,
{ {
list_delete_init(&wait->node); list_delete_init(&wait->node);
ret = nxevent_sem_post(&wait->sem); ret = nxsem_post(&wait->sem);
if (ret < 0) if (ret < 0)
{ {
continue; continue;
@@ -156,11 +133,9 @@ int nxevent_post(FAR nxevent_t *event, nxevent_mask_t events,
{ {
event->events &= ~clear; event->events &= ~clear;
} }
sched_unlock();
} }
leave_critical_section(flags); spin_unlock_irqrestore_nopreempt(&event->lock, flags);
return ret; return ret;
} }
+10 -3
View File
@@ -80,7 +80,7 @@ nxevent_mask_t nxevent_tickwait_wait(FAR nxevent_t *event,
events = ~0; events = ~0;
} }
flags = enter_critical_section(); flags = spin_lock_irqsave(&event->lock);
if ((eflags & NXEVENT_WAIT_RESET) != 0) if ((eflags & NXEVENT_WAIT_RESET) != 0)
{ {
@@ -126,6 +126,7 @@ nxevent_mask_t nxevent_tickwait_wait(FAR nxevent_t *event,
wait->eflags = eflags; wait->eflags = eflags;
list_add_tail(&event->list, &(wait->node)); list_add_tail(&event->list, &(wait->node));
spin_unlock_irqrestore(&event->lock, flags);
/* Wait for the event */ /* Wait for the event */
@@ -141,19 +142,25 @@ nxevent_mask_t nxevent_tickwait_wait(FAR nxevent_t *event,
/* Destroy local variables */ /* Destroy local variables */
nxsem_destroy(&(wait->sem)); nxsem_destroy(&(wait->sem));
list_delete(&(wait->node));
flags = spin_lock_irqsave(&event->lock);
if (ret == 0) if (ret == 0)
{ {
events = wait->expect; events = wait->expect;
DEBUGASSERT(!list_in_list(&(wait->node)));
} }
else else
{ {
if (list_in_list(&(wait->node)))
{
list_delete(&(wait->node));
}
events = 0; events = 0;
} }
} }
leave_critical_section(flags); spin_unlock_irqrestore(&event->lock, flags);
return events; return events;
} }