From: sashiko-bot@kernel.org
To: "Jaidev Shastri" <jaidevshastri@vt.edu>
Cc: linux-serial@vger.kernel.org
Subject: Re: [PATCH 2/6] vt: keyboard: publish npadch_value with release semantics
Date: Tue, 22 Sep 2026 01:39:28 +0000 [thread overview]
Message-ID: <20260922013928.71DE51F000FF@smtp.kernel.org> (raw)
In-Reply-To: <20260921-mb-keyboard-v1-2-d170228b80c0@vt.edu>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Medium] vt: redundant memory barriers on npadch_value under spinlock
- [Low] vt: broken lockless pattern with inverted flag/payload release
--
commit e52bca2cdc7445b0c1faf7ccdceda38d504afc27
Author: Jaidev Shastri <jaidevshastri@vt.edu>
vt: keyboard: publish npadch_value with release semantics
k_ascii() accumulates the numeric keypad code in npadch_value after it
has set npadch_active. k_shift() tests npadch_active and then emits
npadch_value when the modifier is released. Store the accumulated value
with smp_store_release() and read it with smp_load_acquire().
> diff --git a/drivers/tty/vt/keyboard.c b/drivers/tty/vt/keyboard.c
> index 089f3b048beee..6f3472cd4f24d 100644
> --- a/drivers/tty/vt/keyboard.c
> +++ b/drivers/tty/vt/keyboard.c
> @@ -898,10 +898,13 @@ static void k_shift(struct vc_data *vc, unsigned char value, char up_flag)
>
> /* kludge */
> if (up_flag && shift_state != old_state && npadch_active) {
> + /* Pairs with the smp_store_release() in k_ascii(). */
> + unsigned int npadch = smp_load_acquire(&npadch_value);
> +
[Severity: Medium]
Are these memory barriers redundant?
All invocations of k_shift() and k_ascii() occur under the kbd_event_lock.
They are only dispatched via kbd_keycode(), which strictly executes within a
scoped_guard(spinlock, &kbd_event_lock) in kbd_event().
Because all accesses to npadch_value and npadch_active are serialized by
this lock, concurrent execution is not possible here. The static analysis
tool appears to have missed this locking context.
> if (kbd->kbdmode == VC_UNICODE)
> - to_utf8(vc, npadch_value);
> + to_utf8(vc, npadch);
> else
> - put_queue(vc, npadch_value & 0xff);
> + put_queue(vc, npadch & 0xff);
> npadch_active = false;
> }
> }
> @@ -939,7 +942,8 @@ static void k_ascii(struct vc_data *vc, unsigned char value, char up_flag)
> npadch_active = true;
> }
>
> - npadch_value = npadch_value * base + value;
> + /* Pairs with the smp_load_acquire() in k_shift(). */
> + smp_store_release(&npadch_value, npadch_value * base + value);
[Severity: Low]
Does this inverted lockless pattern fail to provide the intended guarantees?
Even if concurrent execution were possible, the release and acquire
semantics are applied to the data payload (npadch_value) rather than the
condition flag (npadch_active).
Here, the producer updates npadch_active with a plain store before executing
a release store on npadch_value. This allows the condition flag to become
visible prematurely.
In a correct lockless pattern, the producer updates the payload first and
then executes a release store on the condition flag. The consumer would then
execute an acquire load on the flag before reading the payload.
While reviewing this file, I noticed a pre-existing issue nearby in k_shift():
drivers/tty/vt/keyboard.c:k_shift() {
...
/* Pairs with the smp_load_acquire() in vt_get_shift_state(). */
smp_store_release(&shift_state, state);
...
}
[Severity: Low]
This is a pre-existing issue, but is the use of release/acquire barriers
invalid for this standalone read?
The shift_state variable is a standalone integer and does not act as a
condition flag to synchronize dependent memory accesses. Applying heavyweight
memory barriers here adds unnecessary complexity and overhead on
architectures where barriers are not free.
The reader vt_get_shift_state() merely returns the shift_state value to
userspace without taking kbd_event_lock:
drivers/tty/vt/keyboard.c:vt_get_shift_state() {
...
return smp_load_acquire(&shift_state);
...
}
To safely perform a lockless read of a standalone variable and mitigate
compiler tearing, READ_ONCE() and WRITE_ONCE() would be the correct and
sufficient primitives.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260921-mb-keyboard-v1-0-d170228b80c0@vt.edu?part=2
next prev parent reply other threads:[~2026-09-22 1:39 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-22 1:28 [PATCH 0/6] vt: keyboard: make the kbd_event_lock ordering explicit Jaidev Shastri via B4 Relay
2026-09-22 1:28 ` Jaidev Shastri
2026-09-22 1:28 ` [PATCH 1/6] vt: keyboard: publish shift_state with release semantics Jaidev Shastri via B4 Relay
2026-09-22 1:28 ` Jaidev Shastri
2026-09-22 1:38 ` sashiko-bot
2026-09-23 12:51 ` Greg Kroah-Hartman
2026-09-22 1:28 ` [PATCH 2/6] vt: keyboard: publish npadch_value " Jaidev Shastri via B4 Relay
2026-09-22 1:28 ` Jaidev Shastri
2026-09-22 1:39 ` sashiko-bot [this message]
2026-09-22 1:28 ` [PATCH 3/6] vt: keyboard: publish dead_key_next " Jaidev Shastri via B4 Relay
2026-09-22 1:28 ` Jaidev Shastri
2026-09-22 1:39 ` sashiko-bot
2026-09-22 1:28 ` [PATCH 4/6] vt: keyboard: publish accent_table_size " Jaidev Shastri via B4 Relay
2026-09-22 1:28 ` Jaidev Shastri
2026-09-22 1:36 ` sashiko-bot
2026-09-22 1:28 ` [PATCH 5/6] vt: keyboard: recompute the shift state into locals before publishing it Jaidev Shastri via B4 Relay
2026-09-22 1:28 ` Jaidev Shastri
2026-09-22 1:34 ` sashiko-bot
2026-09-22 1:28 ` [PATCH 6/6] vt: keyboard: publish the shift_down[] counters with release semantics Jaidev Shastri via B4 Relay
2026-09-22 1:28 ` Jaidev Shastri
2026-09-22 1:42 ` sashiko-bot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260922013928.71DE51F000FF@smtp.kernel.org \
--to=sashiko-bot@kernel.org \
--cc=jaidevshastri@vt.edu \
--cc=linux-serial@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.