From: Sasha Levin Date: Sun, 5 May 2019 20:04:00 +0000 (-0400) Subject: fixes for 4.4 X-Git-Tag: v4.9.174~30 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=288d6f2550d9e6f744bfbe810aa82244019189d9;p=thirdparty%2Fkernel%2Fstable-queue.git fixes for 4.4 Signed-off-by: Sasha Levin --- diff --git a/queue-4.4/arm-iop-don-t-use-using-64-bit-dma-masks.patch b/queue-4.4/arm-iop-don-t-use-using-64-bit-dma-masks.patch new file mode 100644 index 00000000000..60f524e7f6e --- /dev/null +++ b/queue-4.4/arm-iop-don-t-use-using-64-bit-dma-masks.patch @@ -0,0 +1,152 @@ +From 7dc40e9d0b47d6f04548770b71be054e0ac115f0 Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +Date: Mon, 25 Mar 2019 16:50:43 +0100 +Subject: ARM: iop: don't use using 64-bit DMA masks + +[ Upstream commit 2125801ccce19249708ca3245d48998e70569ab8 ] + +clang warns about statically defined DMA masks from the DMA_BIT_MASK +macro with length 64: + + arch/arm/mach-iop13xx/setup.c:303:35: error: shift count >= width of type [-Werror,-Wshift-count-overflow] + static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(64); + ^~~~~~~~~~~~~~~~ + include/linux/dma-mapping.h:141:54: note: expanded from macro 'DMA_BIT_MASK' + #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) + ^ ~~~ + +The ones in iop shouldn't really be 64 bit masks, so changing them +to what the driver can support avoids the warning. + +Signed-off-by: Arnd Bergmann +Signed-off-by: Olof Johansson +Signed-off-by: Sasha Levin +--- + arch/arm/mach-iop13xx/setup.c | 8 ++++---- + arch/arm/mach-iop13xx/tpmi.c | 10 +++++----- + arch/arm/plat-iop/adma.c | 6 +++--- + 3 files changed, 12 insertions(+), 12 deletions(-) + +diff --git a/arch/arm/mach-iop13xx/setup.c b/arch/arm/mach-iop13xx/setup.c +index 53c316f7301e..fe4932fda01d 100644 +--- a/arch/arm/mach-iop13xx/setup.c ++++ b/arch/arm/mach-iop13xx/setup.c +@@ -300,7 +300,7 @@ static struct resource iop13xx_adma_2_resources[] = { + } + }; + +-static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(64); ++static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(32); + static struct iop_adma_platform_data iop13xx_adma_0_data = { + .hw_id = 0, + .pool_size = PAGE_SIZE, +@@ -324,7 +324,7 @@ static struct platform_device iop13xx_adma_0_channel = { + .resource = iop13xx_adma_0_resources, + .dev = { + .dma_mask = &iop13xx_adma_dmamask, +- .coherent_dma_mask = DMA_BIT_MASK(64), ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = (void *) &iop13xx_adma_0_data, + }, + }; +@@ -336,7 +336,7 @@ static struct platform_device iop13xx_adma_1_channel = { + .resource = iop13xx_adma_1_resources, + .dev = { + .dma_mask = &iop13xx_adma_dmamask, +- .coherent_dma_mask = DMA_BIT_MASK(64), ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = (void *) &iop13xx_adma_1_data, + }, + }; +@@ -348,7 +348,7 @@ static struct platform_device iop13xx_adma_2_channel = { + .resource = iop13xx_adma_2_resources, + .dev = { + .dma_mask = &iop13xx_adma_dmamask, +- .coherent_dma_mask = DMA_BIT_MASK(64), ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = (void *) &iop13xx_adma_2_data, + }, + }; +diff --git a/arch/arm/mach-iop13xx/tpmi.c b/arch/arm/mach-iop13xx/tpmi.c +index db511ec2b1df..116feb6b261e 100644 +--- a/arch/arm/mach-iop13xx/tpmi.c ++++ b/arch/arm/mach-iop13xx/tpmi.c +@@ -152,7 +152,7 @@ static struct resource iop13xx_tpmi_3_resources[] = { + } + }; + +-u64 iop13xx_tpmi_mask = DMA_BIT_MASK(64); ++u64 iop13xx_tpmi_mask = DMA_BIT_MASK(32); + static struct platform_device iop13xx_tpmi_0_device = { + .name = "iop-tpmi", + .id = 0, +@@ -160,7 +160,7 @@ static struct platform_device iop13xx_tpmi_0_device = { + .resource = iop13xx_tpmi_0_resources, + .dev = { + .dma_mask = &iop13xx_tpmi_mask, +- .coherent_dma_mask = DMA_BIT_MASK(64), ++ .coherent_dma_mask = DMA_BIT_MASK(32), + }, + }; + +@@ -171,7 +171,7 @@ static struct platform_device iop13xx_tpmi_1_device = { + .resource = iop13xx_tpmi_1_resources, + .dev = { + .dma_mask = &iop13xx_tpmi_mask, +- .coherent_dma_mask = DMA_BIT_MASK(64), ++ .coherent_dma_mask = DMA_BIT_MASK(32), + }, + }; + +@@ -182,7 +182,7 @@ static struct platform_device iop13xx_tpmi_2_device = { + .resource = iop13xx_tpmi_2_resources, + .dev = { + .dma_mask = &iop13xx_tpmi_mask, +- .coherent_dma_mask = DMA_BIT_MASK(64), ++ .coherent_dma_mask = DMA_BIT_MASK(32), + }, + }; + +@@ -193,7 +193,7 @@ static struct platform_device iop13xx_tpmi_3_device = { + .resource = iop13xx_tpmi_3_resources, + .dev = { + .dma_mask = &iop13xx_tpmi_mask, +- .coherent_dma_mask = DMA_BIT_MASK(64), ++ .coherent_dma_mask = DMA_BIT_MASK(32), + }, + }; + +diff --git a/arch/arm/plat-iop/adma.c b/arch/arm/plat-iop/adma.c +index a4d1f8de3b5b..d9612221e484 100644 +--- a/arch/arm/plat-iop/adma.c ++++ b/arch/arm/plat-iop/adma.c +@@ -143,7 +143,7 @@ struct platform_device iop3xx_dma_0_channel = { + .resource = iop3xx_dma_0_resources, + .dev = { + .dma_mask = &iop3xx_adma_dmamask, +- .coherent_dma_mask = DMA_BIT_MASK(64), ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = (void *) &iop3xx_dma_0_data, + }, + }; +@@ -155,7 +155,7 @@ struct platform_device iop3xx_dma_1_channel = { + .resource = iop3xx_dma_1_resources, + .dev = { + .dma_mask = &iop3xx_adma_dmamask, +- .coherent_dma_mask = DMA_BIT_MASK(64), ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = (void *) &iop3xx_dma_1_data, + }, + }; +@@ -167,7 +167,7 @@ struct platform_device iop3xx_aau_channel = { + .resource = iop3xx_aau_resources, + .dev = { + .dma_mask = &iop3xx_adma_dmamask, +- .coherent_dma_mask = DMA_BIT_MASK(64), ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = (void *) &iop3xx_aau_data, + }, + }; +-- +2.20.1 + diff --git a/queue-4.4/arm-orion-don-t-use-using-64-bit-dma-masks.patch b/queue-4.4/arm-orion-don-t-use-using-64-bit-dma-masks.patch new file mode 100644 index 00000000000..354dfc50af9 --- /dev/null +++ b/queue-4.4/arm-orion-don-t-use-using-64-bit-dma-masks.patch @@ -0,0 +1,51 @@ +From 53a0a1cfa5aef9869c2cb2f58531c11430b2e82f Mon Sep 17 00:00:00 2001 +From: Arnd Bergmann +Date: Mon, 25 Mar 2019 16:50:42 +0100 +Subject: ARM: orion: don't use using 64-bit DMA masks + +[ Upstream commit cd92d74d67c811dc22544430b9ac3029f5bd64c5 ] + +clang warns about statically defined DMA masks from the DMA_BIT_MASK +macro with length 64: + +arch/arm/plat-orion/common.c:625:29: error: shift count >= width of type [-Werror,-Wshift-count-overflow] + .coherent_dma_mask = DMA_BIT_MASK(64), + ^~~~~~~~~~~~~~~~ +include/linux/dma-mapping.h:141:54: note: expanded from macro 'DMA_BIT_MASK' + #define DMA_BIT_MASK(n) (((n) == 64) ? ~0ULL : ((1ULL<<(n))-1)) + +The ones in orion shouldn't really be 64 bit masks, so changing them +to what the driver can support avoids the warning. + +Signed-off-by: Arnd Bergmann +Signed-off-by: Olof Johansson +Signed-off-by: Sasha Levin +--- + arch/arm/plat-orion/common.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/arm/plat-orion/common.c b/arch/arm/plat-orion/common.c +index 8861c367d061..51c3737ddba7 100644 +--- a/arch/arm/plat-orion/common.c ++++ b/arch/arm/plat-orion/common.c +@@ -645,7 +645,7 @@ static struct platform_device orion_xor0_shared = { + .resource = orion_xor0_shared_resources, + .dev = { + .dma_mask = &orion_xor_dmamask, +- .coherent_dma_mask = DMA_BIT_MASK(64), ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &orion_xor0_pdata, + }, + }; +@@ -706,7 +706,7 @@ static struct platform_device orion_xor1_shared = { + .resource = orion_xor1_shared_resources, + .dev = { + .dma_mask = &orion_xor_dmamask, +- .coherent_dma_mask = DMA_BIT_MASK(64), ++ .coherent_dma_mask = DMA_BIT_MASK(32), + .platform_data = &orion_xor1_pdata, + }, + }; +-- +2.20.1 + diff --git a/queue-4.4/bonding-show-full-hw-address-in-sysfs-for-slave-entr.patch b/queue-4.4/bonding-show-full-hw-address-in-sysfs-for-slave-entr.patch new file mode 100644 index 00000000000..8d93c47b807 --- /dev/null +++ b/queue-4.4/bonding-show-full-hw-address-in-sysfs-for-slave-entr.patch @@ -0,0 +1,43 @@ +From 3e2167779a2c6ee8da4cd442f559d4114f6d8765 Mon Sep 17 00:00:00 2001 +From: Konstantin Khorenko +Date: Thu, 28 Mar 2019 13:29:21 +0300 +Subject: bonding: show full hw address in sysfs for slave entries + +[ Upstream commit 18bebc6dd3281955240062655a4df35eef2c46b3 ] + +Bond expects ethernet hwaddr for its slave, but it can be longer than 6 +bytes - infiniband interface for example. + + # cat /sys/devices//net/ib0/address + 80:00:02:08:fe:80:00:00:00:00:00:00:7c:fe:90:03:00:be:5d:e1 + + # cat /sys/devices//net/ib0/bonding_slave/perm_hwaddr + 80:00:02:08:fe:80 + +So print full hwaddr in sysfs "bonding_slave/perm_hwaddr" as well. + +Signed-off-by: Konstantin Khorenko +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/bonding/bond_sysfs_slave.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/bonding/bond_sysfs_slave.c b/drivers/net/bonding/bond_sysfs_slave.c +index 7d16c51e6913..641a532b67cb 100644 +--- a/drivers/net/bonding/bond_sysfs_slave.c ++++ b/drivers/net/bonding/bond_sysfs_slave.c +@@ -55,7 +55,9 @@ static SLAVE_ATTR_RO(link_failure_count); + + static ssize_t perm_hwaddr_show(struct slave *slave, char *buf) + { +- return sprintf(buf, "%pM\n", slave->perm_hwaddr); ++ return sprintf(buf, "%*phC\n", ++ slave->dev->addr_len, ++ slave->perm_hwaddr); + } + static SLAVE_ATTR_RO(perm_hwaddr); + +-- +2.20.1 + diff --git a/queue-4.4/debugfs-fix-use-after-free-on-symlink-traversal.patch b/queue-4.4/debugfs-fix-use-after-free-on-symlink-traversal.patch new file mode 100644 index 00000000000..56001528624 --- /dev/null +++ b/queue-4.4/debugfs-fix-use-after-free-on-symlink-traversal.patch @@ -0,0 +1,54 @@ +From a42ad11b26087a7f8ff931115732756b57479e3e Mon Sep 17 00:00:00 2001 +From: Al Viro +Date: Tue, 26 Mar 2019 01:43:37 +0000 +Subject: debugfs: fix use-after-free on symlink traversal + +[ Upstream commit 93b919da64c15b90953f96a536e5e61df896ca57 ] + +symlink body shouldn't be freed without an RCU delay. Switch debugfs to +->destroy_inode() and use of call_rcu(); free both the inode and symlink +body in the callback. Similar to solution for bpf, only here it's even +more obvious that ->evict_inode() can be dropped. + +Signed-off-by: Al Viro +Signed-off-by: Sasha Levin +--- + fs/debugfs/inode.c | 13 +++++++++---- + 1 file changed, 9 insertions(+), 4 deletions(-) + +diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c +index 22fe11baef2b..3530e1c3ff56 100644 +--- a/fs/debugfs/inode.c ++++ b/fs/debugfs/inode.c +@@ -164,19 +164,24 @@ static int debugfs_show_options(struct seq_file *m, struct dentry *root) + return 0; + } + +-static void debugfs_evict_inode(struct inode *inode) ++static void debugfs_i_callback(struct rcu_head *head) + { +- truncate_inode_pages_final(&inode->i_data); +- clear_inode(inode); ++ struct inode *inode = container_of(head, struct inode, i_rcu); + if (S_ISLNK(inode->i_mode)) + kfree(inode->i_link); ++ free_inode_nonrcu(inode); ++} ++ ++static void debugfs_destroy_inode(struct inode *inode) ++{ ++ call_rcu(&inode->i_rcu, debugfs_i_callback); + } + + static const struct super_operations debugfs_super_operations = { + .statfs = simple_statfs, + .remount_fs = debugfs_remount, + .show_options = debugfs_show_options, +- .evict_inode = debugfs_evict_inode, ++ .destroy_inode = debugfs_destroy_inode, + }; + + static struct vfsmount *debugfs_automount(struct path *path) +-- +2.20.1 + diff --git a/queue-4.4/hid-debug-fix-race-condition-with-between-rdesc_show.patch b/queue-4.4/hid-debug-fix-race-condition-with-between-rdesc_show.patch new file mode 100644 index 00000000000..cda9268d695 --- /dev/null +++ b/queue-4.4/hid-debug-fix-race-condition-with-between-rdesc_show.patch @@ -0,0 +1,61 @@ +From d1dc5aebabcca92968b7f6836e77caada0c625f8 Mon Sep 17 00:00:00 2001 +From: "He, Bo" +Date: Thu, 14 Mar 2019 02:28:21 +0000 +Subject: HID: debug: fix race condition with between rdesc_show() and device + removal + +[ Upstream commit cef0d4948cb0a02db37ebfdc320e127c77ab1637 ] + +There is a race condition that could happen if hid_debug_rdesc_show() +is running while hdev is in the process of going away (device removal, +system suspend, etc) which could result in NULL pointer dereference: + + BUG: unable to handle kernel paging request at 0000000783316040 + CPU: 1 PID: 1512 Comm: getevent Tainted: G U O 4.19.20-quilt-2e5dc0ac-00029-gc455a447dd55 #1 + RIP: 0010:hid_dump_device+0x9b/0x160 + Call Trace: + hid_debug_rdesc_show+0x72/0x1d0 + seq_read+0xe0/0x410 + full_proxy_read+0x5f/0x90 + __vfs_read+0x3a/0x170 + vfs_read+0xa0/0x150 + ksys_read+0x58/0xc0 + __x64_sys_read+0x1a/0x20 + do_syscall_64+0x55/0x110 + entry_SYSCALL_64_after_hwframe+0x49/0xbe + +Grab driver_input_lock to make sure the input device exists throughout the +whole process of dumping the rdesc. + +[jkosina@suse.cz: update changelog a bit] +Signed-off-by: he, bo +Signed-off-by: "Zhang, Jun" +Signed-off-by: Jiri Kosina +Signed-off-by: Sasha Levin +--- + drivers/hid/hid-debug.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/drivers/hid/hid-debug.c b/drivers/hid/hid-debug.c +index d7179dd3c9ef..3cafa1d28fed 100644 +--- a/drivers/hid/hid-debug.c ++++ b/drivers/hid/hid-debug.c +@@ -1058,10 +1058,15 @@ static int hid_debug_rdesc_show(struct seq_file *f, void *p) + seq_printf(f, "\n\n"); + + /* dump parsed data and input mappings */ ++ if (down_interruptible(&hdev->driver_input_lock)) ++ return 0; ++ + hid_dump_device(hdev, f); + seq_printf(f, "\n"); + hid_dump_input_mapping(hdev, f); + ++ up(&hdev->driver_input_lock); ++ + return 0; + } + +-- +2.20.1 + diff --git a/queue-4.4/hugetlbfs-fix-memory-leak-for-resv_map.patch b/queue-4.4/hugetlbfs-fix-memory-leak-for-resv_map.patch new file mode 100644 index 00000000000..a2b8f2df3f8 --- /dev/null +++ b/queue-4.4/hugetlbfs-fix-memory-leak-for-resv_map.patch @@ -0,0 +1,78 @@ +From a4a279248cfd0dc3f7fd0c9d28cdd438b6d23aa8 Mon Sep 17 00:00:00 2001 +From: Mike Kravetz +Date: Fri, 5 Apr 2019 18:39:06 -0700 +Subject: hugetlbfs: fix memory leak for resv_map + +[ Upstream commit 58b6e5e8f1addd44583d61b0a03c0f5519527e35 ] + +When mknod is used to create a block special file in hugetlbfs, it will +allocate an inode and kmalloc a 'struct resv_map' via resv_map_alloc(). +inode->i_mapping->private_data will point the newly allocated resv_map. +However, when the device special file is opened bd_acquire() will set +inode->i_mapping to bd_inode->i_mapping. Thus the pointer to the +allocated resv_map is lost and the structure is leaked. + +Programs to reproduce: + mount -t hugetlbfs nodev hugetlbfs + mknod hugetlbfs/dev b 0 0 + exec 30<> hugetlbfs/dev + umount hugetlbfs/ + +resv_map structures are only needed for inodes which can have associated +page allocations. To fix the leak, only allocate resv_map for those +inodes which could possibly be associated with page allocations. + +Link: http://lkml.kernel.org/r/20190401213101.16476-1-mike.kravetz@oracle.com +Signed-off-by: Mike Kravetz +Reviewed-by: Andrew Morton +Reported-by: Yufen Yu +Suggested-by: Yufen Yu +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Sasha Levin +--- + fs/hugetlbfs/inode.c | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c +index cefae2350da5..27c4e2ac39a9 100644 +--- a/fs/hugetlbfs/inode.c ++++ b/fs/hugetlbfs/inode.c +@@ -745,11 +745,17 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, + umode_t mode, dev_t dev) + { + struct inode *inode; +- struct resv_map *resv_map; ++ struct resv_map *resv_map = NULL; + +- resv_map = resv_map_alloc(); +- if (!resv_map) +- return NULL; ++ /* ++ * Reserve maps are only needed for inodes that can have associated ++ * page allocations. ++ */ ++ if (S_ISREG(mode) || S_ISLNK(mode)) { ++ resv_map = resv_map_alloc(); ++ if (!resv_map) ++ return NULL; ++ } + + inode = new_inode(sb); + if (inode) { +@@ -790,8 +796,10 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, + break; + } + lockdep_annotate_inode_mutex_key(inode); +- } else +- kref_put(&resv_map->refs, resv_map_release); ++ } else { ++ if (resv_map) ++ kref_put(&resv_map->refs, resv_map_release); ++ } + + return inode; + } +-- +2.20.1 + diff --git a/queue-4.4/igb-fix-warn_once-on-runtime-suspend.patch b/queue-4.4/igb-fix-warn_once-on-runtime-suspend.patch new file mode 100644 index 00000000000..d8b056abb19 --- /dev/null +++ b/queue-4.4/igb-fix-warn_once-on-runtime-suspend.patch @@ -0,0 +1,155 @@ +From 98f5404955e18393fae252c228edf61cbfb9ca09 Mon Sep 17 00:00:00 2001 +From: Arvind Sankar +Date: Sat, 2 Mar 2019 11:01:17 -0500 +Subject: igb: Fix WARN_ONCE on runtime suspend + +[ Upstream commit dabb8338be533c18f50255cf39ff4f66d4dabdbe ] + +The runtime_suspend device callbacks are not supposed to save +configuration state or change the power state. Commit fb29f76cc566 +("igb: Fix an issue that PME is not enabled during runtime suspend") +changed the driver to not save configuration state during runtime +suspend, however the driver callback still put the device into a +low-power state. This causes a warning in the pci pm core and results in +pci_pm_runtime_suspend not calling pci_save_state or pci_finish_runtime_suspend. + +Fix this by not changing the power state either, leaving that to pci pm +core, and make the same change for suspend callback as well. + +Also move a couple of defines into the appropriate header file instead +of inline in the .c file. + +Fixes: fb29f76cc566 ("igb: Fix an issue that PME is not enabled during runtime suspend") +Signed-off-by: Arvind Sankar +Reviewed-by: Kai-Heng Feng +Tested-by: Aaron Brown +Signed-off-by: Jeff Kirsher +Signed-off-by: Sasha Levin +--- + .../net/ethernet/intel/igb/e1000_defines.h | 2 + + drivers/net/ethernet/intel/igb/igb_main.c | 57 +++---------------- + 2 files changed, 10 insertions(+), 49 deletions(-) + +diff --git a/drivers/net/ethernet/intel/igb/e1000_defines.h b/drivers/net/ethernet/intel/igb/e1000_defines.h +index b1915043bc0c..7b9fb71137da 100644 +--- a/drivers/net/ethernet/intel/igb/e1000_defines.h ++++ b/drivers/net/ethernet/intel/igb/e1000_defines.h +@@ -193,6 +193,8 @@ + /* enable link status from external LINK_0 and LINK_1 pins */ + #define E1000_CTRL_SWDPIN0 0x00040000 /* SWDPIN 0 value */ + #define E1000_CTRL_SWDPIN1 0x00080000 /* SWDPIN 1 value */ ++#define E1000_CTRL_ADVD3WUC 0x00100000 /* D3 WUC */ ++#define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000 /* PHY PM enable */ + #define E1000_CTRL_SDP0_DIR 0x00400000 /* SDP0 Data direction */ + #define E1000_CTRL_SDP1_DIR 0x00800000 /* SDP1 Data direction */ + #define E1000_CTRL_RST 0x04000000 /* Global reset */ +diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c +index c1796aa2dde5..70ed5e5c3514 100644 +--- a/drivers/net/ethernet/intel/igb/igb_main.c ++++ b/drivers/net/ethernet/intel/igb/igb_main.c +@@ -7325,9 +7325,7 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, + struct e1000_hw *hw = &adapter->hw; + u32 ctrl, rctl, status; + u32 wufc = runtime ? E1000_WUFC_LNKC : adapter->wol; +-#ifdef CONFIG_PM +- int retval = 0; +-#endif ++ bool wake; + + rtnl_lock(); + netif_device_detach(netdev); +@@ -7338,14 +7336,6 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, + igb_clear_interrupt_scheme(adapter); + rtnl_unlock(); + +-#ifdef CONFIG_PM +- if (!runtime) { +- retval = pci_save_state(pdev); +- if (retval) +- return retval; +- } +-#endif +- + status = rd32(E1000_STATUS); + if (status & E1000_STATUS_LU) + wufc &= ~E1000_WUFC_LNKC; +@@ -7362,10 +7352,6 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, + } + + ctrl = rd32(E1000_CTRL); +- /* advertise wake from D3Cold */ +- #define E1000_CTRL_ADVD3WUC 0x00100000 +- /* phy power management enable */ +- #define E1000_CTRL_EN_PHY_PWR_MGMT 0x00200000 + ctrl |= E1000_CTRL_ADVD3WUC; + wr32(E1000_CTRL, ctrl); + +@@ -7379,12 +7365,15 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, + wr32(E1000_WUFC, 0); + } + +- *enable_wake = wufc || adapter->en_mng_pt; +- if (!*enable_wake) ++ wake = wufc || adapter->en_mng_pt; ++ if (!wake) + igb_power_down_link(adapter); + else + igb_power_up_link(adapter); + ++ if (enable_wake) ++ *enable_wake = wake; ++ + /* Release control of h/w to f/w. If f/w is AMT enabled, this + * would have already happened in close and is redundant. + */ +@@ -7399,22 +7388,7 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake, + #ifdef CONFIG_PM_SLEEP + static int igb_suspend(struct device *dev) + { +- int retval; +- bool wake; +- struct pci_dev *pdev = to_pci_dev(dev); +- +- retval = __igb_shutdown(pdev, &wake, 0); +- if (retval) +- return retval; +- +- if (wake) { +- pci_prepare_to_sleep(pdev); +- } else { +- pci_wake_from_d3(pdev, false); +- pci_set_power_state(pdev, PCI_D3hot); +- } +- +- return 0; ++ return __igb_shutdown(to_pci_dev(dev), NULL, 0); + } + #endif /* CONFIG_PM_SLEEP */ + +@@ -7483,22 +7457,7 @@ static int igb_runtime_idle(struct device *dev) + + static int igb_runtime_suspend(struct device *dev) + { +- struct pci_dev *pdev = to_pci_dev(dev); +- int retval; +- bool wake; +- +- retval = __igb_shutdown(pdev, &wake, 1); +- if (retval) +- return retval; +- +- if (wake) { +- pci_prepare_to_sleep(pdev); +- } else { +- pci_wake_from_d3(pdev, false); +- pci_set_power_state(pdev, PCI_D3hot); +- } +- +- return 0; ++ return __igb_shutdown(to_pci_dev(dev), NULL, 1); + } + + static int igb_runtime_resume(struct device *dev) +-- +2.20.1 + diff --git a/queue-4.4/jffs2-fix-use-after-free-on-symlink-traversal.patch b/queue-4.4/jffs2-fix-use-after-free-on-symlink-traversal.patch new file mode 100644 index 00000000000..ba95a843631 --- /dev/null +++ b/queue-4.4/jffs2-fix-use-after-free-on-symlink-traversal.patch @@ -0,0 +1,53 @@ +From 2a6e6ca03f91565b6458df29edeb2334f6081938 Mon Sep 17 00:00:00 2001 +From: Al Viro +Date: Tue, 26 Mar 2019 01:39:50 +0000 +Subject: jffs2: fix use-after-free on symlink traversal + +[ Upstream commit 4fdcfab5b5537c21891e22e65996d4d0dd8ab4ca ] + +free the symlink body after the same RCU delay we have for freeing the +struct inode itself, so that traversal during RCU pathwalk wouldn't step +into freed memory. + +Signed-off-by: Al Viro +Signed-off-by: Sasha Levin +--- + fs/jffs2/readinode.c | 5 ----- + fs/jffs2/super.c | 5 ++++- + 2 files changed, 4 insertions(+), 6 deletions(-) + +diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c +index bfebbf13698c..5b52ea41b84f 100644 +--- a/fs/jffs2/readinode.c ++++ b/fs/jffs2/readinode.c +@@ -1414,11 +1414,6 @@ void jffs2_do_clear_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f) + + jffs2_kill_fragtree(&f->fragtree, deleted?c:NULL); + +- if (f->target) { +- kfree(f->target); +- f->target = NULL; +- } +- + fds = f->dents; + while(fds) { + fd = fds; +diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c +index 023e7f32ee1b..9fc297df8c75 100644 +--- a/fs/jffs2/super.c ++++ b/fs/jffs2/super.c +@@ -47,7 +47,10 @@ static struct inode *jffs2_alloc_inode(struct super_block *sb) + static void jffs2_i_callback(struct rcu_head *head) + { + struct inode *inode = container_of(head, struct inode, i_rcu); +- kmem_cache_free(jffs2_inode_cachep, JFFS2_INODE_INFO(inode)); ++ struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode); ++ ++ kfree(f->target); ++ kmem_cache_free(jffs2_inode_cachep, f); + } + + static void jffs2_destroy_inode(struct inode *inode) +-- +2.20.1 + diff --git a/queue-4.4/net-hns-fix-warning-when-remove-hns-driver-with-smmu.patch b/queue-4.4/net-hns-fix-warning-when-remove-hns-driver-with-smmu.patch new file mode 100644 index 00000000000..41c9d0d6f63 --- /dev/null +++ b/queue-4.4/net-hns-fix-warning-when-remove-hns-driver-with-smmu.patch @@ -0,0 +1,101 @@ +From ce3a850a2a35528c307b6284fc210cff38e11260 Mon Sep 17 00:00:00 2001 +From: Yonglong Liu +Date: Thu, 4 Apr 2019 16:46:46 +0800 +Subject: net: hns: Fix WARNING when remove HNS driver with SMMU enabled + +[ Upstream commit 8601a99d7c0256b7a7fdd1ab14cf6c1f1dfcadc6 ] + +When enable SMMU, remove HNS driver will cause a WARNING: + +[ 141.924177] WARNING: CPU: 36 PID: 2708 at drivers/iommu/dma-iommu.c:443 __iommu_dma_unmap+0xc0/0xc8 +[ 141.954673] Modules linked in: hns_enet_drv(-) +[ 141.963615] CPU: 36 PID: 2708 Comm: rmmod Tainted: G W 5.0.0-rc1-28723-gb729c57de95c-dirty #32 +[ 141.983593] Hardware name: Huawei D05/D05, BIOS Hisilicon D05 UEFI Nemo 1.8 RC0 08/31/2017 +[ 142.000244] pstate: 60000005 (nZCv daif -PAN -UAO) +[ 142.009886] pc : __iommu_dma_unmap+0xc0/0xc8 +[ 142.018476] lr : __iommu_dma_unmap+0xc0/0xc8 +[ 142.027066] sp : ffff000013533b90 +[ 142.033728] x29: ffff000013533b90 x28: ffff8013e6983600 +[ 142.044420] x27: 0000000000000000 x26: 0000000000000000 +[ 142.055113] x25: 0000000056000000 x24: 0000000000000015 +[ 142.065806] x23: 0000000000000028 x22: ffff8013e66eee68 +[ 142.076499] x21: ffff8013db919800 x20: 0000ffffefbff000 +[ 142.087192] x19: 0000000000001000 x18: 0000000000000007 +[ 142.097885] x17: 000000000000000e x16: 0000000000000001 +[ 142.108578] x15: 0000000000000019 x14: 363139343a70616d +[ 142.119270] x13: 6e75656761705f67 x12: 0000000000000000 +[ 142.129963] x11: 00000000ffffffff x10: 0000000000000006 +[ 142.140656] x9 : 1346c1aa88093500 x8 : ffff0000114de4e0 +[ 142.151349] x7 : 6662666578303d72 x6 : ffff0000105ffec8 +[ 142.162042] x5 : 0000000000000000 x4 : 0000000000000000 +[ 142.172734] x3 : 00000000ffffffff x2 : ffff0000114de500 +[ 142.183427] x1 : 0000000000000000 x0 : 0000000000000035 +[ 142.194120] Call trace: +[ 142.199030] __iommu_dma_unmap+0xc0/0xc8 +[ 142.206920] iommu_dma_unmap_page+0x20/0x28 +[ 142.215335] __iommu_unmap_page+0x40/0x60 +[ 142.223399] hnae_unmap_buffer+0x110/0x134 +[ 142.231639] hnae_free_desc+0x6c/0x10c +[ 142.239177] hnae_fini_ring+0x14/0x34 +[ 142.246540] hnae_fini_queue+0x2c/0x40 +[ 142.254080] hnae_put_handle+0x38/0xcc +[ 142.261619] hns_nic_dev_remove+0x54/0xfc [hns_enet_drv] +[ 142.272312] platform_drv_remove+0x24/0x64 +[ 142.280552] device_release_driver_internal+0x17c/0x20c +[ 142.291070] driver_detach+0x4c/0x90 +[ 142.298259] bus_remove_driver+0x5c/0xd8 +[ 142.306148] driver_unregister+0x2c/0x54 +[ 142.314037] platform_driver_unregister+0x10/0x18 +[ 142.323505] hns_nic_dev_driver_exit+0x14/0xf0c [hns_enet_drv] +[ 142.335248] __arm64_sys_delete_module+0x214/0x25c +[ 142.344891] el0_svc_common+0xb0/0x10c +[ 142.352430] el0_svc_handler+0x24/0x80 +[ 142.359968] el0_svc+0x8/0x7c0 +[ 142.366104] ---[ end trace 60ad1cd58e63c407 ]--- + +The tx ring buffer map when xmit and unmap when xmit done. So in +hnae_init_ring() did not map tx ring buffer, but in hnae_fini_ring() +have a unmap operation for tx ring buffer, which is already unmapped +when xmit done, than cause this WARNING. + +The hnae_alloc_buffers() is called in hnae_init_ring(), +so the hnae_free_buffers() should be in hnae_fini_ring(), not in +hnae_free_desc(). + +In hnae_fini_ring(), adds a check is_rx_ring() as in hnae_init_ring(). +When the ring buffer is tx ring, adds a piece of code to ensure that +the tx ring is unmap. + +Signed-off-by: Yonglong Liu +Signed-off-by: Peng Li +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/hisilicon/hns/hnae.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.c b/drivers/net/ethernet/hisilicon/hns/hnae.c +index b3645297477e..3ce41efe8a94 100644 +--- a/drivers/net/ethernet/hisilicon/hns/hnae.c ++++ b/drivers/net/ethernet/hisilicon/hns/hnae.c +@@ -144,7 +144,6 @@ static int hnae_alloc_buffers(struct hnae_ring *ring) + /* free desc along with its attached buffer */ + static void hnae_free_desc(struct hnae_ring *ring) + { +- hnae_free_buffers(ring); + dma_unmap_single(ring_to_dev(ring), ring->desc_dma_addr, + ring->desc_num * sizeof(ring->desc[0]), + ring_to_dma_dir(ring)); +@@ -177,6 +176,9 @@ static int hnae_alloc_desc(struct hnae_ring *ring) + /* fini ring, also free the buffer for the ring */ + static void hnae_fini_ring(struct hnae_ring *ring) + { ++ if (is_rx_ring(ring)) ++ hnae_free_buffers(ring); ++ + hnae_free_desc(ring); + kfree(ring->desc_cb); + ring->desc_cb = NULL; +-- +2.20.1 + diff --git a/queue-4.4/net-hns-use-napi_poll_weight-for-hns-driver.patch b/queue-4.4/net-hns-use-napi_poll_weight-for-hns-driver.patch new file mode 100644 index 00000000000..7885c19e68e --- /dev/null +++ b/queue-4.4/net-hns-use-napi_poll_weight-for-hns-driver.patch @@ -0,0 +1,59 @@ +From b0c028e3b215537b30a37d137ec71b84641a44bb Mon Sep 17 00:00:00 2001 +From: Yonglong Liu +Date: Thu, 4 Apr 2019 16:46:43 +0800 +Subject: net: hns: Use NAPI_POLL_WEIGHT for hns driver + +[ Upstream commit acb1ce15a61154aa501891d67ebf79bc9ea26818 ] + +When the HNS driver loaded, always have an error print: +"netif_napi_add() called with weight 256" + +This is because the kernel checks the NAPI polling weights +requested by drivers and it prints an error message if a driver +requests a weight bigger than 64. + +So use NAPI_POLL_WEIGHT to fix it. + +Signed-off-by: Yonglong Liu +Signed-off-by: Peng Li +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/hisilicon/hns/hns_enet.c | 7 ++----- + 1 file changed, 2 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c +index 2fa54b0b0679..6d649e7b45a9 100644 +--- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c ++++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c +@@ -28,9 +28,6 @@ + + #define SERVICE_TIMER_HZ (1 * HZ) + +-#define NIC_TX_CLEAN_MAX_NUM 256 +-#define NIC_RX_CLEAN_MAX_NUM 64 +- + #define RCB_IRQ_NOT_INITED 0 + #define RCB_IRQ_INITED 1 + +@@ -1408,7 +1405,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv *priv) + rd->fini_process = hns_nic_tx_fini_pro; + + netif_napi_add(priv->netdev, &rd->napi, +- hns_nic_common_poll, NIC_TX_CLEAN_MAX_NUM); ++ hns_nic_common_poll, NAPI_POLL_WEIGHT); + rd->ring->irq_init_flag = RCB_IRQ_NOT_INITED; + } + for (i = h->q_num; i < h->q_num * 2; i++) { +@@ -1420,7 +1417,7 @@ static int hns_nic_init_ring_data(struct hns_nic_priv *priv) + rd->fini_process = hns_nic_rx_fini_pro; + + netif_napi_add(priv->netdev, &rd->napi, +- hns_nic_common_poll, NIC_RX_CLEAN_MAX_NUM); ++ hns_nic_common_poll, NAPI_POLL_WEIGHT); + rd->ring->irq_init_flag = RCB_IRQ_NOT_INITED; + } + +-- +2.20.1 + diff --git a/queue-4.4/rtc-da9063-set-uie_unsupported-when-relevant.patch b/queue-4.4/rtc-da9063-set-uie_unsupported-when-relevant.patch new file mode 100644 index 00000000000..51ee05de636 --- /dev/null +++ b/queue-4.4/rtc-da9063-set-uie_unsupported-when-relevant.patch @@ -0,0 +1,42 @@ +From 69200015bf1959c38f79e2214ce917e3a54eed28 Mon Sep 17 00:00:00 2001 +From: Alexandre Belloni +Date: Tue, 2 Apr 2019 12:26:36 +0200 +Subject: rtc: da9063: set uie_unsupported when relevant + +[ Upstream commit 882c5e552ffd06856de42261460f46e18319d259 ] + +The DA9063AD doesn't support alarms on any seconds and its granularity is +the minute. Set uie_unsupported in that case. + +Reported-by: Wolfram Sang +Reported-by: Geert Uytterhoeven +Reviewed-by: Wolfram Sang +Tested-by: Wolfram Sang +Acked-by: Steve Twiss +Signed-off-by: Alexandre Belloni +Signed-off-by: Sasha Levin +--- + drivers/rtc/rtc-da9063.c | 7 +++++++ + 1 file changed, 7 insertions(+) + +diff --git a/drivers/rtc/rtc-da9063.c b/drivers/rtc/rtc-da9063.c +index d6c853bbfa9f..e93beecd5010 100644 +--- a/drivers/rtc/rtc-da9063.c ++++ b/drivers/rtc/rtc-da9063.c +@@ -491,6 +491,13 @@ static int da9063_rtc_probe(struct platform_device *pdev) + da9063_data_to_tm(data, &rtc->alarm_time, rtc); + rtc->rtc_sync = false; + ++ /* ++ * TODO: some models have alarms on a minute boundary but still support ++ * real hardware interrupts. Add this once the core supports it. ++ */ ++ if (config->rtc_data_start != RTC_SEC) ++ rtc->rtc_dev->uie_unsupported = 1; ++ + irq_alarm = platform_get_irq_byname(pdev, "ALARM"); + ret = devm_request_threaded_irq(&pdev->dev, irq_alarm, NULL, + da9063_alarm_event, +-- +2.20.1 + diff --git a/queue-4.4/rtc-sh-fix-invalid-alarm-warning-for-non-enabled-ala.patch b/queue-4.4/rtc-sh-fix-invalid-alarm-warning-for-non-enabled-ala.patch new file mode 100644 index 00000000000..c581ea80e60 --- /dev/null +++ b/queue-4.4/rtc-sh-fix-invalid-alarm-warning-for-non-enabled-ala.patch @@ -0,0 +1,46 @@ +From 379329392cbdfe93b0eecbb0cbd8f00e281f033f Mon Sep 17 00:00:00 2001 +From: Geert Uytterhoeven +Date: Wed, 20 Mar 2019 11:32:14 +0100 +Subject: rtc: sh: Fix invalid alarm warning for non-enabled alarm + +[ Upstream commit 15d82d22498784966df8e4696174a16b02cc1052 ] + +When no alarm has been programmed on RSK-RZA1, an error message is +printed during boot: + + rtc rtc0: invalid alarm value: 2019-03-14T255:255:255 + +sh_rtc_read_alarm_value() returns 0xff when querying a hardware alarm +field that is not enabled. __rtc_read_alarm() validates the received +alarm values, and fills in missing fields when needed. +While 0xff is handled fine for the year, month, and day fields, and +corrected as considered being out-of-range, this is not the case for the +hour, minute, and second fields, where -1 is expected for missing +fields. + +Fix this by returning -1 instead, as this value is handled fine for all +fields. + +Signed-off-by: Geert Uytterhoeven +Signed-off-by: Alexandre Belloni +Signed-off-by: Sasha Levin +--- + drivers/rtc/rtc-sh.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/rtc/rtc-sh.c b/drivers/rtc/rtc-sh.c +index 2b81dd4baf17..104c854d6a8a 100644 +--- a/drivers/rtc/rtc-sh.c ++++ b/drivers/rtc/rtc-sh.c +@@ -455,7 +455,7 @@ static int sh_rtc_set_time(struct device *dev, struct rtc_time *tm) + static inline int sh_rtc_read_alarm_value(struct sh_rtc *rtc, int reg_off) + { + unsigned int byte; +- int value = 0xff; /* return 0xff for ignored values */ ++ int value = -1; /* return -1 for ignored values */ + + byte = readb(rtc->regbase + reg_off); + if (byte & AR_ENB) { +-- +2.20.1 + diff --git a/queue-4.4/scsi-storvsc-fix-calculation-of-sub-channel-count.patch b/queue-4.4/scsi-storvsc-fix-calculation-of-sub-channel-count.patch new file mode 100644 index 00000000000..0f67ec39f7c --- /dev/null +++ b/queue-4.4/scsi-storvsc-fix-calculation-of-sub-channel-count.patch @@ -0,0 +1,58 @@ +From fc31c866903c5dcc9e408cf7bf7a97bbaa0a7c62 Mon Sep 17 00:00:00 2001 +From: Michael Kelley +Date: Mon, 1 Apr 2019 16:10:52 +0000 +Subject: scsi: storvsc: Fix calculation of sub-channel count + +[ Upstream commit 382e06d11e075a40b4094b6ef809f8d4bcc7ab2a ] + +When the number of sub-channels offered by Hyper-V is >= the number of CPUs +in the VM, calculate the correct number of sub-channels. The current code +produces one too many. + +This scenario arises only when the number of CPUs is artificially +restricted (for example, with maxcpus= on the kernel boot line), because +Hyper-V normally offers a sub-channel count < number of CPUs. While the +current code doesn't break, the extra sub-channel is unbalanced across the +CPUs (for example, a total of 5 channels on a VM with 4 CPUs). + +Signed-off-by: Michael Kelley +Reviewed-by: Vitaly Kuznetsov +Reviewed-by: Long Li +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/storvsc_drv.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c +index 44b7a69d022a..45cd4cf93af3 100644 +--- a/drivers/scsi/storvsc_drv.c ++++ b/drivers/scsi/storvsc_drv.c +@@ -613,13 +613,22 @@ static void handle_sc_creation(struct vmbus_channel *new_sc) + static void handle_multichannel_storage(struct hv_device *device, int max_chns) + { + struct storvsc_device *stor_device; +- int num_cpus = num_online_cpus(); + int num_sc; + struct storvsc_cmd_request *request; + struct vstor_packet *vstor_packet; + int ret, t; + +- num_sc = ((max_chns > num_cpus) ? num_cpus : max_chns); ++ /* ++ * If the number of CPUs is artificially restricted, such as ++ * with maxcpus=1 on the kernel boot line, Hyper-V could offer ++ * sub-channels >= the number of CPUs. These sub-channels ++ * should not be created. The primary channel is already created ++ * and assigned to one CPU, so check against # CPUs - 1. ++ */ ++ num_sc = min((int)(num_online_cpus() - 1), max_chns); ++ if (!num_sc) ++ return; ++ + stor_device = get_out_stor_device(device); + if (!stor_device) + return; +-- +2.20.1 + diff --git a/queue-4.4/series b/queue-4.4/series index 8e5517d7cf3..3900793ab89 100644 --- a/queue-4.4/series +++ b/queue-4.4/series @@ -117,3 +117,19 @@ usb-yurex-fix-protection-fault-after-device-removal.patch usb-w1-ds2490-fix-bug-caused-by-improper-use-of-altsetting-array.patch usb-core-fix-unterminated-string-returned-by-usb_string.patch usb-core-fix-bug-caused-by-duplicate-interface-pm-usage-counter.patch +hid-debug-fix-race-condition-with-between-rdesc_show.patch +rtc-sh-fix-invalid-alarm-warning-for-non-enabled-ala.patch +igb-fix-warn_once-on-runtime-suspend.patch +bonding-show-full-hw-address-in-sysfs-for-slave-entr.patch +jffs2-fix-use-after-free-on-symlink-traversal.patch +debugfs-fix-use-after-free-on-symlink-traversal.patch +rtc-da9063-set-uie_unsupported-when-relevant.patch +vfio-pci-use-correct-format-characters.patch +scsi-storvsc-fix-calculation-of-sub-channel-count.patch +net-hns-use-napi_poll_weight-for-hns-driver.patch +net-hns-fix-warning-when-remove-hns-driver-with-smmu.patch +hugetlbfs-fix-memory-leak-for-resv_map.patch +xsysace-fix-error-handling-in-ace_setup.patch +arm-orion-don-t-use-using-64-bit-dma-masks.patch +arm-iop-don-t-use-using-64-bit-dma-masks.patch +usb-usbip-fix-isoc-packet-num-validation-in-get_pipe.patch diff --git a/queue-4.4/usb-usbip-fix-isoc-packet-num-validation-in-get_pipe.patch b/queue-4.4/usb-usbip-fix-isoc-packet-num-validation-in-get_pipe.patch new file mode 100644 index 00000000000..19dafddd050 --- /dev/null +++ b/queue-4.4/usb-usbip-fix-isoc-packet-num-validation-in-get_pipe.patch @@ -0,0 +1,93 @@ +From a60fd39fb67f83d67adb0d09bcb12eeaec04c255 Mon Sep 17 00:00:00 2001 +From: Malte Leip +Date: Sun, 5 May 2019 19:57:56 +0200 +Subject: usb: usbip: fix isoc packet num validation in get_pipe + +commit c409ca3be3c6ff3a1eeb303b191184e80d412862 upstream. + +Backport of the upstream commit, which fixed c6688ef9f297. +c6688ef9f297 got backported as commit b6f826ba10dc, as the unavailable +function usb_endpoint_maxp_mult had to be replaced. The upstream commit +removed the call to this function, so the backport is straightforward. + +Original commit message: + +Change the validation of number_of_packets in get_pipe to compare the +number of packets to a fixed maximum number of packets allowed, set to +be 1024. This number was chosen due to it being used by other drivers as +well, for example drivers/usb/host/uhci-q.c + +Background/reason: +The get_pipe function in stub_rx.c validates the number of packets in +isochronous mode and aborts with an error if that number is too large, +in order to prevent malicious input from possibly triggering large +memory allocations. This was previously done by checking whether +pdu->u.cmd_submit.number_of_packets is bigger than the number of packets +that would be needed for pdu->u.cmd_submit.transfer_buffer_length bytes +if all except possibly the last packet had maximum length, given by +usb_endpoint_maxp(epd) * usb_endpoint_maxp_mult(epd). This leads to an +error if URBs with packets shorter than the maximum possible length are +submitted, which is allowed according to +Documentation/driver-api/usb/URB.rst and occurs for example with the +snd-usb-audio driver. + +Fixes: b6f826ba10dc ("usbip: fix stub_rx: harden CMD_SUBMIT path to handle malicious input") +Signed-off-by: Malte Leip +Cc: stable # 4.4.x +Signed-off-by: Sasha Levin +--- + drivers/usb/usbip/stub_rx.c | 18 +++--------------- + drivers/usb/usbip/usbip_common.h | 7 +++++++ + 2 files changed, 10 insertions(+), 15 deletions(-) + +diff --git a/drivers/usb/usbip/stub_rx.c b/drivers/usb/usbip/stub_rx.c +index 56cacb68040c..808e3a317954 100644 +--- a/drivers/usb/usbip/stub_rx.c ++++ b/drivers/usb/usbip/stub_rx.c +@@ -380,22 +380,10 @@ static int get_pipe(struct stub_device *sdev, struct usbip_header *pdu) + } + + if (usb_endpoint_xfer_isoc(epd)) { +- /* validate packet size and number of packets */ +- unsigned int maxp, packets, bytes; +- +-#define USB_EP_MAXP_MULT_SHIFT 11 +-#define USB_EP_MAXP_MULT_MASK (3 << USB_EP_MAXP_MULT_SHIFT) +-#define USB_EP_MAXP_MULT(m) \ +- (((m) & USB_EP_MAXP_MULT_MASK) >> USB_EP_MAXP_MULT_SHIFT) +- +- maxp = usb_endpoint_maxp(epd); +- maxp *= (USB_EP_MAXP_MULT( +- __le16_to_cpu(epd->wMaxPacketSize)) + 1); +- bytes = pdu->u.cmd_submit.transfer_buffer_length; +- packets = DIV_ROUND_UP(bytes, maxp); +- ++ /* validate number of packets */ + if (pdu->u.cmd_submit.number_of_packets < 0 || +- pdu->u.cmd_submit.number_of_packets > packets) { ++ pdu->u.cmd_submit.number_of_packets > ++ USBIP_MAX_ISO_PACKETS) { + dev_err(&sdev->udev->dev, + "CMD_SUBMIT: isoc invalid num packets %d\n", + pdu->u.cmd_submit.number_of_packets); +diff --git a/drivers/usb/usbip/usbip_common.h b/drivers/usb/usbip/usbip_common.h +index 0fc5ace57c0e..af903aa4ad90 100644 +--- a/drivers/usb/usbip/usbip_common.h ++++ b/drivers/usb/usbip/usbip_common.h +@@ -134,6 +134,13 @@ extern struct device_attribute dev_attr_usbip_debug; + #define USBIP_DIR_OUT 0x00 + #define USBIP_DIR_IN 0x01 + ++/* ++ * Arbitrary limit for the maximum number of isochronous packets in an URB, ++ * compare for example the uhci_submit_isochronous function in ++ * drivers/usb/host/uhci-q.c ++ */ ++#define USBIP_MAX_ISO_PACKETS 1024 ++ + /** + * struct usbip_header_basic - data pertinent to every request + * @command: the usbip request type +-- +2.20.1 + diff --git a/queue-4.4/vfio-pci-use-correct-format-characters.patch b/queue-4.4/vfio-pci-use-correct-format-characters.patch new file mode 100644 index 00000000000..a2d7db32268 --- /dev/null +++ b/queue-4.4/vfio-pci-use-correct-format-characters.patch @@ -0,0 +1,81 @@ +From 7635389c96cd3546fd017c04f33aed0ed5b6f029 Mon Sep 17 00:00:00 2001 +From: Louis Taylor +Date: Wed, 3 Apr 2019 12:36:20 -0600 +Subject: vfio/pci: use correct format characters + +[ Upstream commit 426b046b748d1f47e096e05bdcc6fb4172791307 ] + +When compiling with -Wformat, clang emits the following warnings: + +drivers/vfio/pci/vfio_pci.c:1601:5: warning: format specifies type + 'unsigned short' but the argument has type 'unsigned int' [-Wformat] + vendor, device, subvendor, subdevice, + ^~~~~~ + +drivers/vfio/pci/vfio_pci.c:1601:13: warning: format specifies type + 'unsigned short' but the argument has type 'unsigned int' [-Wformat] + vendor, device, subvendor, subdevice, + ^~~~~~ + +drivers/vfio/pci/vfio_pci.c:1601:21: warning: format specifies type + 'unsigned short' but the argument has type 'unsigned int' [-Wformat] + vendor, device, subvendor, subdevice, + ^~~~~~~~~ + +drivers/vfio/pci/vfio_pci.c:1601:32: warning: format specifies type + 'unsigned short' but the argument has type 'unsigned int' [-Wformat] + vendor, device, subvendor, subdevice, + ^~~~~~~~~ + +drivers/vfio/pci/vfio_pci.c:1605:5: warning: format specifies type + 'unsigned short' but the argument has type 'unsigned int' [-Wformat] + vendor, device, subvendor, subdevice, + ^~~~~~ + +drivers/vfio/pci/vfio_pci.c:1605:13: warning: format specifies type + 'unsigned short' but the argument has type 'unsigned int' [-Wformat] + vendor, device, subvendor, subdevice, + ^~~~~~ + +drivers/vfio/pci/vfio_pci.c:1605:21: warning: format specifies type + 'unsigned short' but the argument has type 'unsigned int' [-Wformat] + vendor, device, subvendor, subdevice, + ^~~~~~~~~ + +drivers/vfio/pci/vfio_pci.c:1605:32: warning: format specifies type + 'unsigned short' but the argument has type 'unsigned int' [-Wformat] + vendor, device, subvendor, subdevice, + ^~~~~~~~~ +The types of these arguments are unconditionally defined, so this patch +updates the format character to the correct ones for unsigned ints. + +Link: https://github.com/ClangBuiltLinux/linux/issues/378 +Signed-off-by: Louis Taylor +Reviewed-by: Nick Desaulniers +Signed-off-by: Alex Williamson +Signed-off-by: Sasha Levin +--- + drivers/vfio/pci/vfio_pci.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c +index b31b84f56e8f..47b229fa5e8e 100644 +--- a/drivers/vfio/pci/vfio_pci.c ++++ b/drivers/vfio/pci/vfio_pci.c +@@ -1191,11 +1191,11 @@ static void __init vfio_pci_fill_ids(void) + rc = pci_add_dynid(&vfio_pci_driver, vendor, device, + subvendor, subdevice, class, class_mask, 0); + if (rc) +- pr_warn("failed to add dynamic id [%04hx:%04hx[%04hx:%04hx]] class %#08x/%08x (%d)\n", ++ pr_warn("failed to add dynamic id [%04x:%04x[%04x:%04x]] class %#08x/%08x (%d)\n", + vendor, device, subvendor, subdevice, + class, class_mask, rc); + else +- pr_info("add [%04hx:%04hx[%04hx:%04hx]] class %#08x/%08x\n", ++ pr_info("add [%04x:%04x[%04x:%04x]] class %#08x/%08x\n", + vendor, device, subvendor, subdevice, + class, class_mask); + } +-- +2.20.1 + diff --git a/queue-4.4/xsysace-fix-error-handling-in-ace_setup.patch b/queue-4.4/xsysace-fix-error-handling-in-ace_setup.patch new file mode 100644 index 00000000000..8d9ea98f112 --- /dev/null +++ b/queue-4.4/xsysace-fix-error-handling-in-ace_setup.patch @@ -0,0 +1,85 @@ +From 691df174ad5e59b8db1cca851dcdd4e4605f5722 Mon Sep 17 00:00:00 2001 +From: Guenter Roeck +Date: Tue, 19 Feb 2019 08:49:56 -0800 +Subject: xsysace: Fix error handling in ace_setup + +[ Upstream commit 47b16820c490149c2923e8474048f2c6e7557cab ] + +If xace hardware reports a bad version number, the error handling code +in ace_setup() calls put_disk(), followed by queue cleanup. However, since +the disk data structure has the queue pointer set, put_disk() also +cleans and releases the queue. This results in blk_cleanup_queue() +accessing an already released data structure, which in turn may result +in a crash such as the following. + +[ 10.681671] BUG: Kernel NULL pointer dereference at 0x00000040 +[ 10.681826] Faulting instruction address: 0xc0431480 +[ 10.682072] Oops: Kernel access of bad area, sig: 11 [#1] +[ 10.682251] BE PAGE_SIZE=4K PREEMPT Xilinx Virtex440 +[ 10.682387] Modules linked in: +[ 10.682528] CPU: 0 PID: 1 Comm: swapper Tainted: G W 5.0.0-rc6-next-20190218+ #2 +[ 10.682733] NIP: c0431480 LR: c043147c CTR: c0422ad8 +[ 10.682863] REGS: cf82fbe0 TRAP: 0300 Tainted: G W (5.0.0-rc6-next-20190218+) +[ 10.683065] MSR: 00029000 CR: 22000222 XER: 00000000 +[ 10.683236] DEAR: 00000040 ESR: 00000000 +[ 10.683236] GPR00: c043147c cf82fc90 cf82ccc0 00000000 00000000 00000000 00000002 00000000 +[ 10.683236] GPR08: 00000000 00000000 c04310bc 00000000 22000222 00000000 c0002c54 00000000 +[ 10.683236] GPR16: 00000000 00000001 c09aa39c c09021b0 c09021dc 00000007 c0a68c08 00000000 +[ 10.683236] GPR24: 00000001 ced6d400 ced6dcf0 c0815d9c 00000000 00000000 00000000 cedf0800 +[ 10.684331] NIP [c0431480] blk_mq_run_hw_queue+0x28/0x114 +[ 10.684473] LR [c043147c] blk_mq_run_hw_queue+0x24/0x114 +[ 10.684602] Call Trace: +[ 10.684671] [cf82fc90] [c043147c] blk_mq_run_hw_queue+0x24/0x114 (unreliable) +[ 10.684854] [cf82fcc0] [c04315bc] blk_mq_run_hw_queues+0x50/0x7c +[ 10.685002] [cf82fce0] [c0422b24] blk_set_queue_dying+0x30/0x68 +[ 10.685154] [cf82fcf0] [c0423ec0] blk_cleanup_queue+0x34/0x14c +[ 10.685306] [cf82fd10] [c054d73c] ace_probe+0x3dc/0x508 +[ 10.685445] [cf82fd50] [c052d740] platform_drv_probe+0x4c/0xb8 +[ 10.685592] [cf82fd70] [c052abb0] really_probe+0x20c/0x32c +[ 10.685728] [cf82fda0] [c052ae58] driver_probe_device+0x68/0x464 +[ 10.685877] [cf82fdc0] [c052b500] device_driver_attach+0xb4/0xe4 +[ 10.686024] [cf82fde0] [c052b5dc] __driver_attach+0xac/0xfc +[ 10.686161] [cf82fe00] [c0528428] bus_for_each_dev+0x80/0xc0 +[ 10.686314] [cf82fe30] [c0529b3c] bus_add_driver+0x144/0x234 +[ 10.686457] [cf82fe50] [c052c46c] driver_register+0x88/0x15c +[ 10.686610] [cf82fe60] [c09de288] ace_init+0x4c/0xac +[ 10.686742] [cf82fe80] [c0002730] do_one_initcall+0xac/0x330 +[ 10.686888] [cf82fee0] [c09aafd0] kernel_init_freeable+0x34c/0x478 +[ 10.687043] [cf82ff30] [c0002c6c] kernel_init+0x18/0x114 +[ 10.687188] [cf82ff40] [c000f2f0] ret_from_kernel_thread+0x14/0x1c +[ 10.687349] Instruction dump: +[ 10.687435] 3863ffd4 4bfffd70 9421ffd0 7c0802a6 93c10028 7c9e2378 93e1002c 38810008 +[ 10.687637] 7c7f1b78 90010034 4bfffc25 813f008c <81290040> 75290100 4182002c 80810008 +[ 10.688056] ---[ end trace 13c9ff51d41b9d40 ]--- + +Fix the problem by setting the disk queue pointer to NULL before calling +put_disk(). A more comprehensive fix might be to rearrange the code +to check the hardware version before initializing data structures, +but I don't know if this would have undesirable side effects, and +it would increase the complexity of backporting the fix to older kernels. + +Fixes: 74489a91dd43a ("Add support for Xilinx SystemACE CompactFlash interface") +Acked-by: Michal Simek +Signed-off-by: Guenter Roeck +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + drivers/block/xsysace.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/block/xsysace.c b/drivers/block/xsysace.c +index c4328d9d9981..f838119d12b2 100644 +--- a/drivers/block/xsysace.c ++++ b/drivers/block/xsysace.c +@@ -1062,6 +1062,8 @@ static int ace_setup(struct ace_device *ace) + return 0; + + err_read: ++ /* prevent double queue cleanup */ ++ ace->gd->queue = NULL; + put_disk(ace->gd); + err_alloc_disk: + blk_cleanup_queue(ace->queue); +-- +2.20.1 +