Linux 5.15.160
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.15.160 kernel.
All users of the 5.15 kernel series must upgrade.
The updated 5.15.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.15.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/admin-guide/hw-vuln/core-scheduling.rst | 4 Documentation/sphinx/kernel_include.py | 1 Makefile | 2 arch/x86/kvm/x86.c | 11 drivers/android/binder.c | 2 drivers/android/binder_internal.h | 2 drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c | 3 drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c | 7 drivers/net/ethernet/broadcom/genet/bcmgenet.c | 12 - drivers/net/ethernet/broadcom/genet/bcmgenet.h | 2 drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c | 6 drivers/net/ethernet/broadcom/genet/bcmmii.c | 4 drivers/pinctrl/core.c | 14 - drivers/remoteproc/mtk_scp.c | 10 drivers/tty/serial/kgdboc.c | 30 ++ drivers/usb/typec/ucsi/displayport.c | 4 fs/nfs/callback.c | 9 fs/nfsd/nfs4proc.c | 5 fs/nfsd/nfssvc.c | 12 - include/net/tls.h | 6 net/netlink/af_netlink.c | 23 +- net/sunrpc/svc_xprt.c | 16 - net/tls/tls_sw.c | 199 +++++++++--------- security/keys/trusted-keys/trusted_tpm2.c | 25 +- tools/testing/selftests/vm/map_hugetlb.c | 7 25 files changed, 242 insertions(+), 174 deletions(-)
Akira Yokosawa (1):
docs: kernel_include.py: Cope with docutils 0.21
AngeloGioacchino Del Regno (1):
remoteproc: mediatek: Make sure IPI buffer fits in L2TCM
Carlos Llamas (1):
binder: fix max_thread type inconsistency
Daniel Thompson (1):
serial: kgdboc: Fix NMI-safety problems from keyboard reset code
Doug Berger (2):
net: bcmgenet: synchronize EXT_RGMII_OOB_CTRL access
net: bcmgenet: synchronize UMAC_CMD access
Eric Dumazet (2):
netlink: annotate lockless accesses to nlk->max_recvmsg_len
netlink: annotate data-races around sk->sk_errGreg Kroah-Hartman (1):
Linux 5.15.160
Harshit Mogalapalli (1):
Revert "selftests: mm: fix map_hugetlb failure on 64K page size systems"
Heikki Krogerus (1):
usb: typec: ucsi: displayport: Fix potential deadlock
Jakub Kicinski (4):
tls: rx: simplify async wait
net: tls: factor out tls_*crypt_async_wait()
tls: fix race between async notify and socket close
net: tls: handle backlogging of crypto requests
Jarkko Sakkinen (2):
KEYS: trusted: Fix memory leak in tpm2_key_encode()
KEYS: trusted: Do not use WARN when encode fails
Jose Fernandez (1):
drm/amd/display: Fix division by zero in setup_dsc_config
NeilBrown (1):
nfsd: don't allow nfsd threads to be signalled.
Sabrina Dubroca (1):
tls: extract context alloc/initialization out of tls_set_sw_offload
Sean Christopherson (1):
KVM: x86: Clear "has_error_code", not "error_code", for RM exception injection
Sergey Shtylyov (1):
pinctrl: core: handle radix_tree_insert() errors in pinctrl_register_one_pin()
Srinivasan Shanmugam (1):
drm/amdgpu: Fix possible NULL dereference in amdgpu_ras_query_error_status_helper()
Thomas Weißschuh (1):
admin-guide/hw-vuln/core-scheduling: fix return type of PR_SCHED_CORE_GET
Greg Kroah-Hartman
maintainerDocumentation/admin-guide/hw-vuln/core-scheduling.rst +2 -2
@@ -66,8 +66,8 @@ arg4: will be performed for all tasks in the task group of ``pid``. arg5: - userspace pointer to an unsigned long for storing the cookie returned by - ``PR_SCHED_CORE_GET`` command. Should be 0 for all other commands. + userspace pointer to an unsigned long long for storing the cookie returned + by ``PR_SCHED_CORE_GET`` command. Should be 0 for all other commands. In order for a process to push a cookie to, or pull a cookie from a process, it is required to have the ptrace access mode: `PTRACE_MODE_READ_REALCREDS` to the
Documentation/sphinx/kernel_include.py +0 -1
@@ -94,7 +94,6 @@ class KernelInclude(Include): # HINT: this is the only line I had to change / commented out: #path = utils.relative_path(None, path) - path = nodes.reprunicode(path) encoding = self.options.get( 'encoding', self.state.document.settings.input_encoding) e_handler=self.state.document.settings.input_encoding_error_handler
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 15 -SUBLEVEL = 159 +SUBLEVEL = 160 EXTRAVERSION = NAME = Trick or Treat
arch/x86/kvm/x86.c +9 -2
@@ -9134,13 +9134,20 @@ int kvm_check_nested_events(struct kvm_vcpu *vcpu)static void kvm_inject_exception (struct kvm_vcpu *vcpu) { +/* +* Suppress the error code if the vCPU is in Real Mode, as Real Mode +* exceptions don't report error codes. The presence of an error code +* is carried with the exception and only stripped when the exception +* is injected as intercepted #PF VM-Exits for AMD's Paged Real Mode do +* report an error code despite the CPU being in Real Mode. +*/ + vcpu->arch.exception.has_error_code &=is_protmode (vcpu); +trace_kvm_inj_exception (vcpu->arch.exception.nr, vcpu->arch.exception.has_error_code, vcpu->arch.exception.error_code, vcpu->arch.exception.injected); -if (vcpu->arch.exception.error_code && !is_protmode (vcpu)) - vcpu->arch.exception.error_code = false;static_call (kvm_x86_queue_exception)(vcpu); }
drivers/android/binder.c +1 -1
@@ -5165,7 +5165,7 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) goto err;break ;case BINDER_SET_MAX_THREADS : { -int max_threads; +u32 max_threads;if (copy_from_user (&max_threads, ubuf,sizeof (max_threads))) {
drivers/android/binder_internal.h +1 -1
@@ -420,7 +420,7 @@ struct binder_proc {struct list_head todo;struct binder_stats stats;struct list_head delivered_death; -int max_threads; +u32 max_threads;int requested_threads;int requested_threads_started;int tmp_ref;
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c +3 -0
@@ -820,6 +820,9 @@ int amdgpu_ras_query_error_status(struct amdgpu_device *adev,if (!obj)return -EINVAL ; +if (!info || info->head.block ==AMDGPU_RAS_BLOCK_COUNT ) +return -EINVAL ; +switch (info->head.block) {case AMDGPU_RAS_BLOCK__UMC : if (adev->umc.ras_funcs &&
drivers/gpu/drm/amd/display/dc/dsc/dc_dsc.c +6 -1
@@ -939,7 +939,12 @@ static bool setup_dsc_config(if (!is_dsc_possible) goto done; - dsc_cfg->num_slices_v = pic_height/slice_height; +if (slice_height >0 ) { + dsc_cfg->num_slices_v = pic_height / slice_height; + }else { + is_dsc_possible = false; + goto done; + }if (target_bandwidth_kbps >0 ) { is_dsc_possible = decide_dsc_target_bpp_x16(
drivers/net/ethernet/broadcom/genet/bcmgenet.c +11 -1
@@ -2424,14 +2424,18 @@ static void umac_enable_set(struct bcmgenet_priv *priv, u32 mask, bool enable) {u32 reg; +spin_lock_bh (&priv->reg_lock); reg =bcmgenet_umac_readl (priv,UMAC_CMD ); -if (reg &CMD_SW_RESET ) +if (reg &CMD_SW_RESET ) { +spin_unlock_bh (&priv->reg_lock);return ; + }if (enable) reg |= mask;else reg &= ~mask;bcmgenet_umac_writel (priv, reg,UMAC_CMD ); +spin_unlock_bh (&priv->reg_lock);/* UniMAC stops on a packet boundary, wait for a full-size packet * to be processed
@@ -2447,8 +2451,10 @@ static void reset_umac(struct bcmgenet_priv *priv)udelay (10 );/* issue soft reset and disable MAC while updating its registers */ +spin_lock_bh (&priv->reg_lock);bcmgenet_umac_writel (priv,CMD_SW_RESET ,UMAC_CMD );udelay (2 ); +spin_unlock_bh (&priv->reg_lock); }static void bcmgenet_intr_disable (struct bcmgenet_priv *priv)
@@ -3576,16 +3582,19 @@ static void bcmgenet_set_rx_mode(struct net_device *dev)* 3. The number of filters needed exceeds the number filters * supported by the hardware. */ +spin_lock (&priv->reg_lock); reg =bcmgenet_umac_readl (priv,UMAC_CMD );if ((dev->flags & (IFF_PROMISC |IFF_ALLMULTI )) || (nfilter >MAX_MDF_FILTER )) { reg |=CMD_PROMISC ;bcmgenet_umac_writel (priv, reg,UMAC_CMD ); +spin_unlock (&priv->reg_lock);bcmgenet_umac_writel (priv,0 ,UMAC_MDF_CTRL );return ; }else { reg &= ~CMD_PROMISC ;bcmgenet_umac_writel (priv, reg,UMAC_CMD ); +spin_unlock (&priv->reg_lock); }/* update MDF filter */
@@ -3979,6 +3988,7 @@ static int bcmgenet_probe(struct platform_device *pdev) goto err; } +spin_lock_init (&priv->reg_lock);spin_lock_init (&priv->lock);SET_NETDEV_DEV (dev, &pdev->dev);
drivers/net/ethernet/broadcom/genet/bcmgenet.h +2 -0
@@ -572,6 +572,8 @@ struct bcmgenet_rxnfc_rule {/* device context */ struct bcmgenet_priv {void __iomem *base; +/* reg_lock: lock to serialize access to shared registers */ +spinlock_t reg_lock;enum bcmgenet_version version;struct net_device *dev;
drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c +6 -0
@@ -133,6 +133,7 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv, }/* Can't suspend with WoL if MAC is still in reset */ +spin_lock_bh (&priv->reg_lock); reg =bcmgenet_umac_readl (priv,UMAC_CMD );if (reg &CMD_SW_RESET ) reg &= ~CMD_SW_RESET ;
@@ -140,6 +141,7 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv,/* disable RX */ reg &= ~CMD_RX_EN ;bcmgenet_umac_writel (priv, reg,UMAC_CMD ); +spin_unlock_bh (&priv->reg_lock);mdelay (10 );if (priv->wolopts & (WAKE_MAGIC |WAKE_MAGICSECURE )) {
@@ -185,6 +187,7 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv, }/* Enable CRC forward */ +spin_lock_bh (&priv->reg_lock); reg =bcmgenet_umac_readl (priv,UMAC_CMD ); priv->crc_fwd_en =1 ; reg |=CMD_CRC_FWD ;
@@ -192,6 +195,7 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv *priv,/* Receiver must be enabled for WOL MP detection */ reg |=CMD_RX_EN ;bcmgenet_umac_writel (priv, reg,UMAC_CMD ); +spin_unlock_bh (&priv->reg_lock); reg =UMAC_IRQ_MPD_R ;if (hfb_enable)
@@ -238,7 +242,9 @@ void bcmgenet_wol_power_up_cfg(struct bcmgenet_priv *priv, }/* Disable CRC Forward */ +spin_lock_bh (&priv->reg_lock); reg =bcmgenet_umac_readl (priv,UMAC_CMD ); reg &= ~CMD_CRC_FWD ;bcmgenet_umac_writel (priv, reg,UMAC_CMD ); +spin_unlock_bh (&priv->reg_lock); }
drivers/net/ethernet/broadcom/genet/bcmmii.c +4 -0
@@ -91,6 +91,7 @@ void bcmgenet_mii_setup(struct net_device *dev) reg |=RGMII_LINK ;bcmgenet_ext_writel (priv, reg,EXT_RGMII_OOB_CTRL ); +spin_lock_bh (&priv->reg_lock); reg =bcmgenet_umac_readl (priv,UMAC_CMD ); reg &= ~((CMD_SPEED_MASK << CMD_SPEED_SHIFT) | CMD_HD_EN |
@@ -103,6 +104,7 @@ void bcmgenet_mii_setup(struct net_device *dev) reg |=CMD_TX_EN |CMD_RX_EN ; }bcmgenet_umac_writel (priv, reg,UMAC_CMD ); +spin_unlock_bh (&priv->reg_lock); priv->eee.eee_active =phy_init_eee (phydev,0 ) >=0 ; bcmgenet_eee_enable_set(dev,
@@ -264,6 +266,7 @@ int bcmgenet_mii_config(struct net_device *dev, bool init)* block for the interface to work */ if (priv->ext_phy) { +mutex_lock (&phydev->lock); reg =bcmgenet_ext_readl (priv,EXT_RGMII_OOB_CTRL ); reg &= ~ID_MODE_DIS ; reg |= id_mode_dis;
@@ -272,6 +275,7 @@ int bcmgenet_mii_config(struct net_device *dev, bool init)else reg |=RGMII_MODE_EN ;bcmgenet_ext_writel (priv, reg,EXT_RGMII_OOB_CTRL ); +mutex_unlock (&phydev->lock); }if (init)
drivers/pinctrl/core.c +11 -3
@@ -205,6 +205,7 @@ static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev, const struct pinctrl_pin_desc *pin) {struct pin_desc *pindesc; +int error; pindesc =pin_desc_get (pctldev, pin->number);if (pindesc) {
@@ -226,18 +227,25 @@ static int pinctrl_register_one_pin(struct pinctrl_dev *pctldev, }else { pindesc->name =kasprintf (GFP_KERNEL ,"PIN%u" , pin->number);if (!pindesc->name) { -kfree (pindesc); -return -ENOMEM ; + error = -ENOMEM ; + goto failed; } pindesc->dynamic_name = true; } pindesc->drv_data = pin->drv_data; -radix_tree_insert (&pctldev->pin_desc_tree, pin->number, pindesc); + error =radix_tree_insert (&pctldev->pin_desc_tree, pin->number, pindesc); +if (error) + goto failed; +pr_debug ("registered pin %d (%s) on %s\n" , pin->number, pindesc->name, pctldev->desc->name);return 0 ; + +failed: +kfree (pindesc); +return error; } static int pinctrl_register_pins(struct pinctrl_dev *pctldev,
drivers/remoteproc/mtk_scp.c +9 -1
@@ -126,7 +126,7 @@ static int scp_elf_read_ipi_buf_addr(struct mtk_scp *scp,static int scp_ipi_init (struct mtk_scp *scp,const struct firmware *fw) {int ret; -size_t offset; +size_t buf_sz, offset;/* read the ipi buf addr from FW itself first */ ret =scp_elf_read_ipi_buf_addr (scp, fw, &offset);
@@ -138,6 +138,14 @@ static int scp_ipi_init(struct mtk_scp *scp, const struct firmware *fw) }dev_info (scp->dev,"IPI buf addr %#010zx\n" , offset); +/* Make sure IPI buffer fits in the L2TCM range assigned to this core */ + buf_sz =sizeof (*scp->recv_buf) +sizeof (*scp->send_buf); + +if (scp->sram_size < buf_sz + offset) { +dev_err (scp->dev,"IPI buffer does not fit in SRAM.\n" ); +return -EOVERFLOW ; + } + scp->recv_buf = (struct mtk_share_obj __iomem *) (scp->sram_base + offset); scp->send_buf = (struct mtk_share_obj __iomem *)
drivers/tty/serial/kgdboc.c +29 -1
@@ -19,6 +19,7 @@#include <linux/console.h> #include <linux/vt_kern.h> #include <linux/input.h> +#include <linux/irq_work.h> #include <linux/module.h> #include <linux/platform_device.h> #include <linux/serial_core.h>
@@ -48,6 +49,25 @@ static struct kgdb_io kgdboc_earlycon_io_ops;static int (*earlycon_orig_exit)(struct console *con);#endif /* IS_BUILTIN(CONFIG_KGDB_SERIAL_CONSOLE) */ +/* +* When we leave the debug trap handler we need to reset the keyboard status +* (since the original keyboard state gets partially clobbered by kdb use of +* the keyboard). +* +* The path to deliver the reset is somewhat circuitous. +* +* To deliver the reset we register an input handler, reset the keyboard and +* then deregister the input handler. However, to get this done right, we do +* have to carefully manage the calling context because we can only register +* input handlers from task context. +* +* In particular we need to trigger the action from the debug trap handler with +* all its NMI and/or NMI-like oddities. To solve this the kgdboc trap exit code +* (the "post_exception" callback) uses irq_work_queue(), which is NMI-safe, to +* schedule a callback from a hardirq context. From there we have to defer the +* work again, this time using schedule_work(), to get a callback using the +* system workqueue, which runs in task context. +*/ #ifdef CONFIG_KDB_KEYBOARD static int kgdboc_reset_connect(struct input_handler *handler, struct input_dev *dev,
@@ -99,10 +119,17 @@ static void kgdboc_restore_input_helper(struct work_struct *dummy) static DECLARE_WORK(kgdboc_restore_input_work, kgdboc_restore_input_helper); +static void kgdboc_queue_restore_input_helper (struct irq_work *unused) +{ +schedule_work (&kgdboc_restore_input_work); +} + +static DEFINE_IRQ_WORK(kgdboc_restore_input_irq_work, kgdboc_queue_restore_input_helper); +static void kgdboc_restore_input (void ) {if (likely (system_state ==SYSTEM_RUNNING )) -schedule_work (&kgdboc_restore_input_work); +irq_work_queue (&kgdboc_restore_input_irq_work); }static int kgdboc_register_kbd (char **cptr)
@@ -133,6 +160,7 @@ static void kgdboc_unregister_kbd(void) i--; } } +irq_work_sync (&kgdboc_restore_input_irq_work);flush_work (&kgdboc_restore_input_work); }#else /* ! CONFIG_KDB_KEYBOARD */
drivers/usb/typec/ucsi/displayport.c +0 -4
@@ -275,8 +275,6 @@ static void ucsi_displayport_work(struct work_struct *work) struct ucsi_dp *dp = container_of(work, struct ucsi_dp, work);int ret; -mutex_lock (&dp->con->lock); - ret =typec_altmode_vdm (dp->alt, dp->header, dp->vdo_data, dp->vdo_size);if (ret)
@@ -285,8 +283,6 @@ static void ucsi_displayport_work(struct work_struct *work) dp->vdo_data =NULL ; dp->vdo_size =0 ; dp->header =0 ; - -mutex_unlock (&dp->con->lock); }void ucsi_displayport_remove_partner (struct typec_altmode *alt)
fs/nfs/callback.c +1 -8
@@ -80,9 +80,6 @@ nfs4_callback_svc(void *vrqstp)set_freezable ();while (!kthread_freezable_should_stop (NULL )) { - -if (signal_pending (current)) -flush_signals (current);/* * Listen for a request on the socket */
@@ -112,11 +109,7 @@ nfs41_callback_svc(void *vrqstp)set_freezable ();while (!kthread_freezable_should_stop (NULL )) { - -if (signal_pending (current)) -flush_signals (current); - -prepare_to_wait (&serv->sv_cb_waitq, &wq,TASK_INTERRUPTIBLE ); +prepare_to_wait (&serv->sv_cb_waitq, &wq,TASK_IDLE );spin_lock_bh (&serv->sv_cb_lock);if (!list_empty (&serv->sv_cb_list)) { req = list_first_entry(&serv->sv_cb_list,
fs/nfsd/nfs4proc.c +2 -3
@@ -1317,12 +1317,11 @@ static __be32 nfsd4_ssc_setup_dul(struct nfsd_net *nn, char *ipaddr,/* found a match */ if (ni->nsui_busy) {/* wait - and try again */ -prepare_to_wait (&nn->nfsd_ssc_waitq, &wait, -TASK_INTERRUPTIBLE ); +prepare_to_wait (&nn->nfsd_ssc_waitq, &wait,TASK_IDLE );spin_unlock (&nn->nfsd_ssc_lock);/* allow 20secs for mount/unmount for now - revisit */ -if (signal_pending (current) || +if (kthread_should_stop () || (schedule_timeout (20 *HZ ) ==0 )) {finish_wait (&nn->nfsd_ssc_waitq, &wait);kfree (work);
fs/nfsd/nfssvc.c +0 -12
@@ -938,15 +938,6 @@ nfsd(void *vrqstp) current->fs->umask =0 ; -/* -* thread is spawned with all signals set to SIG_IGN, re-enable -* the ones that will bring down the thread -*/ -allow_signal (SIGKILL ); -allow_signal (SIGHUP ); -allow_signal (SIGINT ); -allow_signal (SIGQUIT ); -atomic_inc (&nfsdstats.th_cnt);set_freezable ();
@@ -971,9 +962,6 @@ nfsd(void *vrqstp)validate_process_creds (); } -/* Clear signals before calling svc_exit_thread() */ -flush_signals (current); -atomic_dec (&nfsdstats.th_cnt); out:
include/net/tls.h +0 -6
@@ -128,9 +128,6 @@ struct tls_sw_context_tx {struct tls_rec *open_rec;struct list_head tx_list;atomic_t encrypt_pending; -/* protect crypto_wait with encrypt_pending */ -spinlock_t encrypt_compl_lock; -int async_notify; u8 async_capable:1;#define BIT_TX_SCHEDULED 0
@@ -148,9 +145,6 @@ struct tls_sw_context_rx {struct sk_buff *recv_pkt; u8 async_capable:1;atomic_t decrypt_pending; -/* protect crypto_wait with decrypt_pending*/ -spinlock_t decrypt_compl_lock; -bool async_notify; };struct tls_record_info {
net/netlink/af_netlink.c +13 -10
@@ -352,7 +352,7 @@ static void netlink_overrun(struct sock *sk)if (!(nlk->flags &NETLINK_F_RECV_NO_ENOBUFS )) {if (!test_and_set_bit (NETLINK_S_CONGESTED , &nlk_sk (sk)->state)) { - sk->sk_err =ENOBUFS ; +WRITE_ONCE (sk->sk_err,ENOBUFS );sk_error_report (sk); } }
@@ -1591,7 +1591,7 @@ static int do_one_set_err(struct sock *sk, struct netlink_set_err_data *p) goto out; } - sk->sk_err = p->code; +WRITE_ONCE (sk->sk_err, p->code);sk_error_report (sk); out:return ret;
@@ -1935,7 +1935,7 @@ static int netlink_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,struct sock *sk = sock->sk;struct netlink_sock *nlk =nlk_sk (sk);int noblock = flags &MSG_DONTWAIT ; -size_t copied; +size_t copied, max_recvmsg_len;struct sk_buff *skb, *data_skb;int err, ret;
@@ -1968,9 +1968,10 @@ static int netlink_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,#endif /* Record the max length of recvmsg() calls for future allocations */ - nlk->max_recvmsg_len =max (nlk->max_recvmsg_len, len); - nlk->max_recvmsg_len =min_t (size_t, nlk->max_recvmsg_len, -SKB_WITH_OVERHEAD (32768 )); + max_recvmsg_len =max (READ_ONCE (nlk->max_recvmsg_len), len); + max_recvmsg_len =min_t (size_t, max_recvmsg_len, +SKB_WITH_OVERHEAD (32768 )); +WRITE_ONCE (nlk->max_recvmsg_len, max_recvmsg_len); copied = data_skb->len;if (len < copied) {
@@ -2005,7 +2006,7 @@ static int netlink_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) { ret =netlink_dump (sk);if (ret) { - sk->sk_err = -ret; +WRITE_ONCE (sk->sk_err, -ret);sk_error_report (sk); } }
@@ -2219,6 +2220,7 @@ static int netlink_dump(struct sock *sk)struct netlink_ext_ack extack = {};struct netlink_callback *cb;struct sk_buff *skb =NULL ; +size_t max_recvmsg_len;struct module *module;int err = -ENOBUFS ;int alloc_min_size;
@@ -2241,8 +2243,9 @@ static int netlink_dump(struct sock *sk) cb = &nlk->cb; alloc_min_size =max_t (int, cb->min_dump_alloc,NLMSG_GOODSIZE ); -if (alloc_min_size < nlk->max_recvmsg_len) { - alloc_size = nlk->max_recvmsg_len; + max_recvmsg_len =READ_ONCE (nlk->max_recvmsg_len); +if (alloc_min_size < max_recvmsg_len) { + alloc_size = max_recvmsg_len; skb =alloc_skb (alloc_size, (GFP_KERNEL & ~__GFP_DIRECT_RECLAIM) | __GFP_NOWARN | __GFP_NORETRY);
@@ -2439,7 +2442,7 @@ void netlink_ack(struct sk_buff *in_skb, struct nlmsghdr *nlh, int err, skb =nlmsg_new (payload + tlvlen,GFP_KERNEL );if (!skb) { -NETLINK_CB (in_skb).sk->sk_err =ENOBUFS ; +WRITE_ONCE (NETLINK_CB (in_skb).sk->sk_err,ENOBUFS );sk_error_report (NETLINK_CB (in_skb).sk);return ; }
net/sunrpc/svc_xprt.c +6 -10
@@ -700,8 +700,8 @@ static int svc_alloc_arg(struct svc_rqst *rqstp)/* Made progress, don't sleep yet */ continue ; -set_current_state (TASK_INTERRUPTIBLE ); -if (signalled () ||kthread_should_stop ()) { +set_current_state (TASK_IDLE ); +if (kthread_should_stop ()) {set_current_state (TASK_RUNNING );return -EINTR ; }
@@ -736,7 +736,7 @@ rqst_should_sleep(struct svc_rqst *rqstp)return false;/* are we shutting down? */ -if (signalled () ||kthread_should_stop ()) +if (kthread_should_stop ())return false;/* are we freezing? */
@@ -758,11 +758,7 @@ static struct svc_xprt *svc_get_next_xprt(struct svc_rqst *rqstp, long timeout)if (rqstp->rq_xprt) goto out_found; -/* -* We have to be able to interrupt this wait -* to bring down the daemons ... -*/ -set_current_state (TASK_INTERRUPTIBLE ); +set_current_state (TASK_IDLE );smp_mb__before_atomic ();clear_bit (SP_CONGESTED , &pool->sp_flags);clear_bit (RQ_BUSY , &rqstp->rq_flags);
@@ -784,7 +780,7 @@ static struct svc_xprt *svc_get_next_xprt(struct svc_rqst *rqstp, long timeout)if (!time_left)atomic_long_inc (&pool->sp_stats.threads_timedout); -if (signalled () ||kthread_should_stop ()) +if (kthread_should_stop ())return ERR_PTR (-EINTR );return ERR_PTR (-EAGAIN ); out_found:
@@ -882,7 +878,7 @@ int svc_recv(struct svc_rqst *rqstp, long timeout)try_to_freeze ();cond_resched (); err = -EINTR ; -if (signalled () ||kthread_should_stop ()) +if (kthread_should_stop ()) goto out; xprt =svc_get_next_xprt (rqstp, timeout);
net/tls/tls_sw.c +106 -93
301 lines not on this page · raw message
security/keys/trusted-keys/trusted_tpm2.c +19 -6
@@ -38,6 +38,7 @@ static int tpm2_key_encode(struct trusted_key_payload *payload,u8 *end_work = scratch +SCRATCH_SIZE ;u8 *priv, *pub;u16 priv_len, pub_len; +int ret; priv_len =get_unaligned_be16 (src) +2 ; priv = src;
@@ -57,8 +58,10 @@ static int tpm2_key_encode(struct trusted_key_payload *payload,unsigned char bool[3 ], *w = bool;/* tag 0 is emptyAuth */ w =asn1_encode_boolean (w, w +sizeof (bool ), true); -if (WARN (IS_ERR (w),"BUG: Boolean failed to encode" )) -return PTR_ERR (w); +if (WARN (IS_ERR (w),"BUG: Boolean failed to encode" )) { + ret =PTR_ERR (w); + goto err; + } work =asn1_encode_tag (work, end_work,0 , bool, w - bool); }
@@ -69,8 +72,10 @@ static int tpm2_key_encode(struct trusted_key_payload *payload,* trigger, so if it does there's something nefarious going on */ if (WARN (work - scratch + pub_len + priv_len +14 >SCRATCH_SIZE , -"BUG: scratch buffer is too small" )) -return -EINVAL ; +"BUG: scratch buffer is too small" )) { + ret = -EINVAL ; + goto err; + } work =asn1_encode_integer (work, end_work, options->keyhandle); work =asn1_encode_octet_string (work, end_work, pub, pub_len);
@@ -79,10 +84,18 @@ static int tpm2_key_encode(struct trusted_key_payload *payload, work1 = payload->blob; work1 =asn1_encode_sequence (work1, work1 +sizeof (payload->blob), scratch, work - scratch); -if (WARN (IS_ERR (work1),"BUG: ASN.1 encoder failed" )) -return PTR_ERR (work1); +if (IS_ERR (work1)) { + ret =PTR_ERR (work1); +pr_err ("BUG: ASN.1 encoder failed with %d\n" , ret); + goto err; + } +kfree (scratch);return work1 - payload->blob; + +err: +kfree (scratch); +return ret; }struct tpm2_key_context {
tools/testing/selftests/vm/map_hugetlb.c +0 -7
@@ -15,7 +15,6 @@#include <unistd.h> #include <sys/mman.h> #include <fcntl.h> -#include "vm_util.h" #define LENGTH (256UL*1024*1024)#define PROTECTION (PROT_READ | PROT_WRITE)
@@ -71,16 +70,10 @@ int main(int argc, char **argv) {void *addr;int ret; -size_t hugepage_size;size_t length =LENGTH ;int flags =FLAGS ;int shift =0 ; - hugepage_size =default_huge_page_size (); -/* munmap with fail if the length is not page aligned */ -if (hugepage_size > length) - length = hugepage_size; -if (argc >1 ) length =atol (argv[1 ]) <<20 ;if (argc >2 ) {