commit:     2ed27787412a1a1c669988e5b36261fac46988c4
Author:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
AuthorDate: Tue Feb 23 14:27:11 2021 +0000
Commit:     Alice Ferrazzi <alicef <AT> gentoo <DOT> org>
CommitDate: Tue Feb 23 14:28:13 2021 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=2ed27787

Linux patch 5.4.100

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

 0000_README              |   4 +
 1099_linux-5.4.100.patch | 403 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 407 insertions(+)

diff --git a/0000_README b/0000_README
index 3e20dc5..d459040 100644
--- a/0000_README
+++ b/0000_README
@@ -439,6 +439,10 @@ Patch:  1098_linux-5.4.99.patch
 From:   http://www.kernel.org
 Desc:   Linux 5.4.99
 
+Patch:  1099_linux-5.4.100.patch
+From:   http://www.kernel.org
+Desc:   Linux 5.4.100
+
 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/1099_linux-5.4.100.patch b/1099_linux-5.4.100.patch
new file mode 100644
index 0000000..66ef005
--- /dev/null
+++ b/1099_linux-5.4.100.patch
@@ -0,0 +1,403 @@
+diff --git a/Makefile b/Makefile
+index a0491ba1d7593..d0d4beb4f8373 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 5
+ PATCHLEVEL = 4
+-SUBLEVEL = 99
++SUBLEVEL = 100
+ EXTRAVERSION =
+ NAME = Kleptomaniac Octopus
+ 
+diff --git a/arch/arm/xen/p2m.c b/arch/arm/xen/p2m.c
+index e52950a43f2ed..fd6e3aafe2724 100644
+--- a/arch/arm/xen/p2m.c
++++ b/arch/arm/xen/p2m.c
+@@ -95,8 +95,10 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref 
*map_ops,
+       for (i = 0; i < count; i++) {
+               if (map_ops[i].status)
+                       continue;
+-              set_phys_to_machine(map_ops[i].host_addr >> XEN_PAGE_SHIFT,
+-                                  map_ops[i].dev_bus_addr >> XEN_PAGE_SHIFT);
++              if (unlikely(!set_phys_to_machine(map_ops[i].host_addr >> 
XEN_PAGE_SHIFT,
++                                  map_ops[i].dev_bus_addr >> 
XEN_PAGE_SHIFT))) {
++                      return -ENOMEM;
++              }
+       }
+ 
+       return 0;
+diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
+index 296b0d7570d06..1da558f28aa57 100644
+--- a/arch/x86/kvm/svm.c
++++ b/arch/x86/kvm/svm.c
+@@ -7104,7 +7104,6 @@ static int svm_register_enc_region(struct kvm *kvm,
+       region->uaddr = range->addr;
+       region->size = range->size;
+ 
+-      mutex_lock(&kvm->lock);
+       list_add_tail(&region->list, &sev->regions_list);
+       mutex_unlock(&kvm->lock);
+ 
+diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c
+index 0acba2c712ab8..7fe5be8e6d3db 100644
+--- a/arch/x86/xen/p2m.c
++++ b/arch/x86/xen/p2m.c
+@@ -716,7 +716,8 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref 
*map_ops,
+               unsigned long mfn, pfn;
+ 
+               /* Do not add to override if the map failed. */
+-              if (map_ops[i].status)
++              if (map_ops[i].status != GNTST_okay ||
++                  (kmap_ops && kmap_ops[i].status != GNTST_okay))
+                       continue;
+ 
+               if (map_ops[i].flags & GNTMAP_contains_pte) {
+@@ -754,17 +755,15 @@ int clear_foreign_p2m_mapping(struct 
gnttab_unmap_grant_ref *unmap_ops,
+               unsigned long mfn = __pfn_to_mfn(page_to_pfn(pages[i]));
+               unsigned long pfn = page_to_pfn(pages[i]);
+ 
+-              if (mfn == INVALID_P2M_ENTRY || !(mfn & FOREIGN_FRAME_BIT)) {
++              if (mfn != INVALID_P2M_ENTRY && (mfn & FOREIGN_FRAME_BIT))
++                      set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
++              else
+                       ret = -EINVAL;
+-                      goto out;
+-              }
+-
+-              set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
+       }
+       if (kunmap_ops)
+               ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
+-                                              kunmap_ops, count);
+-out:
++                                              kunmap_ops, count) ?: ret;
++
+       return ret;
+ }
+ EXPORT_SYMBOL_GPL(clear_foreign_p2m_mapping);
+diff --git a/drivers/block/xen-blkback/blkback.c 
b/drivers/block/xen-blkback/blkback.c
+index b18f0162cb9c4..208f3eea3641f 100644
+--- a/drivers/block/xen-blkback/blkback.c
++++ b/drivers/block/xen-blkback/blkback.c
+@@ -850,8 +850,11 @@ again:
+                       pages[i]->page = persistent_gnt->page;
+                       pages[i]->persistent_gnt = persistent_gnt;
+               } else {
+-                      if (get_free_page(ring, &pages[i]->page))
+-                              goto out_of_memory;
++                      if (get_free_page(ring, &pages[i]->page)) {
++                              put_free_pages(ring, pages_to_gnt, segs_to_map);
++                              ret = -ENOMEM;
++                              goto out;
++                      }
+                       addr = vaddr(pages[i]->page);
+                       pages_to_gnt[segs_to_map] = pages[i]->page;
+                       pages[i]->persistent_gnt = NULL;
+@@ -867,10 +870,8 @@ again:
+                       break;
+       }
+ 
+-      if (segs_to_map) {
++      if (segs_to_map)
+               ret = gnttab_map_refs(map, NULL, pages_to_gnt, segs_to_map);
+-              BUG_ON(ret);
+-      }
+ 
+       /*
+        * Now swizzle the MFN in our domain with the MFN from the other domain
+@@ -885,7 +886,7 @@ again:
+                               pr_debug("invalid buffer -- could not remap 
it\n");
+                               put_free_pages(ring, &pages[seg_idx]->page, 1);
+                               pages[seg_idx]->handle = BLKBACK_INVALID_HANDLE;
+-                              ret |= 1;
++                              ret |= !ret;
+                               goto next;
+                       }
+                       pages[seg_idx]->handle = map[new_map_idx].handle;
+@@ -937,17 +938,18 @@ next:
+       }
+       segs_to_map = 0;
+       last_map = map_until;
+-      if (map_until != num)
++      if (!ret && map_until != num)
+               goto again;
+ 
+-      return ret;
+-
+-out_of_memory:
+-      pr_alert("%s: out of memory\n", __func__);
+-      put_free_pages(ring, pages_to_gnt, segs_to_map);
+-      for (i = last_map; i < num; i++)
++out:
++      for (i = last_map; i < num; i++) {
++              /* Don't zap current batch's valid persistent grants. */
++              if(i >= last_map + segs_to_map)
++                      pages[i]->persistent_gnt = NULL;
+               pages[i]->handle = BLKBACK_INVALID_HANDLE;
+-      return -ENOMEM;
++      }
++
++      return ret;
+ }
+ 
+ static int xen_blkbk_map_seg(struct pending_req *pending_req)
+diff --git a/drivers/media/usb/pwc/pwc-if.c b/drivers/media/usb/pwc/pwc-if.c
+index 9b76cf133d524..3df7ca2357da8 100644
+--- a/drivers/media/usb/pwc/pwc-if.c
++++ b/drivers/media/usb/pwc/pwc-if.c
+@@ -147,16 +147,17 @@ static const struct video_device pwc_template = {
+ /***************************************************************************/
+ /* Private functions */
+ 
+-static void *pwc_alloc_urb_buffer(struct device *dev,
++static void *pwc_alloc_urb_buffer(struct usb_device *dev,
+                                 size_t size, dma_addr_t *dma_handle)
+ {
++      struct device *dmadev = dev->bus->sysdev;
+       void *buffer = kmalloc(size, GFP_KERNEL);
+ 
+       if (!buffer)
+               return NULL;
+ 
+-      *dma_handle = dma_map_single(dev, buffer, size, DMA_FROM_DEVICE);
+-      if (dma_mapping_error(dev, *dma_handle)) {
++      *dma_handle = dma_map_single(dmadev, buffer, size, DMA_FROM_DEVICE);
++      if (dma_mapping_error(dmadev, *dma_handle)) {
+               kfree(buffer);
+               return NULL;
+       }
+@@ -164,12 +165,14 @@ static void *pwc_alloc_urb_buffer(struct device *dev,
+       return buffer;
+ }
+ 
+-static void pwc_free_urb_buffer(struct device *dev,
++static void pwc_free_urb_buffer(struct usb_device *dev,
+                               size_t size,
+                               void *buffer,
+                               dma_addr_t dma_handle)
+ {
+-      dma_unmap_single(dev, dma_handle, size, DMA_FROM_DEVICE);
++      struct device *dmadev = dev->bus->sysdev;
++
++      dma_unmap_single(dmadev, dma_handle, size, DMA_FROM_DEVICE);
+       kfree(buffer);
+ }
+ 
+@@ -274,6 +277,7 @@ static void pwc_frame_complete(struct pwc_device *pdev)
+ static void pwc_isoc_handler(struct urb *urb)
+ {
+       struct pwc_device *pdev = (struct pwc_device *)urb->context;
++      struct device *dmadev = urb->dev->bus->sysdev;
+       int i, fst, flen;
+       unsigned char *iso_buf = NULL;
+ 
+@@ -320,7 +324,7 @@ static void pwc_isoc_handler(struct urb *urb)
+       /* Reset ISOC error counter. We did get here, after all. */
+       pdev->visoc_errors = 0;
+ 
+-      dma_sync_single_for_cpu(&urb->dev->dev,
++      dma_sync_single_for_cpu(dmadev,
+                               urb->transfer_dma,
+                               urb->transfer_buffer_length,
+                               DMA_FROM_DEVICE);
+@@ -371,7 +375,7 @@ static void pwc_isoc_handler(struct urb *urb)
+               pdev->vlast_packet_size = flen;
+       }
+ 
+-      dma_sync_single_for_device(&urb->dev->dev,
++      dma_sync_single_for_device(dmadev,
+                                  urb->transfer_dma,
+                                  urb->transfer_buffer_length,
+                                  DMA_FROM_DEVICE);
+@@ -453,7 +457,7 @@ retry:
+               urb->pipe = usb_rcvisocpipe(udev, pdev->vendpoint);
+               urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
+               urb->transfer_buffer_length = ISO_BUFFER_SIZE;
+-              urb->transfer_buffer = pwc_alloc_urb_buffer(&udev->dev,
++              urb->transfer_buffer = pwc_alloc_urb_buffer(udev,
+                                                           
urb->transfer_buffer_length,
+                                                           &urb->transfer_dma);
+               if (urb->transfer_buffer == NULL) {
+@@ -516,7 +520,7 @@ static void pwc_iso_free(struct pwc_device *pdev)
+               if (urb) {
+                       PWC_DEBUG_MEMORY("Freeing URB\n");
+                       if (urb->transfer_buffer)
+-                              pwc_free_urb_buffer(&urb->dev->dev,
++                              pwc_free_urb_buffer(urb->dev,
+                                                   urb->transfer_buffer_length,
+                                                   urb->transfer_buffer,
+                                                   urb->transfer_dma);
+diff --git a/drivers/net/xen-netback/netback.c 
b/drivers/net/xen-netback/netback.c
+index fa1ac0abc924b..4bfafcd6317f4 100644
+--- a/drivers/net/xen-netback/netback.c
++++ b/drivers/net/xen-netback/netback.c
+@@ -1335,13 +1335,11 @@ int xenvif_tx_action(struct xenvif_queue *queue, int 
budget)
+               return 0;
+ 
+       gnttab_batch_copy(queue->tx_copy_ops, nr_cops);
+-      if (nr_mops != 0) {
++      if (nr_mops != 0)
+               ret = gnttab_map_refs(queue->tx_map_ops,
+                                     NULL,
+                                     queue->pages_to_map,
+                                     nr_mops);
+-              BUG_ON(ret);
+-      }
+ 
+       work_done = xenvif_tx_submit(queue);
+ 
+diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c
+index 246864bbb3e4e..e953ea34b3e43 100644
+--- a/drivers/xen/gntdev.c
++++ b/drivers/xen/gntdev.c
+@@ -319,44 +319,47 @@ int gntdev_map_grant_pages(struct gntdev_grant_map *map)
+                * to the kernel linear addresses of the struct pages.
+                * These ptes are completely different from the user ptes dealt
+                * with find_grant_ptes.
++               * Note that GNTMAP_device_map isn't needed here: The
++               * dev_bus_addr output field gets consumed only from ->map_ops,
++               * and by not requesting it when mapping we also avoid needing
++               * to mirror dev_bus_addr into ->unmap_ops (and holding an extra
++               * reference to the page in the hypervisor).
+                */
++              unsigned int flags = (map->flags & ~GNTMAP_device_map) |
++                                   GNTMAP_host_map;
++
+               for (i = 0; i < map->count; i++) {
+                       unsigned long address = (unsigned long)
+                               pfn_to_kaddr(page_to_pfn(map->pages[i]));
+                       BUG_ON(PageHighMem(map->pages[i]));
+ 
+-                      gnttab_set_map_op(&map->kmap_ops[i], address,
+-                              map->flags | GNTMAP_host_map,
++                      gnttab_set_map_op(&map->kmap_ops[i], address, flags,
+                               map->grants[i].ref,
+                               map->grants[i].domid);
+                       gnttab_set_unmap_op(&map->kunmap_ops[i], address,
+-                              map->flags | GNTMAP_host_map, -1);
++                              flags, -1);
+               }
+       }
+ 
+       pr_debug("map %d+%d\n", map->index, map->count);
+       err = gnttab_map_refs(map->map_ops, use_ptemod ? map->kmap_ops : NULL,
+                       map->pages, map->count);
+-      if (err)
+-              return err;
+ 
+       for (i = 0; i < map->count; i++) {
+-              if (map->map_ops[i].status) {
++              if (map->map_ops[i].status == GNTST_okay)
++                      map->unmap_ops[i].handle = map->map_ops[i].handle;
++              else if (!err)
+                       err = -EINVAL;
+-                      continue;
+-              }
+ 
+-              map->unmap_ops[i].handle = map->map_ops[i].handle;
+-              if (use_ptemod)
+-                      map->kunmap_ops[i].handle = map->kmap_ops[i].handle;
+-#ifdef CONFIG_XEN_GRANT_DMA_ALLOC
+-              else if (map->dma_vaddr) {
+-                      unsigned long bfn;
++              if (map->flags & GNTMAP_device_map)
++                      map->unmap_ops[i].dev_bus_addr = 
map->map_ops[i].dev_bus_addr;
+ 
+-                      bfn = pfn_to_bfn(page_to_pfn(map->pages[i]));
+-                      map->unmap_ops[i].dev_bus_addr = __pfn_to_phys(bfn);
++              if (use_ptemod) {
++                      if (map->kmap_ops[i].status == GNTST_okay)
++                              map->kunmap_ops[i].handle = 
map->kmap_ops[i].handle;
++                      else if (!err)
++                              err = -EINVAL;
+               }
+-#endif
+       }
+       return err;
+ }
+diff --git a/drivers/xen/xen-scsiback.c b/drivers/xen/xen-scsiback.c
+index 33d6499d84724..32aba2e8c075f 100644
+--- a/drivers/xen/xen-scsiback.c
++++ b/drivers/xen/xen-scsiback.c
+@@ -422,12 +422,12 @@ static int scsiback_gnttab_data_map_batch(struct 
gnttab_map_grant_ref *map,
+               return 0;
+ 
+       err = gnttab_map_refs(map, NULL, pg, cnt);
+-      BUG_ON(err);
+       for (i = 0; i < cnt; i++) {
+               if (unlikely(map[i].status != GNTST_okay)) {
+                       pr_err("invalid buffer -- could not remap it\n");
+                       map[i].handle = SCSIBACK_INVALID_HANDLE;
+-                      err = -ENOMEM;
++                      if (!err)
++                              err = -ENOMEM;
+               } else {
+                       get_page(pg[i]);
+               }
+diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
+index cda5534d3d0e3..7960359dbc700 100644
+--- a/fs/btrfs/ctree.h
++++ b/fs/btrfs/ctree.h
+@@ -136,9 +136,6 @@ enum {
+       BTRFS_FS_STATE_DEV_REPLACING,
+       /* The btrfs_fs_info created for self-tests */
+       BTRFS_FS_STATE_DUMMY_FS_INFO,
+-
+-      /* Indicate that we can't trust the free space tree for caching yet */
+-      BTRFS_FS_FREE_SPACE_TREE_UNTRUSTED,
+ };
+ 
+ #define BTRFS_BACKREF_REV_MAX         256
+@@ -527,6 +524,9 @@ enum {
+        * so we don't need to offload checksums to workqueues.
+        */
+       BTRFS_FS_CSUM_IMPL_FAST,
++
++      /* Indicate that we can't trust the free space tree for caching yet */
++      BTRFS_FS_FREE_SPACE_TREE_UNTRUSTED,
+ };
+ 
+ struct btrfs_fs_info {
+diff --git a/include/xen/grant_table.h b/include/xen/grant_table.h
+index 9bc5bc07d4d3f..a9978350b45b0 100644
+--- a/include/xen/grant_table.h
++++ b/include/xen/grant_table.h
+@@ -157,6 +157,7 @@ gnttab_set_map_op(struct gnttab_map_grant_ref *map, 
phys_addr_t addr,
+       map->flags = flags;
+       map->ref = ref;
+       map->dom = domid;
++      map->status = 1; /* arbitrary positive value */
+ }
+ 
+ static inline void
+diff --git a/net/bridge/br.c b/net/bridge/br.c
+index 8a8f9e5f264f2..cccbb9bf3ca4e 100644
+--- a/net/bridge/br.c
++++ b/net/bridge/br.c
+@@ -43,7 +43,10 @@ static int br_device_event(struct notifier_block *unused, 
unsigned long event, v
+ 
+               if (event == NETDEV_REGISTER) {
+                       /* register of bridge completed, add sysfs entries */
+-                      br_sysfs_addbr(dev);
++                      err = br_sysfs_addbr(dev);
++                      if (err)
++                              return notifier_from_errno(err);
++
+                       return NOTIFY_DONE;
+               }
+       }
+diff --git a/net/qrtr/qrtr.c b/net/qrtr/qrtr.c
+index d6d2736ec9273..ef602976bb2c8 100644
+--- a/net/qrtr/qrtr.c
++++ b/net/qrtr/qrtr.c
+@@ -187,7 +187,7 @@ static int qrtr_node_enqueue(struct qrtr_node *node, 
struct sk_buff *skb,
+       hdr->src_port_id = cpu_to_le32(from->sq_port);
+       if (to->sq_port == QRTR_PORT_CTRL) {
+               hdr->dst_node_id = cpu_to_le32(node->nid);
+-              hdr->dst_port_id = cpu_to_le32(QRTR_NODE_BCAST);
++              hdr->dst_port_id = cpu_to_le32(QRTR_PORT_CTRL);
+       } else {
+               hdr->dst_node_id = cpu_to_le32(to->sq_node);
+               hdr->dst_port_id = cpu_to_le32(to->sq_port);

Reply via email to