This is the start of the stable review cycle for the 5.15.94 release.
There are 67 patches in this series, all will be posted as a response
to this one. If anyone has any issues with these being applied, please
let me know.
Responses should be made by Wed, 15 Feb 2023 14:46:51 +0000.
Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.94-rc…
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-5.15.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <gregkh(a)linuxfoundation.org>
Linux 5.15.94-rc1
Russell King (Oracle) <rmk+kernel(a)armlinux.org.uk>
nvmem: core: fix return value
Ville Syrjälä <ville.syrjala(a)linux.intel.com>
drm/i915: Fix VBT DSI DVO port handling
Aravind Iddamsetty <aravind.iddamsetty(a)intel.com>
drm/i915: Initialize the obj flags for shmem objects
Guilherme G. Piccoli <gpiccoli(a)igalia.com>
drm/amdgpu/fence: Fix oops due to non-matching drm_sched init/fini
David Chen <david.chen(a)nutanix.com>
Fix page corruption caused by racy check in __free_pages
Heiner Kallweit <hkallweit1(a)gmail.com>
arm64: dts: meson-axg: Make mmc host controller interrupts level-sensitive
Heiner Kallweit <hkallweit1(a)gmail.com>
arm64: dts: meson-g12-common: Make mmc host controller interrupts level-sensitive
Heiner Kallweit <hkallweit1(a)gmail.com>
arm64: dts: meson-gx: Make mmc host controller interrupts level-sensitive
Wander Lairson Costa <wander(a)redhat.com>
rtmutex: Ensure that the top waiter is always woken up
Nicholas Piggin <npiggin(a)gmail.com>
powerpc/64s/interrupt: Fix interrupt exit race with security mitigation switch
Guo Ren <guoren(a)linux.alibaba.com>
riscv: Fixup race condition on PG_dcache_clean in flush_icache_pte
Xiubo Li <xiubli(a)redhat.com>
ceph: flush cap releases when the session is flushed
Paul Cercueil <paul(a)crapouillou.net>
clk: ingenic: jz4760: Update M/N/OD calculation algorithm
Prashant Malani <pmalani(a)chromium.org>
usb: typec: altmodes/displayport: Fix probe pin assign check
Mark Pearson <mpearson-lenovo(a)squebb.ca>
usb: core: add quirk for Alcor Link AK9563 smartcard reader
Anand Jain <anand.jain(a)oracle.com>
btrfs: free device in btrfs_close_devices for a single device filesystem
Paolo Abeni <pabeni(a)redhat.com>
mptcp: be careful on subflow status propagation on errors
Alan Stern <stern(a)rowland.harvard.edu>
net: USB: Fix wrong-direction WARNING in plusb.c
ZhaoLong Wang <wangzhaolong1(a)huawei.com>
cifs: Fix use-after-free in rdata->read_into_pages()
Andy Shevchenko <andriy.shevchenko(a)linux.intel.com>
pinctrl: intel: Restore the pins that used to be in Direct IRQ mode
Serge Semin <Sergey.Semin(a)baikalelectronics.ru>
spi: dw: Fix wrong FIFO level setting for long xfers
Maxim Korotkov <korotkov.maxim.s(a)gmail.com>
pinctrl: single: fix potential NULL dereference
Joel Stanley <joel(a)jms.id.au>
pinctrl: aspeed: Fix confusing types in return value
Guodong Liu <Guodong.Liu(a)mediatek.com>
pinctrl: mediatek: Fix the drive register definition of some Pins
Amadeusz Sławiński <amadeuszx.slawinski(a)linux.intel.com>
ASoC: topology: Return -ENOMEM on memory allocation failure
Liu Shixin <liushixin2(a)huawei.com>
riscv: stacktrace: Fix missing the first frame
Dan Carpenter <error27(a)gmail.com>
ALSA: pci: lx6464es: fix a debug loop
Hangbin Liu <liuhangbin(a)gmail.com>
selftests: forwarding: lib: quote the sysctl values
Pietro Borrello <borrello(a)diag.uniroma1.it>
rds: rds_rm_zerocopy_callback() use list_first_entry()
Sasha Neftin <sasha.neftin(a)intel.com>
igc: Add ndo_tx_timeout support
Shay Drory <shayd(a)nvidia.com>
net/mlx5: Serialize module cleanup with reload and remove
Shay Drory <shayd(a)nvidia.com>
net/mlx5: fw_tracer, Zero consumer index when reloading the tracer
Shay Drory <shayd(a)nvidia.com>
net/mlx5: fw_tracer, Clear load bit when freeing string DBs buffers
Dragos Tatulea <dtatulea(a)nvidia.com>
net/mlx5e: IPoIB, Show unknown speed instead of error
Vlad Buslov <vladbu(a)nvidia.com>
net/mlx5: Bridge, fix ageing of peer FDB entries
Adham Faris <afaris(a)nvidia.com>
net/mlx5e: Update rx ring hw mtu upon each rx-fcs flag change
Maxim Mikityanskiy <maximmi(a)nvidia.com>
net/mlx5e: Introduce the mlx5e_flush_rq function
Maxim Mikityanskiy <maximmi(a)nvidia.com>
net/mlx5e: Move repeating clear_bit in mlx5e_rx_reporter_err_rq_cqe_recover
Vladimir Oltean <vladimir.oltean(a)nxp.com>
net: mscc: ocelot: fix VCAP filters not matching on MAC with "protocol 802.1Q"
Vladimir Oltean <vladimir.oltean(a)nxp.com>
net: dsa: mt7530: don't change PVC_EG_TAG when CPU port becomes VLAN-aware
Anirudh Venkataramanan <anirudh.venkataramanan(a)intel.com>
ice: Do not use WQ_MEM_RECLAIM flag for workqueue
Herton R. Krzesinski <herton(a)redhat.com>
uapi: add missing ip/ipv6 header dependencies for linux/stddef.h
Neel Patel <neel.patel(a)amd.com>
ionic: clean interrupt before enabling queue to avoid credit race
Heiner Kallweit <hkallweit1(a)gmail.com>
net: phy: meson-gxl: use MMD access dummy stubs for GXL, internal PHY
Qi Zheng <zhengqi.arch(a)bytedance.com>
bonding: fix error checking in bond_debug_reregister()
Clément Léger <clement.leger(a)bootlin.com>
net: phylink: move phy_device_free() to correctly release phy device
Christian Hopps <chopps(a)chopps.org>
xfrm: fix bug with DSCP copy to v6 from v4 tunnel
Yang Yingliang <yangyingliang(a)huawei.com>
RDMA/usnic: use iommu_map_atomic() under spin_lock()
Nikita Zhandarovich <n.zhandarovich(a)fintech.ru>
RDMA/irdma: Fix potential NULL-ptr-dereference
Dragos Tatulea <dtatulea(a)nvidia.com>
IB/IPoIB: Fix legacy IPoIB due to wrong number of queues
Eric Dumazet <edumazet(a)google.com>
xfrm/compat: prevent potential spectre v1 gadget in xfrm_xlate32_attr()
Dean Luick <dean.luick(a)cornelisnetworks.com>
IB/hfi1: Restore allocated resources on failed copyout
Anastasia Belova <abelova(a)astralinux.ru>
xfrm: compat: change expression for switch in xfrm_xlate64
Devid Antonio Filoni <devid.filoni(a)egluetechnologies.com>
can: j1939: do not wait 250 ms if the same addr was already claimed
Mark Brown <broonie(a)kernel.org>
of/address: Return an error when no valid dma-ranges are found
Shiju Jose <shiju.jose(a)huawei.com>
tracing: Fix poll() and select() do not work on per_cpu trace_pipe and trace_pipe_raw
Elvis Angelaccio <elvis.angelaccio(a)kde.org>
ALSA: hda/realtek: Enable mute/micmute LEDs on HP Elitebook, 645 G9
Guillaume Pinot <texitoi(a)texitoi.eu>
ALSA: hda/realtek: Fix the speaker output on Samsung Galaxy Book2 Pro 360
Artemii Karasev <karasev(a)ispras.ru>
ALSA: emux: Avoid potential array out-of-bound in snd_emux_xg_control()
Edson Juliano Drosdeck <edson.drosdeck(a)gmail.com>
ALSA: hda/realtek: Add Positivo N14KP6-TG
Alexander Potapenko <glider(a)google.com>
btrfs: zlib: zero-initialize zlib workspace
Josef Bacik <josef(a)toxicpanda.com>
btrfs: limit device extents to the device size
Mike Kravetz <mike.kravetz(a)oracle.com>
migrate: hugetlb: check for hugetlb shared PMD in node migration
Miaohe Lin <linmiaohe(a)huawei.com>
mm/migration: return errno when isolate_huge_page failed
Russell King (Oracle) <rmk+kernel(a)armlinux.org.uk>
nvmem: core: fix registration vs use race
Russell King (Oracle) <rmk+kernel(a)armlinux.org.uk>
nvmem: core: fix cleanup after dev_set_name()
Gaosheng Cui <cuigaosheng1(a)huawei.com>
nvmem: core: add error handling for dev_set_name
-------------
Diffstat:
Makefile | 4 +-
arch/arm64/boot/dts/amlogic/meson-axg.dtsi | 4 +-
arch/arm64/boot/dts/amlogic/meson-g12-common.dtsi | 6 +-
arch/arm64/boot/dts/amlogic/meson-gx.dtsi | 6 +-
arch/powerpc/kernel/interrupt.c | 6 +-
arch/riscv/kernel/stacktrace.c | 3 +-
arch/riscv/mm/cacheflush.c | 4 +-
drivers/clk/ingenic/jz4760-cgu.c | 18 ++--
drivers/gpu/drm/amd/amdgpu/amdgpu_fence.c | 8 +-
drivers/gpu/drm/i915/display/intel_bios.c | 33 +++++---
drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 2 +-
drivers/infiniband/hw/hfi1/file_ops.c | 7 +-
drivers/infiniband/hw/irdma/cm.c | 3 +
drivers/infiniband/hw/usnic/usnic_uiom.c | 8 +-
drivers/infiniband/ulp/ipoib/ipoib_main.c | 8 ++
drivers/net/bonding/bond_debugfs.c | 2 +-
drivers/net/dsa/mt7530.c | 26 ++++--
drivers/net/ethernet/intel/ice/ice_main.c | 2 +-
drivers/net/ethernet/intel/igc/igc_main.c | 25 +++++-
.../ethernet/mellanox/mlx5/core/diag/fw_tracer.c | 3 +-
drivers/net/ethernet/mellanox/mlx5/core/en.h | 2 +-
.../ethernet/mellanox/mlx5/core/en/rep/bridge.c | 4 -
.../ethernet/mellanox/mlx5/core/en/reporter_rx.c | 30 +------
drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 98 ++++++++--------------
.../net/ethernet/mellanox/mlx5/core/esw/bridge.c | 2 +-
.../ethernet/mellanox/mlx5/core/ipoib/ethtool.c | 13 ++-
drivers/net/ethernet/mellanox/mlx5/core/main.c | 14 ++--
drivers/net/ethernet/mscc/ocelot_flower.c | 24 +++---
drivers/net/ethernet/pensando/ionic/ionic_lif.c | 15 +++-
drivers/net/phy/meson-gxl.c | 2 +
drivers/net/phy/phylink.c | 5 +-
drivers/net/usb/plusb.c | 4 +-
drivers/nvmem/core.c | 41 ++++-----
drivers/of/address.c | 21 +++--
drivers/pinctrl/aspeed/pinctrl-aspeed.c | 2 +-
drivers/pinctrl/intel/pinctrl-intel.c | 16 +++-
drivers/pinctrl/mediatek/pinctrl-mt8195.c | 4 +-
drivers/pinctrl/pinctrl-single.c | 2 +
drivers/spi/spi-dw-core.c | 2 +-
drivers/usb/core/quirks.c | 3 +
drivers/usb/typec/altmodes/displayport.c | 8 +-
fs/btrfs/volumes.c | 22 ++++-
fs/btrfs/zlib.c | 2 +-
fs/ceph/mds_client.c | 6 ++
fs/cifs/file.c | 4 +-
include/linux/hugetlb.h | 6 +-
include/uapi/linux/ip.h | 1 +
include/uapi/linux/ipv6.h | 1 +
kernel/locking/rtmutex.c | 5 +-
kernel/trace/trace.c | 3 -
mm/gup.c | 2 +-
mm/hugetlb.c | 11 ++-
mm/memory-failure.c | 2 +-
mm/memory_hotplug.c | 2 +-
mm/mempolicy.c | 5 +-
mm/migrate.c | 7 +-
mm/page_alloc.c | 5 +-
net/can/j1939/address-claim.c | 40 +++++++++
net/mptcp/subflow.c | 10 ++-
net/rds/message.c | 6 +-
net/xfrm/xfrm_compat.c | 4 +-
net/xfrm/xfrm_input.c | 3 +-
sound/pci/hda/patch_realtek.c | 3 +
sound/pci/lx6464es/lx_core.c | 11 ++-
sound/soc/soc-topology.c | 8 +-
sound/synth/emux/emux_nrpn.c | 3 +
tools/testing/selftests/net/forwarding/lib.sh | 4 +-
67 files changed, 398 insertions(+), 268 deletions(-)
changes since v2:
- The code was tottaly rewritten based on the disscution of the
v2 patch.
- the ssid is set in __cfg80211_connect_result() and only if the ssid is
not already set.
- Do not add an other ssid reset path since it is already done in
__cfg80211_disconnected()
When a connexion was established without going through
NL80211_CMD_CONNECT, the ssid was never set in the wireless_dev struct.
Now we set it in __cfg80211_connect_result() when it is not already set.
Reported-by: Yohan Prod'homme <kernel(a)zoddo.fr>
Fixes: 7b0a0e3c3a88260b6fcb017e49f198463aa62ed1
Cc: linux-wireless(a)vger.kernel.org
Cc: stable(a)vger.kernel.org
Link: https://bugzilla.kernel.org/show_bug.cgi?id=216711
Signed-off-by: Marc Bornand <dev.mbornand(a)systemb.ch>
---
net/wireless/sme.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/net/wireless/sme.c b/net/wireless/sme.c
index 4b5b6ee0fe01..629d7b5f65c1 100644
--- a/net/wireless/sme.c
+++ b/net/wireless/sme.c
@@ -723,6 +723,7 @@ void __cfg80211_connect_result(struct net_device *dev,
bool wextev)
{
struct wireless_dev *wdev = dev->ieee80211_ptr;
+ const struct element *ssid;
const struct element *country_elem = NULL;
const u8 *country_data;
u8 country_datalen;
@@ -883,6 +884,21 @@ void __cfg80211_connect_result(struct net_device *dev,
country_data, country_datalen);
kfree(country_data);
+ if (wdev->u.client.ssid_len == 0) {
+ rcu_read_lock();
+ for_each_valid_link(cr, link) {
+ ssid = ieee80211_bss_get_elem(cr->links[link].bss,
+ WLAN_EID_SSID);
+
+ if (ssid->datalen == 0)
+ continue;
+
+ memcpy(wdev->u.client.ssid, ssid->data, ssid->datalen);
+ wdev->u.client.ssid_len = ssid->datalen;
+ }
+ rcu_read_unlock();
+ }
+
return;
out:
for_each_valid_link(cr, link)
--
2.39.1
Add the MST topology for a CRTC to the atomic state if the driver
needs to force a modeset on the CRTC after the encoder compute config
functions are called.
Later the MST encoder's disable hook also adds the state, but that isn't
guaranteed to work (since in that hook getting the state may fail, which
can't be handled there). This should fix that, while a later patch fixes
the use of the MST state in the disable hook.
v2: Add missing forward struct declartions, caught by hdrtest.
v3: Factor out intel_dp_mst_add_topology_state_for_connector() used
later in the patchset.
Cc: Lyude Paul <lyude(a)redhat.com>
Cc: Ville Syrjälä <ville.syrjala(a)linux.intel.com>
Cc: stable(a)vger.kernel.org # 6.1
Reviewed-by: Ville Syrjälä <ville.syrjala(a)linux.intel.com> # v2
Reviewed-by: Lyude Paul <lyude(a)redhat.com>
Signed-off-by: Imre Deak <imre.deak(a)intel.com>
---
drivers/gpu/drm/i915/display/intel_display.c | 4 ++
drivers/gpu/drm/i915/display/intel_dp_mst.c | 61 ++++++++++++++++++++
drivers/gpu/drm/i915/display/intel_dp_mst.h | 4 ++
3 files changed, 69 insertions(+)
diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
index 166662ade593c..38106cf63b3b9 100644
--- a/drivers/gpu/drm/i915/display/intel_display.c
+++ b/drivers/gpu/drm/i915/display/intel_display.c
@@ -5936,6 +5936,10 @@ int intel_modeset_all_pipes(struct intel_atomic_state *state,
if (ret)
return ret;
+ ret = intel_dp_mst_add_topology_state_for_crtc(state, crtc);
+ if (ret)
+ return ret;
+
ret = intel_atomic_add_affected_planes(state, crtc);
if (ret)
return ret;
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
index 8b0e4defa3f10..f3cb12dcfe0a7 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
@@ -1223,3 +1223,64 @@ bool intel_dp_mst_is_slave_trans(const struct intel_crtc_state *crtc_state)
return crtc_state->mst_master_transcoder != INVALID_TRANSCODER &&
crtc_state->mst_master_transcoder != crtc_state->cpu_transcoder;
}
+
+/**
+ * intel_dp_mst_add_topology_state_for_connector - add MST topology state for a connector
+ * @state: atomic state
+ * @connector: connector to add the state for
+ * @crtc: the CRTC @connector is attached to
+ *
+ * Add the MST topology state for @connector to @state.
+ *
+ * Returns 0 on success, negative error code on failure.
+ */
+static int
+intel_dp_mst_add_topology_state_for_connector(struct intel_atomic_state *state,
+ struct intel_connector *connector,
+ struct intel_crtc *crtc)
+{
+ struct drm_dp_mst_topology_state *mst_state;
+
+ if (!connector->mst_port)
+ return 0;
+
+ mst_state = drm_atomic_get_mst_topology_state(&state->base,
+ &connector->mst_port->mst_mgr);
+ if (IS_ERR(mst_state))
+ return PTR_ERR(mst_state);
+
+ mst_state->pending_crtc_mask |= drm_crtc_mask(&crtc->base);
+
+ return 0;
+}
+
+/**
+ * intel_dp_mst_add_topology_state_for_crtc - add MST topology state for a CRTC
+ * @state: atomic state
+ * @crtc: CRTC to add the state for
+ *
+ * Add the MST topology state for @crtc to @state.
+ *
+ * Returns 0 on success, negative error code on failure.
+ */
+int intel_dp_mst_add_topology_state_for_crtc(struct intel_atomic_state *state,
+ struct intel_crtc *crtc)
+{
+ struct drm_connector *_connector;
+ struct drm_connector_state *conn_state;
+ int i;
+
+ for_each_new_connector_in_state(&state->base, _connector, conn_state, i) {
+ struct intel_connector *connector = to_intel_connector(_connector);
+ int ret;
+
+ if (conn_state->crtc != &crtc->base)
+ continue;
+
+ ret = intel_dp_mst_add_topology_state_for_connector(state, connector, crtc);
+ if (ret)
+ return ret;
+ }
+
+ return 0;
+}
diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.h b/drivers/gpu/drm/i915/display/intel_dp_mst.h
index f7301de6cdfb3..f1815bb722672 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_mst.h
+++ b/drivers/gpu/drm/i915/display/intel_dp_mst.h
@@ -8,6 +8,8 @@
#include <linux/types.h>
+struct intel_atomic_state;
+struct intel_crtc;
struct intel_crtc_state;
struct intel_digital_port;
struct intel_dp;
@@ -18,5 +20,7 @@ int intel_dp_mst_encoder_active_links(struct intel_digital_port *dig_port);
bool intel_dp_mst_is_master_trans(const struct intel_crtc_state *crtc_state);
bool intel_dp_mst_is_slave_trans(const struct intel_crtc_state *crtc_state);
bool intel_dp_mst_source_support(struct intel_dp *intel_dp);
+int intel_dp_mst_add_topology_state_for_crtc(struct intel_atomic_state *state,
+ struct intel_crtc *crtc);
#endif /* __INTEL_DP_MST_H__ */
--
2.37.1
The following commit has been merged into the timers/urgent branch of tip:
Commit-ID: d125d1349abeb46945dc5e98f7824bf688266f13
Gitweb: https://git.kernel.org/tip/d125d1349abeb46945dc5e98f7824bf688266f13
Author: Thomas Gleixner <tglx(a)linutronix.de>
AuthorDate: Thu, 09 Feb 2023 23:25:49 +01:00
Committer: Thomas Gleixner <tglx(a)linutronix.de>
CommitterDate: Tue, 14 Feb 2023 11:18:35 +01:00
alarmtimer: Prevent starvation by small intervals and SIG_IGN
syzbot reported a RCU stall which is caused by setting up an alarmtimer
with a very small interval and ignoring the signal. The reproducer arms the
alarm timer with a relative expiry of 8ns and an interval of 9ns. Not a
problem per se, but that's an issue when the signal is ignored because then
the timer is immediately rearmed because there is no way to delay that
rearming to the signal delivery path. See posix_timer_fn() and commit
58229a189942 ("posix-timers: Prevent softirq starvation by small intervals
and SIG_IGN") for details.
The reproducer does not set SIG_IGN explicitely, but it sets up the timers
signal with SIGCONT. That has the same effect as explicitely setting
SIG_IGN for a signal as SIGCONT is ignored if there is no handler set and
the task is not ptraced.
The log clearly shows that:
[pid 5102] --- SIGCONT {si_signo=SIGCONT, si_code=SI_TIMER, si_timerid=0, si_overrun=316014, si_int=0, si_ptr=NULL} ---
It works because the tasks are traced and therefore the signal is queued so
the tracer can see it, which delays the restart of the timer to the signal
delivery path. But then the tracer is killed:
[pid 5087] kill(-5102, SIGKILL <unfinished ...>
...
./strace-static-x86_64: Process 5107 detached
and after it's gone the stall can be observed:
syzkaller login: [ 79.439102][ C0] hrtimer: interrupt took 68471 ns
[ 184.460538][ C1] rcu: INFO: rcu_preempt detected stalls on CPUs/tasks:
...
[ 184.658237][ C1] rcu: Stack dump where RCU GP kthread last ran:
[ 184.664574][ C1] Sending NMI from CPU 1 to CPUs 0:
[ 184.669821][ C0] NMI backtrace for cpu 0
[ 184.669831][ C0] CPU: 0 PID: 5108 Comm: syz-executor192 Not tainted 6.2.0-rc6-next-20230203-syzkaller #0
...
[ 184.670036][ C0] Call Trace:
[ 184.670041][ C0] <IRQ>
[ 184.670045][ C0] alarmtimer_fired+0x327/0x670
posix_timer_fn() prevents that by checking whether the interval for
timers which have the signal ignored is smaller than a jiffie and
artifically delay it by shifting the next expiry out by a jiffie. That's
accurate vs. the overrun accounting, but slightly inaccurate
vs. timer_gettimer(2).
The comment in that function says what needs to be done and there was a fix
available for the regular userspace induced SIG_IGN mechanism, but that did
not work due to the implicit ignore for SIGCONT and similar signals. This
needs to be worked on, but for now the only available workaround is to do
exactly what posix_timer_fn() does:
Increase the interval of self-rearming timers, which have their signal
ignored, to at least a jiffie.
Interestingly this has been fixed before via commit ff86bf0c65f1
("alarmtimer: Rate limit periodic intervals") already, but that fix got
lost in a later rework.
Reported-by: syzbot+b9564ba6e8e00694511b(a)syzkaller.appspotmail.com
Fixes: f2c45807d399 ("alarmtimer: Switch over to generic set/get/rearm routine")
Signed-off-by: Thomas Gleixner <tglx(a)linutronix.de>
Acked-by: John Stultz <jstultz(a)google.com>
Cc: stable(a)vger.kernel.org
Link: https://lore.kernel.org/r/87k00q1no2.ffs@tglx
---
kernel/time/alarmtimer.c | 33 +++++++++++++++++++++++++++++----
1 file changed, 29 insertions(+), 4 deletions(-)
diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c
index 5897828..7e5dff6 100644
--- a/kernel/time/alarmtimer.c
+++ b/kernel/time/alarmtimer.c
@@ -470,11 +470,35 @@ u64 alarm_forward(struct alarm *alarm, ktime_t now, ktime_t interval)
}
EXPORT_SYMBOL_GPL(alarm_forward);
-u64 alarm_forward_now(struct alarm *alarm, ktime_t interval)
+static u64 __alarm_forward_now(struct alarm *alarm, ktime_t interval, bool throttle)
{
struct alarm_base *base = &alarm_bases[alarm->type];
+ ktime_t now = base->get_ktime();
+
+ if (IS_ENABLED(CONFIG_HIGH_RES_TIMERS) && throttle) {
+ /*
+ * Same issue as with posix_timer_fn(). Timers which are
+ * periodic but the signal is ignored can starve the system
+ * with a very small interval. The real fix which was
+ * promised in the context of posix_timer_fn() never
+ * materialized, but someone should really work on it.
+ *
+ * To prevent DOS fake @now to be 1 jiffie out which keeps
+ * the overrun accounting correct but creates an
+ * inconsistency vs. timer_gettime(2).
+ */
+ ktime_t kj = NSEC_PER_SEC / HZ;
+
+ if (interval < kj)
+ now = ktime_add(now, kj);
+ }
+
+ return alarm_forward(alarm, now, interval);
+}
- return alarm_forward(alarm, base->get_ktime(), interval);
+u64 alarm_forward_now(struct alarm *alarm, ktime_t interval)
+{
+ return __alarm_forward_now(alarm, interval, false);
}
EXPORT_SYMBOL_GPL(alarm_forward_now);
@@ -551,9 +575,10 @@ static enum alarmtimer_restart alarm_handle_timer(struct alarm *alarm,
if (posix_timer_event(ptr, si_private) && ptr->it_interval) {
/*
* Handle ignored signals and rearm the timer. This will go
- * away once we handle ignored signals proper.
+ * away once we handle ignored signals proper. Ensure that
+ * small intervals cannot starve the system.
*/
- ptr->it_overrun += alarm_forward_now(alarm, ptr->it_interval);
+ ptr->it_overrun += __alarm_forward_now(alarm, ptr->it_interval, true);
++ptr->it_requeue_pending;
ptr->it_active = 1;
result = ALARMTIMER_RESTART;