404 lines
13 KiB
Diff
404 lines
13 KiB
Diff
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(®ion->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);
|