This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "the great next stuff".

The branch, dde has been updated
       via  7c686eff39acbfdcba2d444c4a4430ae6cf74d4e (commit)
       via  b8869c337e9d0d6db372e687de3ee7573fc1bdc9 (commit)
      from  c91f65274dd81512b9cfc21fe7424ecb4bc19ffd (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 7c686eff39acbfdcba2d444c4a4430ae6cf74d4e
Author: David Bidner <[email protected]>
Date:   Mon Oct 12 20:27:26 2026 +0200

    libdde_linux26: Make the softirq pending word updates atomic
    
    DDE runs each Linux "cpu" as CPU 0 in separate threads and its
    local_irq_save() only disables interrupts on the current thread, so the
    softirq pending word (irq_stat[0].__softirq_pending) is shared without
    real mutual exclusion.  __raise_softirq_irqoff() expands to a plain
    read-modify-write (local_softirq_pending() |= bit) and __do_softirq()
    clears the word with a plain store, so a raise can be lost:
    
      - the IRQ thread raises NET_RX from __napi_schedule();
      - the networking threads raise NET_TX via raise_softirq_irqoff();
      - the softirq thread reads the word and then clears it.
    
    A NET_RX raise that lands between the softirq thread's read and its
    clear (or between two plain |= operations) is overwritten.  The NAPI
    entry stays on the poll list but no softirq is pending, so the softirq
    thread blocks on dde_softirq_sem and the network stack stops.
    
    Make the raise and the read-and-clear atomic: dde_or_softirq_pending()
    uses __sync_fetch_and_or() and dde_softirq_pending_xchg() uses
    __sync_lock_test_and_set(..., 0); __raise_softirq_irqoff() and
    __do_softirq() use them.
    
    * libdde_linux26/contrib/include/linux/interrupt.h: declare the helpers
    and use dde_or_softirq_pending() in __raise_softirq_irqoff().
    * libdde_linux26/lib/src/arch/l4/softirq.c (__do_softirq): read and
    clear the pending word atomically.
    Message-ID: <[email protected]>

commit b8869c337e9d0d6db372e687de3ee7573fc1bdc9
Author: David Bidner <[email protected]>
Date:   Mon Oct 12 20:27:25 2026 +0200

    libdde_linux26: Wake the softirq thread when __do_softirq gives up
    
    DDE's __do_softirq() runs a bounded retry loop and returns when the
    softirq pending bits are still set after MAX_SOFTIRQ_RETRIES.  Linux
    wakes ksoftirqd at that point; DDE has no such helper, so the softirq
    thread immediately blocks again on dde_softirq_sem and the pending work
    is never processed.
    
    Post dde_softirq_sem before returning when softirqs are still pending,
    mirroring mainline's wakeup_softirqd().
    
    * libdde_linux26/lib/src/arch/l4/softirq.c (__do_softirq): Wake the
    softirq thread if pending work remains.
    Message-ID: <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 libdde_linux26/contrib/include/linux/interrupt.h |  7 ++++++-
 libdde_linux26/lib/src/arch/l4/softirq.c         | 18 ++++++++++++++----
 2 files changed, 20 insertions(+), 5 deletions(-)


hooks/post-receive
-- 
the great next stuff

Reply via email to