Also, if you’re talking about performance, it would be appropriate to back
that up with some real data.

>From your PR:

> with CPU frequencies below 100 MHz — this copying becomes very costly.
For example, with SPP bandwidth at 200 MB/s, this alone can consume more
than 15% CPU load.

This is total nonsense. SPP can't achieve 200 MB/s, it is impossible !

Sorry, but your claims regarding Nimble were simply false, furthermore, the
example you provided abot SSP is also nonsense. I don’t like that.

pt., 16 paź 2026 o 08:55 raiden00pl <[email protected]> napisał(a):

> Your response has nothing to do with my reply to your comment about
> Nimble.
> No one is claiming that the porting layer in Nimble is perfect, but it
> certainly
> doesn't use the kernel's private API.
>
> Good architecture and POSIX compliance are the core values of this
> project.
> It has always been this way, and I hope it remains so. For this reason,
> adding
> anything to the kernel that sits above the L4–L5 layers of the OSI model
> is
> a bad idea and I hope it never happens.
>
>
> pt., 16 paź 2026 o 08:44 chao an <[email protected]> napisał(a):
>
>> Hi raiden00pl,
>>
>> Regarding your point about the NimBLE port using the POSIX API — yes, it
>> uses POSIX, but there are real issues with the current implementation that
>> go beyond just kernel/protected mode support.
>> 1. ble_npl_hw_enter_critical is not a real critical section
>>
>> Look at the NuttX port's implementation:
>>
>> https://github.com/apache/mynewt-nimble/blob/master/porting/npl/nuttx/src/os_atomic.c
>>
>> static pthread_mutex_t s_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
>>
>> uint32_t ble_npl_hw_enter_critical(void)
>> {
>>     pthread_mutex_lock(&s_mutex);
>>     return 0;
>> }
>>
>> This is a mutex, not a critical section. It does not disable interrupts or
>> preemption — an ISR can still fire and corrupt data that the "critical
>> section" was supposed to protect. On top of that, using a mutex opens the
>> door to ABBA deadlocks when combined with any other lock held inside the
>> critical region:
>>
>>    - Thread A: enter_critical → lock(s_mutex) → try lock(mutex M) ←
>> blocked
>>    by B
>>    - Thread B: lock(M) → enter_critical → lock(s_mutex) ← blocked by A
>>
>> Compare this with the FreeRTOS port, which correctly uses
>> vPortEnterCritical() / vPortExitCritical() (i.e., actually disabling
>> scheduling/preemption). The current NuttX port simply does not meet the
>> semantic contract that the NimBLE stack expects from
>> ble_npl_hw_enter_critical.
>> 2. Time subsystem uses clock_gettime instead of kernel tick APIs
>>
>>
>> https://github.com/apache/mynewt-nimble/blob/master/porting/npl/nuttx/src/os_time.c
>>
>> ble_npl_time_get() is backed by clock_gettime(CLOCK_MONOTONIC, ...), which
>> involves a syscall and floating-point arithmetic on every call. In a BLE
>> stack where timestamps and timing are on the hot path, this adds
>> measurable
>> overhead compared to accessing the kernel tick counter directly.
>> 3. Others are already using the kernel approach — and for good reason
>>
>> A concrete example: Xiaomi's Bluetooth stack (zblue) for openvela/NuttX
>> uses kernel APIs directly, bypassing POSIX for the performance-critical
>> paths:
>> https://github.com/sprhawk/zblue-port-openvela/tree/yaotepai/port/kernel
>>
>> This isn't an academic exercise — it's a production choice. They
>> recognized
>> that a BLE stack needs tight integration with the OS timer subsystem,
>> direct access to critical section primitives, and efficient event
>> delivery,
>> none of which POSIX provides well in this context.
>> My question
>>
>> If other organizations are already using a more performant,
>> architecturally
>> correct kernel-level integration for their BLE stacks on NuttX, why should
>> we be told that we must use the slower, less correct POSIX path? NuttX's
>> POSIX compliance is valuable, but it shouldn't come at the cost of
>> shipping
>> a BLE stack with a broken critical section primitive. There should be room
>> for both approaches, and the decision should be driven by technical merit,
>> not by treating POSIX as the only acceptable answer.
>>
>> Best regards,
>>
>> raiden00pl <[email protected]> 于2026年10月16日周五 14:06写道:
>>
>> > > We already have a similar problem with the current NimBLE integration.
>> > The
>> > > NimBLE port in nuttx-apps directly depends on many NuttX
>> kernel/internal
>> > > APIs. As a result, it is difficult to support protected/kernel builds
>> > > cleanly, and it is also hard to keep the port synchronized with
>> upstream
>> > > NimBLE over time.
>> >
>> > Is this an AI analysis or something? Because it’s definitely not true:
>> > Nimble
>> > port uses the POSIX API. The only issue with kernel mode is that
>> > SIGEV_SIGNAL is not supported in kernel mode, but this is a nuttx
>> > limitation,
>> > not a port architecture issue.
>> > I agree that synchronizing with an external repository is a challenge.
>> > However,
>> > a plus side is that we aren't the ones maintaining the code that must
>> > comply
>> > with the BLE standard.
>> >
>> > I also consider placing the entire BLE stack within the kernel to be a
>> bad
>> > idea.
>> > Even if performance isn't ideal, it’s the price one pays for a sound
>> > architecture.
>> > NuttX has always focused on addressing architectural challenges (POSIX
>> > compliance)
>> > rather than striving to be the best in terms of performance.
>> >
>> >
>> > pt., 16 paź 2026 o 06:52 chao an <[email protected]> napisał(a):
>> >
>> > > No, I do not agree that the current port is only a Zephyr API
>> replacement
>> > > and
>> > > NuttX coding-style reformatting.
>> > >
>> > >
>> > >
>> > > This code base has already fixed part of the issues that still exist
>> in
>> > the
>> > >
>> > > Zephyr community implementation. In addition, we still have pending
>> > > features and
>> > > fixes that have not been submitted yet. Since some of those changes
>> were
>> > > made by
>> > > other developers, I cannot submit their work by myself without proper
>> > > permission
>> > > and attribution.
>> > >
>> > >
>> > > https://github.com/zephyrproject-rtos/zephyr/pull/122348
>> > >
>> > >
>> > > I have already stated in the email why I do not recommend putting the
>> > > initial
>> > > Bluetooth host stack into nuttx-apps. Architecturally, placing it in
>> apps
>> > > would
>> > > cause significant performance degradation compared with the Zephyr
>> > design.
>> > > The
>> > > Bluetooth host stack is tightly coupled with kernel primitives, buffer
>> > >
>> > > management, work queues, timing, and HCI/driver paths. Moving it
>> entirely
>> > > to
>> > > apps would change that integration model and make the architecture
>> worse
>> > > from
>> > > the beginning.
>> > >
>> > >
>> > >
>> > > Therefore, please read my previous email more carefully. The concern
>> here
>> > > is not
>> > > only the initial review size, but also the long-term architecture and
>> > > runtime
>> > > performance of the Bluetooth stack in NuttX.
>> > >
>> > > BRs,
>> > >
>> > > Xiang Xiao <[email protected]> 于2026年10月16日周五 12:44写道:
>> > >
>> > > > On Fri, Oct 16, 2026 at 11:25 AM chao an <[email protected]>
>> wrote:
>> > > >
>> > > > > Hi all,
>> > > > >
>> > > > > I would like to summarize the background, technical motivation,
>> and
>> > > > > proposed evolution plan for PR #20686, which introduces a
>> > Zephyr-based
>> > > > > Bluetooth host stack under net/bt.
>> > > > >
>> > > > > https://github.com/apache/nuttx/pull/20686
>> > > > >
>> > > > > First of all, I fully understand the concerns raised in the
>> > discussion.
>> > > > > Adding a new Bluetooth stack is a significant architectural
>> change,
>> > and
>> > > > it
>> > > > > is reasonable for the community to ask whether we should instead
>> > > continue
>> > > > > improving the existing NuttX Bluetooth implementation. I would
>> like
>> > to
>> > > > > explain why we believe introducing the new stack incrementally is
>> the
>> > > > more
>> > > > > practical path, while still keeping the long-term NuttX
>> architecture
>> > > > clean
>> > > > > and maintainable.
>> > > > > ------------------------------
>> > > > > 1. Why not only enhance the existing NuttX Bluetooth stack?
>> > > > >
>> > > > > The existing NuttX Bluetooth implementation is mainly focused on
>> BLE
>> > > > > functionality. However, modern Bluetooth support is no longer
>> limited
>> > > to
>> > > > > basic BLE. A complete Bluetooth host stack now commonly includes:
>> > > > >
>> > > > >    - BLE GAP/GATT/ATT/SMP
>> > > > >    - Classic Bluetooth profiles
>> > > > >    - A2DP
>> > > > >    - AVRCP
>> > > > >    - HFP/HSP
>> > > > >    - HID
>> > > > >    - LE Mesh
>> > > > >    - LE Audio
>> > > > >    - Additional profile-level interoperability logic
>> > > > >
>> > > > >
>> > > > But most of these profiles should belong to the userspace, please
>> split
>> > > the
>> > > > related code to nuttx-apps.git, instead nuttx/.
>> > > > especially, the code related shell spread in the whole code base:
>> > > >
>> > > >
>> > >
>> >
>> https://github.com/anchao/nuttx/tree/6d6ddbb271cfdeb3e0993b5ebe992b4eab858c6c/net/bt/audio/shell
>> > > >
>> > > >
>> > >
>> >
>> https://github.com/anchao/nuttx/tree/6d6ddbb271cfdeb3e0993b5ebe992b4eab858c6c/net/bt/host/classic/shell
>> > > >
>> > > >
>> > >
>> >
>> https://github.com/anchao/nuttx/tree/6d6ddbb271cfdeb3e0993b5ebe992b4eab858c6c/net/bt/host/shell
>> > > >
>> > > >
>> > >
>> >
>> https://github.com/anchao/nuttx/blob/6d6ddbb271cfdeb3e0993b5ebe992b4eab858c6c/net/bt/mesh/shell/
>> > > >
>> > > >
>> > >
>> >
>> https://github.com/anchao/nuttx/blob/6d6ddbb271cfdeb3e0993b5ebe992b4eab858c6c/net/bt/services/ias/shell
>> > > > it's definitely wrong to put the shell code inside kernel space.
>> > > >
>> > > >
>> > > > > The Zephyr Bluetooth stack already provides a broad and actively
>> > > > maintained
>> > > > > implementation across many of these areas. Rebuilding equivalent
>> > > > > functionality directly on top of the current NuttX Bluetooth stack
>> > > would
>> > > > > require a very large multi-year effort, including not only
>> protocol
>> > > > > implementation but also interoperability testing with real phones,
>> > > > > headsets, speakers, cars, and other commercial devices.
>> > > > >
>> > > > > Therefore, our goal is not to discard NuttX's existing work
>> lightly,
>> > > but
>> > > > to
>> > > > > provide a practical path to make NuttX capable of supporting a
>> much
>> > > wider
>> > > > > Bluetooth feature set in a reasonable time frame.
>> > > > > ------------------------------
>> > > > > 2. Why place the stack in nuttx instead of nuttx-apps?
>> > > > >
>> > > > > Another important discussion point is whether the new Bluetooth
>> stack
>> > > > > should live in nuttx-apps, similar to how NimBLE is currently
>> > > integrated.
>> > > > >
>> > > > > Our concern is that a host stack is not just an application-level
>> > > > > component. It interacts closely with:
>> > > > >
>> > > > >    - HCI transport
>> > > > >    - L2CAP channels
>> > > > >    - Socket or device interfaces
>> > > > >    - Memory pools
>> > > > >    - Timers and work queues
>> > > > >    - Security and pairing state
>> > > > >    - Profile registration
>> > > > >    - Controller event dispatch
>> > > > >    - Future kernel/user boundary mechanisms
>> > > > >
>> > > > > Putting the core host stack in nuttx-apps would either require
>> > exposing
>> > > > > many internal kernel interfaces or would force the
>> application-side
>> > > stack
>> > > > > to depend on non-public NuttX internals.
>> > > > >
>> > > > > We already have a similar problem with the current NimBLE
>> > integration.
>> > > > The
>> > > > > NimBLE port in nuttx-apps directly depends on many NuttX
>> > > kernel/internal
>> > > > > APIs. As a result, it is difficult to support protected/kernel
>> builds
>> > > > > cleanly, and it is also hard to keep the port synchronized with
>> > > upstream
>> > > > > NimBLE over time.
>> > > > >
>> > > > >
>> > > > These are kernel public API, the only problem is that they are
>> called
>> > by
>> > > > userspace.
>> > > >
>> > > >
>> > > > > For this reason, we believe the Bluetooth host core belongs in the
>> > > NuttX
>> > > > > tree. User-facing profiles, tools, shell commands, or demo
>> > applications
>> > > > can
>> > > > > still live outside the core as appropriate, but the
>> transport-facing
>> > > host
>> > > > > stack should have a well-defined place inside NuttX.
>> > > > >
>> > > > > There is also a performance consideration. In flat build mode, the
>> > > > > Bluetooth host stack can run directly on the kernel side without
>> > > > additional
>> > > > > syscall or user/kernel boundary overhead. This is especially
>> > important
>> > > > for
>> > > > > IoT chips with relatively low CPU frequency, where Bluetooth data
>> > path
>> > > > and
>> > > > > profile handling overhead can have a visible impact on throughput,
>> > > > latency,
>> > > > > and power consumption.
>> > > > >
>> > > > > At the same time, this does not mean that the final architecture
>> must
>> > > > > remain flat-build-only. A compatible evolution path is to keep the
>> > > > > performance-sensitive transport and host core on the kernel side,
>> > while
>> > > > > gradually moving suitable Bluetooth profile implementations or
>> > > > > profile-facing helper layers into libc-visible build paths. This
>> > allows
>> > > > > protected and kernel builds to use proper public interfaces, while
>> > > still
>> > > > > preserving good performance for flat build and low-end IoT
>> platforms.
>> > > > >
>> > > > > In other words, placing the stack in nuttx gives us a cleaner
>> > long-term
>> > > > > architecture:
>> > > > >
>> > > > >    - Flat build can get the best performance with minimum
>> overhead.
>> > > > >    - Protected/kernel build can be supported later through proper
>> > > public
>> > > > >    interfaces.
>> > > > >    - Profile code can be migrated into libc-compatible paths where
>> > > > >    appropriate.
>> > > > >    - Userspace does not need to directly depend on private kernel
>> > > > symbols.
>> > > > >    - The design avoids repeating the long-term maintainability
>> issue
>> > > seen
>> > > > >    in some existing userspace Bluetooth integrations.
>> > > > >
>> > > > >
>> > > >
>> > > > But Zephyr bluetooth stack is implemented as a monolithic block like
>> > > > NimBLE.
>> > > > Your current porting just include:
>> > > >
>> > > >    1. Switch Zephyr API to NuttX kernel API
>> > > >    2. Format the code base to follow The NuttX coding style
>> > > >
>> > > > No any change related to the kernel/user space separation, so it's
>> > better
>> > > > to contain in nuttx-apps.git in the current stage.
>> > > > I would suggest you put the initial code inside nuttx-apps and move
>> the
>> > > > part which belongs to the kernel step by step,
>> > > > so the community can review the change more carefully.
>> > > >
>> > >
>> >
>>
>

Reply via email to