There is currently a big problem in the address environment handling which
is that the address environment is released too soon when the process is
exiting. The current MMU mappings will always be the exiting process's, which means
the system needs them AT LEAST until the next context switch happens. If
the next thread is a kernel thread, the address environment is needed for
longer.
Kernel threads "lend" the address environment of the previous user process.
This is beneficial in two ways:
- The kernel processes do not need an allocated address environment
- When a context switch happens from user -> kernel or kernel -> kernel,
the TLB does not need to be flushed. This must be done only when
changing to a different user address environment.
Another issue is when a new process is created; the address environment
of the new process must be temporarily instantiated by up_addrenv_select().
However, the system scheduler does not know that the process has a different
address environment to its own and when / if a context restore happens, the
wrong MMU page directory is restored and the process will either crash or
do something horribly wrong.
The following changes are needed to fix the issues:
- Add mm_curr which is the current address environment of the process
- Add a reference counter to safeguard the address environment
- Whenever an address environment is mapped to MMU, its reference counter
is incremented
- Whenever and address environment is unmapped from MMU, its reference
counter is decremented, and tested. If no more references -> drop the
address environment and release the memory as well
- To limit the context switch delay, the address environment is freed in
a separate low priority clean-up thread (LPWORK)
- When a process temporarily instantiates another process's address
environment, the scheduler will now know of this and will restore the
correct mappings to MMU
Why is this not causing more noticeable issues ? The problem only happens
under the aforementioned special conditions, and if a context switch or
IRQ occurs during this time.
Summary:
- Since QEMU does not report L2CC information correctly,
NuttX stops if DEBUG_ASSERTIONS=y.
- This commit adds DEBUG_ASSERTIONS=y to citest/defconfigs
and disables L2CC related configs.
- Also, it disables RAMLOG to show the crash information
Impact:
- None
Testing:
- Tested with QEMU-7.1
Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
Summary:
- This commit adjusts TCP and UDP configurations based on
sabre-6quad/configs/netnsh/defconfig
Impact:
- sabre-6quad only
Testing:
- Tested with QEMU-7.1
Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
Summary:
- This commit enables to test C++ static object in ELF (hello++3)
Impact:
- elf defconfig only
Testing:
- Tested with QEMU and sabre-6quad board
Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
Summary:
- This commit enables environ and path in knsh/defconfig
Impact:
- None
Testing:
- Tested with QEMU
Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
Summary:
- I noticed that undefined instruction happens with getprime and gcc-10.3.1
- Actually, the issue does not happen with gcc-9.3.1
- This is a tentative solution to avoid the issue
Impact:
- sabre-6quad:knsh only
Testing:
- Tested with hello/getprime
Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
Summary:
- Add sabre-6quad:knsh to test BUILD_KERNEL with qemu
- Update README.txt to run the nuttx with qemu
Impact:
- None
Testing:
- Tested with QEMU
- NOTE: getprime crashes with undefined instruction when
compiled with gcc 10.3.x (please use 9.3.1)
Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
several configs are used for testing and need the BSD components
more information about license can be found here
https://www.apache.org/legal/resolved.html#category-a
Signed-off-by: Alin Jerpelea <alin.jerpelea@sony.com>
Summary:
- This commit adds ELF support to netnsh and netnsh_smp
Impact:
- None
Testing:
- Tested with QEMU
Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
Summary:
- The CONFIG_SMP_IDLETHREAD_STACKSIZE was introduced to optimize
the idle stack size for other than CPU0
- However, there are no big differences between the idle stacks.
- This commit removes the config to simplify the kernel code
Impact:
- All SMP configurations
Testing:
- Tested with ostest with the following configs
- spresense:smp, spresense:rndis_smp
- esp32-devkitc:smp (QEMU), maix-bit:smp (QEMU)
- sabre-6quad:smp (QEMU), sabre-6quad:netnsh_smp (QEMU)
- raspberrypi-pico:smp, sim:smp (x86_64)
Signed-off-by: Masayuki Ishikawa <asayuki.Ishikawa@jp.sony.com>
Summary:
- This commit removes SCHED_INSTRUMENTATION which has been used
to debug NuttX SMP kernel
Impact:
- None
Testing:
- Tested with ostest
Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
Summary:
- Let me revert the commit because I noticed that performance
with iperf -s is much worth than before.
Impact:
- sabre-6quad:netnsh oly
Testing:
- Tested with iperf (both -c and -s) with QEMU
This reverts commit 07e7ccb80c.
Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
Summary:
- This commit makes the iperf work with CONFIG_NET_TCP_WRITE_BUFFERS
- Since the iperf sends a large packet (e.g. 16KB), CONFIG_IOB_NBUFFERS
must be increased enough to hold the packet
- To improve performance CONFIG_IMX_ENET_NTXBUFFERS was changed to
the default (i.e. 2)
Impact:
- sabre-6quad:netnsh only
Testing:
- Tested with iperf with QEMU
Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>
Summary:
- This commit updates the followings
- Remove CONFIG_DEBUG_XXX except for CONFIG_DEBUG_FULLOPT and CONFIG_DEBUG_SYMBOLS
- Add CONFIG_EXAMPLES_IPERF=y and CONFIG_EXAMPLES_TCPBLASTER=y
- Set CONFIG_IMX_ENET_NTXBUFFERS=1 and CONFIG_NET_ETH_PKTSIZE=1514
- Add CONFIG_SCHED_LPWORK=y and CONFIG_SYSLOG_TIMESTAMP=y
- Add CONFIG_SYSTEM_DHCPC_RENEW=y and CONFIG_SYSTEM_DHCPC_RENEW=y
Impact:
- sabre-6quad:netnsh only
Testing:
- Tested with sabre-6quad:netnsh with QEMU
Signed-off-by: Masayuki Ishikawa <Masayuki.Ishikawa@jp.sony.com>