mfd: intel-lpss: Do not put device in reset state on suspend
A message that is not in the archive (sent off-list or not yet received): [email protected]
Greg Kroah-Hartman
maintainerPATCH 1/31 x86/cpu/AMD: Fix cpu_llc_id for AMD Fam17h systems
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yazen Ghannam <[email protected]>
commit b0b6e86846093c5f8820386bc01515f857dd8faa upstream.
cpu_llc_id (Last Level Cache ID) derivation on AMD Fam17h has an underflow bug when extracting the socket_id value. It starts from 0 so subtracting 1 from it will result in an invalid value. This breaks scheduling topology later on since the cpu_llc_id will be incorrect.
For example, the the cpu_llc_id of the *other* CPU in the loops in set_cpu_sibling_map() underflows and we're generating the funniest thread_siblings masks and then when I run 8 threads of nbench, they get spread around the LLC domains in a very strange pattern which doesn't give you the normal scheduling spread one would expect for performance.
Other things like EDAC use cpu_llc_id so they will be b0rked too.
So, the APIC ID is preset in APICx020 for bits 3 and above: they contain the core complex, node and socket IDs.
The LLC is at the core complex level so we can find a unique cpu_llc_id by right shifting the APICID by 3 because then the least significant bit will be the Core Complex ID.
--- arch/x86/kernel/cpu/amd.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
arch/x86/kernel/cpu/amd.c +1 -5
@@ -352,7 +352,6 @@ static void amd_detect_cmp(struct cpuinf#ifdef CONFIG_SMP unsigned bits;int cpu =smp_processor_id (); -unsigned int socket_id, core_complex_id; bits = c->x86_coreid_bits;/* Low order bits define the core id (index of core in socket) */
@@ -370,10 +369,7 @@ static void amd_detect_cmp(struct cpuinfif (c->x86 !=0x17 || !cpuid_edx (0x80000006 ))return ; - socket_id = (c->apicid >> bits) -1 ; - core_complex_id = (c->apicid & ((1 << bits) -1 )) >>3 ; - -per_cpu (cpu_llc_id, cpu) = (socket_id <<3 ) | core_complex_id; +per_cpu (cpu_llc_id, cpu) = c->apicid >>3 ;#endif }
Greg Kroah-Hartman
maintainerPATCH 4/31 fuse: fix fuse_write_end() if zero bytes were copied
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miklos Szeredi <[email protected]>
commit 59c3b76cc61d1d676f965c192cc7969aa5cb2744 upstream.
If pos is at the beginning of a page and copied is zero then page is not zeroed but is marked uptodate.
Fix by skipping everything except unlock/put of page if zero bytes were copied.
--- fs/fuse/file.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/fuse/file.c +6 -0
@@ -1997,6 +1997,10 @@ static int fuse_write_end(struct file *f {struct inode *inode = page->mapping->host; +/* Haven't copied anything? Skip zeroing, size extending, dirtying. */ +if (!copied) + goto unlock; +if (!PageUptodate (page)) {/* Zero any unwritten bytes at the end of the page */ size_t endoff = (pos + copied) & ~PAGE_CACHE_MASK ;
@@ -2007,6 +2011,8 @@ static int fuse_write_end(struct file *ffuse_write_update_size (inode, pos + copied);set_page_dirty (page); + +unlock:unlock_page (page);page_cache_release (page);
Greg Kroah-Hartman
maintainerPATCH 5/31 mfd: intel-lpss: Do not put device in reset state on suspend
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Azhar Shaikh <[email protected]>
commit 274e43edcda6f709aa67e436b3123e45a6270923 upstream.
Commit 41a3da2b8e163 ("mfd: intel-lpss: Save register context on suspend") saved the register context while going to suspend and also put the device in reset state.
Due to the resetting of device, system cannot enter S3/S0ix states when no_console_suspend flag is enabled. The system and serial console both hang. The resetting of device is not needed while going to suspend. Hence remove this code.
--- drivers/mfd/intel-lpss.c | 3 --- 1 file changed, 3 deletions(-)
drivers/mfd/intel-lpss.c +0 -3
@@ -494,9 +494,6 @@ int intel_lpss_suspend(struct device *defor (i =0 ; i <LPSS_PRIV_REG_COUNT ; i++) lpss->priv_ctx[i] =readl (lpss->priv + i *4 ); -/* Put the device into reset state */ -writel (0 , lpss->priv +LPSS_PRIV_RESETS ); -return 0 ; }EXPORT_SYMBOL_GPL (intel_lpss_suspend);
Hi Greg,
Please pick this patch. No concerns.
Regards,
Azhar Shaikh
-----Original Message-----
From: Greg Kroah-Hartman [mailto:[email protected]]
Sent: Thursday, November 24, 2016 6:55 AM
To: [email protected]
Cc: Greg Kroah-Hartman <[email protected]>; [email protected]; Shaikh, Azhar <[email protected]>; Mika Westerberg <[email protected]>; Andy Shevchenko <[email protected]>; Lee Jones <[email protected]>
Subject: [PATCH 4.4 05/31] mfd: intel-lpss: Do not put device in reset state on suspend
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Azhar Shaikh <[email protected]>
commit 274e43edcda6f709aa67e436b3123e45a6270923 upstream.
Commit 41a3da2b8e163 ("mfd: intel-lpss: Save register context on
suspend") saved the register context while going to suspend and also put the device in reset state.
Due to the resetting of device, system cannot enter S3/S0ix states when no_console_suspend flag is enabled. The system and serial console both hang. The resetting of device is not needed while going to suspend. Hence remove this code.
--- drivers/mfd/intel-lpss.c | 3 --- 1 file changed, 3 deletions(-)
drivers/mfd/intel-lpss.c +0 -3
@@ -494,9 +494,6 @@ int intel_lpss_suspend(struct device *defor (i =0 ; i <LPSS_PRIV_REG_COUNT ; i++) lpss->priv_ctx[i] =readl (lpss->priv + i *4 ); -/* Put the device into reset state */ -writel (0 , lpss->priv +LPSS_PRIV_RESETS ); -return 0 ; }EXPORT_SYMBOL_GPL (intel_lpss_suspend);
Greg Kroah-Hartman
maintainerPATCH 6/31 can: bcm: fix warning in bcm_connect/proc_register
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Hartkopp <[email protected]>
commit deb507f91f1adbf64317ad24ac46c56eeccfb754 upstream.
Andrey Konovalov reported an issue with proc_register in bcm.c. As suggested by Cong Wang this patch adds a lock_sock() protection and a check for unsuccessful proc_create_data() in bcm_connect().
Reference: http://marc.info/?l=linux-netdev&m=147732648731237
--- net/can/bcm.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-)
net/can/bcm.c +23 -9
@@ -1500,24 +1500,31 @@ static int bcm_connect(struct socket *sostruct sockaddr_can *addr = (struct sockaddr_can *)uaddr;struct sock *sk = sock->sk;struct bcm_sock *bo =bcm_sk (sk); +int ret =0 ;if (len <sizeof (*addr))return -EINVAL ; -if (bo->bound) -return -EISCONN ; +lock_sock (sk); + +if (bo->bound) { + ret = -EISCONN ; + goto fail; + }/* bind a device to this socket */ if (addr->can_ifindex) {struct net_device *dev; dev =dev_get_by_index (&init_net, addr->can_ifindex); -if (!dev) -return -ENODEV ; - +if (!dev) { + ret = -ENODEV ; + goto fail; + }if (dev->type !=ARPHRD_CAN ) {dev_put (dev); -return -ENODEV ; + ret = -ENODEV ; + goto fail; } bo->ifindex = dev->ifindex;
@@ -1528,17 +1535,24 @@ static int bcm_connect(struct socket *so bo->ifindex =0 ; } - bo->bound =1 ; -if (proc_dir) {/* unique socket address as filename */ sprintf (bo->procname,"%lu" ,sock_i_ino (sk)); bo->bcm_proc_read =proc_create_data (bo->procname,0644 , proc_dir, &bcm_proc_fops, sk); +if (!bo->bcm_proc_read) { + ret = -ENOMEM ; + goto fail; + } } -return 0 ; + bo->bound =1 ; + +fail: +release_sock (sk); + +return ret; } static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
Greg Kroah-Hartman
maintainerPATCH 7/31 i2c: mux: fix up dependencies
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Walleij <[email protected]>
commit 93d710a65ef02fb7fd48ae207e78f460bd7a6089 upstream.
We get the following build error from UM Linux after adding an entry to drivers/iio/gyro/Kconfig that issues "select I2C_MUX":
ERROR: "devm_ioremap_resource"
[drivers/i2c/muxes/i2c-mux-reg.ko] undefined!
ERROR: "of_address_to_resource"
[drivers/i2c/muxes/i2c-mux-reg.ko] undefined!
It appears that the I2C mux core code depends on HAS_IOMEM for historical reasons, while CONFIG_I2C_MUX_REG does *not* have a direct dependency on HAS_IOMEM.
This creates a situation where a allyesconfig or allmodconfig for UM Linux will select I2C_MUX, and will implicitly enable I2C_MUX_REG as well, and the compilation will fail for the register driver.
Fix this up by making I2C_MUX_REG depend on HAS_IOMEM and removing the dependency from I2C_MUX.
--- drivers/i2c/Kconfig | 1 - drivers/i2c/muxes/Kconfig | 1 + 2 files changed, 1 insertion(+), 1 deletion(-)
drivers/i2c/Kconfig +0 -1
@@ -59,7 +59,6 @@ config I2C_CHARDEV config I2C_MUX tristate "I2C bus multiplexing support" - depends on HAS_IOMEM help Say Y here if you want the I2C core to support the ability to handle multiplexed I2C bus topologies, by presenting each
drivers/i2c/muxes/Kconfig +1 -0
@@ -63,6 +63,7 @@ config I2C_MUX_PINCTRL config I2C_MUX_REG tristate "Register-based I2C multiplexer" + depends on HAS_IOMEM help If you say yes to this option, support will be included for a register based I2C multiplexer. This driver provides access to
Greg Kroah-Hartman
maintainerPATCH 9/31 scripts/has-stack-protector: add -fno-PIE
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <[email protected]>
commit 82031ea29e454b574bc6f49a33683a693ca5d907 upstream.
Adding -no-PIE to the fstack protector check. -no-PIE was introduced before -fstack-protector so there is no need for a runtime check.
Without it the build stops:
|Cannot use CONFIG_CC_STACKPROTECTOR_STRONG: -fstack-protector-strong available but compiler is broken
due to -mcmodel=kernel + -fPIE if -fPIE is enabled by default.
Tagging it stable so it is possible to compile recent stable kernels as well.
--- scripts/gcc-x86_64-has-stack-protector.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/gcc-x86_64-has-stack-protector.sh +1 -1
@@ -1,6 +1,6 @@ #!/bin/sh -echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fstack-protector - -o - 2> /dev/null | grep -q "%gs" +echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fno-PIE -fstack-protector - -o - 2> /dev/null | grep -q "%gs" if [ "$?" -eq "0" ] ; then echo y else
Greg Kroah-Hartman
maintainerPATCH 10/31 x86/kexec: add -fno-PIE
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <[email protected]>
commit 90944e40ba1838de4b2a9290cf273f9d76bd3bdd upstream.
If the gcc is configured to do -fPIE by default then the build aborts later with:
| Unsupported relocation type: unknown type rel type name (29)
Tagging it stable so it is possible to compile recent stable kernels as well.
--- arch/x86/purgatory/Makefile | 1 + 1 file changed, 1 insertion(+)
arch/x86/purgatory/Makefile +1 -0
@@ -12,6 +12,7 @@ targets += purgatory.ro KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes -fno-zero-initialized-in-bss -fno-builtin -ffreestanding -c -MD -Os -mcmodel=large KBUILD_CFLAGS += -m$(BITS) +KBUILD_CFLAGS += $(call cc-option,-fno-PIE) $(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE $(call if_changed,ld)
Greg Kroah-Hartman
maintainerPATCH 11/31 kbuild: Steal gccs pie from the very beginning
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Borislav Petkov <[email protected]>
commit c6a385539175ebc603da53aafb7753d39089f32e upstream.
So Sebastian turned off the PIE for kernel builds but that was too late
- Kbuild.include already uses KBUILD_CFLAGS and trying to disable gcc options with, say cc-disable-warning, fails:
gcc -D__KERNEL__ -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs
...
-Wno-sign-compare -fno-asynchronous-unwind-tables -Wframe-address -c -x c /dev/null -o .31392.tmp /dev/null:1:0: error: code model kernel does not support PIC mode
because that returns an error and we can't disable the warning. For example in this case:
KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,)
which leads to gcc issuing all those warnings again.
So let's turn off PIE/PIC at the earliest possible moment, when we declare KBUILD_CFLAGS so that cc-disable-warning picks it up too.
Also, we need the $(call cc-option ...) because -fno-PIE is supported since gcc v3.4 and our lowest supported gcc version is 3.2 right now.
--- Makefile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
Makefile +3 -4
@@ -395,11 +395,12 @@ KBUILD_CFLAGS := -Wall -Wundef -Wstric -fno-strict-aliasing -fno-common \ -Werror-implicit-function-declaration \ -Wno-format-security \ - -std=gnu89 + -std=gnu89 $(call cc-option,-fno-PIE) + KBUILD_AFLAGS_KERNEL := KBUILD_CFLAGS_KERNEL := -KBUILD_AFLAGS := -D__ASSEMBLY__ +KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE) KBUILD_AFLAGS_MODULE := -DMODULE KBUILD_CFLAGS_MODULE := -DMODULE KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
@@ -618,8 +619,6 @@ include arch/$(SRCARCH)/Makefile KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,) KBUILD_CFLAGS += $(call cc-disable-warning,maybe-uninitialized,) KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,) -KBUILD_CFLAGS += $(call cc-option,-fno-PIE) -KBUILD_AFLAGS += $(call cc-option,-fno-PIE) ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE KBUILD_CFLAGS += -Os
Greg Kroah-Hartman
maintainerPATCH 12/31 ext4: sanity check the block and cluster size at mount time
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Theodore Ts'o <[email protected]>
commit 8cdf3372fe8368f56315e66bea9f35053c418093 upstream.
If the block size or cluster size is insane, reject the mount. This is important for security reasons (although we shouldn't be just depending on this check).
Ref: http://www.securityfocus.com/archive/1/539661
Ref: https://bugzilla.redhat.com/show_bug.cgi?id=1332506
--- fs/ext4/ext4.h | 1 + fs/ext4/super.c | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 1 deletion(-)
fs/ext4/ext4.h +1 -0
@@ -221,6 +221,7 @@ struct ext4_io_submit {#define EXT4_MAX_BLOCK_SIZE 65536#define EXT4_MIN_BLOCK_LOG_SIZE 10#define EXT4_MAX_BLOCK_LOG_SIZE 16 +#define EXT4_MAX_CLUSTER_LOG_SIZE 30#ifdef __KERNEL__# define EXT4_BLOCK_SIZE (s) ((s)->s_blocksize)#else
fs/ext4/super.c +16 -1
@@ -3394,7 +3394,15 @@ static int ext4_fill_super(struct super_if (blocksize <EXT4_MIN_BLOCK_SIZE || blocksize >EXT4_MAX_BLOCK_SIZE ) {ext4_msg (sb,KERN_ERR , -"Unsupported filesystem blocksize %d" , blocksize); +"Unsupported filesystem blocksize %d (%d log_block_size)" , + blocksize,le32_to_cpu (es->s_log_block_size)); + goto failed_mount; + } +if (le32_to_cpu (es->s_log_block_size) > + (EXT4_MAX_BLOCK_LOG_SIZE -EXT4_MIN_BLOCK_LOG_SIZE )) { +ext4_msg (sb,KERN_ERR , +"Invalid log block size: %u" , +le32_to_cpu (es->s_log_block_size)); goto failed_mount; }
@@ -3533,6 +3541,13 @@ static int ext4_fill_super(struct super_ "block size (%d)", clustersize, blocksize); goto failed_mount; } +if (le32_to_cpu (es->s_log_cluster_size) > + (EXT4_MAX_CLUSTER_LOG_SIZE -EXT4_MIN_BLOCK_LOG_SIZE )) { +ext4_msg (sb,KERN_ERR , +"Invalid log cluster size: %u" , +le32_to_cpu (es->s_log_cluster_size)); + goto failed_mount; + } sbi->s_cluster_bits =le32_to_cpu (es->s_log_cluster_size) -le32_to_cpu (es->s_log_block_size); sbi->s_clusters_per_group =
Greg Kroah-Hartman
maintainerPATCH 15/31 clk: mmp: pxa910: fix return value check in pxa910_clk_init()
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
commit 10f2bfb092e3b49000526c02cfe8b2abbbdbb752 upstream.
Fix the retrn value check which testing the wrong variable in pxa910_clk_init().
--- drivers/clk/mmp/clk-of-pxa910.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/mmp/clk-of-pxa910.c +2 -2
@@ -282,7 +282,7 @@ static void __init pxa910_clk_init(struc } pxa_unit->apmu_base =of_iomap (np,1 ); -if (!pxa_unit->mpmu_base) { +if (!pxa_unit->apmu_base) {pr_err ("failed to map apmu registers\n" );return ; }
@@ -294,7 +294,7 @@ static void __init pxa910_clk_init(struc } pxa_unit->apbcp_base =of_iomap (np,3 ); -if (!pxa_unit->mpmu_base) { +if (!pxa_unit->apbcp_base) {pr_err ("failed to map apbcp registers\n" );return ; }
Greg Kroah-Hartman
maintainerPATCH 16/31 clk: mmp: pxa168: fix return value check in pxa168_clk_init()
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
commit deab07261d54b4db7b627d38e0efac97f176c6d6 upstream.
Fix the retrn value check which testing the wrong variable in pxa168_clk_init().
--- drivers/clk/mmp/clk-of-pxa168.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/mmp/clk-of-pxa168.c +1 -1
@@ -262,7 +262,7 @@ static void __init pxa168_clk_init(struc } pxa_unit->apmu_base =of_iomap (np,1 ); -if (!pxa_unit->mpmu_base) { +if (!pxa_unit->apmu_base) {pr_err ("failed to map apmu registers\n" );return ; }
Greg Kroah-Hartman
maintainerPATCH 17/31 clk: mmp: mmp2: fix return value check in mmp2_clk_init()
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
commit a29e52a6e66f4c0c895e7083e4bad2e7957f1fb5 upstream.
Fix the retrn value check which testing the wrong variable in mmp2_clk_init().
--- drivers/clk/mmp/clk-of-mmp2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/mmp/clk-of-mmp2.c +1 -1
@@ -313,7 +313,7 @@ static void __init mmp2_clk_init(struct } pxa_unit->apmu_base =of_iomap (np,1 ); -if (!pxa_unit->mpmu_base) { +if (!pxa_unit->apmu_base) {pr_err ("failed to map apmu registers\n" );return ; }
Greg Kroah-Hartman
maintainerPATCH 18/31 rtc: omap: Fix selecting external osc
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lokesh Vutla <[email protected]>
commit 3984903a2e3906d3def220e688040ce93368200a upstream.
RTC can be clocked from an external 32KHz oscillator, or from the Peripheral PLL. The RTC has an internal oscillator buffer to support direct operation with a crystal.
----------------------------------------
| Device --------- |
| | | |
| | RTCSS | |
| --------- | | |
OSC |<------| RTC | | | |
|------>| OSC |--- | | |
| -------- | | | |
| ----|clk | |
| -------- | | | |
| | PRCM |--- | | |
| -------- -------- |
----------------------------------------The RTC functional clock is sourced by default from the clock derived from the Peripheral PLL. In order to select source as external osc clk the following changes needs to be done:
- Enable the RTC OSC (RTC_OSC_REG[4]OSC32K_GZ = 0)
- Enable the clock mux(RTC_OSC_REG[6]K32CLK_EN = 1)
- Select the external clock source (RTC_OSC_REG[3]32KCLK_SEL = 1)
--- drivers/rtc/rtc-omap.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/rtc/rtc-omap.c +4 -2
@@ -109,6 +109,7 @@/* OMAP_RTC_OSC_REG bit fields: */ #define OMAP_RTC_OSC_32KCLK_EN BIT(6)#define OMAP_RTC_OSC_SEL_32KCLK_SRC BIT(3) +#define OMAP_RTC_OSC_OSC32K_GZ_DISABLE BIT(4)/* OMAP_RTC_IRQWAKEEN bit fields: */ #define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1)
@@ -646,8 +647,9 @@ static int omap_rtc_probe(struct platfor*/ if (rtc->has_ext_clk) { reg =rtc_read (rtc,OMAP_RTC_OSC_REG ); -rtc_write (rtc,OMAP_RTC_OSC_REG , - reg |OMAP_RTC_OSC_SEL_32KCLK_SRC ); + reg &= ~OMAP_RTC_OSC_OSC32K_GZ_DISABLE ; + reg |=OMAP_RTC_OSC_32KCLK_EN |OMAP_RTC_OSC_SEL_32KCLK_SRC ; +rtc_writel (rtc,OMAP_RTC_OSC_REG , reg); } rtc->type->lock (rtc);
Greg Kroah-Hartman
maintainerPATCH 19/31 iwlwifi: pcie: fix SPLC structure parsing
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luca Coelho <[email protected]>
commit e0d9727c111a5917a1184c71c1a8e6f78c7fc41d upstream.
The SPLC data parsing is too restrictive and was not trying find the correct element for WiFi. This causes problems with some BIOSes where the SPLC method exists, but doesn't have a WiFi entry on the first element of the list. The domain type values are also incorrect according to the specification.
Fix this by complying with the actual specification.
Additionally, replace all occurrences of SPLX to SPLC, since SPLX is only a structure internal to the ACPI tables, and may not even exist.
--- drivers/net/wireless/iwlwifi/pcie/drv.c | 77 +++++++++++++++++++------------- 1 file changed, 47 insertions(+), 30 deletions(-)
drivers/net/wireless/iwlwifi/pcie/drv.c +47 -30
@@ -475,48 +475,64 @@ static const struct pci_device_id iwl_hwMODULE_DEVICE_TABLE (pci, iwl_hw_card_ids);#ifdef CONFIG_ACPI -#define SPL_METHOD "SPLC" -#define SPL_DOMAINTYPE_MODULE BIT(0) -#define SPL_DOMAINTYPE_WIFI BIT(1) -#define SPL_DOMAINTYPE_WIGIG BIT(2) -#define SPL_DOMAINTYPE_RFEM BIT(3) +#define ACPI_SPLC_METHOD "SPLC" +#define ACPI_SPLC_DOMAIN_WIFI (0x07) -static u64 splx_get_pwr_limit (struct iwl_trans *trans,union acpi_object *splx) +static u64 splc_get_pwr_limit (struct iwl_trans *trans,union acpi_object *splc) { -union acpi_object *limits, *domain_type, *power_limit; +union acpi_object *data_pkg, *dflt_pwr_limit; +int i; -if (splx->type !=ACPI_TYPE_PACKAGE || - splx->package.count !=2 || - splx->package.elements[0 ].type !=ACPI_TYPE_INTEGER || - splx->package.elements[0 ].integer.value !=0 ) { -IWL_ERR (trans,"Unsupported splx structure\n" ); +/* We need at least two elements, one for the revision and one +* for the data itself. Also check that the revision is +* supported (currently only revision 0). +*/ +if (splc->type !=ACPI_TYPE_PACKAGE || + splc->package.count <2 || + splc->package.elements[0 ].type !=ACPI_TYPE_INTEGER || + splc->package.elements[0 ].integer.value !=0 ) { +IWL_DEBUG_INFO (trans, +"Unsupported structure returned by the SPLC method. Ignoring.\n" );return 0 ; } - limits = &splx->package.elements[1 ]; -if (limits->type !=ACPI_TYPE_PACKAGE || - limits->package.count <2 || - limits->package.elements[0 ].type !=ACPI_TYPE_INTEGER || - limits->package.elements[1 ].type !=ACPI_TYPE_INTEGER ) { -IWL_ERR (trans,"Invalid limits element\n" ); -return 0 ; +/* loop through all the packages to find the one for WiFi */ +for (i =1 ; i < splc->package.count; i++) { +union acpi_object *domain; + + data_pkg = &splc->package.elements[i]; + +/* Skip anything that is not a package with the right +* amount of elements (i.e. at least 2 integers). +*/ +if (data_pkg->type !=ACPI_TYPE_PACKAGE || + data_pkg->package.count <2 || + data_pkg->package.elements[0 ].type !=ACPI_TYPE_INTEGER || + data_pkg->package.elements[1 ].type !=ACPI_TYPE_INTEGER ) +continue ; + + domain = &data_pkg->package.elements[0 ]; +if (domain->integer.value ==ACPI_SPLC_DOMAIN_WIFI ) +break ; + + data_pkg =NULL ; } - domain_type = &limits->package.elements[0 ]; - power_limit = &limits->package.elements[1 ]; -if (!(domain_type->integer.value &SPL_DOMAINTYPE_WIFI )) { -IWL_DEBUG_INFO (trans,"WiFi power is not limited\n" ); +if (!data_pkg) { +IWL_DEBUG_INFO (trans, +"No element for the WiFi domain returned by the SPLC method.\n" );return 0 ; } -return power_limit->integer.value; + dflt_pwr_limit = &data_pkg->package.elements[1 ]; +return dflt_pwr_limit->integer.value; }static void set_dflt_pwr_limit (struct iwl_trans *trans,struct pci_dev *pdev) {acpi_handle pxsx_handle;acpi_handle handle; -struct acpi_buffer splx = {ACPI_ALLOCATE_BUFFER ,NULL }; +struct acpi_buffer splc = {ACPI_ALLOCATE_BUFFER ,NULL };acpi_status status; pxsx_handle =ACPI_HANDLE (&pdev->dev);
@@ -527,23 +543,24 @@ static void set_dflt_pwr_limit(struct iw }/* Get the method's handle */ - status =acpi_get_handle (pxsx_handle, (acpi_string )SPL_METHOD , &handle); + status =acpi_get_handle (pxsx_handle, (acpi_string )ACPI_SPLC_METHOD , + &handle);if (ACPI_FAILURE (status)) { -IWL_DEBUG_INFO (trans,"SPL method not found\n" ); +IWL_DEBUG_INFO (trans,"SPLC method not found\n" );return ; }/* Call SPLC with no arguments */ - status =acpi_evaluate_object (handle,NULL ,NULL , &splx); + status =acpi_evaluate_object (handle,NULL ,NULL , &splc);if (ACPI_FAILURE (status)) {IWL_ERR (trans,"SPLC invocation failed (0x%x)\n" , status);return ; } - trans->dflt_pwr_limit =splx_get_pwr_limit (trans, splx.pointer); + trans->dflt_pwr_limit =splc_get_pwr_limit (trans, splc.pointer);IWL_DEBUG_INFO (trans,"Default power limit set to %lld\n" , trans->dflt_pwr_limit); -kfree (splx.pointer); +kfree (splc.pointer); }#else /* CONFIG_ACPI */
Greg Kroah-Hartman
maintainerPATCH 20/31 mfd: core: Fix device reference leak in mfd_clone_cell
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 722f191080de641f023feaa7d5648caf377844f5 upstream.
Make sure to drop the reference taken by bus_find_device_by_name() before returning from mfd_clone_cell().
--- drivers/mfd/mfd-core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/mfd/mfd-core.c +2 -0
@@ -354,6 +354,8 @@ int mfd_clone_cell(const char *cell, con clones[i]); } +put_device (dev); +return 0 ; }EXPORT_SYMBOL (mfd_clone_cell);
Greg Kroah-Hartman
maintainerPATCH 21/31 uwb: fix device reference leaks
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit d6124b409ca33c100170ffde51cd8dff761454a1 upstream.
This subsystem consistently fails to drop the device reference taken by class_find_device().
Note that some of these lookup functions already take a reference to the returned data, while others claim no reference is needed (or does not seem need one).
--- drivers/uwb/lc-rc.c | 16 +++++++++++++--- drivers/uwb/pal.c | 2 ++ 2 files changed, 15 insertions(+), 3 deletions(-)
drivers/uwb/lc-rc.c +13 -3
@@ -56,8 +56,11 @@ static struct uwb_rc *uwb_rc_find_by_indstruct uwb_rc *rc =NULL ; dev =class_find_device (&uwb_rc_class,NULL , &index, uwb_rc_index_match); -if (dev) +if (dev) { rc =dev_get_drvdata (dev); +put_device (dev); + } +return rc; }
@@ -467,7 +470,9 @@ struct uwb_rc *__uwb_rc_try_get(struct uif (dev) { rc =dev_get_drvdata (dev);__uwb_rc_get (rc); +put_device (dev); } +return rc; }EXPORT_SYMBOL_GPL (__uwb_rc_try_get);
@@ -520,8 +525,11 @@ struct uwb_rc *uwb_rc_get_by_grandpa(con dev =class_find_device (&uwb_rc_class,NULL , grandpa_dev, find_rc_grandpa); -if (dev) +if (dev) { rc =dev_get_drvdata (dev); +put_device (dev); + } +return rc; }EXPORT_SYMBOL_GPL (uwb_rc_get_by_grandpa);
@@ -553,8 +561,10 @@ struct uwb_rc *uwb_rc_get_by_dev(const sstruct uwb_rc *rc =NULL ; dev =class_find_device (&uwb_rc_class,NULL , addr, find_rc_dev); -if (dev) +if (dev) { rc =dev_get_drvdata (dev); +put_device (dev); + }return rc; }
drivers/uwb/pal.c +2 -0
@@ -97,6 +97,8 @@ static bool uwb_rc_class_device_exists(s dev =class_find_device (&uwb_rc_class,NULL , target_rc, find_rc); +put_device (dev); +return (dev !=NULL ); }
Greg Kroah-Hartman
maintainerPATCH 22/31 PM / sleep: fix device reference leak in test_suspend
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit ceb75787bc75d0a7b88519ab8a68067ac690f55a upstream.
Make sure to drop the reference taken by class_find_device() after opening the RTC device.
--- kernel/power/suspend_test.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
kernel/power/suspend_test.c +3 -1
@@ -203,8 +203,10 @@ static int __init test_suspend(void)/* RTCs have initialized by now too ... can we use one? */ dev =class_find_device (rtc_class,NULL ,NULL , has_wakealarm); -if (dev) +if (dev) { rtc =rtc_class_open (dev_name (dev)); +put_device (dev); + }if (!rtc) {printk (warn_no_rtc);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 23/31 PM / sleep: dont suspend parent when async child suspend_{noirq, late} fails
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Brian Norris <[email protected]>
commit 6f75c3fd56daf547d684127a7f83c283c3c160d1 upstream.
Consider two devices, A and B, where B is a child of A, and B utilizes asynchronous suspend (it does not matter whether A is sync or async). If B fails to suspend_noirq() or suspend_late(), or is interrupted by a wakeup (pm_wakeup_pending()), then it aborts and sets the async_error variable. However, device A does not (immediately) check the async_error variable; it may continue to run its own suspend_noirq()/suspend_late() callback. This is bad.
We can resolve this problem by doing our error and wakeup checking (particularly, for the async_error flag) after waiting for children to suspend, instead of before. This also helps align the logic for the noirq and late suspend cases with the logic in __device_suspend().
It's easy to observe this erroneous behavior by, for example, forcing a device to sleep a bit in its suspend_noirq() (to ensure the parent is waiting for the child to complete), then return an error, and watch the parent suspend_noirq() still get called. (Or similarly, fake a wakeup event at the right (or is it wrong?) time.)
--- drivers/base/power/main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/base/power/main.c +4 -4
@@ -1022,6 +1022,8 @@ static int __device_suspend_noirq(structTRACE_DEVICE (dev);TRACE_SUSPEND (0 ); +dpm_wait_for_children (dev, async); +if (async_error) goto Complete;
@@ -1033,8 +1035,6 @@ static int __device_suspend_noirq(structif (dev->power.syscore || dev->power.direct_complete) goto Complete; -dpm_wait_for_children (dev, async); -if (dev->pm_domain) { info ="noirq power domain " ; callback =pm_noirq_op (&dev->pm_domain->ops, state);
@@ -1169,6 +1169,8 @@ static int __device_suspend_late(struct__pm_runtime_disable (dev, false); +dpm_wait_for_children (dev, async); +if (async_error) goto Complete;
@@ -1180,8 +1182,6 @@ static int __device_suspend_late(structif (dev->power.syscore || dev->power.direct_complete) goto Complete; -dpm_wait_for_children (dev, async); -if (dev->pm_domain) { info ="late power domain " ; callback =pm_late_early_op (&dev->pm_domain->ops, state);
Greg Kroah-Hartman
maintainerPATCH 24/31 IB/mlx4: Check gid_index return value
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Jurgens <[email protected]>
commit 37995116fecfce2b61ee3da6e73b3e394c6818f9 upstream.
Check the returned GID index value and return an error if it is invalid.
--- drivers/infiniband/hw/mlx4/ah.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/infiniband/hw/mlx4/ah.c +4 -1
@@ -102,7 +102,10 @@ static struct ib_ah *create_iboe_ah(struif (vlan_tag <0x1000 ) vlan_tag |= (ah_attr->sl &7 ) <<13 ; ah->av.eth.port_pd =cpu_to_be32 (to_mpd (pd)->pdn | (ah_attr->port_num <<24 )); - ah->av.eth.gid_index =mlx4_ib_gid_index_to_real_index (ibdev, ah_attr->port_num, ah_attr->grh.sgid_index); + ret =mlx4_ib_gid_index_to_real_index (ibdev, ah_attr->port_num, ah_attr->grh.sgid_index); +if (ret <0 ) +return ERR_PTR (ret); + ah->av.eth.gid_index = ret; ah->av.eth.vlan =cpu_to_be16 (vlan_tag);if (ah_attr->static_rate) { ah->av.eth.stat_rate = ah_attr->static_rate +MLX4_STAT_RATE_OFFSET ;
Greg Kroah-Hartman
maintainerPATCH 25/31 IB/mlx4: Fix create CQ error flow
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matan Barak <[email protected]>
commit 593ff73bcfdc79f79a8a0df55504f75ad3e5d1a9 upstream.
Currently, if ib_copy_to_udata fails, the CQ won't be deleted from the radix tree and the HW (HW2SW).
--- drivers/infiniband/hw/mlx4/cq.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/infiniband/hw/mlx4/cq.c +4 -1
@@ -253,11 +253,14 @@ struct ib_cq *mlx4_ib_create_cq(struct iif (context)if (ib_copy_to_udata (udata, &cq->mcq.cqn,sizeof (__u32))) { err = -EFAULT ; - goto err_dbmap; + goto err_cq_free; }return &cq->ibcq; +err_cq_free: +mlx4_cq_free (dev->dev, &cq->mcq); + err_dbmap:if (context)mlx4_ib_db_unmap_user (to_mucontext (context), &cq->db);
Greg Kroah-Hartman
maintainerPATCH 26/31 IB/mlx5: Use cache line size to select CQE stride
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Jurgens <[email protected]>
commit 16b0e0695a73b68d8ca40288c8f9614ef208917b upstream.
When creating kernel CQs use 128B CQE stride if the cache line size is 128B, 64B otherwise. This prevents multiple CQEs from residing in a 128B cache line, which can cause retries when there are concurrent read and writes in one cache line.
Tested with IPoIB on PPC64, saw ~5% throughput
improvement.
--- drivers/infiniband/hw/mlx5/cq.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/infiniband/hw/mlx5/cq.c +1 -2
@@ -787,8 +787,7 @@ struct ib_cq *mlx5_ib_create_cq(struct iif (err) goto err_create; }else { -/* for now choose 64 bytes till we have a proper interface */ - cqe_size =64 ; + cqe_size =cache_line_size () ==128 ?128 :64 ; err =create_cq_kernel (dev, cq, entries, cqe_size, &cqb, &index, &inlen);if (err)
Greg Kroah-Hartman
maintainerPATCH 27/31 IB/mlx5: Fix fatal error dispatching
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eli Cohen <[email protected]>
commit dbaaff2a2caa03d472b5cc53a3fbfd415c97dc26 upstream.
When an internal error condition is detected, make sure to set the device inactive after dispatching the event so ULPs can get a notification of this event.
--- drivers/infiniband/hw/mlx5/main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/infiniband/hw/mlx5/main.c +5 -2
@@ -947,13 +947,13 @@ static void mlx5_ib_event(struct mlx5_co {struct mlx5_ib_dev *ibdev = (struct mlx5_ib_dev *)context;struct ib_event ibev; - +bool fatal = false;u8 port =0 ;switch (event) {case MLX5_DEV_EVENT_SYS_ERROR : - ibdev->ib_active = false; ibev.event =IB_EVENT_DEVICE_FATAL ; + fatal = true;break ;case MLX5_DEV_EVENT_PORT_UP :
@@ -998,6 +998,9 @@ static void mlx5_ib_event(struct mlx5_coif (ibdev->ib_active)ib_dispatch_event (&ibev); + +if (fatal) + ibdev->ib_active = false; }static void get_ext_port_caps (struct mlx5_ib_dev *dev)
Greg Kroah-Hartman
maintainerPATCH 28/31 IB/core: Avoid unsigned int overflow in sg_alloc_table
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Bloch <[email protected]>
commit 3c7ba5760ab8eedec01159b267bb9bfcffe522ac upstream.
sg_alloc_table gets unsigned int as parameter while the driver returns it as size_t. Check npages isn't greater than maximum unsigned int.
--- drivers/infiniband/core/umem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/core/umem.c +1 -1
@@ -175,7 +175,7 @@ struct ib_umem *ib_umem_get(struct ib_uc cur_base = addr &PAGE_MASK ; -if (npages ==0 ) { +if (npages ==0 || npages >UINT_MAX ) { ret = -EINVAL ; goto out; }
Greg Kroah-Hartman
maintainerPATCH 29/31 IB/uverbs: Fix leak of XRC target QPs
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tariq Toukan <[email protected]>
commit 5b810a242c28e1d8d64d718cebe75b79d86a0b2d upstream.
The real QP is destroyed in case of the ref count reaches zero, but for XRC target QPs this call was missed and caused to QP leaks.
Let's call to destroy for all flows.
--- drivers/infiniband/core/uverbs_main.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-)
drivers/infiniband/core/uverbs_main.c +2 -5
@@ -244,12 +244,9 @@ static int ib_uverbs_cleanup_ucontext(st container_of(uobj, struct ib_uqp_object, uevent.uobject);idr_remove_uobj (&ib_uverbs_qp_idr, uobj); -if (qp != qp->real_qp) { -ib_close_qp (qp); - }else { +if (qp == qp->real_qp)ib_uverbs_detach_umcast (qp, uqp); -ib_destroy_qp (qp); - } +ib_destroy_qp (qp);ib_uverbs_release_uevent (file, &uqp->uevent);kfree (uqp); }
Greg Kroah-Hartman
maintainerPATCH 30/31 IB/cm: Mark stale CM ids whenever the mad agent was unregistered
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Bloch <[email protected]>
commit 9db0ff53cb9b43ed75bacd42a89c1a0ab048b2b0 upstream.
When there is a CM id object that has port assigned to it, it means that the cm-id asked for the specific port that it should go by it, but if that port was removed (hot-unplug event) the cm-id was not updated. In order to fix that the port keeps a list of all the cm-id's that are planning to go by it, whenever the port is removed it marks all of them as invalid.
This commit fixes a kernel panic which happens when running traffic between guests and we force reboot a guest mid traffic, it triggers a kernel panic:
Call Trace: [<ffffffff815271fa>] ? panic+0xa7/0x16f [<ffffffff8152b534>] ? oops_end+0xe4/0x100 [<ffffffff8104a00b>] ? no_context+0xfb/0x260 [<ffffffff81084db2>] ? del_timer_sync+0x22/0x30 [<ffffffff8104a295>] ? __bad_area_nosemaphore+0x125/0x1e0 [<ffffffff81084240>] ? process_timeout+0x0/0x10 [<ffffffff8104a363>] ? bad_area_nosemaphore+0x13/0x20 [<ffffffff8104aabf>] ? __do_page_fault+0x31f/0x480 [<ffffffff81065df0>] ? default_wake_function+0x0/0x20 [<ffffffffa0752675>] ? free_msg+0x55/0x70 [mlx5_core] [<ffffffffa0753434>] ? cmd_exec+0x124/0x840 [mlx5_core] [<ffffffff8105a924>] ? find_busiest_group+0x244/0x9f0 [<ffffffff8152d45e>] ? do_page_fault+0x3e/0xa0 [<ffffffff8152a815>] ? page_fault+0x25/0x30 [<ffffffffa024da25>] ? cm_alloc_msg+0x35/0xc0 [ib_cm] [<ffffffffa024e821>] ? ib_send_cm_dreq+0xb1/0x1e0 [ib_cm] [<ffffffffa024f836>] ? cm_destroy_id+0x176/0x320 [ib_cm] [<ffffffffa024fb00>] ? ib_destroy_cm_id+0x10/0x20 [ib_cm] [<ffffffffa034f527>] ? ipoib_cm_free_rx_reap_list+0xa7/0x110 [ib_ipoib] [<ffffffffa034f590>] ? ipoib_cm_rx_reap+0x0/0x20 [ib_ipoib] [<ffffffffa034f5a5>] ? ipoib_cm_rx_reap+0x15/0x20 [ib_ipoib] [<ffffffff81094d20>] ? worker_thread+0x170/0x2a0 [<ffffffff8109b2a0>] ? autoremove_wake_function+0x0/0x40 [<ffffffff81094bb0>] ? worker_thread+0x0/0x2a0 [<ffffffff8109aef6>] ? kthread+0x96/0xa0 [<ffffffff8100c20a>] ? child_rip+0xa/0x20 [<ffffffff8109ae60>] ? kthread+0x0/0xa0 [<ffffffff8100c200>] ? child_rip+0x0/0x20
--- drivers/infiniband/core/cm.c | 126 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 110 insertions(+), 16 deletions(-)
drivers/infiniband/core/cm.c +110 -16
@@ -80,6 +80,8 @@ static struct ib_cm {__be32 random_id_operand;struct list_head timewait_list;struct workqueue_struct *wq; +/* Sync on cm change port state */ +spinlock_t state_lock; } cm;/* Counter indexes ordered by attribute ID */
@@ -161,6 +163,8 @@ struct cm_port {struct ib_mad_agent *mad_agent;struct kobject port_obj;u8 port_num; +struct list_head cm_priv_prim_list; +struct list_head cm_priv_altr_list;struct cm_counter_group counter_group[CM_COUNTER_GROUPS ]; };
@@ -241,6 +245,12 @@ struct cm_id_private {u8 service_timeout;u8 target_ack_delay; +struct list_head prim_list; +struct list_head altr_list; +/* Indicates that the send port mad is registered and av is set */ +int prim_send_port_not_ready; +int altr_send_port_not_ready; +struct list_head work_list;atomic_t work_count; };
@@ -259,20 +269,47 @@ static int cm_alloc_msg(struct cm_id_pristruct ib_mad_agent *mad_agent;struct ib_mad_send_buf *m;struct ib_ah *ah; +struct cm_av *av; +unsigned long flags, flags2; +int ret =0 ; +/* don't let the port to be released till the agent is down */ +spin_lock_irqsave (&cm.state_lock, flags2); +spin_lock_irqsave (&cm.lock, flags); +if (!cm_id_priv->prim_send_port_not_ready) + av = &cm_id_priv->av; +else if (!cm_id_priv->altr_send_port_not_ready && + (cm_id_priv->alt_av.port)) + av = &cm_id_priv->alt_av; +else { +pr_info ("%s: not valid CM id\n" , __func__); + ret = -ENODEV ; +spin_unlock_irqrestore (&cm.lock, flags); + goto out; + } +spin_unlock_irqrestore (&cm.lock, flags); +/* Make sure the port haven't released the mad yet */ mad_agent = cm_id_priv->av.port->mad_agent; - ah =ib_create_ah (mad_agent->qp->pd, &cm_id_priv->av.ah_attr); -if (IS_ERR (ah)) -return PTR_ERR (ah); +if (!mad_agent) { +pr_info ("%s: not a valid MAD agent\n" , __func__); + ret = -ENODEV ; + goto out; + } + ah =ib_create_ah (mad_agent->qp->pd, &av->ah_attr); +if (IS_ERR (ah)) { + ret =PTR_ERR (ah); + goto out; + } m =ib_create_send_mad (mad_agent, cm_id_priv->id.remote_cm_qpn, - cm_id_priv->av.pkey_index, + av->pkey_index,0 ,IB_MGMT_MAD_HDR ,IB_MGMT_MAD_DATA ,GFP_ATOMIC ,IB_MGMT_BASE_VERSION );if (IS_ERR (m)) {ib_destroy_ah (ah); -return PTR_ERR (m); + ret =PTR_ERR (m); + goto out; }/* Timeout set by caller if response is expected. */
@@ -282,7 +319,10 @@ static int cm_alloc_msg(struct cm_id_priatomic_inc (&cm_id_priv->refcount); m->context[0 ] = cm_id_priv; *msg = m; -return 0 ; + +out: +spin_unlock_irqrestore (&cm.state_lock, flags2); +return ret; } static int cm_alloc_response_msg(struct cm_port *port,
@@ -352,7 +392,8 @@ static void cm_init_av_for_response(stru grh, &av->ah_attr); } -static int cm_init_av_by_path (struct ib_sa_path_rec *path,struct cm_av *av) +static int cm_init_av_by_path (struct ib_sa_path_rec *path,struct cm_av *av, +struct cm_id_private *cm_id_priv) {struct cm_device *cm_dev;struct cm_port *port =NULL ;
@@ -387,7 +428,17 @@ static int cm_init_av_by_path(struct ib_ &av->ah_attr); av->timeout = path->packet_life_time +1 ; -return 0 ; +spin_lock_irqsave (&cm.lock, flags); +if (&cm_id_priv->av == av) +list_add_tail (&cm_id_priv->prim_list, &port->cm_priv_prim_list); +else if (&cm_id_priv->alt_av == av) +list_add_tail (&cm_id_priv->altr_list, &port->cm_priv_altr_list); +else + ret = -EINVAL ; + +spin_unlock_irqrestore (&cm.lock, flags); + +return ret; }static int cm_alloc_id (struct cm_id_private *cm_id_priv)
@@ -677,6 +728,8 @@ struct ib_cm_id *ib_create_cm_id(structspin_lock_init (&cm_id_priv->lock);init_completion (&cm_id_priv->comp);INIT_LIST_HEAD (&cm_id_priv->work_list); +INIT_LIST_HEAD (&cm_id_priv->prim_list); +INIT_LIST_HEAD (&cm_id_priv->altr_list);atomic_set (&cm_id_priv->work_count,-1 );atomic_set (&cm_id_priv->refcount,1 );return &cm_id_priv->id;
@@ -892,6 +945,15 @@ retest:break ; } +spin_lock_irq (&cm.lock); +if (!list_empty (&cm_id_priv->altr_list) && + (!cm_id_priv->altr_send_port_not_ready)) +list_del (&cm_id_priv->altr_list); +if (!list_empty (&cm_id_priv->prim_list) && + (!cm_id_priv->prim_send_port_not_ready)) +list_del (&cm_id_priv->prim_list); +spin_unlock_irq (&cm.lock); +cm_free_id (cm_id->local_id);cm_deref_id (cm_id_priv);wait_for_completion (&cm_id_priv->comp);
@@ -1192,12 +1254,13 @@ int ib_send_cm_req(struct ib_cm_id *cm_i goto out; } - ret =cm_init_av_by_path (param->primary_path, &cm_id_priv->av); + ret =cm_init_av_by_path (param->primary_path, &cm_id_priv->av, + cm_id_priv);if (ret) goto error1;if (param->alternate_path) { ret =cm_init_av_by_path (param->alternate_path, - &cm_id_priv->alt_av); + &cm_id_priv->alt_av, cm_id_priv);if (ret) goto error1; }
@@ -1639,7 +1702,8 @@ static int cm_req_handler(struct cm_workcm_format_paths_from_req (req_msg, &work->path[0 ], &work->path[1 ]);memcpy (work->path[0 ].dmac, cm_id_priv->av.ah_attr.dmac,ETH_ALEN ); - ret =cm_init_av_by_path (&work->path[0 ], &cm_id_priv->av); + ret =cm_init_av_by_path (&work->path[0 ], &cm_id_priv->av, + cm_id_priv);if (ret) { ib_get_cached_gid(work->port->cm_dev->ib_device, work->port->port_num, 0, &work->path[0].sgid,
@@ -1650,7 +1714,8 @@ static int cm_req_handler(struct cm_work goto rejected; }if (req_msg->alt_local_lid) { - ret =cm_init_av_by_path (&work->path[1 ], &cm_id_priv->alt_av); + ret =cm_init_av_by_path (&work->path[1 ], &cm_id_priv->alt_av, + cm_id_priv);if (ret) { ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_ALT_GID, &work->path[0].sgid,
@@ -2705,7 +2770,8 @@ int ib_send_cm_lap(struct ib_cm_id *cm_i goto out; } - ret =cm_init_av_by_path (alternate_path, &cm_id_priv->alt_av); + ret =cm_init_av_by_path (alternate_path, &cm_id_priv->alt_av, + cm_id_priv);if (ret) goto out; cm_id_priv->alt_av.timeout =
@@ -2817,7 +2883,8 @@ static int cm_lap_handler(struct cm_workcm_init_av_for_response (work->port, work->mad_recv_wc->wc, work->mad_recv_wc->recv_buf.grh, &cm_id_priv->av); -cm_init_av_by_path (param->alternate_path, &cm_id_priv->alt_av); +cm_init_av_by_path (param->alternate_path, &cm_id_priv->alt_av, + cm_id_priv); ret =atomic_inc_and_test (&cm_id_priv->work_count);if (!ret)list_add_tail (&work->list, &cm_id_priv->work_list);
@@ -3009,7 +3076,7 @@ int ib_send_cm_sidr_req(struct ib_cm_idreturn -EINVAL ; cm_id_priv = container_of(cm_id, struct cm_id_private, id); - ret =cm_init_av_by_path (param->path, &cm_id_priv->av); + ret =cm_init_av_by_path (param->path, &cm_id_priv->av, cm_id_priv);if (ret) goto out;
@@ -3446,7 +3513,9 @@ out:static int cm_migrate (struct ib_cm_id *cm_id) {struct cm_id_private *cm_id_priv; +struct cm_av tmp_av;unsigned long flags; +int tmp_send_port_not_ready;int ret =0 ; cm_id_priv = container_of(cm_id, struct cm_id_private, id);
@@ -3455,7 +3524,14 @@ static int cm_migrate(struct ib_cm_id *c (cm_id->lap_state == IB_CM_LAP_UNINIT || cm_id->lap_state == IB_CM_LAP_IDLE)) { cm_id->lap_state =IB_CM_LAP_IDLE ; +/* Swap address vector */ + tmp_av = cm_id_priv->av; cm_id_priv->av = cm_id_priv->alt_av; + cm_id_priv->alt_av = tmp_av; +/* Swap port send ready state */ + tmp_send_port_not_ready = cm_id_priv->prim_send_port_not_ready; + cm_id_priv->prim_send_port_not_ready = cm_id_priv->altr_send_port_not_ready; + cm_id_priv->altr_send_port_not_ready = tmp_send_port_not_ready; } else ret = -EINVAL ;spin_unlock_irqrestore (&cm_id_priv->lock, flags);
@@ -3875,6 +3951,9 @@ static void cm_add_one(struct ib_device port->cm_dev = cm_dev; port->port_num = i; +INIT_LIST_HEAD (&port->cm_priv_prim_list); +INIT_LIST_HEAD (&port->cm_priv_altr_list); + ret =cm_create_port_fs (port);if (ret) goto error1;
@@ -3932,6 +4011,8 @@ static void cm_remove_one(struct ib_devi {struct cm_device *cm_dev = client_data;struct cm_port *port; +struct cm_id_private *cm_id_priv; +struct ib_mad_agent *cur_mad_agent;struct ib_port_modify port_modify = { .clr_port_cap_mask =IB_PORT_CM_SUP };
@@ -3955,15 +4036,27 @@ static void cm_remove_one(struct ib_devi port = cm_dev->port[i-1 ];ib_modify_port (ib_device, port->port_num,0 , &port_modify); +/* Mark all the cm_id's as not valid */ +spin_lock_irq (&cm.lock); +list_for_each_entry (cm_id_priv, &port->cm_priv_altr_list, altr_list) + cm_id_priv->altr_send_port_not_ready =1 ; +list_for_each_entry (cm_id_priv, &port->cm_priv_prim_list, prim_list) + cm_id_priv->prim_send_port_not_ready =1 ; +spin_unlock_irq (&cm.lock);/* * We flush the queue here after the going_down set, this * verify that no new works will be queued in the recv handler, * after that we can call the unregister_mad_agent */ flush_workqueue (cm.wq); -ib_unregister_mad_agent (port->mad_agent); +spin_lock_irq (&cm.state_lock); + cur_mad_agent = port->mad_agent; + port->mad_agent =NULL ; +spin_unlock_irq (&cm.state_lock); +ib_unregister_mad_agent (cur_mad_agent);cm_remove_port_fs (port); } +device_unregister (cm_dev->device);kfree (cm_dev); }
@@ -3976,6 +4069,7 @@ static int __init ib_cm_init(void)INIT_LIST_HEAD (&cm.device_list);rwlock_init (&cm.device_lock);spin_lock_init (&cm.lock); +spin_lock_init (&cm.state_lock); cm.listen_service_table =RB_ROOT ; cm.listen_service_id =be64_to_cpu (IB_CM_ASSIGN_SERVICE_ID ); cm.remote_id_table =RB_ROOT ;
Greg Kroah-Hartman
maintainerPATCH 31/31 netfilter: nft_dynset: fix element timeout for HZ != 1000
In reply to a message not in the archive4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anders K. Pedersen <[email protected]>
commit a8b1e36d0d1d6f51490e7adce35367ed6adb10e7 upstream.
With HZ=100 element timeout in dynamic sets (i.e. flow tables) is 10 times higher than configured.
Add proper conversion to/from jiffies, when interacting with userspace.
I tested this on Linux 4.8.1, and it applies cleanly to current nf and nf-next trees.
--- net/netfilter/nft_dynset.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
net/netfilter/nft_dynset.c +4 -2
@@ -140,7 +140,8 @@ static int nft_dynset_init(const structif (tb[NFTA_DYNSET_TIMEOUT ] !=NULL ) {if (!(set->flags &NFT_SET_TIMEOUT ))return -EINVAL ; - timeout =be64_to_cpu (nla_get_be64 (tb[NFTA_DYNSET_TIMEOUT ])); + timeout =msecs_to_jiffies (be64_to_cpu (nla_get_be64 ( + tb[NFTA_DYNSET_TIMEOUT ]))); } priv->sreg_key =nft_parse_register (tb[NFTA_DYNSET_SREG_KEY ]);
@@ -227,7 +228,8 @@ static int nft_dynset_dump(struct sk_buf goto nla_put_failure;if (nla_put_string (skb,NFTA_DYNSET_SET_NAME , priv->set->name)) goto nla_put_failure; -if (nla_put_be64 (skb,NFTA_DYNSET_TIMEOUT ,cpu_to_be64 (priv->timeout))) +if (nla_put_be64 (skb,NFTA_DYNSET_TIMEOUT , +cpu_to_be64 (jiffies_to_msecs (priv->timeout)))) goto nla_put_failure;if (priv->expr &&nft_expr_dump (skb,NFTA_DYNSET_EXPR , priv->expr)) goto nla_put_failure;
Re: [PATCH 4.4 00/31] 4.4.35-stable review
In reply to a message not in the archiveQuoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.35 release. There are 31 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Nov 26 14:54:32 UTC 2016. Anything received after that time might be too late.
Build results:
total: 149 pass: 149 fail: 0 Qemu test results: total: 107 pass: 107 fail: 0
Details are available at http://kerneltests.org/builders.
Guenter
A message that is not in the archive (sent off-list or not yet received): [email protected]
Greg Kroah-Hartman
maintainerRe: [PATCH 4.4 00/31] 4.4.35-stable review
Quoted 28 lines · kernelci.org bot
stable-rc boot: 216 boots: 7 failed, 208 passed with 1 offline (v4.4.34-32-gcd586a7eea80)
Full Boot Summary: https://kernelci.org/boot/all/job/stable-rc/kernel/v4.4.34-32-gcd586a7eea80/
Full Build Summary: https://kernelci.org/build/stable-rc/kernel/v4.4.34-32-gcd586a7eea80/Tree: stable-rc
Branch: local/linux-4.4.y
Git Describe: v4.4.34-32-gcd586a7eea80
Git Commit:cd586a7eea80fc8c62a6d0b269e4cbac6cd39135
Git URL: http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
Tested: 56 unique boards, 16 SoC families, 25 builds out of 202Boot Failures Detected: https://kernelci.org/boot/?v4.4.34-32-gcd586a7eea80&fail
arm:
multi_v7_defconfig+CONFIG_PROVE_LOCKING=y:
at91-sama5d2_xplained: 1 failed lab
at91-sama5d3_xplained: 1 failed labx86:
defconfig+CONFIG_OF_UNITTEST=y:
x86-kvm: 1 failed labdefconfig+CONFIG_KASAN=y:
x86-kvm: 1 failed lab
Quoted 8 lines
defconfig+CONFIG_LKDTM=y:
x86-kvm: 1 failed labdefconfig+kvm_guest:
x86-kvm: 1 failed lab
x86_64_defconfig:
x86-kvm: 1 failed lab
Same question here.
thanks,
greg k-h