-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Feature/smp granular locks v4 #1154
base: main
Are you sure you want to change the base?
Feature/smp granular locks v4 #1154
Conversation
@chinglee-iot @aggarg This PR introduces the granular locks changes to the FreeRTOS kernel. Please have a look and we could have discussions/changes in this PR context. Thank you. cc: @ESP-Marius @Dazza0 |
Thank you for your contribution, I'll forward this request to the team. There are few error in the PR can you please try fixing them |
Hello @sudeep-mohanty, I am just following up if you had time to fix the build issues |
@rawalexe Yes! I shall work on the failures and would also do some refactoring for an easier review process. For now, I've put this PR in draft. |
0159a4a
to
5bf8c33
Compare
Hi @sudeep-mohanty, |
5bf8c33
to
9f8acc7
Compare
Hi @ActoryOu, I've made some updates which should fix the CI failures however I could not understand why the link-verifier action fails. Seems more like a script failure to me. So this action would still fail. If you have more information on what is causing it, could you let me know and I shall fix it. Thanks. |
c79962d
to
f50d476
Compare
Created a PR to fix the CI failure - FreeRTOS/FreeRTOS#1292 |
f50d476
to
421cd7f
Compare
…herit() xTaskPriorityInherit() is called inside a critical section from queue.c. This commit moves the critical section into xTaskPriorityInherit(). Co-authored-by: Sudeep Mohanty <[email protected]>
Changed xPreemptionDisable to be a count rather than a pdTRUE/pdFALSE. This allows nested calls to vTaskPreemptionEnable(), where a yield only occurs when xPreemptionDisable is 0. Co-authored-by: Sudeep Mohanty <[email protected]>
Adds the required checks for granular locking port macros. Port Config: - portUSING_GRANULAR_LOCKS to enable granular locks - portCRITICAL_NESTING_IN_TCB should be disabled Granular Locking Port Macros: - Spinlocks - portSPINLOCK_TYPE - portINIT_EVENT_GROUP_TASK_SPINLOCK( pxSpinlock ) - portINIT_EVENT_GROUP_ISR_SPINLOCK( pxSpinlock ) - portINIT_QUEUE_TASK_SPINLOCK( pxSpinlock ) - portINIT_QUEUE_ISR_SPINLOCK( pxSpinlock ) - portINIT_STREAM_BUFFER_TASK_SPINLOCK( pxSpinlock ) - portINIT_STREAM_BUFFER_ISR_SPINLOCK( pxSpinlock ) - portINIT_KERNEL_TASK_SPINLOCK_STATIC - portINIT_KERNEL_ISR_SPINLOCK_STATIC - portINIT_TIMERS_TASK_SPINLOCK_STATIC - portINIT_TIMERS_ISR_SPINLOCK_STATIC - Locking - portGET_SPINLOCK() - portRELEASE_SPINLOCK() Co-authored-by: Sudeep Mohanty <[email protected]>
Added or modify granular locking related API: Added: - vTaskLockDataGroup() - vTaskUnlockDataGroup() - uxTaskLockDataGroupFromISR() - vTaskUnlockDataGroupFromISR() - taskLOCK_DATA_GROUP() - taskUNLOCK_DATA_GROUP() - taskLOCK_DATA_GROUP_FROM_ISR() - taskUNLOCK_DATA_GROUP_FROM_ISR() Updated: - Remove prvCheckForRunStateChange() when granular locks is enabled - Updated vTaskSuspendAll() and xTaskResumeAll() - Now holds the xTaskSpinlock during kernel suspension - Increments/decrements xPreemptionDisable. Only yields when 0, thus allowing for nested suspensions across different data groups Co-authored-by: Sudeep Mohanty <[email protected]>
cd06778
to
70eb466
Compare
Replaced critical section macros with data group locking macros such as taskENTER/EXIT_CRITICAL() with taskLOCK/UNLOCK_KERNEL_DATA_GROUP(). Some tasks.c API relied on their callers to enter critical sections. This assumption no longer works under granular locking. Critical sections added to the following functions: - `vTaskInternalSetTimeOutState()` - `xTaskIncrementTick()` - `vTaskSwitchContext()` - `xTaskRemoveFromEventList()` - `vTaskInternalSetTimeOutState()` - `eTaskConfirmSleepModeStatus()` - `xTaskPriorityDisinherit()` - `pvTaskIncrementMutexHeldCount()` Added missing suspensions to the following functions: - `vTaskPlaceOnEventList()` - `vTaskPlaceOnUnorderedEventList()` - `vTaskPlaceOnEventListRestricted()` Fixed the locking in vTaskSwitchContext() vTaskSwitchContext() must aquire both kernel locks, viz., task lock and ISR lock. This is because, vTaskSwitchContext() can be called from either task context or ISR context. Also, vTaskSwitchContext() must not alter the interrupt state prematurely. Co-authored-by: Sudeep Mohanty <[email protected]>
Updated queue.c to use granular locking - Added xTaskSpinlock and xISRSpinlock - Replaced critical section macros with data group locking macros such as taskENTER/EXIT_CRITICAL() with taskLOCK/UNLOCK_DATA_GROUP(). - Added prvSuspendQueue() and prvResumeQueue() as the granular locking equivalents to prvLockQueue() and prvUnlockQueue() respectively - Added missing critical sections to prvNotifyQueueSetContainer() Co-authored-by: Sudeep Mohanty <[email protected]>
Updated event_groups.c to use granular locking - Added xTaskSpinlock and xISRSpinlock - Replaced critical section macros with data group locking macros such as taskENTER/EXIT_CRITICAL() with taskLOCK/UNLOCK_DATA_GROUP(). - Added prvSuspendEventGroup() and prvResumeEventGroup() to suspend the event group when executing non-deterministic code. - xEventGroupSetBits() and vEventGroupDelete() accesses the kernel data group directly. Thus, added vTaskSuspendAll()/xTaskResumeAll() to these fucntions. Co-authored-by: Sudeep Mohanty <[email protected]>
Updated stream_buffer.c to use granular locking - Added xTaskSpinlock and xISRSpinlock - Replaced critical section macros with data group locking macros such as taskENTER/EXIT_CRITICAL() with taskLOCK/UNLOCK_DATA_GROUP(). - Added prvSuspendStreamBuffer() and prvResumeStreamBuffer() to suspend the stream buffer when executing non-deterministic code. Co-authored-by: Sudeep Mohanty <[email protected]>
Updated timers.c to use granular locking - Added xTaskSpinlock and xISRSpinlock - Replaced critical section macros with data group locking macros such as taskENTER/EXIT_CRITICAL() with taskLOCK/UNLOCK_DATA_GROUP(). Co-authored-by: Sudeep Mohanty <[email protected]>
Co-authored-by: Sudeep Mohanty <[email protected]>
70eb466
to
edc1c98
Compare
Quality Gate passedIssues Measures |
@@ -576,7 +581,7 @@ | |||
traceENTER_vTimerSetReloadMode( xTimer, xAutoReload ); | |||
|
|||
configASSERT( xTimer ); | |||
taskENTER_CRITICAL(); | |||
taskLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock ); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
xTaskSpinlock
and xISRSpinlock
only exist when portUSING_GRANULAR_LOCKS is enabled. Although these two variables are ignored in macro expansion for non-granular lock kernel, I would like to suggest we hide this information in macro. For example,
/* Non-granular lock version. Single core and SMP. */
#define taskLOCK_TIMER_DATA_GROUP taskENTER_CRITICAL
/* Granular lock version. */
#define taskLOCK_TIMER_DATA_GROUP() portLOCK_DATA_GROUP( &xTaskSpinlock, &xISRSpinlock )
This PR adds support for granular locking to the FreeRTOS kernel.
Description
Granular locking introduces the concept of having localized locks per kernel data group for SMP configuration. This method is an optional replacement of the existing kernel locks and is controlled by a new port layer configuration, viz.,
portUSING_GRANULAR_LOCKS
. More details about the approach can be found here.Test Steps
The implementation has been tested on Espressif SoC targets, viz., the ESP32 using the ESP-IDF framework.
1. Testing on an
esp32
targetesp32
, setup the ESP-IDF environment on your local machine. The steps to follow are listed in the Getting Started Guide.components/freertos/test_apps/freertos
where all the test cases are located.performance
subfolder at the same location.idf.py seet-target esp32
.menuconfig
options. To do this you must enter the command-idf.py menuconfig
->Component config
->FreeRTOS
->Kernel
->Run the Amazon SMP FreeRTOS kernel instead (FEATURE UNDER DEVELOPMENT)
. Save the configuration and exit the menuconfig.idf.py build flash monitor
.TODO
Checklist:
Related Issue
By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.