change nxsched_islocked_global to nxsched_islocked_tcb
Summary
1 To improve efficiency, we mimic Linux's behavior where preemption disabling is only applicable to the current CPU and does not affect other CPUs. 2 In the future, we will implement "spinlock+sched_lock", and use it extensively. Under such circumstances, if preemption is still globally disabled, it will seriously impact the scheduling efficiency. 3 We have removed g_cpu_lockset and used irqcount in order to eliminate the dependency of schedlock on critical sections in the future, simplify the logic, and further enhance the performance of sched_lock. 4 We set lockcount to 1 in order to lock scheduling on all CPUs during startup, without the need to provide additional functions to disable scheduling on other CPUs. 5 Cpu (1-n) must wait for cpu0 to enter the idle state before enabling scheduling because it prevents CPUs1~n from competing with cpu0 for the memory manager mutex, which could cause the cpu0 idle task to enter a wait state and trigger an assert.
size nuttx
before:
text data bss dec hex filename
265396 51057 63646 380099 5ccc3 nuttx
after:
text data bss dec hex filename
265184 51057 63642 379883 5cbeb nuttx
size -216
Impact
sched_lock/sched_unlock
Testing
Configuring NuttX and compile:
$ ./tools/configure.sh -l qemu-armv8a:nsh_smp
$ make
Running with qemu
$ qemu-system-aarch64 -cpu cortex-a53 -smp 4 -nographic \
-machine virt,virtualization=on,gic-version=3 \
-net none -chardev stdio,id=con,mux=on -serial chardev:con \
-mon chardev=con,mode=readline -kernel ./nuttx
ostest
[Experimental Bot, please feedback here]
NuttX PR Requirements Review
While this PR summary provides context and reasoning for the changes, it partially meets NuttX's PR requirements.
Here's what's missing or needs improvement:
- Summary:
- Functional part: Be more specific about which functional part of the code is changed (e.g., scheduler, interrupt handling, specific driver).
- How it works: The explanation is high-level. Provide concrete details on the mechanism used to achieve per-CPU preemption disabling and how
irqcountreplacesg_cpu_lockset. - Issue references: Include links to relevant NuttX and/or NuttX Apps issues.
- Impact:
- User impact: While it mentions scheduling changes, clarify if any user-facing behavior is modified.
- Build impact: Does this PR change any build configurations, dependencies, or options?
- Hardware impact: Specify the affected architectures (ARMv8-A is implied but state it explicitly).
- Documentation: Clearly state if documentation updates are required and whether the PR includes them.
- Security, Compatibility: Address these even if there's no impact (e.g., "NO impact on security").
- Testing:
- Build Hosts: List all build environments used for testing (OS, CPU architecture, compiler).
- Targets: Specify the exact board configurations within qemu-armv8a (e.g.,
qemu-armv8a:nsh_smp). - Testing logs: The logs are placeholder comments. Include actual logs demonstrating the issue before the change and the correct behavior after.
Recommendations:
- Expand the summary to provide a more technically detailed explanation.
- Address all impact categories explicitly, even if it's "NO impact."
- Provide comprehensive testing information with specific build/target details and actual logs.
By addressing these points, your PR will be more informative and easier for reviewers to assess.