commit:     9723a6ca8963f59a83672d3b433b01f598183bcc
Author:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
AuthorDate: Sat Jan 30 13:26:22 2021 +0000
Commit:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
CommitDate: Sat Jan 30 13:27:06 2021 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=9723a6ca

Linux patch 5.10.12

Signed-off-by: Alice Ferrazzi <alicef <AT> gentoo.org>

 0000_README              |    4 +
 1011_linux-5.10.12.patch | 1263 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 1267 insertions(+)

diff --git a/0000_README b/0000_README
index fe8a778..8c99e2c 100644
--- a/0000_README
+++ b/0000_README
@@ -87,6 +87,10 @@ Patch:  1010_linux-5.10.11.patch
 From:   http://www.kernel.org
 Desc:   Linux 5.10.11
 
+Patch:  1011_linux-5.10.12.patch
+From:   http://www.kernel.org
+Desc:   Linux 5.10.12
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1011_linux-5.10.12.patch b/1011_linux-5.10.12.patch
new file mode 100644
index 0000000..40728cb
--- /dev/null
+++ b/1011_linux-5.10.12.patch
@@ -0,0 +1,1263 @@
+diff --git a/Makefile b/Makefile
+index 7a5d906f6ee36..a6b2e64bcf6c7 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 5
+ PATCHLEVEL = 10
+-SUBLEVEL = 11
++SUBLEVEL = 12
+ EXTRAVERSION =
+ NAME = Kleptomaniac Octopus
+ 
+diff --git a/drivers/gpio/gpio-mvebu.c b/drivers/gpio/gpio-mvebu.c
+index 2f245594a90a6..ed7c5fc47f524 100644
+--- a/drivers/gpio/gpio-mvebu.c
++++ b/drivers/gpio/gpio-mvebu.c
+@@ -660,9 +660,8 @@ static void mvebu_pwm_get_state(struct pwm_chip *chip,
+ 
+       spin_lock_irqsave(&mvpwm->lock, flags);
+ 
+-      val = (unsigned long long)
+-              readl_relaxed(mvebu_pwmreg_blink_on_duration(mvpwm));
+-      val *= NSEC_PER_SEC;
++      u = readl_relaxed(mvebu_pwmreg_blink_on_duration(mvpwm));
++      val = (unsigned long long) u * NSEC_PER_SEC;
+       do_div(val, mvpwm->clk_rate);
+       if (val > UINT_MAX)
+               state->duty_cycle = UINT_MAX;
+@@ -671,21 +670,17 @@ static void mvebu_pwm_get_state(struct pwm_chip *chip,
+       else
+               state->duty_cycle = 1;
+ 
+-      val = (unsigned long long)
+-              readl_relaxed(mvebu_pwmreg_blink_off_duration(mvpwm));
++      val = (unsigned long long) u; /* on duration */
++      /* period = on + off duration */
++      val += readl_relaxed(mvebu_pwmreg_blink_off_duration(mvpwm));
+       val *= NSEC_PER_SEC;
+       do_div(val, mvpwm->clk_rate);
+-      if (val < state->duty_cycle) {
++      if (val > UINT_MAX)
++              state->period = UINT_MAX;
++      else if (val)
++              state->period = val;
++      else
+               state->period = 1;
+-      } else {
+-              val -= state->duty_cycle;
+-              if (val > UINT_MAX)
+-                      state->period = UINT_MAX;
+-              else if (val)
+-                      state->period = val;
+-              else
+-                      state->period = 1;
+-      }
+ 
+       regmap_read(mvchip->regs, GPIO_BLINK_EN_OFF + mvchip->offset, &u);
+       if (u)
+diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
+index 0743ef51d3b24..8429ebe7097e4 100644
+--- a/drivers/hid/hid-multitouch.c
++++ b/drivers/hid/hid-multitouch.c
+@@ -758,7 +758,8 @@ static int mt_touch_input_mapping(struct hid_device *hdev, 
struct hid_input *hi,
+                       MT_STORE_FIELD(inrange_state);
+                       return 1;
+               case HID_DG_CONFIDENCE:
+-                      if (cls->name == MT_CLS_WIN_8 &&
++                      if ((cls->name == MT_CLS_WIN_8 ||
++                           cls->name == MT_CLS_WIN_8_FORCE_MULTI_INPUT) &&
+                               (field->application == HID_DG_TOUCHPAD ||
+                                field->application == HID_DG_TOUCHSCREEN))
+                               app->quirks |= MT_QUIRK_CONFIDENCE;
+diff --git a/drivers/hid/wacom_sys.c b/drivers/hid/wacom_sys.c
+index 9e852b4bbf92b..73dafa60080f1 100644
+--- a/drivers/hid/wacom_sys.c
++++ b/drivers/hid/wacom_sys.c
+@@ -147,9 +147,9 @@ static int wacom_wac_pen_serial_enforce(struct hid_device 
*hdev,
+       }
+ 
+       if (flush)
+-              wacom_wac_queue_flush(hdev, &wacom_wac->pen_fifo);
++              wacom_wac_queue_flush(hdev, wacom_wac->pen_fifo);
+       else if (insert)
+-              wacom_wac_queue_insert(hdev, &wacom_wac->pen_fifo,
++              wacom_wac_queue_insert(hdev, wacom_wac->pen_fifo,
+                                      raw_data, report_size);
+ 
+       return insert && !flush;
+@@ -1280,7 +1280,7 @@ static void wacom_devm_kfifo_release(struct device *dev, 
void *res)
+ static int wacom_devm_kfifo_alloc(struct wacom *wacom)
+ {
+       struct wacom_wac *wacom_wac = &wacom->wacom_wac;
+-      struct kfifo_rec_ptr_2 *pen_fifo = &wacom_wac->pen_fifo;
++      struct kfifo_rec_ptr_2 *pen_fifo;
+       int error;
+ 
+       pen_fifo = devres_alloc(wacom_devm_kfifo_release,
+@@ -1297,6 +1297,7 @@ static int wacom_devm_kfifo_alloc(struct wacom *wacom)
+       }
+ 
+       devres_add(&wacom->hdev->dev, pen_fifo);
++      wacom_wac->pen_fifo = pen_fifo;
+ 
+       return 0;
+ }
+diff --git a/drivers/hid/wacom_wac.h b/drivers/hid/wacom_wac.h
+index da612b6e9c779..195910dd2154e 100644
+--- a/drivers/hid/wacom_wac.h
++++ b/drivers/hid/wacom_wac.h
+@@ -342,7 +342,7 @@ struct wacom_wac {
+       struct input_dev *pen_input;
+       struct input_dev *touch_input;
+       struct input_dev *pad_input;
+-      struct kfifo_rec_ptr_2 pen_fifo;
++      struct kfifo_rec_ptr_2 *pen_fifo;
+       int pid;
+       int num_contacts_left;
+       u8 bt_features;
+diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h 
b/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h
+index c142f5e7f25f8..de57f2fed7437 100644
+--- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h
++++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma.h
+@@ -509,6 +509,20 @@ static inline int ib_send_flags_to_pvrdma(int flags)
+       return flags & PVRDMA_MASK(PVRDMA_SEND_FLAGS_MAX);
+ }
+ 
++static inline int pvrdma_network_type_to_ib(enum pvrdma_network_type type)
++{
++      switch (type) {
++      case PVRDMA_NETWORK_ROCE_V1:
++              return RDMA_NETWORK_ROCE_V1;
++      case PVRDMA_NETWORK_IPV4:
++              return RDMA_NETWORK_IPV4;
++      case PVRDMA_NETWORK_IPV6:
++              return RDMA_NETWORK_IPV6;
++      default:
++              return RDMA_NETWORK_IPV6;
++      }
++}
++
+ void pvrdma_qp_cap_to_ib(struct ib_qp_cap *dst,
+                        const struct pvrdma_qp_cap *src);
+ void ib_qp_cap_to_pvrdma(struct pvrdma_qp_cap *dst,
+diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c 
b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c
+index 319546a39a0d5..62164db593a4f 100644
+--- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c
++++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_cq.c
+@@ -364,7 +364,7 @@ retry:
+       wc->dlid_path_bits = cqe->dlid_path_bits;
+       wc->port_num = cqe->port_num;
+       wc->vendor_err = cqe->vendor_err;
+-      wc->network_hdr_type = cqe->network_hdr_type;
++      wc->network_hdr_type = pvrdma_network_type_to_ib(cqe->network_hdr_type);
+ 
+       /* Update shared ring state */
+       pvrdma_idx_ring_inc(&cq->ring_state->rx.cons_head, cq->ibcq.cqe);
+diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c 
b/drivers/media/common/videobuf2/videobuf2-v4l2.c
+index 96d3b2b2aa318..3f61f5863bf77 100644
+--- a/drivers/media/common/videobuf2/videobuf2-v4l2.c
++++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c
+@@ -118,8 +118,7 @@ static int __verify_length(struct vb2_buffer *vb, const 
struct v4l2_buffer *b)
+                               return -EINVAL;
+               }
+       } else {
+-              length = (b->memory == VB2_MEMORY_USERPTR ||
+-                        b->memory == VB2_MEMORY_DMABUF)
++              length = (b->memory == VB2_MEMORY_USERPTR)
+                       ? b->length : vb->planes[0].length;
+ 
+               if (b->bytesused > length)
+diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c 
b/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c
+index 8fa1c22fd96db..fcad5cdcabfa4 100644
+--- a/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c
++++ b/drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c
+@@ -237,13 +237,6 @@ static int iwl_dbg_tlv_alloc_region(struct iwl_trans 
*trans,
+       if (le32_to_cpu(tlv->length) < sizeof(*reg))
+               return -EINVAL;
+ 
+-      /* For safe using a string from FW make sure we have a
+-       * null terminator
+-       */
+-      reg->name[IWL_FW_INI_MAX_NAME - 1] = 0;
+-
+-      IWL_DEBUG_FW(trans, "WRT: parsing region: %s\n", reg->name);
+-
+       if (id >= IWL_FW_INI_MAX_REGION_ID) {
+               IWL_ERR(trans, "WRT: Invalid region id %u\n", id);
+               return -EINVAL;
+diff --git a/fs/file.c b/fs/file.c
+index 4559b5fec3bd5..21c0893f2f1df 100644
+--- a/fs/file.c
++++ b/fs/file.c
+@@ -21,7 +21,6 @@
+ #include <linux/rcupdate.h>
+ #include <linux/close_range.h>
+ #include <net/sock.h>
+-#include <linux/io_uring.h>
+ 
+ unsigned int sysctl_nr_open __read_mostly = 1024*1024;
+ unsigned int sysctl_nr_open_min = BITS_PER_LONG;
+@@ -453,7 +452,6 @@ void exit_files(struct task_struct *tsk)
+       struct files_struct * files = tsk->files;
+ 
+       if (files) {
+-              io_uring_files_cancel(files);
+               task_lock(tsk);
+               tsk->files = NULL;
+               task_unlock(tsk);
+diff --git a/fs/io_uring.c b/fs/io_uring.c
+index 8cb0db187d90f..fd12d9327ee5b 100644
+--- a/fs/io_uring.c
++++ b/fs/io_uring.c
+@@ -260,6 +260,7 @@ struct io_ring_ctx {
+               unsigned int            drain_next: 1;
+               unsigned int            eventfd_async: 1;
+               unsigned int            restricted: 1;
++              unsigned int            sqo_dead: 1;
+ 
+               /*
+                * Ring buffer of indices into array of io_uring_sqe, which is
+@@ -970,6 +971,7 @@ static ssize_t io_import_iovec(int rw, struct io_kiocb 
*req,
+ static int io_setup_async_rw(struct io_kiocb *req, const struct iovec *iovec,
+                            const struct iovec *fast_iov,
+                            struct iov_iter *iter, bool force);
++static void io_req_drop_files(struct io_kiocb *req);
+ 
+ static struct kmem_cache *req_cachep;
+ 
+@@ -990,8 +992,7 @@ EXPORT_SYMBOL(io_uring_get_socket);
+ 
+ static inline void io_clean_op(struct io_kiocb *req)
+ {
+-      if (req->flags & (REQ_F_NEED_CLEANUP | REQ_F_BUFFER_SELECTED |
+-                        REQ_F_INFLIGHT))
++      if (req->flags & (REQ_F_NEED_CLEANUP | REQ_F_BUFFER_SELECTED))
+               __io_clean_op(req);
+ }
+ 
+@@ -1213,11 +1214,6 @@ static void __io_commit_cqring(struct io_ring_ctx *ctx)
+ 
+       /* order cqe stores with ring update */
+       smp_store_release(&rings->cq.tail, ctx->cached_cq_tail);
+-
+-      if (wq_has_sleeper(&ctx->cq_wait)) {
+-              wake_up_interruptible(&ctx->cq_wait);
+-              kill_fasync(&ctx->cq_fasync, SIGIO, POLL_IN);
+-      }
+ }
+ 
+ static void io_put_identity(struct io_uring_task *tctx, struct io_kiocb *req)
+@@ -1260,6 +1256,8 @@ static void io_req_clean_work(struct io_kiocb *req)
+                       free_fs_struct(fs);
+               req->work.flags &= ~IO_WQ_WORK_FS;
+       }
++      if (req->flags & REQ_F_INFLIGHT)
++              io_req_drop_files(req);
+ 
+       io_put_identity(req->task->io_uring, req);
+ }
+@@ -1603,6 +1601,10 @@ static inline bool io_should_trigger_evfd(struct 
io_ring_ctx *ctx)
+ 
+ static void io_cqring_ev_posted(struct io_ring_ctx *ctx)
+ {
++      if (wq_has_sleeper(&ctx->cq_wait)) {
++              wake_up_interruptible(&ctx->cq_wait);
++              kill_fasync(&ctx->cq_fasync, SIGIO, POLL_IN);
++      }
+       if (waitqueue_active(&ctx->wait))
+               wake_up(&ctx->wait);
+       if (ctx->sq_data && waitqueue_active(&ctx->sq_data->wait))
+@@ -2083,11 +2085,9 @@ static void io_req_task_cancel(struct callback_head *cb)
+ static void __io_req_task_submit(struct io_kiocb *req)
+ {
+       struct io_ring_ctx *ctx = req->ctx;
+-      bool fail;
+ 
+-      fail = __io_sq_thread_acquire_mm(ctx);
+       mutex_lock(&ctx->uring_lock);
+-      if (!fail)
++      if (!ctx->sqo_dead && !__io_sq_thread_acquire_mm(ctx))
+               __io_queue_sqe(req, NULL);
+       else
+               __io_req_task_cancel(req, -EFAULT);
+@@ -5962,9 +5962,6 @@ static void __io_clean_op(struct io_kiocb *req)
+               }
+               req->flags &= ~REQ_F_NEED_CLEANUP;
+       }
+-
+-      if (req->flags & REQ_F_INFLIGHT)
+-              io_req_drop_files(req);
+ }
+ 
+ static int io_issue_sqe(struct io_kiocb *req, bool force_nonblock,
+@@ -6796,7 +6793,7 @@ again:
+               to_submit = 8;
+ 
+       mutex_lock(&ctx->uring_lock);
+-      if (likely(!percpu_ref_is_dying(&ctx->refs)))
++      if (likely(!percpu_ref_is_dying(&ctx->refs) && !ctx->sqo_dead))
+               ret = io_submit_sqes(ctx, to_submit);
+       mutex_unlock(&ctx->uring_lock);
+ 
+@@ -8487,6 +8484,10 @@ static void io_ring_ctx_wait_and_kill(struct 
io_ring_ctx *ctx)
+       mutex_lock(&ctx->uring_lock);
+       percpu_ref_kill(&ctx->refs);
+       /* if force is set, the ring is going away. always drop after that */
++
++      if (WARN_ON_ONCE((ctx->flags & IORING_SETUP_SQPOLL) && !ctx->sqo_dead))
++              ctx->sqo_dead = 1;
++
+       ctx->cq_overflow_flushed = 1;
+       if (ctx->rings)
+               __io_cqring_overflow_flush(ctx, true, NULL, NULL);
+@@ -8698,6 +8699,8 @@ static bool io_uring_cancel_files(struct io_ring_ctx 
*ctx,
+                       break;
+               /* cancel this request, or head link requests */
+               io_attempt_cancel(ctx, cancel_req);
++              io_cqring_overflow_flush(ctx, true, task, files);
++
+               io_put_req(cancel_req);
+               /* cancellations _may_ trigger task work */
+               io_run_task_work();
+@@ -8745,6 +8748,17 @@ static bool __io_uring_cancel_task_requests(struct 
io_ring_ctx *ctx,
+       return ret;
+ }
+ 
++static void io_disable_sqo_submit(struct io_ring_ctx *ctx)
++{
++      mutex_lock(&ctx->uring_lock);
++      ctx->sqo_dead = 1;
++      mutex_unlock(&ctx->uring_lock);
++
++      /* make sure callers enter the ring to get error */
++      if (ctx->rings)
++              io_ring_set_wakeup_flag(ctx);
++}
++
+ /*
+  * We need to iteratively cancel requests, in case a request has dependent
+  * hard links. These persist even for failure of cancelations, hence keep
+@@ -8756,6 +8770,9 @@ static void io_uring_cancel_task_requests(struct 
io_ring_ctx *ctx,
+       struct task_struct *task = current;
+ 
+       if ((ctx->flags & IORING_SETUP_SQPOLL) && ctx->sq_data) {
++              /* for SQPOLL only sqo_task has task notes */
++              WARN_ON_ONCE(ctx->sqo_task != current);
++              io_disable_sqo_submit(ctx);
+               task = ctx->sq_data->thread;
+               atomic_inc(&task->io_uring->in_idle);
+               io_sq_thread_park(ctx->sq_data);
+@@ -8835,23 +8852,6 @@ static void io_uring_del_task_file(struct file *file)
+               fput(file);
+ }
+ 
+-/*
+- * Drop task note for this file if we're the only ones that hold it after
+- * pending fput()
+- */
+-static void io_uring_attempt_task_drop(struct file *file)
+-{
+-      if (!current->io_uring)
+-              return;
+-      /*
+-       * fput() is pending, will be 2 if the only other ref is our potential
+-       * task file note. If the task is exiting, drop regardless of count.
+-       */
+-      if (fatal_signal_pending(current) || (current->flags & PF_EXITING) ||
+-          atomic_long_read(&file->f_count) == 2)
+-              io_uring_del_task_file(file);
+-}
+-
+ static void io_uring_remove_task_files(struct io_uring_task *tctx)
+ {
+       struct file *file;
+@@ -8917,6 +8917,10 @@ void __io_uring_task_cancel(void)
+       /* make sure overflow events are dropped */
+       atomic_inc(&tctx->in_idle);
+ 
++      /* trigger io_disable_sqo_submit() */
++      if (tctx->sqpoll)
++              __io_uring_files_cancel(NULL);
++
+       do {
+               /* read completions before cancelations */
+               inflight = tctx_inflight(tctx);
+@@ -8943,7 +8947,36 @@ void __io_uring_task_cancel(void)
+ 
+ static int io_uring_flush(struct file *file, void *data)
+ {
+-      io_uring_attempt_task_drop(file);
++      struct io_uring_task *tctx = current->io_uring;
++      struct io_ring_ctx *ctx = file->private_data;
++
++      if (!tctx)
++              return 0;
++
++      /* we should have cancelled and erased it before PF_EXITING */
++      WARN_ON_ONCE((current->flags & PF_EXITING) &&
++                   xa_load(&tctx->xa, (unsigned long)file));
++
++      /*
++       * fput() is pending, will be 2 if the only other ref is our potential
++       * task file note. If the task is exiting, drop regardless of count.
++       */
++      if (atomic_long_read(&file->f_count) != 2)
++              return 0;
++
++      if (ctx->flags & IORING_SETUP_SQPOLL) {
++              /* there is only one file note, which is owned by sqo_task */
++              WARN_ON_ONCE(ctx->sqo_task != current &&
++                           xa_load(&tctx->xa, (unsigned long)file));
++              /* sqo_dead check is for when this happens after cancellation */
++              WARN_ON_ONCE(ctx->sqo_task == current && !ctx->sqo_dead &&
++                           !xa_load(&tctx->xa, (unsigned long)file));
++
++              io_disable_sqo_submit(ctx);
++      }
++
++      if (!(ctx->flags & IORING_SETUP_SQPOLL) || ctx->sqo_task == current)
++              io_uring_del_task_file(file);
+       return 0;
+ }
+ 
+@@ -9017,8 +9050,9 @@ static unsigned long 
io_uring_nommu_get_unmapped_area(struct file *file,
+ 
+ #endif /* !CONFIG_MMU */
+ 
+-static void io_sqpoll_wait_sq(struct io_ring_ctx *ctx)
++static int io_sqpoll_wait_sq(struct io_ring_ctx *ctx)
+ {
++      int ret = 0;
+       DEFINE_WAIT(wait);
+ 
+       do {
+@@ -9027,6 +9061,11 @@ static void io_sqpoll_wait_sq(struct io_ring_ctx *ctx)
+ 
+               prepare_to_wait(&ctx->sqo_sq_wait, &wait, TASK_INTERRUPTIBLE);
+ 
++              if (unlikely(ctx->sqo_dead)) {
++                      ret = -EOWNERDEAD;
++                      goto out;
++              }
++
+               if (!io_sqring_full(ctx))
+                       break;
+ 
+@@ -9034,6 +9073,8 @@ static void io_sqpoll_wait_sq(struct io_ring_ctx *ctx)
+       } while (!signal_pending(current));
+ 
+       finish_wait(&ctx->sqo_sq_wait, &wait);
++out:
++      return ret;
+ }
+ 
+ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, to_submit,
+@@ -9077,10 +9118,16 @@ SYSCALL_DEFINE6(io_uring_enter, unsigned int, fd, u32, 
to_submit,
+       if (ctx->flags & IORING_SETUP_SQPOLL) {
+               io_cqring_overflow_flush(ctx, false, NULL, NULL);
+ 
++              ret = -EOWNERDEAD;
++              if (unlikely(ctx->sqo_dead))
++                      goto out;
+               if (flags & IORING_ENTER_SQ_WAKEUP)
+                       wake_up(&ctx->sq_data->wait);
+-              if (flags & IORING_ENTER_SQ_WAIT)
+-                      io_sqpoll_wait_sq(ctx);
++              if (flags & IORING_ENTER_SQ_WAIT) {
++                      ret = io_sqpoll_wait_sq(ctx);
++                      if (ret)
++                              goto out;
++              }
+               submitted = to_submit;
+       } else if (to_submit) {
+               ret = io_uring_add_task_file(ctx, f.file);
+@@ -9491,6 +9538,7 @@ static int io_uring_create(unsigned entries, struct 
io_uring_params *p,
+        */
+       ret = io_uring_install_fd(ctx, file);
+       if (ret < 0) {
++              io_disable_sqo_submit(ctx);
+               /* fput will clean it up */
+               fput(file);
+               return ret;
+@@ -9499,6 +9547,7 @@ static int io_uring_create(unsigned entries, struct 
io_uring_params *p,
+       trace_io_uring_create(ret, ctx, p->sq_entries, p->cq_entries, p->flags);
+       return ret;
+ err:
++      io_disable_sqo_submit(ctx);
+       io_ring_ctx_wait_and_kill(ctx);
+       return ret;
+ }
+diff --git a/include/uapi/linux/v4l2-subdev.h 
b/include/uapi/linux/v4l2-subdev.h
+index 00850b98078a2..a38454d9e0f54 100644
+--- a/include/uapi/linux/v4l2-subdev.h
++++ b/include/uapi/linux/v4l2-subdev.h
+@@ -176,7 +176,7 @@ struct v4l2_subdev_capability {
+ };
+ 
+ /* The v4l2 sub-device video device node is registered in read-only mode. */
+-#define V4L2_SUBDEV_CAP_RO_SUBDEV             BIT(0)
++#define V4L2_SUBDEV_CAP_RO_SUBDEV             0x00000001
+ 
+ /* Backwards compatibility define --- to be removed */
+ #define v4l2_subdev_edid v4l2_edid
+diff --git a/include/uapi/rdma/vmw_pvrdma-abi.h 
b/include/uapi/rdma/vmw_pvrdma-abi.h
+index f8b638c73371d..901a4fd72c09f 100644
+--- a/include/uapi/rdma/vmw_pvrdma-abi.h
++++ b/include/uapi/rdma/vmw_pvrdma-abi.h
+@@ -133,6 +133,13 @@ enum pvrdma_wc_flags {
+       PVRDMA_WC_FLAGS_MAX             = PVRDMA_WC_WITH_NETWORK_HDR_TYPE,
+ };
+ 
++enum pvrdma_network_type {
++      PVRDMA_NETWORK_IB,
++      PVRDMA_NETWORK_ROCE_V1 = PVRDMA_NETWORK_IB,
++      PVRDMA_NETWORK_IPV4,
++      PVRDMA_NETWORK_IPV6
++};
++
+ struct pvrdma_alloc_ucontext_resp {
+       __u32 qp_tab_size;
+       __u32 reserved;
+diff --git a/kernel/exit.c b/kernel/exit.c
+index 1f236ed375f83..d13d67fc5f4e2 100644
+--- a/kernel/exit.c
++++ b/kernel/exit.c
+@@ -63,6 +63,7 @@
+ #include <linux/random.h>
+ #include <linux/rcuwait.h>
+ #include <linux/compat.h>
++#include <linux/io_uring.h>
+ 
+ #include <linux/uaccess.h>
+ #include <asm/unistd.h>
+@@ -762,6 +763,7 @@ void __noreturn do_exit(long code)
+               schedule();
+       }
+ 
++      io_uring_files_cancel(tsk->files);
+       exit_signals(tsk);  /* sets PF_EXITING */
+ 
+       /* sync mm's RSS info before statistics gathering */
+diff --git a/kernel/futex.c b/kernel/futex.c
+index 00259c7e288ee..0693b3ea0f9a4 100644
+--- a/kernel/futex.c
++++ b/kernel/futex.c
+@@ -765,6 +765,29 @@ static struct futex_pi_state *alloc_pi_state(void)
+       return pi_state;
+ }
+ 
++static void pi_state_update_owner(struct futex_pi_state *pi_state,
++                                struct task_struct *new_owner)
++{
++      struct task_struct *old_owner = pi_state->owner;
++
++      lockdep_assert_held(&pi_state->pi_mutex.wait_lock);
++
++      if (old_owner) {
++              raw_spin_lock(&old_owner->pi_lock);
++              WARN_ON(list_empty(&pi_state->list));
++              list_del_init(&pi_state->list);
++              raw_spin_unlock(&old_owner->pi_lock);
++      }
++
++      if (new_owner) {
++              raw_spin_lock(&new_owner->pi_lock);
++              WARN_ON(!list_empty(&pi_state->list));
++              list_add(&pi_state->list, &new_owner->pi_state_list);
++              pi_state->owner = new_owner;
++              raw_spin_unlock(&new_owner->pi_lock);
++      }
++}
++
+ static void get_pi_state(struct futex_pi_state *pi_state)
+ {
+       WARN_ON_ONCE(!refcount_inc_not_zero(&pi_state->refcount));
+@@ -787,17 +810,11 @@ static void put_pi_state(struct futex_pi_state *pi_state)
+        * and has cleaned up the pi_state already
+        */
+       if (pi_state->owner) {
+-              struct task_struct *owner;
+               unsigned long flags;
+ 
+               raw_spin_lock_irqsave(&pi_state->pi_mutex.wait_lock, flags);
+-              owner = pi_state->owner;
+-              if (owner) {
+-                      raw_spin_lock(&owner->pi_lock);
+-                      list_del_init(&pi_state->list);
+-                      raw_spin_unlock(&owner->pi_lock);
+-              }
+-              rt_mutex_proxy_unlock(&pi_state->pi_mutex, owner);
++              pi_state_update_owner(pi_state, NULL);
++              rt_mutex_proxy_unlock(&pi_state->pi_mutex);
+               raw_spin_unlock_irqrestore(&pi_state->pi_mutex.wait_lock, 
flags);
+       }
+ 
+@@ -943,7 +960,8 @@ static inline void exit_pi_state_list(struct task_struct 
*curr) { }
+  *    FUTEX_OWNER_DIED bit. See [4]
+  *
+  * [10] There is no transient state which leaves owner and user space
+- *    TID out of sync.
++ *    TID out of sync. Except one error case where the kernel is denied
++ *    write access to the user address, see fixup_pi_state_owner().
+  *
+  *
+  * Serialization and lifetime rules:
+@@ -1523,26 +1541,15 @@ static int wake_futex_pi(u32 __user *uaddr, u32 uval, 
struct futex_pi_state *pi_
+                       ret = -EINVAL;
+       }
+ 
+-      if (ret)
+-              goto out_unlock;
+-
+-      /*
+-       * This is a point of no return; once we modify the uval there is no
+-       * going back and subsequent operations must not fail.
+-       */
+-
+-      raw_spin_lock(&pi_state->owner->pi_lock);
+-      WARN_ON(list_empty(&pi_state->list));
+-      list_del_init(&pi_state->list);
+-      raw_spin_unlock(&pi_state->owner->pi_lock);
+-
+-      raw_spin_lock(&new_owner->pi_lock);
+-      WARN_ON(!list_empty(&pi_state->list));
+-      list_add(&pi_state->list, &new_owner->pi_state_list);
+-      pi_state->owner = new_owner;
+-      raw_spin_unlock(&new_owner->pi_lock);
+-
+-      postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, &wake_q);
++      if (!ret) {
++              /*
++               * This is a point of no return; once we modified the uval
++               * there is no going back and subsequent operations must
++               * not fail.
++               */
++              pi_state_update_owner(pi_state, new_owner);
++              postunlock = __rt_mutex_futex_unlock(&pi_state->pi_mutex, 
&wake_q);
++      }
+ 
+ out_unlock:
+       raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
+@@ -2325,18 +2332,13 @@ static void unqueue_me_pi(struct futex_q *q)
+       spin_unlock(q->lock_ptr);
+ }
+ 
+-static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
+-                              struct task_struct *argowner)
++static int __fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
++                                struct task_struct *argowner)
+ {
+       struct futex_pi_state *pi_state = q->pi_state;
+-      u32 uval, curval, newval;
+       struct task_struct *oldowner, *newowner;
+-      u32 newtid;
+-      int ret, err = 0;
+-
+-      lockdep_assert_held(q->lock_ptr);
+-
+-      raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
++      u32 uval, curval, newval, newtid;
++      int err = 0;
+ 
+       oldowner = pi_state->owner;
+ 
+@@ -2370,14 +2372,12 @@ retry:
+                        * We raced against a concurrent self; things are
+                        * already fixed up. Nothing to do.
+                        */
+-                      ret = 0;
+-                      goto out_unlock;
++                      return 0;
+               }
+ 
+               if (__rt_mutex_futex_trylock(&pi_state->pi_mutex)) {
+-                      /* We got the lock after all, nothing to fix. */
+-                      ret = 0;
+-                      goto out_unlock;
++                      /* We got the lock. pi_state is correct. Tell caller. */
++                      return 1;
+               }
+ 
+               /*
+@@ -2404,8 +2404,7 @@ retry:
+                        * We raced against a concurrent self; things are
+                        * already fixed up. Nothing to do.
+                        */
+-                      ret = 0;
+-                      goto out_unlock;
++                      return 1;
+               }
+               newowner = argowner;
+       }
+@@ -2435,22 +2434,9 @@ retry:
+        * We fixed up user space. Now we need to fix the pi_state
+        * itself.
+        */
+-      if (pi_state->owner != NULL) {
+-              raw_spin_lock(&pi_state->owner->pi_lock);
+-              WARN_ON(list_empty(&pi_state->list));
+-              list_del_init(&pi_state->list);
+-              raw_spin_unlock(&pi_state->owner->pi_lock);
+-      }
++      pi_state_update_owner(pi_state, newowner);
+ 
+-      pi_state->owner = newowner;
+-
+-      raw_spin_lock(&newowner->pi_lock);
+-      WARN_ON(!list_empty(&pi_state->list));
+-      list_add(&pi_state->list, &newowner->pi_state_list);
+-      raw_spin_unlock(&newowner->pi_lock);
+-      raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
+-
+-      return 0;
++      return argowner == current;
+ 
+       /*
+        * In order to reschedule or handle a page fault, we need to drop the
+@@ -2471,17 +2457,16 @@ handle_err:
+ 
+       switch (err) {
+       case -EFAULT:
+-              ret = fault_in_user_writeable(uaddr);
++              err = fault_in_user_writeable(uaddr);
+               break;
+ 
+       case -EAGAIN:
+               cond_resched();
+-              ret = 0;
++              err = 0;
+               break;
+ 
+       default:
+               WARN_ON_ONCE(1);
+-              ret = err;
+               break;
+       }
+ 
+@@ -2491,17 +2476,44 @@ handle_err:
+       /*
+        * Check if someone else fixed it for us:
+        */
+-      if (pi_state->owner != oldowner) {
+-              ret = 0;
+-              goto out_unlock;
+-      }
++      if (pi_state->owner != oldowner)
++              return argowner == current;
+ 
+-      if (ret)
+-              goto out_unlock;
++      /* Retry if err was -EAGAIN or the fault in succeeded */
++      if (!err)
++              goto retry;
+ 
+-      goto retry;
++      /*
++       * fault_in_user_writeable() failed so user state is immutable. At
++       * best we can make the kernel state consistent but user state will
++       * be most likely hosed and any subsequent unlock operation will be
++       * rejected due to PI futex rule [10].
++       *
++       * Ensure that the rtmutex owner is also the pi_state owner despite
++       * the user space value claiming something different. There is no
++       * point in unlocking the rtmutex if current is the owner as it
++       * would need to wait until the next waiter has taken the rtmutex
++       * to guarantee consistent state. Keep it simple. Userspace asked
++       * for this wreckaged state.
++       *
++       * The rtmutex has an owner - either current or some other
++       * task. See the EAGAIN loop above.
++       */
++      pi_state_update_owner(pi_state, rt_mutex_owner(&pi_state->pi_mutex));
+ 
+-out_unlock:
++      return err;
++}
++
++static int fixup_pi_state_owner(u32 __user *uaddr, struct futex_q *q,
++                              struct task_struct *argowner)
++{
++      struct futex_pi_state *pi_state = q->pi_state;
++      int ret;
++
++      lockdep_assert_held(q->lock_ptr);
++
++      raw_spin_lock_irq(&pi_state->pi_mutex.wait_lock);
++      ret = __fixup_pi_state_owner(uaddr, q, argowner);
+       raw_spin_unlock_irq(&pi_state->pi_mutex.wait_lock);
+       return ret;
+ }
+@@ -2525,8 +2537,6 @@ static long futex_wait_restart(struct restart_block 
*restart);
+  */
+ static int fixup_owner(u32 __user *uaddr, struct futex_q *q, int locked)
+ {
+-      int ret = 0;
+-
+       if (locked) {
+               /*
+                * Got the lock. We might not be the anticipated owner if we
+@@ -2537,8 +2547,8 @@ static int fixup_owner(u32 __user *uaddr, struct futex_q 
*q, int locked)
+                * stable state, anything else needs more attention.
+                */
+               if (q->pi_state->owner != current)
+-                      ret = fixup_pi_state_owner(uaddr, q, current);
+-              return ret ? ret : locked;
++                      return fixup_pi_state_owner(uaddr, q, current);
++              return 1;
+       }
+ 
+       /*
+@@ -2549,23 +2559,17 @@ static int fixup_owner(u32 __user *uaddr, struct 
futex_q *q, int locked)
+        * Another speculative read; pi_state->owner == current is unstable
+        * but needs our attention.
+        */
+-      if (q->pi_state->owner == current) {
+-              ret = fixup_pi_state_owner(uaddr, q, NULL);
+-              return ret;
+-      }
++      if (q->pi_state->owner == current)
++              return fixup_pi_state_owner(uaddr, q, NULL);
+ 
+       /*
+        * Paranoia check. If we did not take the lock, then we should not be
+-       * the owner of the rt_mutex.
++       * the owner of the rt_mutex. Warn and establish consistent state.
+        */
+-      if (rt_mutex_owner(&q->pi_state->pi_mutex) == current) {
+-              printk(KERN_ERR "fixup_owner: ret = %d pi-mutex: %p "
+-                              "pi-state %p\n", ret,
+-                              q->pi_state->pi_mutex.owner,
+-                              q->pi_state->owner);
+-      }
++      if (WARN_ON_ONCE(rt_mutex_owner(&q->pi_state->pi_mutex) == current))
++              return fixup_pi_state_owner(uaddr, q, current);
+ 
+-      return ret;
++      return 0;
+ }
+ 
+ /**
+@@ -2773,7 +2777,6 @@ static int futex_lock_pi(u32 __user *uaddr, unsigned int 
flags,
+                        ktime_t *time, int trylock)
+ {
+       struct hrtimer_sleeper timeout, *to;
+-      struct futex_pi_state *pi_state = NULL;
+       struct task_struct *exiting = NULL;
+       struct rt_mutex_waiter rt_waiter;
+       struct futex_hash_bucket *hb;
+@@ -2909,23 +2912,8 @@ no_block:
+       if (res)
+               ret = (res < 0) ? res : 0;
+ 
+-      /*
+-       * If fixup_owner() faulted and was unable to handle the fault, unlock
+-       * it and return the fault to userspace.
+-       */
+-      if (ret && (rt_mutex_owner(&q.pi_state->pi_mutex) == current)) {
+-              pi_state = q.pi_state;
+-              get_pi_state(pi_state);
+-      }
+-
+       /* Unqueue and drop the lock */
+       unqueue_me_pi(&q);
+-
+-      if (pi_state) {
+-              rt_mutex_futex_unlock(&pi_state->pi_mutex);
+-              put_pi_state(pi_state);
+-      }
+-
+       goto out;
+ 
+ out_unlock_put_key:
+@@ -3185,7 +3173,6 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, 
unsigned int flags,
+                                u32 __user *uaddr2)
+ {
+       struct hrtimer_sleeper timeout, *to;
+-      struct futex_pi_state *pi_state = NULL;
+       struct rt_mutex_waiter rt_waiter;
+       struct futex_hash_bucket *hb;
+       union futex_key key2 = FUTEX_KEY_INIT;
+@@ -3263,16 +3250,17 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, 
unsigned int flags,
+               if (q.pi_state && (q.pi_state->owner != current)) {
+                       spin_lock(q.lock_ptr);
+                       ret = fixup_pi_state_owner(uaddr2, &q, current);
+-                      if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == 
current) {
+-                              pi_state = q.pi_state;
+-                              get_pi_state(pi_state);
+-                      }
+                       /*
+                        * Drop the reference to the pi state which
+                        * the requeue_pi() code acquired for us.
+                        */
+                       put_pi_state(q.pi_state);
+                       spin_unlock(q.lock_ptr);
++                      /*
++                       * Adjust the return value. It's either -EFAULT or
++                       * success (1) but the caller expects 0 for success.
++                       */
++                      ret = ret < 0 ? ret : 0;
+               }
+       } else {
+               struct rt_mutex *pi_mutex;
+@@ -3303,25 +3291,10 @@ static int futex_wait_requeue_pi(u32 __user *uaddr, 
unsigned int flags,
+               if (res)
+                       ret = (res < 0) ? res : 0;
+ 
+-              /*
+-               * If fixup_pi_state_owner() faulted and was unable to handle
+-               * the fault, unlock the rt_mutex and return the fault to
+-               * userspace.
+-               */
+-              if (ret && rt_mutex_owner(&q.pi_state->pi_mutex) == current) {
+-                      pi_state = q.pi_state;
+-                      get_pi_state(pi_state);
+-              }
+-
+               /* Unqueue and drop the lock. */
+               unqueue_me_pi(&q);
+       }
+ 
+-      if (pi_state) {
+-              rt_mutex_futex_unlock(&pi_state->pi_mutex);
+-              put_pi_state(pi_state);
+-      }
+-
+       if (ret == -EINTR) {
+               /*
+                * We've already been requeued, but cannot restart by calling
+diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c
+index cfdd5b93264d7..2f8cd616d3b29 100644
+--- a/kernel/locking/rtmutex.c
++++ b/kernel/locking/rtmutex.c
+@@ -1716,8 +1716,7 @@ void rt_mutex_init_proxy_locked(struct rt_mutex *lock,
+  * possible because it belongs to the pi_state which is about to be freed
+  * and it is not longer visible to other tasks.
+  */
+-void rt_mutex_proxy_unlock(struct rt_mutex *lock,
+-                         struct task_struct *proxy_owner)
++void rt_mutex_proxy_unlock(struct rt_mutex *lock)
+ {
+       debug_rt_mutex_proxy_unlock(lock);
+       rt_mutex_set_owner(lock, NULL);
+diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h
+index d1d62f942be22..ca6fb489007b6 100644
+--- a/kernel/locking/rtmutex_common.h
++++ b/kernel/locking/rtmutex_common.h
+@@ -133,8 +133,7 @@ enum rtmutex_chainwalk {
+ extern struct task_struct *rt_mutex_next_owner(struct rt_mutex *lock);
+ extern void rt_mutex_init_proxy_locked(struct rt_mutex *lock,
+                                      struct task_struct *proxy_owner);
+-extern void rt_mutex_proxy_unlock(struct rt_mutex *lock,
+-                                struct task_struct *proxy_owner);
++extern void rt_mutex_proxy_unlock(struct rt_mutex *lock);
+ extern void rt_mutex_init_waiter(struct rt_mutex_waiter *waiter);
+ extern int __rt_mutex_start_proxy_lock(struct rt_mutex *lock,
+                                    struct rt_mutex_waiter *waiter,
+diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
+index 801f8bc52b34f..aafec8cb8637d 100644
+--- a/kernel/printk/printk.c
++++ b/kernel/printk/printk.c
+@@ -1338,11 +1338,16 @@ static size_t info_print_prefix(const struct 
printk_info  *info, bool syslog,
+  * done:
+  *
+  *   - Add prefix for each line.
++ *   - Drop truncated lines that no longer fit into the buffer.
+  *   - Add the trailing newline that has been removed in vprintk_store().
+- *   - Drop truncated lines that do not longer fit into the buffer.
++ *   - Add a string terminator.
++ *
++ * Since the produced string is always terminated, the maximum possible
++ * return value is @r->text_buf_size - 1;
+  *
+  * Return: The length of the updated/prepared text, including the added
+- * prefixes and the newline. The dropped line(s) are not counted.
++ * prefixes and the newline. The terminator is not counted. The dropped
++ * line(s) are not counted.
+  */
+ static size_t record_print_text(struct printk_record *r, bool syslog,
+                               bool time)
+@@ -1385,26 +1390,31 @@ static size_t record_print_text(struct printk_record 
*r, bool syslog,
+ 
+               /*
+                * Truncate the text if there is not enough space to add the
+-               * prefix and a trailing newline.
++               * prefix and a trailing newline and a terminator.
+                */
+-              if (len + prefix_len + text_len + 1 > buf_size) {
++              if (len + prefix_len + text_len + 1 + 1 > buf_size) {
+                       /* Drop even the current line if no space. */
+-                      if (len + prefix_len + line_len + 1 > buf_size)
++                      if (len + prefix_len + line_len + 1 + 1 > buf_size)
+                               break;
+ 
+-                      text_len = buf_size - len - prefix_len - 1;
++                      text_len = buf_size - len - prefix_len - 1 - 1;
+                       truncated = true;
+               }
+ 
+               memmove(text + prefix_len, text, text_len);
+               memcpy(text, prefix, prefix_len);
+ 
++              /*
++               * Increment the prepared length to include the text and
++               * prefix that were just moved+copied. Also increment for the
++               * newline at the end of this line. If this is the last line,
++               * there is no newline, but it will be added immediately below.
++               */
+               len += prefix_len + line_len + 1;
+-
+               if (text_len == line_len) {
+                       /*
+-                       * Add the trailing newline removed in
+-                       * vprintk_store().
++                       * This is the last line. Add the trailing newline
++                       * removed in vprintk_store().
+                        */
+                       text[prefix_len + line_len] = '\n';
+                       break;
+@@ -1429,6 +1439,14 @@ static size_t record_print_text(struct printk_record 
*r, bool syslog,
+               text_len -= line_len + 1;
+       }
+ 
++      /*
++       * If a buffer was provided, it will be terminated. Space for the
++       * string terminator is guaranteed to be available. The terminator is
++       * not counted in the return value.
++       */
++      if (buf_size > 0)
++              r->text_buf[len] = 0;
++
+       return len;
+ }
+ 
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index 14b9e83ff9da2..88639706ae177 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -2846,20 +2846,20 @@ __rmqueue(struct zone *zone, unsigned int order, int 
migratetype,
+ {
+       struct page *page;
+ 
+-#ifdef CONFIG_CMA
+-      /*
+-       * Balance movable allocations between regular and CMA areas by
+-       * allocating from CMA when over half of the zone's free memory
+-       * is in the CMA area.
+-       */
+-      if (alloc_flags & ALLOC_CMA &&
+-          zone_page_state(zone, NR_FREE_CMA_PAGES) >
+-          zone_page_state(zone, NR_FREE_PAGES) / 2) {
+-              page = __rmqueue_cma_fallback(zone, order);
+-              if (page)
+-                      return page;
++      if (IS_ENABLED(CONFIG_CMA)) {
++              /*
++               * Balance movable allocations between regular and CMA areas by
++               * allocating from CMA when over half of the zone's free memory
++               * is in the CMA area.
++               */
++              if (alloc_flags & ALLOC_CMA &&
++                  zone_page_state(zone, NR_FREE_CMA_PAGES) >
++                  zone_page_state(zone, NR_FREE_PAGES) / 2) {
++                      page = __rmqueue_cma_fallback(zone, order);
++                      if (page)
++                              goto out;
++              }
+       }
+-#endif
+ retry:
+       page = __rmqueue_smallest(zone, order, migratetype);
+       if (unlikely(!page)) {
+@@ -2870,8 +2870,9 @@ retry:
+                                                               alloc_flags))
+                       goto retry;
+       }
+-
+-      trace_mm_page_alloc_zone_locked(page, order, migratetype);
++out:
++      if (page)
++              trace_mm_page_alloc_zone_locked(page, order, migratetype);
+       return page;
+ }
+ 
+diff --git a/mm/slub.c b/mm/slub.c
+index 3f4303f4b657d..071e41067ea67 100644
+--- a/mm/slub.c
++++ b/mm/slub.c
+@@ -5620,10 +5620,8 @@ static int sysfs_slab_add(struct kmem_cache *s)
+ 
+       s->kobj.kset = kset;
+       err = kobject_init_and_add(&s->kobj, &slab_ktype, NULL, "%s", name);
+-      if (err) {
+-              kobject_put(&s->kobj);
++      if (err)
+               goto out;
+-      }
+ 
+       err = sysfs_create_group(&s->kobj, &slab_attr_group);
+       if (err)
+diff --git a/mm/swapfile.c b/mm/swapfile.c
+index d58361109066d..16db9d1ebcbf3 100644
+--- a/mm/swapfile.c
++++ b/mm/swapfile.c
+@@ -1045,16 +1045,18 @@ int get_swap_pages(int n_goal, swp_entry_t 
swp_entries[], int entry_size)
+       /* Only single cluster request supported */
+       WARN_ON_ONCE(n_goal > 1 && size == SWAPFILE_CLUSTER);
+ 
++      spin_lock(&swap_avail_lock);
++
+       avail_pgs = atomic_long_read(&nr_swap_pages) / size;
+-      if (avail_pgs <= 0)
++      if (avail_pgs <= 0) {
++              spin_unlock(&swap_avail_lock);
+               goto noswap;
++      }
+ 
+       n_goal = min3((long)n_goal, (long)SWAP_BATCH, avail_pgs);
+ 
+       atomic_long_sub(n_goal * size, &nr_swap_pages);
+ 
+-      spin_lock(&swap_avail_lock);
+-
+ start_over:
+       node = numa_node_id();
+       plist_for_each_entry_safe(si, next, &swap_avail_heads[node], 
avail_lists[node]) {
+@@ -1128,14 +1130,13 @@ swp_entry_t get_swap_page_of_type(int type)
+ 
+       spin_lock(&si->lock);
+       if (si->flags & SWP_WRITEOK) {
+-              atomic_long_dec(&nr_swap_pages);
+               /* This is called for allocating swap entry, not cache */
+               offset = scan_swap_map(si, 1);
+               if (offset) {
++                      atomic_long_dec(&nr_swap_pages);
+                       spin_unlock(&si->lock);
+                       return swp_entry(type, offset);
+               }
+-              atomic_long_inc(&nr_swap_pages);
+       }
+       spin_unlock(&si->lock);
+ fail:
+diff --git a/tools/bpf/resolve_btfids/Makefile 
b/tools/bpf/resolve_btfids/Makefile
+index 66cb92136de4a..bf656432ad736 100644
+--- a/tools/bpf/resolve_btfids/Makefile
++++ b/tools/bpf/resolve_btfids/Makefile
+@@ -18,15 +18,6 @@ else
+ endif
+ 
+ # always use the host compiler
+-ifneq ($(LLVM),)
+-HOSTAR  ?= llvm-ar
+-HOSTCC  ?= clang
+-HOSTLD  ?= ld.lld
+-else
+-HOSTAR  ?= ar
+-HOSTCC  ?= gcc
+-HOSTLD  ?= ld
+-endif
+ AR       = $(HOSTAR)
+ CC       = $(HOSTCC)
+ LD       = $(HOSTLD)
+diff --git a/tools/build/Makefile b/tools/build/Makefile
+index 722f1700d96a8..bae48e6fa9952 100644
+--- a/tools/build/Makefile
++++ b/tools/build/Makefile
+@@ -15,10 +15,6 @@ endef
+ $(call allow-override,CC,$(CROSS_COMPILE)gcc)
+ $(call allow-override,LD,$(CROSS_COMPILE)ld)
+ 
+-HOSTCC ?= gcc
+-HOSTLD ?= ld
+-HOSTAR ?= ar
+-
+ export HOSTCC HOSTLD HOSTAR
+ 
+ ifeq ($(V),1)
+diff --git a/tools/objtool/Makefile b/tools/objtool/Makefile
+index 4ea9a833dde7a..5cdb19036d7f7 100644
+--- a/tools/objtool/Makefile
++++ b/tools/objtool/Makefile
+@@ -3,15 +3,6 @@ include ../scripts/Makefile.include
+ include ../scripts/Makefile.arch
+ 
+ # always use the host compiler
+-ifneq ($(LLVM),)
+-HOSTAR        ?= llvm-ar
+-HOSTCC        ?= clang
+-HOSTLD        ?= ld.lld
+-else
+-HOSTAR        ?= ar
+-HOSTCC        ?= gcc
+-HOSTLD        ?= ld
+-endif
+ AR     = $(HOSTAR)
+ CC     = $(HOSTCC)
+ LD     = $(HOSTLD)
+diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
+index 4e1d7460574b4..9452cfb01ef19 100644
+--- a/tools/objtool/elf.c
++++ b/tools/objtool/elf.c
+@@ -354,8 +354,11 @@ static int read_symbols(struct elf *elf)
+ 
+       symtab = find_section_by_name(elf, ".symtab");
+       if (!symtab) {
+-              WARN("missing symbol table");
+-              return -1;
++              /*
++               * A missing symbol table is actually possible if it's an empty
++               * .o file.  This can happen for thunk_64.o.
++               */
++              return 0;
+       }
+ 
+       symtab_shndx = find_section_by_name(elf, ".symtab_shndx");
+diff --git a/tools/perf/Makefile.perf b/tools/perf/Makefile.perf
+index 7ce3f2e8b9c74..62f3deb1d3a8b 100644
+--- a/tools/perf/Makefile.perf
++++ b/tools/perf/Makefile.perf
+@@ -175,10 +175,6 @@ endef
+ 
+ LD += $(EXTRA_LDFLAGS)
+ 
+-HOSTCC  ?= gcc
+-HOSTLD  ?= ld
+-HOSTAR  ?= ar
+-
+ PKG_CONFIG = $(CROSS_COMPILE)pkg-config
+ LLVM_CONFIG ?= llvm-config
+ 
+diff --git a/tools/power/acpi/Makefile.config 
b/tools/power/acpi/Makefile.config
+index 54a2857c2510a..331f6d30f4726 100644
+--- a/tools/power/acpi/Makefile.config
++++ b/tools/power/acpi/Makefile.config
+@@ -54,7 +54,6 @@ INSTALL_SCRIPT = ${INSTALL_PROGRAM}
+ CROSS = #/usr/i386-linux-uclibc/usr/bin/i386-uclibc-
+ CROSS_COMPILE ?= $(CROSS)
+ LD = $(CC)
+-HOSTCC = gcc
+ 
+ # check if compiler option is supported
+ cc-supports = ${shell if $(CC) ${1} -S -o /dev/null -x c /dev/null > 
/dev/null 2>&1; then echo "$(1)"; fi;}
+diff --git a/tools/scripts/Makefile.include b/tools/scripts/Makefile.include
+index a7974638561ca..1358e89cdf7d6 100644
+--- a/tools/scripts/Makefile.include
++++ b/tools/scripts/Makefile.include
+@@ -59,6 +59,16 @@ $(call allow-override,LD,$(CROSS_COMPILE)ld)
+ $(call allow-override,CXX,$(CROSS_COMPILE)g++)
+ $(call allow-override,STRIP,$(CROSS_COMPILE)strip)
+ 
++ifneq ($(LLVM),)
++HOSTAR  ?= llvm-ar
++HOSTCC  ?= clang
++HOSTLD  ?= ld.lld
++else
++HOSTAR  ?= ar
++HOSTCC  ?= gcc
++HOSTLD  ?= ld
++endif
++
+ ifeq ($(CC_NO_CLANG), 1)
+ EXTRA_WARNINGS += -Wstrict-aliasing=3
+ endif

Reply via email to