From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
"linux-kernel@vger.kernel.org,
Linus Torvalds" <torvalds@linux-foundation.org>,
Eric Biggers <ebiggers@google.com>,
Linus Torvalds <torvalds@linux-foundation.org>
Subject: [PATCH 4.19 34/74] wait: add wake_up_pollfree()
Date: Mon, 13 Dec 2021 10:30:05 +0100 [thread overview]
Message-ID: <20211213092931.961002448@linuxfoundation.org> (raw)
In-Reply-To: <20211213092930.763200615@linuxfoundation.org>
From: Eric Biggers <ebiggers@google.com>
commit 42288cb44c4b5fff7653bc392b583a2b8bd6a8c0 upstream.
Several ->poll() implementations are special in that they use a
waitqueue whose lifetime is the current task, rather than the struct
file as is normally the case. This is okay for blocking polls, since a
blocking poll occurs within one task; however, non-blocking polls
require another solution. This solution is for the queue to be cleared
before it is freed, using 'wake_up_poll(wq, EPOLLHUP | POLLFREE);'.
However, that has a bug: wake_up_poll() calls __wake_up() with
nr_exclusive=1. Therefore, if there are multiple "exclusive" waiters,
and the wakeup function for the first one returns a positive value, only
that one will be called. That's *not* what's needed for POLLFREE;
POLLFREE is special in that it really needs to wake up everyone.
Considering the three non-blocking poll systems:
- io_uring poll doesn't handle POLLFREE at all, so it is broken anyway.
- aio poll is unaffected, since it doesn't support exclusive waits.
However, that's fragile, as someone could add this feature later.
- epoll doesn't appear to be broken by this, since its wakeup function
returns 0 when it sees POLLFREE. But this is fragile.
Although there is a workaround (see epoll), it's better to define a
function which always sends POLLFREE to all waiters. Add such a
function. Also make it verify that the queue really becomes empty after
all waiters have been woken up.
Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20211209010455.42744-2-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@google.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
include/linux/wait.h | 26 ++++++++++++++++++++++++++
kernel/sched/wait.c | 7 +++++++
2 files changed, 33 insertions(+)
--- a/include/linux/wait.h
+++ b/include/linux/wait.h
@@ -191,6 +191,7 @@ void __wake_up_locked_key_bookmark(struc
void __wake_up_sync_key(struct wait_queue_head *wq_head, unsigned int mode, int nr, void *key);
void __wake_up_locked(struct wait_queue_head *wq_head, unsigned int mode, int nr);
void __wake_up_sync(struct wait_queue_head *wq_head, unsigned int mode, int nr);
+void __wake_up_pollfree(struct wait_queue_head *wq_head);
#define wake_up(x) __wake_up(x, TASK_NORMAL, 1, NULL)
#define wake_up_nr(x, nr) __wake_up(x, TASK_NORMAL, nr, NULL)
@@ -217,6 +218,31 @@ void __wake_up_sync(struct wait_queue_he
#define wake_up_interruptible_sync_poll(x, m) \
__wake_up_sync_key((x), TASK_INTERRUPTIBLE, 1, poll_to_key(m))
+/**
+ * wake_up_pollfree - signal that a polled waitqueue is going away
+ * @wq_head: the wait queue head
+ *
+ * In the very rare cases where a ->poll() implementation uses a waitqueue whose
+ * lifetime is tied to a task rather than to the 'struct file' being polled,
+ * this function must be called before the waitqueue is freed so that
+ * non-blocking polls (e.g. epoll) are notified that the queue is going away.
+ *
+ * The caller must also RCU-delay the freeing of the wait_queue_head, e.g. via
+ * an explicit synchronize_rcu() or call_rcu(), or via SLAB_TYPESAFE_BY_RCU.
+ */
+static inline void wake_up_pollfree(struct wait_queue_head *wq_head)
+{
+ /*
+ * For performance reasons, we don't always take the queue lock here.
+ * Therefore, we might race with someone removing the last entry from
+ * the queue, and proceed while they still hold the queue lock.
+ * However, rcu_read_lock() is required to be held in such cases, so we
+ * can safely proceed with an RCU-delayed free.
+ */
+ if (waitqueue_active(wq_head))
+ __wake_up_pollfree(wq_head);
+}
+
#define ___wait_cond_timeout(condition) \
({ \
bool __cond = (condition); \
--- a/kernel/sched/wait.c
+++ b/kernel/sched/wait.c
@@ -209,6 +209,13 @@ void __wake_up_sync(struct wait_queue_he
}
EXPORT_SYMBOL_GPL(__wake_up_sync); /* For internal use only */
+void __wake_up_pollfree(struct wait_queue_head *wq_head)
+{
+ __wake_up(wq_head, TASK_NORMAL, 0, poll_to_key(EPOLLHUP | POLLFREE));
+ /* POLLFREE must have cleared the queue. */
+ WARN_ON_ONCE(waitqueue_active(wq_head));
+}
+
/*
* Note: we use "set_current_state()" _after_ the wait-queue add,
* because we need a memory barrier there on SMP, so that any
next prev parent reply other threads:[~2021-12-13 9:48 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-12-13 9:29 [PATCH 4.19 00/74] 4.19.221-rc1 review Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 01/74] HID: google: add eel USB id Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 02/74] HID: add hid_is_usb() function to make it simpler for USB detection Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 03/74] HID: add USB_HID dependancy to hid-prodikeys Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 04/74] HID: add USB_HID dependancy to hid-chicony Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 05/74] HID: add USB_HID dependancy on some USB HID drivers Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 06/74] HID: wacom: fix problems when device is not a valid USB device Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 07/74] HID: check for valid USB device for many HID drivers Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 08/74] can: kvaser_usb: get CAN clock frequency from device Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 09/74] can: sja1000: fix use after free in ems_pcmcia_add_card() Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 10/74] net: core: netlink: add helper refcount dec and lock function Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 11/74] net: sched: rename qdisc_destroy() to qdisc_put() Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 12/74] net: sched: extend Qdisc with rcu Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 13/74] net: sched: add helper function to take reference to Qdisc Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 14/74] net: sched: use Qdisc rcu API instead of relying on rtnl lock Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 15/74] nfc: fix potential NULL pointer deref in nfc_genl_dump_ses_done Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 16/74] bpf: Fix the off-by-two error in range markings Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 17/74] ice: ignore dropped packets during init Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 18/74] bonding: make tx_rebalance_counter an atomic Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 19/74] nfp: Fix memory leak in nfp_cpp_area_cache_add() Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 20/74] seg6: fix the iif in the IPv6 socket control block Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 21/74] udp: using datalen to cap max gso segments Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 22/74] IB/hfi1: Correct guard on eager buffer deallocation Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 23/74] mm: bdi: initialize bdi_min_ratio when bdi is unregistered Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 24/74] ALSA: ctl: Fix copy of updated id with element read/write Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 25/74] ALSA: pcm: oss: Fix negative period/buffer sizes Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 26/74] ALSA: pcm: oss: Limit the period size to 16MB Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 27/74] ALSA: pcm: oss: Handle missing errors in snd_pcm_oss_change_params*() Greg Kroah-Hartman
2021-12-13 9:29 ` [PATCH 4.19 28/74] tracefs: Have new files inherit the ownership of their parent Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 29/74] clk: qcom: regmap-mux: fix parent clock lookup Greg Kroah-Hartman
2021-12-15 9:16 ` Pavel Machek
2021-12-15 10:37 ` Dmitry Baryshkov
2021-12-15 17:54 ` Pavel Machek
2021-12-13 9:30 ` [PATCH 4.19 30/74] can: pch_can: pch_can_rx_normal: fix use after free Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 31/74] can: m_can: Disable and ignore ELO interrupt Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 32/74] x86/sme: Explicitly map new EFI memmap table as encrypted Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 33/74] libata: add horkage for ASMedia 1092 Greg Kroah-Hartman
2021-12-13 9:30 ` Greg Kroah-Hartman [this message]
2021-12-13 9:30 ` [PATCH 4.19 35/74] binder: use wake_up_pollfree() Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 36/74] signalfd: " Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 37/74] aio: keep poll requests on waitqueue until completed Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 38/74] aio: fix use-after-free due to missing POLLFREE handling Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 39/74] tracefs: Set all files to the same group ownership as the mount option Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 40/74] block: fix ioprio_get(IOPRIO_WHO_PGRP) vs setuid(2) Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 41/74] qede: validate non LSO skb length Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 42/74] ASoC: qdsp6: q6routing: Fix return value from msm_routing_put_audio_mixer Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 43/74] i40e: Fix pre-set max number of queues for VF Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 44/74] mtd: rawnand: fsmc: Take instruction delay into account Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 45/74] tools build: Remove needless libpython-version feature check that breaks test-all fast path Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 46/74] net: cdc_ncm: Allow for dwNtbOutMaxSize to be unset or zero Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 47/74] net: altera: set a couple error code in probe() Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 48/74] net: fec: only clear interrupt of handling queue in fec_enet_rx_queue() Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 49/74] net, neigh: clear whole pneigh_entry at alloc time Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 50/74] net/qla3xxx: fix an error code in ql_adapter_up() Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 51/74] USB: gadget: detect too-big endpoint 0 requests Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 52/74] USB: gadget: zero allocate endpoint 0 buffers Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 53/74] usb: core: config: fix validation of wMaxPacketValue entries Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 54/74] xhci: Remove CONFIG_USB_DEFAULT_PERSIST to prevent xHCI from runtime suspending Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 55/74] usb: core: config: using bit mask instead of individual bits Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 56/74] xhci: avoid race between disable slot command and host runtime suspend Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 57/74] iio: trigger: Fix reference counting Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 58/74] iio: trigger: stm32-timer: fix MODULE_ALIAS Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 59/74] iio: stk3310: Dont return error code in interrupt handler Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 60/74] iio: mma8452: Fix trigger reference couting Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 61/74] iio: ltr501: Dont return error code in trigger handler Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 62/74] iio: kxsd9: " Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 63/74] iio: itg3200: Call iio_trigger_notify_done() on error Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 64/74] iio: dln2-adc: Fix lockdep complaint Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 65/74] iio: dln2: Check return value of devm_iio_trigger_register() Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 66/74] iio: at91-sama5d2: Fix incorrect sign extension Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 67/74] iio: adc: axp20x_adc: fix charging current reporting on AXP22x Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 68/74] iio: accel: kxcjk-1013: Fix possible memory leak in probe and remove Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 69/74] irqchip/armada-370-xp: Fix return value of armada_370_xp_msi_alloc() Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 70/74] irqchip/armada-370-xp: Fix support for Multi-MSI interrupts Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 71/74] irqchip/irq-gic-v3-its.c: Force synchronisation when issuing INVALL Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 72/74] irqchip: nvic: Fix offset for Interrupt Priority Offsets Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 73/74] net_sched: fix a crash in tc_new_tfilter() Greg Kroah-Hartman
2021-12-13 9:30 ` [PATCH 4.19 74/74] net: sched: make function qdisc_free_cb() static Greg Kroah-Hartman
2021-12-13 10:33 ` [PATCH 4.19 00/74] 4.19.221-rc1 review Pavel Machek
2021-12-13 14:43 ` Jon Hunter
2021-12-13 16:27 ` Sudip Mukherjee
2021-12-13 18:58 ` Sudip Mukherjee
2021-12-13 19:05 ` Linus Torvalds
2021-12-13 22:23 ` Sudip Mukherjee
2021-12-13 19:55 ` Guenter Roeck
2021-12-13 20:30 ` Shuah Khan
2021-12-14 5:04 ` Naresh Kamboju
2021-12-14 12:40 ` Sudip Mukherjee
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=20211213092931.961002448@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=ebiggers@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=stable@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
/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.