Re: BUG warnings in 4.14.9

2017-12-26 Thread alexander . levin
On Tue, Dec 26, 2017 at 10:54:37PM +0200, Ido Schimmel wrote:
>On Tue, Dec 26, 2017 at 07:59:55PM +0100, Willy Tarreau wrote:
>> Guys,
>>
>> Chris reported the bug below and confirmed that reverting commit
>> 9704f81 (ipv6: grab rt->rt6i_ref before allocating pcpu rt) seems to
>> have fixed the issue for him. This patch is a94b9367 in mainline.
>>
>> I personally have no opinion on the patch, just found it because it
>> was the only one touching this area between 4.14.8 and 4.14.9 :-)
>>
>> Should this be reverted or maybe fixed differently ?
>
>Maybe I'm missing something, but how come this patch even made its way
>into 4.14.y? It's part of a series to RCU-ify IPv6 FIB lookup that went
>into 4.15.
>
>Anyway, the mentioned bug was already fixed by commit 951f788a80ff
>("ipv6: fix a BUG in rt6_get_pcpu_route()") when the code was still in
>net-next.

Uh, you're right. Greg, please just revert 9704f81. Thanks!

-- 

Thanks,
Sasha

Re: BUG warnings in 4.14.9

2017-12-26 Thread alexander . levin
On Tue, Dec 26, 2017 at 07:59:55PM +0100, Willy Tarreau wrote:
>Guys,
>
>Chris reported the bug below and confirmed that reverting commit
>9704f81 (ipv6: grab rt->rt6i_ref before allocating pcpu rt) seems to
>have fixed the issue for him. This patch is a94b9367 in mainline.
>
>I personally have no opinion on the patch, just found it because it
>was the only one touching this area between 4.14.8 and 4.14.9 :-)
>
>Should this be reverted or maybe fixed differently ?

Hi Willy,

This seems to be fixed upstream:

commit 951f788a80ff8b6339c5c1ab888b0d4b4352efd8
Author: Eric Dumazet 
Date:   Sun Oct 8 21:07:18 2017 -0700

ipv6: fix a BUG in rt6_get_pcpu_route()

Ido reported following splat and provided a patch.

[  122.221814] BUG: using smp_processor_id() in preemptible [] 
code: sshd/2672
[  122.221845] caller is debug_smp_processor_id+0x17/0x20
[  122.221866] CPU: 0 PID: 2672 Comm: sshd Not tainted 
4.14.0-rc3-idosch-next-custom #639
[  122.221880] Hardware name: Mellanox Technologies Ltd. 
MSN2100-CB2FO/SA001017, BIOS 5.6.5 06/07/2016
[  122.221893] Call Trace:
[  122.221919]  dump_stack+0xb1/0x10c
[  122.221946]  ? _atomic_dec_and_lock+0x124/0x124
[  122.221974]  ? ___ratelimit+0xfe/0x240
[  122.222020]  check_preemption_disabled+0x173/0x1b0
[  122.222060]  debug_smp_processor_id+0x17/0x20
[  122.222083]  ip6_pol_route+0x1482/0x24a0
...

I believe we can simplify this code path a bit, since we no longer
hold a read_lock and need to release it to avoid a dead lock.

By disabling BH, we make sure we'll prevent code re-entry and
rt6_get_pcpu_route()/rt6_make_pcpu_route() run on the same cpu.

Fixes: 66f5d6ce53e6 ("ipv6: replace rwlock with rcu and spinlock in 
fib6_table")
Reported-by: Ido Schimmel 
Signed-off-by: Eric Dumazet 
Tested-by: Ido Schimmel 
Signed-off-by: David S. Miller 

Which itself would depend on:

commit d3843fe5fd45be0e04a251a2cc68893c859a31bd
Author: Wei Wang 
Date:   Fri Oct 6 12:06:06 2017 -0700

ipv6: replace dst_hold() with dst_hold_safe() in routing code

Which applies with a small conflict.

-- 

Thanks,
Sasha

Re: [PATCH 4.14 108/159] kvm, mm: account kvm related kmem slabs to kmemcg

2017-12-22 Thread alexander . levin
On Fri, Dec 22, 2017 at 07:22:32PM +0100, Michal Hocko wrote:
>On Fri 22-12-17 18:07:23, Sasha Levin wrote:
>> I don't try and override maintainers, I mostly try to get fixes out
>> of subsystems where maintainers/authors partially (or just don't)
>> mark their commits for stable.
>
>Well, I have see quite some MM patches and I believe we are quite good
>at marking patches for stable trees... I also think we we (as the whole
>kernel) are much better are using Fixes tag (although it is over used
>sometimes).

Indeed, mm/ is probably as good as it gets in the kernel.

>Moreover it makes more sense to push on those maintainers than try to
>substitude them without being so closely familiar with the subsystem. If
>missing backports result in bug reports then this just increase the
>pressure on those maintainers /me think.

Both is happening, but it's difficult to force maintainers into doing
anything, as you might have guessed...

I'm hoping that one result of this work is a tool we can stick into
scripts/ (maybe glue it to checkpatch) that'll alert when the patch
is -stable material and suggest adding tags.

>> These patches also go through a much longer review process than
>> commits that are marked for stable (there are at least 3 emails issued
>> for each such commit, and at least 1 week (usually much more) is
>> given for reviews).
>
>Does any of the maintainers read those emails? How many acks/reviewes do
>you get for those patches for the stable tree? To be honest I tend to

I get a fair amount of reviews which seems to be slightly above what
-stable tagged patches get, which is good.

Acks are not expected, and are not happening too often.

>ignore those patchbombs most of the time because it is simply impossible
>to handle them for me. I try to help backporting obvious fixes but
>reviewing seemingly randomly selected patch which applies and changelog
>looks reasonaly is simply out of my time budget. Not to mention that
>this is not just about the patch itself but also the tree it is applied
>to and other patches that are in the same pile.

I'd hope that these patches aren't "random" :)

For some background, this is based on Julia Lawall's work (and paper
https://soarsmu.github.io/papers/icse12-patch.pdf).

-- 

Thanks,
Sasha

Re: [PATCH 4.14 108/159] kvm, mm: account kvm related kmem slabs to kmemcg

2017-12-22 Thread alexander . levin
On Fri, Dec 22, 2017 at 06:56:16PM +0100, Michal Hocko wrote:
>On Fri 22-12-17 17:40:10, Sasha Levin wrote:
>> On Fri, Dec 22, 2017 at 02:06:07PM +0100, Michal Hocko wrote:
>> >On Fri 22-12-17 13:41:22, Greg KH wrote:
>> >> On Fri, Dec 22, 2017 at 10:34:07AM +0100, Michal Hocko wrote:
>> >> > On Fri 22-12-17 09:46:33, Greg KH wrote:
>> >> > > 4.14-stable review patch.  If anyone has any objections, please let 
>> >> > > me know.
>> >> > >
>> >> > > --
>> >> > >
>> >> > > From: Shakeel Butt 
>> >> > >
>> >> > >
>> >> > > [ Upstream commit 46bea48ac241fe0b413805952dda74dd0c09ba8b ]
>> >> > >
>> >> > > The kvm slabs can consume a significant amount of system memory
>> >> > > and indeed in our production environment we have observed that
>> >> > > a lot of machines are spending significant amount of memory that
>> >> > > can not be left as system memory overhead. Also the allocations
>> >> > > from these slabs can be triggered directly by user space applications
>> >> > > which has access to kvm and thus a buggy application can leak
>> >> > > such memory. So, these caches should be accounted to kmemcg.
>> >> > >
>> >> > > Signed-off-by: Shakeel Butt 
>> >> > > Signed-off-by: Paolo Bonzini 
>> >> > > Signed-off-by: Sasha Levin 
>> >> > > Signed-off-by: Greg Kroah-Hartman 
>> >> >
>> >> > The patch is not marked for stable, neither it fixes an existing bug.
>> >> > It is a nice to have thing for sure but I am wondering how this got
>> >> > through stable-filter.
>> >>
>> >> Sasha picked it out, and it seemed like a sane thing to backport.  If
>> >> you think it's not worthy, I'll gladly drop it, but it seemed like such
>> >> a simple bugfix to include.
>> >
>> >It is not that I would have some specific concerns about this particular
>> >patch. It is more of a worry about the overal process. I thought that
>> >_any_ patch backported to the stable tree would require a specific bug
>> >to be fixed or in exceptional cases a performance issue. I have
>> >experienced this pushback myself when trying to push "no real bug report
>> >but better to have this plugged" patches.
>> >
>> >So something has apparently changed in the process, I just haven't
>> >noticed it. I am worried this might lead to more regression in future.
>> >Not that my worry counts all that much as I am not a stable kernel user
>> >though. So this is just my 2c worth of worry.
>>
>> The way I see it is that stable commits are supposed to fix a bug that
>> a user can hit/exploit, it doesn't have to have an actual user
>> complaining about it.
>>
>> For this particular commit, the way I read it is that a user can avoid
>> his kmemcg limits (maybe maliciously), which would qualify as an
>> actual bug we want to get fixed.
>
>How are you going to judge all the possible relations to other
>subsystems? I mean there is a good reason maintainers mark patches for
>stable trees. How do you want to competently decide this for them? Can
>you do that for all subsystems?
>
>I do not want to underestimate your judgment or misinterpret your
>process here but I _believe_ that picking patches based on the changelog
>without a deep understanding of the subsystem is really risky. We do
>not really have to go a long way to see that. Just look at other patch
>in this very thread [1]. But maybe our our understanding of the stable
>trees are different.

I don't try and override maintainers, I mostly try to get fixes out
of subsystems where maintainers/authors partially (or just don't)
mark their commits for stable.

These patches also go through a much longer review process than
commits that are marked for stable (there are at least 3 emails issued
for each such commit, and at least 1 week (usually much more) is
given for reviews).

-- 

Thanks,
Sasha

Re: [PATCH 4.14 108/159] kvm, mm: account kvm related kmem slabs to kmemcg

2017-12-22 Thread alexander . levin
On Fri, Dec 22, 2017 at 02:06:07PM +0100, Michal Hocko wrote:
>On Fri 22-12-17 13:41:22, Greg KH wrote:
>> On Fri, Dec 22, 2017 at 10:34:07AM +0100, Michal Hocko wrote:
>> > On Fri 22-12-17 09:46:33, Greg KH wrote:
>> > > 4.14-stable review patch.  If anyone has any objections, please let me 
>> > > know.
>> > >
>> > > --
>> > >
>> > > From: Shakeel Butt 
>> > >
>> > >
>> > > [ Upstream commit 46bea48ac241fe0b413805952dda74dd0c09ba8b ]
>> > >
>> > > The kvm slabs can consume a significant amount of system memory
>> > > and indeed in our production environment we have observed that
>> > > a lot of machines are spending significant amount of memory that
>> > > can not be left as system memory overhead. Also the allocations
>> > > from these slabs can be triggered directly by user space applications
>> > > which has access to kvm and thus a buggy application can leak
>> > > such memory. So, these caches should be accounted to kmemcg.
>> > >
>> > > Signed-off-by: Shakeel Butt 
>> > > Signed-off-by: Paolo Bonzini 
>> > > Signed-off-by: Sasha Levin 
>> > > Signed-off-by: Greg Kroah-Hartman 
>> >
>> > The patch is not marked for stable, neither it fixes an existing bug.
>> > It is a nice to have thing for sure but I am wondering how this got
>> > through stable-filter.
>>
>> Sasha picked it out, and it seemed like a sane thing to backport.  If
>> you think it's not worthy, I'll gladly drop it, but it seemed like such
>> a simple bugfix to include.
>
>It is not that I would have some specific concerns about this particular
>patch. It is more of a worry about the overal process. I thought that
>_any_ patch backported to the stable tree would require a specific bug
>to be fixed or in exceptional cases a performance issue. I have
>experienced this pushback myself when trying to push "no real bug report
>but better to have this plugged" patches.
>
>So something has apparently changed in the process, I just haven't
>noticed it. I am worried this might lead to more regression in future.
>Not that my worry counts all that much as I am not a stable kernel user
>though. So this is just my 2c worth of worry.

The way I see it is that stable commits are supposed to fix a bug that
a user can hit/exploit, it doesn't have to have an actual user
complaining about it.

For this particular commit, the way I read it is that a user can avoid
his kmemcg limits (maybe maliciously), which would qualify as an
actual bug we want to get fixed.

-- 

Thanks,
Sasha

Re: [PATCH 4.9 124/177] platform/x86: sony-laptop: Fix error handling in sony_nc_setup_rfkill()

2017-12-18 Thread alexander . levin
On Mon, Dec 18, 2017 at 09:21:51AM -0800, Joe Perches wrote:
>On Mon, 2017-12-18 at 16:49 +0100, Greg Kroah-Hartman wrote:
>> 4.9-stable review patch.  If anyone has any objections, please let me know.
>
>I am _very_ suspicious of any -stable patch by Markus Elfring.
>
>Are you sure this is necessary and useful for -stable?
>Does this actually fix something or does it merely reduce
>object size a few bytes?

Yeah... While the patch on it's own makes some sense, the code around
it is pretty crappy and doesn't benefit from the patch.

I'll drop it, thanks!

-- 

Thanks,
Sasha

Re: [PATCH AUTOSEL for 4.14 111/135] ASoC: samsung: i2s: disable secondary DAI until it gets fixed

2017-12-14 Thread alexander . levin
On Thu, Dec 07, 2017 at 05:33:36PM +, Mark Brown wrote:
>On Thu, Dec 07, 2017 at 03:45:57PM +, alexander.le...@verizon.com wrote:
>
>> Secondary DAI in Exynos I2S driver is not used by any of the currently
>> supported boards and it causes problems due to some limitations in the
>> ASoC code. Disable it until it gets proper support both by board-specific
>> and ASoC core code. Also disable IDMA support, which relies on secondary
>> DAI presence.
>
>People carry out of tree patches for that hardware, I'm not sure that it
>makes sense to backport this given that it's likely to conflict for
>users who would encounter it (and if they care they'll have already
>deal with it).

Sorry I forgot to reply in time, I've removed the patch.

-- 

Thanks,
Sasha

Re: [PATCH AUTOSEL for 4.14 19/60] Bluetooth: avoid silent hci_bcm ACPI PM regression

2017-12-13 Thread alexander . levin
On Wed, Dec 13, 2017 at 03:05:59PM +0100, Johan Hovold wrote:
>On Wed, Dec 13, 2017 at 01:37:26PM +, alexander.le...@verizon.com wrote:
>> On Wed, Dec 13, 2017 at 09:14:29AM +0100, Johan Hovold wrote:
>> >On Wed, Dec 13, 2017 at 01:55:14AM +, alexander.le...@verizon.com wrote:
>> >> From: Johan Hovold 
>> >>
>> >> [ Upstream commit 4294625e029028854596865be401b9c5c1f906ef ]
>> >>
>> >> The hci_bcm platform-device hack which was used to implement
>> >> power management for ACPI devices is being replaced by a
>> >> serial-device-bus implementation.
>> >>
>> >> Unfortunately, when the corresponding change to the ACPI code lands (a
>> >> change that will stop enumerating and registering the serial-device-node
>> >> child as a platform device) PM will break silently unless serdev
>> >> TTY-port controller support has been enabled. Specifically, hciattach
>> >> (btattach) would still succeed, but power management would no longer
>> >> work.
>> >
>> >This one is not needed in stable, which does not have the above
>> >mentioned ACPI change [ e361d1f85855 ("ACPI / scan: Fix enumeration for
>> >special UART devices") ].
>> >
>> >The Fixes and stable-CC tags were left out on purpose.
>>
>> Thanks Johan, I'll remove it.
>>
>> The Fixes tag should probably be there, as on it's own it does not
>> indicate a patch should go into stable, and we have tools to prevent
>> us from applying commits that "Fixes:" something which is not in the
>> tree.
>
>But that's the point; this patch was applied before the patch which
>might otherwise have ended up causing a regression. There was no commit
>id to use for a Fixes tag, and it did not fix anything when it was
>applied; its purpose was to avoid future breakage.

Gotcha, thanks!

-- 

Thanks,
Sasha

Re: [PATCH AUTOSEL for 3.18 36/40] powerpc/xmon: Avoid tripping SMP hardlockup watchdog

2017-12-13 Thread alexander . levin
On Thu, Dec 14, 2017 at 12:10:39AM +1100, Michael Ellerman wrote:
>alexander.le...@verizon.com writes:
>
>> From: Nicholas Piggin 
>>
>> [ Upstream commit 064996d62a33ffe10264b5af5dca92d54f60f806 ]
>>
>> The SMP hardlockup watchdog cross-checks other CPUs for lockups, which
>> causes xmon headaches because it's assuming interrupts hard disabled
>> means no watchdog troubles. Try to improve that by calling
>> touch_nmi_watchdog() in obvious places where secondaries are spinning.
>>
>> Also annotate these spin loops with spin_begin/end calls.
>
>These macros didn't exist until 4.13, and haven't been backported AFAIK.

But the touch_nmi_watchdog() bits are something we want in stable, right?

>> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
>> index e23f559faa47..6cec1081cb67 100644
>> --- a/arch/powerpc/xmon/xmon.c
>> +++ b/arch/powerpc/xmon/xmon.c
>> @@ -436,14 +436,19 @@ static int xmon_core(struct pt_regs *regs, int fromipi)
>>
>>   waiting:
>>  secondary = 1;
>> +spin_begin();
>>  while (secondary && !xmon_gate) {
>>  if (in_xmon == 0) {
>> -if (fromipi)
>> +if (fromipi) {
>> +spin_end();
>>  goto leave;
>> +}
>>  secondary = test_and_set_bit(0, &in_xmon);
>>  }
>> -barrier();
>> +spin_cpu_relax();
>> +touch_nmi_watchdog();
>>  }
>> +spin_end();
>>
>>  if (!secondary && !xmon_gate) {
>>  /* we are the first cpu to come in */
>> @@ -470,21 +475,25 @@ static int xmon_core(struct pt_regs *regs, int fromipi)
>>  mb();
>>  xmon_gate = 1;
>>  barrier();
>> +touch_nmi_watchdog();
>>  }
>>
>>   cmdloop:
>>  while (in_xmon) {
>>  if (secondary) {
>> +spin_begin();
>>  if (cpu == xmon_owner) {
>>  if (!test_and_set_bit(0, &xmon_taken)) {
>>  secondary = 0;
>> +spin_end();
>>  continue;
>>  }
>>  /* missed it */
>>  while (cpu == xmon_owner)
>> -barrier();
>> +spin_cpu_relax();
>>  }
>> -barrier();
>> +spin_cpu_relax();
>> +touch_nmi_watchdog();
>>  } else {
>>  cmd = cmds(regs);
>>  if (cmd != 0) {
>> --
>> 2.11.0

-- 

Thanks,
Sasha

Re: [PATCH AUTOSEL for 4.14 19/60] Bluetooth: avoid silent hci_bcm ACPI PM regression

2017-12-13 Thread alexander . levin
On Wed, Dec 13, 2017 at 09:14:29AM +0100, Johan Hovold wrote:
>On Wed, Dec 13, 2017 at 01:55:14AM +, alexander.le...@verizon.com wrote:
>> From: Johan Hovold 
>>
>> [ Upstream commit 4294625e029028854596865be401b9c5c1f906ef ]
>>
>> The hci_bcm platform-device hack which was used to implement
>> power management for ACPI devices is being replaced by a
>> serial-device-bus implementation.
>>
>> Unfortunately, when the corresponding change to the ACPI code lands (a
>> change that will stop enumerating and registering the serial-device-node
>> child as a platform device) PM will break silently unless serdev
>> TTY-port controller support has been enabled. Specifically, hciattach
>> (btattach) would still succeed, but power management would no longer
>> work.
>
>This one is not needed in stable, which does not have the above
>mentioned ACPI change [ e361d1f85855 ("ACPI / scan: Fix enumeration for
>special UART devices") ].
>
>The Fixes and stable-CC tags were left out on purpose.

Thanks Johan, I'll remove it.

The Fixes tag should probably be there, as on it's own it does not
indicate a patch should go into stable, and we have tools to prevent
us from applying commits that "Fixes:" something which is not in the
tree.

-- 

Thanks,
Sasha

[PATCH AUTOSEL for 4.14 08/60] crypto: crypto4xx - increase context and scatter ring buffer elements

2017-12-12 Thread alexander . levin
From: Christian Lamparter 

[ Upstream commit 778f81d6cdb7d25360f082ac0384d5103f04eca5 ]

If crypto4xx is used in conjunction with dm-crypt, the available
ring buffer elements are not enough to handle the load properly.

On an aes-cbc-essiv:sha256 encrypted swap partition the read
performance is abyssal: (tested with hdparm -t)

/dev/mapper/swap_crypt:
 Timing buffered disk reads:  14 MB in  3.68 seconds =   3.81 MB/sec

The patch increases both PPC4XX_NUM_SD and PPC4XX_NUM_PD to 256.
This improves the performance considerably:

/dev/mapper/swap_crypt:
 Timing buffered disk reads: 104 MB in  3.03 seconds =  34.31 MB/sec

Furthermore, PPC4XX_LAST_SD, PPC4XX_LAST_GD and PPC4XX_LAST_PD
can be easily calculated from their respective PPC4XX_NUM_*
constant.

Signed-off-by: Christian Lamparter 
Signed-off-by: Herbert Xu 
Signed-off-by: Sasha Levin 
---
 drivers/crypto/amcc/crypto4xx_core.h | 10 +-
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/drivers/crypto/amcc/crypto4xx_core.h 
b/drivers/crypto/amcc/crypto4xx_core.h
index ecfdcfe3698d..4f41d6da5acc 100644
--- a/drivers/crypto/amcc/crypto4xx_core.h
+++ b/drivers/crypto/amcc/crypto4xx_core.h
@@ -34,12 +34,12 @@
 #define PPC405EX_CE_RESET   0x0008
 
 #define CRYPTO4XX_CRYPTO_PRIORITY  300
-#define PPC4XX_LAST_PD 63
-#define PPC4XX_NUM_PD  64
-#define PPC4XX_LAST_GD 1023
+#define PPC4XX_NUM_PD  256
+#define PPC4XX_LAST_PD (PPC4XX_NUM_PD - 1)
 #define PPC4XX_NUM_GD  1024
-#define PPC4XX_LAST_SD 63
-#define PPC4XX_NUM_SD  64
+#define PPC4XX_LAST_GD (PPC4XX_NUM_GD - 1)
+#define PPC4XX_NUM_SD  256
+#define PPC4XX_LAST_SD (PPC4XX_NUM_SD - 1)
 #define PPC4XX_SD_BUFFER_SIZE  2048
 
 #define PD_ENTRY_INUSE 1
-- 
2.11.0


[PATCH AUTOSEL for 4.14 13/60] PCI: Avoid bus reset if bridge itself is broken

2017-12-12 Thread alexander . levin
From: David Daney 

[ Upstream commit 357027786f3523d26f42391aa4c075b8495e5d28 ]

When checking to see if a PCI bus can safely be reset, we previously
checked to see if any of the children had their PCI_DEV_FLAGS_NO_BUS_RESET
flag set.  Children marked with that flag are known not to behave well
after a bus reset.

Some PCIe root port bridges also do not behave well after a bus reset,
sometimes causing the devices behind the bridge to become unusable.

Add a check for PCI_DEV_FLAGS_NO_BUS_RESET being set in the bridge device
to allow these bridges to be flagged, and prevent their secondary buses
from being reset.

Signed-off-by: David Daney 
[jglau...@cavium.com: fixed typo]
Signed-off-by: Jan Glauber 
Signed-off-by: Bjorn Helgaas 
Reviewed-by: Alex Williamson 

Signed-off-by: Sasha Levin 
---
 drivers/pci/pci.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 6078dfc11b11..74f1c57ab93b 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -4356,6 +4356,10 @@ static bool pci_bus_resetable(struct pci_bus *bus)
 {
struct pci_dev *dev;
 
+
+   if (bus->self && (bus->self->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET))
+   return false;
+
list_for_each_entry(dev, &bus->devices, bus_list) {
if (dev->dev_flags & PCI_DEV_FLAGS_NO_BUS_RESET ||
(dev->subordinate && !pci_bus_resetable(dev->subordinate)))
-- 
2.11.0


[PATCH AUTOSEL for 4.14 09/60] crypto: lrw - Fix an error handling path in 'create()'

2017-12-12 Thread alexander . levin
From: Christophe Jaillet 

[ Upstream commit 616129cc6e75fb4da6681c16c981fa82dfe5e4c7 ]

All error handling paths 'goto err_drop_spawn' except this one.
In order to avoid some resources leak, we should do it as well here.

Fixes: 700cb3f5fe75 ("crypto: lrw - Convert to skcipher")
Signed-off-by: Christophe JAILLET 
Signed-off-by: Herbert Xu 
Signed-off-by: Sasha Levin 
---
 crypto/lrw.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/crypto/lrw.c b/crypto/lrw.c
index a8bfae4451bf..eb681e9fe574 100644
--- a/crypto/lrw.c
+++ b/crypto/lrw.c
@@ -610,8 +610,10 @@ static int create(struct crypto_template *tmpl, struct 
rtattr **tb)
ecb_name[len - 1] = 0;
 
if (snprintf(inst->alg.base.cra_name, CRYPTO_MAX_ALG_NAME,
-"lrw(%s)", ecb_name) >= CRYPTO_MAX_ALG_NAME)
-   return -ENAMETOOLONG;
+"lrw(%s)", ecb_name) >= CRYPTO_MAX_ALG_NAME) {
+   err = -ENAMETOOLONG;
+   goto err_drop_spawn;
+   }
}
 
inst->alg.base.cra_flags = alg->base.cra_flags & CRYPTO_ALG_ASYNC;
-- 
2.11.0


[PATCH AUTOSEL for 4.14 12/60] net: phy: at803x: Change error to EINVAL for invalid MAC

2017-12-12 Thread alexander . levin
From: Dan Murphy 

[ Upstream commit fc7556877d1748ac00958822a0a3bba1d4bd9e0d ]

Change the return error code to EINVAL if the MAC
address is not valid in the set_wol function.

Signed-off-by: Dan Murphy 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/phy/at803x.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c
index c1e52b9dc58d..5f93e6add563 100644
--- a/drivers/net/phy/at803x.c
+++ b/drivers/net/phy/at803x.c
@@ -167,7 +167,7 @@ static int at803x_set_wol(struct phy_device *phydev,
mac = (const u8 *) ndev->dev_addr;
 
if (!is_valid_ether_addr(mac))
-   return -EFAULT;
+   return -EINVAL;
 
for (i = 0; i < 3; i++) {
phy_write(phydev, AT803X_MMD_ACCESS_CONTROL,
-- 
2.11.0


[PATCH AUTOSEL for 4.14 11/60] kvm, mm: account kvm related kmem slabs to kmemcg

2017-12-12 Thread alexander . levin
From: Shakeel Butt 

[ Upstream commit 46bea48ac241fe0b413805952dda74dd0c09ba8b ]

The kvm slabs can consume a significant amount of system memory
and indeed in our production environment we have observed that
a lot of machines are spending significant amount of memory that
can not be left as system memory overhead. Also the allocations
from these slabs can be triggered directly by user space applications
which has access to kvm and thus a buggy application can leak
such memory. So, these caches should be accounted to kmemcg.

Signed-off-by: Shakeel Butt 
Signed-off-by: Paolo Bonzini 
Signed-off-by: Sasha Levin 
---
 arch/x86/kvm/mmu.c  | 4 ++--
 virt/kvm/kvm_main.c | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
index 7a69cf053711..13ebeedcec07 100644
--- a/arch/x86/kvm/mmu.c
+++ b/arch/x86/kvm/mmu.c
@@ -5476,13 +5476,13 @@ int kvm_mmu_module_init(void)
 
pte_list_desc_cache = kmem_cache_create("pte_list_desc",
sizeof(struct pte_list_desc),
-   0, 0, NULL);
+   0, SLAB_ACCOUNT, NULL);
if (!pte_list_desc_cache)
goto nomem;
 
mmu_page_header_cache = kmem_cache_create("kvm_mmu_page_header",
  sizeof(struct kvm_mmu_page),
- 0, 0, NULL);
+ 0, SLAB_ACCOUNT, NULL);
if (!mmu_page_header_cache)
goto nomem;
 
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 9deb5a245b83..3d73299e05f2 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -4010,7 +4010,7 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned 
vcpu_align,
if (!vcpu_align)
vcpu_align = __alignof__(struct kvm_vcpu);
kvm_vcpu_cache = kmem_cache_create("kvm_vcpu", vcpu_size, vcpu_align,
-  0, NULL);
+  SLAB_ACCOUNT, NULL);
if (!kvm_vcpu_cache) {
r = -ENOMEM;
goto out_free_3;
-- 
2.11.0


[PATCH AUTOSEL for 4.14 17/60] PM / OPP: Move error message to debug level

2017-12-12 Thread alexander . levin
From: Fabio Estevam 

[ Upstream commit 035ed07208dc501d023873447113f3f178592156 ]

On some i.MX6 platforms which do not have speed grading
check, opp table will not be created in platform code,
so cpufreq driver prints the following error message:

cpu cpu0: dev_pm_opp_get_opp_count: OPP table not found (-19)

However, this is not really an error in this case because the
imx6q-cpufreq driver first calls dev_pm_opp_get_opp_count()
and if it fails, it means that platform code does not provide
OPP and then dev_pm_opp_of_add_table() will be called.

In order to avoid such confusing error message, move it to
debug level.

It is up to the caller of dev_pm_opp_get_opp_count() to check its
return value and decide if it will print an error or not.

Signed-off-by: Fabio Estevam 
Signed-off-by: Rafael J. Wysocki 
Signed-off-by: Sasha Levin 
---
 drivers/base/power/opp/core.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/base/power/opp/core.c b/drivers/base/power/opp/core.c
index a6de32530693..0459b1204694 100644
--- a/drivers/base/power/opp/core.c
+++ b/drivers/base/power/opp/core.c
@@ -296,7 +296,7 @@ int dev_pm_opp_get_opp_count(struct device *dev)
opp_table = _find_opp_table(dev);
if (IS_ERR(opp_table)) {
count = PTR_ERR(opp_table);
-   dev_err(dev, "%s: OPP table not found (%d)\n",
+   dev_dbg(dev, "%s: OPP table not found (%d)\n",
__func__, count);
return count;
}
-- 
2.11.0


[PATCH AUTOSEL for 4.14 20/60] kbuild: re-order the code to not parse unnecessary variables

2017-12-12 Thread alexander . levin
From: Masahiro Yamada 

[ Upstream commit 2c1f4f125159f10521944cea23e33a00fcf85ede ]

The top Makefile is divided into some sections such as mixed targets,
config targets, build targets, etc.

When we build mixed targets, Kbuild just invokes submake to process
them one by one.  In this case, compiler-related variables like CC,
KBUILD_CFLAGS, etc. are unneeded.

Check what kind of targets we are building first, and parse variables
for building only when necessary.

Signed-off-by: Masahiro Yamada 
Signed-off-by: Sasha Levin 
---
 Makefile | 233 ---
 1 file changed, 118 insertions(+), 115 deletions(-)

diff --git a/Makefile b/Makefile
index 43ac7bdb10ad..2c1cddc9c9b5 100644
--- a/Makefile
+++ b/Makefile
@@ -187,15 +187,6 @@ ifeq ("$(origin M)", "command line")
   KBUILD_EXTMOD := $(M)
 endif
 
-# If building an external module we do not care about the all: rule
-# but instead _all depend on modules
-PHONY += all
-ifeq ($(KBUILD_EXTMOD),)
-_all: all
-else
-_all: modules
-endif
-
 ifeq ($(KBUILD_SRC),)
 # building in the source tree
 srctree := .
@@ -207,6 +198,9 @@ else
 srctree := $(KBUILD_SRC)
 endif
 endif
+
+export KBUILD_CHECKSRC KBUILD_EXTMOD KBUILD_SRC
+
 objtree:= .
 src:= $(srctree)
 obj:= $(objtree)
@@ -215,6 +209,74 @@ VPATH  := $(srctree)$(if 
$(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
 
 export srctree objtree VPATH
 
+# To make sure we do not include .config for any of the *config targets
+# catch them early, and hand them over to scripts/kconfig/Makefile
+# It is allowed to specify more targets when calling make, including
+# mixing *config targets and build targets.
+# For example 'make oldconfig all'.
+# Detect when mixed targets is specified, and make a second invocation
+# of make so .config is not included in this case either (for *config).
+
+version_h := include/generated/uapi/linux/version.h
+old_version_h := include/linux/version.h
+
+no-dot-config-targets := clean mrproper distclean \
+cscope gtags TAGS tags help% %docs check% coccicheck \
+$(version_h) headers_% archheaders archscripts \
+kernelversion %src-pkg
+
+config-targets := 0
+mixed-targets  := 0
+dot-config := 1
+
+ifneq ($(filter $(no-dot-config-targets), $(MAKECMDGOALS)),)
+   ifeq ($(filter-out $(no-dot-config-targets), $(MAKECMDGOALS)),)
+   dot-config := 0
+   endif
+endif
+
+ifeq ($(KBUILD_EXTMOD),)
+ifneq ($(filter config %config,$(MAKECMDGOALS)),)
+config-targets := 1
+ifneq ($(words $(MAKECMDGOALS)),1)
+mixed-targets := 1
+endif
+endif
+endif
+# install and modules_install need also be processed one by one
+ifneq ($(filter install,$(MAKECMDGOALS)),)
+ifneq ($(filter modules_install,$(MAKECMDGOALS)),)
+   mixed-targets := 1
+endif
+endif
+
+ifeq ($(mixed-targets),1)
+# ===
+# We're called with mixed targets (*config and build targets).
+# Handle them one by one.
+
+PHONY += $(MAKECMDGOALS) __build_one_by_one
+
+$(filter-out __build_one_by_one, $(MAKECMDGOALS)): __build_one_by_one
+   @:
+
+__build_one_by_one:
+   $(Q)set -e; \
+   for i in $(MAKECMDGOALS); do \
+   $(MAKE) -f $(srctree)/Makefile $$i; \
+   done
+
+else
+
+# We need some generic definitions (do not try to remake the file).
+scripts/Kbuild.include: ;
+include scripts/Kbuild.include
+
+# Read KERNELRELEASE from include/config/kernel.release (if it exists)
+KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
+KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if 
$(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
+export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
+
 # SUBARCH tells the usermode build what the underlying arch is.  That is set
 # first, and if a usermode build is happening, the "ARCH=um" on the command
 # line overrides the setting of ARCH below.  If a native build is happening,
@@ -312,40 +374,6 @@ HOSTCFLAGS  += -Wno-unused-value -Wno-unused-parameter \
-Wno-missing-field-initializers -fno-delete-null-pointer-checks
 endif
 
-# Decide whether to build built-in, modular, or both.
-# Normally, just do built-in.
-
-KBUILD_MODULES :=
-KBUILD_BUILTIN := 1
-
-# If we have only "make modules", don't compile built-in objects.
-# When we're building modules with modversions, we need to consider
-# the built-in objects during the descend as well, in order to
-# make sure the checksums are up to date before we record them.
-
-ifeq ($(MAKECMDGOALS),modules)
-  KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1)
-endif
-
-# If we have "make  modules", compile modules
-# in addition to whatever we do anyway.
-# Just "make" or "make all" shall build modules as

[PATCH AUTOSEL for 4.14 16/60] PCI: Create SR-IOV virtfn/physfn links before attaching driver

2017-12-12 Thread alexander . levin
From: Stuart Hayes 

[ Upstream commit 27d6162944b9b34c32cd5841acd21786637ee743 ]

When creating virtual functions, create the "virtfn%u" and "physfn" links
in sysfs *before* attaching the driver instead of after.  When we attach
the driver to the new virtual network interface first, there is a race when
the driver attaches to the new sends out an "add" udev event, and the
network interface naming software (biosdevname or systemd, for example)
tries to look at these links.

Signed-off-by: Stuart Hayes 
Signed-off-by: Bjorn Helgaas 
Signed-off-by: Sasha Levin 
---
 drivers/pci/iov.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
index ac41c8be9200..0fd8e164339c 100644
--- a/drivers/pci/iov.c
+++ b/drivers/pci/iov.c
@@ -162,7 +162,6 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id, int 
reset)
 
pci_device_add(virtfn, virtfn->bus);
 
-   pci_bus_add_device(virtfn);
sprintf(buf, "virtfn%u", id);
rc = sysfs_create_link(&dev->dev.kobj, &virtfn->dev.kobj, buf);
if (rc)
@@ -173,6 +172,8 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id, int 
reset)
 
kobject_uevent(&virtfn->dev.kobj, KOBJ_CHANGE);
 
+   pci_bus_add_device(virtfn);
+
return 0;
 
 failed2:
-- 
2.11.0


[PATCH AUTOSEL for 4.14 15/60] scsi: mpt3sas: Fix IO error occurs on pulling out a drive from RAID1 volume created on two SATA drive

2017-12-12 Thread alexander . levin
From: Sreekanth Reddy 

[ Upstream commit 2ce9a3645299ba1752873d333d73f67620f4550b ]

Whenever an I/O for a RAID volume fails with IOCStatus
MPI2_IOCSTATUS_SCSI_IOC_TERMINATED and SCSIStatus equal to
(MPI2_SCSI_STATE_TERMINATED | MPI2_SCSI_STATE_NO_SCSI_STATUS) then
return the I/O to SCSI midlayer with "DID_RESET" (i.e. retry the IO
infinite times) set in the host byte.

Previously, the driver was completing the I/O with "DID_SOFT_ERROR"
which causes the I/O to be quickly retried. However, firmware needed
more time and hence I/Os were failing.

Signed-off-by: Sreekanth Reddy 
Reviewed-by: Tomas Henzl 
Signed-off-by: Martin K. Petersen 
Signed-off-by: Sasha Levin 
---
 drivers/scsi/mpt3sas/mpt3sas_scsih.c | 5 +
 1 file changed, 5 insertions(+)

diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c 
b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index 22998cbd538f..33ff691878e2 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -4804,6 +4804,11 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 
msix_index, u32 reply)
} else if (log_info == VIRTUAL_IO_FAILED_RETRY) {
scmd->result = DID_RESET << 16;
break;
+   } else if ((scmd->device->channel == RAID_CHANNEL) &&
+  (scsi_state == (MPI2_SCSI_STATE_TERMINATED |
+  MPI2_SCSI_STATE_NO_SCSI_STATUS))) {
+   scmd->result = DID_RESET << 16;
+   break;
}
scmd->result = DID_SOFT_ERROR << 16;
break;
-- 
2.11.0


[PATCH AUTOSEL for 4.14 01/60] backlight: pwm_bl: Fix overflow condition

2017-12-12 Thread alexander . levin
From: Derek Basehore 

[ Upstream commit 5d0c49acebc9488e37db95f1d4a55644e545ffe7 ]

This fixes an overflow condition that can happen with high max
brightness and period values in compute_duty_cycle. This fixes it by
using a 64 bit variable for computing the duty cycle.

Signed-off-by: Derek Basehore 
Acked-by: Thierry Reding 
Reviewed-by: Brian Norris 
Signed-off-by: Lee Jones 
Signed-off-by: Sasha Levin 
---
 drivers/video/backlight/pwm_bl.c | 7 +--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/video/backlight/pwm_bl.c b/drivers/video/backlight/pwm_bl.c
index 9bd17682655a..1c2289ddd555 100644
--- a/drivers/video/backlight/pwm_bl.c
+++ b/drivers/video/backlight/pwm_bl.c
@@ -79,14 +79,17 @@ static void pwm_backlight_power_off(struct pwm_bl_data *pb)
 static int compute_duty_cycle(struct pwm_bl_data *pb, int brightness)
 {
unsigned int lth = pb->lth_brightness;
-   int duty_cycle;
+   u64 duty_cycle;
 
if (pb->levels)
duty_cycle = pb->levels[brightness];
else
duty_cycle = brightness;
 
-   return (duty_cycle * (pb->period - lth) / pb->scale) + lth;
+   duty_cycle *= pb->period - lth;
+   do_div(duty_cycle, pb->scale);
+
+   return duty_cycle + lth;
 }
 
 static int pwm_backlight_update_status(struct backlight_device *bl)
-- 
2.11.0


[PATCH AUTOSEL for 4.14 21/60] i40e: use the safe hash table iterator when deleting mac filters

2017-12-12 Thread alexander . levin
From: Lihong Yang 

[ Upstream commit 784548c40d6f43eff2297220ad7800dc04be03c6 ]

This patch replaces hash_for_each function with hash_for_each_safe
when calling  __i40e_del_filter. The hash_for_each_safe function is
the right one to use when iterating over a hash table to safely remove
a hash entry. Otherwise, incorrect values may be read from freed memory.

Detected by CoverityScan, CID 1402048 Read from pointer after free

Signed-off-by: Lihong Yang 
Tested-by: Andrew Bowers 
Signed-off-by: Jeff Kirsher 
Signed-off-by: Sasha Levin 
---
 drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c 
b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
index 4d1e670f490e..fa25ea512e43 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
@@ -2779,6 +2779,7 @@ int i40e_ndo_set_vf_mac(struct net_device *netdev, int 
vf_id, u8 *mac)
struct i40e_mac_filter *f;
struct i40e_vf *vf;
int ret = 0;
+   struct hlist_node *h;
int bkt;
 
/* validate the request */
@@ -2817,7 +2818,7 @@ int i40e_ndo_set_vf_mac(struct net_device *netdev, int 
vf_id, u8 *mac)
/* Delete all the filters for this VSI - we're going to kill it
 * anyway.
 */
-   hash_for_each(vsi->mac_filter_hash, bkt, f, hlist)
+   hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist)
__i40e_del_filter(vsi, f);
 
spin_unlock_bh(&vsi->mac_filter_hash_lock);
-- 
2.11.0


[PATCH AUTOSEL for 4.14 24/60] IB/rxe: check for allocation failure on elem

2017-12-12 Thread alexander . levin
From: Colin Ian King 

[ Upstream commit 4831ca9e4a8e48cb27e0a792f73250390827a228 ]

The allocation for elem may fail (especially because we're using
GFP_ATOMIC) so best to check for a null return.  This fixes a potential
null pointer dereference when assigning elem->pool.

Detected by CoverityScan CID#1357507 ("Dereference null return value")

Fixes: 8700e3e7c485 ("Soft RoCE driver")
Signed-off-by: Colin Ian King 
Signed-off-by: Doug Ledford 
Signed-off-by: Sasha Levin 
---
 drivers/infiniband/sw/rxe/rxe_pool.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/infiniband/sw/rxe/rxe_pool.c 
b/drivers/infiniband/sw/rxe/rxe_pool.c
index c1b5f38f31a5..3b4916680018 100644
--- a/drivers/infiniband/sw/rxe/rxe_pool.c
+++ b/drivers/infiniband/sw/rxe/rxe_pool.c
@@ -404,6 +404,8 @@ void *rxe_alloc(struct rxe_pool *pool)
elem = kmem_cache_zalloc(pool_cache(pool),
 (pool->flags & RXE_POOL_ATOMIC) ?
 GFP_ATOMIC : GFP_KERNEL);
+   if (!elem)
+   return NULL;
 
elem->pool = pool;
kref_init(&elem->ref_cnt);
-- 
2.11.0


[PATCH AUTOSEL for 4.14 22/60] iio: st_sensors: add register mask for status register

2017-12-12 Thread alexander . levin
From: Lorenzo Bianconi 

[ Upstream commit e72a060151e5bb673af24993665e270fc4f674a7 ]

Introduce register mask for data-ready status register since
pressure sensors (e.g. LPS22HB) export just two channels
(BIT(0) and BIT(1)) and BIT(2) is marked reserved while in
st_sensors_new_samples_available() value read from status register
is masked using 0x7.
Moreover do not mask status register using active_scan_mask since
now status value is properly masked and if the result is not zero the
interrupt has to be consumed by the driver. This fix an issue on LPS25H
and LPS331AP where channel definition is swapped respect to status
register.
Furthermore that change allows to properly support new devices
(e.g LIS2DW12) that report just ZYXDA (data-ready) field in status register
to figure out if the interrupt has been generated by the device.

Fixes: 97865fe41322 (iio: st_sensors: verify interrupt event to status)
Signed-off-by: Lorenzo Bianconi 
Reviewed-by: Linus Walleij 
Signed-off-by: Jonathan Cameron 
Signed-off-by: Sasha Levin 
---
 drivers/iio/accel/st_accel_core.c  | 35 +-
 drivers/iio/common/st_sensors/st_sensors_core.c|  2 +-
 drivers/iio/common/st_sensors/st_sensors_trigger.c | 16 +++---
 drivers/iio/gyro/st_gyro_core.c| 15 --
 drivers/iio/magnetometer/st_magn_core.c| 10 +--
 drivers/iio/pressure/st_pressure_core.c| 15 --
 include/linux/iio/common/st_sensors.h  |  7 +++--
 7 files changed, 70 insertions(+), 30 deletions(-)

diff --git a/drivers/iio/accel/st_accel_core.c 
b/drivers/iio/accel/st_accel_core.c
index 752856b3a849..379de1829cdb 100644
--- a/drivers/iio/accel/st_accel_core.c
+++ b/drivers/iio/accel/st_accel_core.c
@@ -164,7 +164,10 @@ static const struct st_sensor_settings 
st_accel_sensors_settings[] = {
.mask_int2 = 0x00,
.addr_ihl = 0x25,
.mask_ihl = 0x02,
-   .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+   .stat_drdy = {
+   .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+   .mask = 0x07,
+   },
},
.sim = {
.addr = 0x23,
@@ -236,7 +239,10 @@ static const struct st_sensor_settings 
st_accel_sensors_settings[] = {
.mask_ihl = 0x80,
.addr_od = 0x22,
.mask_od = 0x40,
-   .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+   .stat_drdy = {
+   .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+   .mask = 0x07,
+   },
},
.sim = {
.addr = 0x23,
@@ -318,7 +324,10 @@ static const struct st_sensor_settings 
st_accel_sensors_settings[] = {
.mask_int2 = 0x00,
.addr_ihl = 0x23,
.mask_ihl = 0x40,
-   .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+   .stat_drdy = {
+   .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+   .mask = 0x07,
+   },
.ig1 = {
.en_addr = 0x23,
.en_mask = 0x08,
@@ -389,7 +398,10 @@ static const struct st_sensor_settings 
st_accel_sensors_settings[] = {
.drdy_irq = {
.addr = 0x21,
.mask_int1 = 0x04,
-   .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+   .stat_drdy = {
+   .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+   .mask = 0x07,
+   },
},
.sim = {
.addr = 0x21,
@@ -451,7 +463,10 @@ static const struct st_sensor_settings 
st_accel_sensors_settings[] = {
.mask_ihl = 0x80,
.addr_od = 0x22,
.mask_od = 0x40,
-   .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+   .stat_drdy = {
+   .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+   .mask = 0x07,
+   },
},
.sim = {
.addr = 0x21,
@@ -569,7 +584,10 @@ static const struct st_sensor_settings 
st_accel_sensors_settings[] = {
.drdy_irq = {
.addr = 0x21,
.mask_int1 = 0x04,
-   .addr_stat_drdy = ST_SENSORS_DEFAULT_STAT_ADDR,
+   .stat_drdy = {
+   .addr = ST_SENSORS_DEFAULT_STAT_ADDR,
+   .mask 

[PATCH AUTOSEL for 4.14 23/60] ixgbe: fix use of uninitialized padding

2017-12-12 Thread alexander . levin
From: Emil Tantilov 

[ Upstream commit dcfd6b839c998bc9838e2a47f44f37afbdf3099c ]

This patch is resolving Coverity hits where padding in a structure could
be used uninitialized.

- Initialize fwd_cmd.pad/2 before ixgbe_calculate_checksum()

- Initialize buffer.pad2/3 before ixgbe_hic_unlocked()

Signed-off-by: Emil Tantilov 
Tested-by: Andrew Bowers 
Signed-off-by: Jeff Kirsher 
Signed-off-by: Sasha Levin 
---
 drivers/net/ethernet/intel/ixgbe/ixgbe_common.c | 4 ++--
 drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c   | 2 ++
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
index 6e6ab6f6875e..64429a14c630 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c
@@ -3781,10 +3781,10 @@ s32 ixgbe_set_fw_drv_ver_generic(struct ixgbe_hw *hw, 
u8 maj, u8 min,
fw_cmd.ver_build = build;
fw_cmd.ver_sub = sub;
fw_cmd.hdr.checksum = 0;
-   fw_cmd.hdr.checksum = ixgbe_calculate_checksum((u8 *)&fw_cmd,
-   (FW_CEM_HDR_LEN + fw_cmd.hdr.buf_len));
fw_cmd.pad = 0;
fw_cmd.pad2 = 0;
+   fw_cmd.hdr.checksum = ixgbe_calculate_checksum((u8 *)&fw_cmd,
+   (FW_CEM_HDR_LEN + fw_cmd.hdr.buf_len));
 
for (i = 0; i <= FW_CEM_MAX_RETRIES; i++) {
ret_val = ixgbe_host_interface_command(hw, &fw_cmd,
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
index 19fbb2f28ea4..8a85217845ae 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c
@@ -900,6 +900,8 @@ static s32 ixgbe_read_ee_hostif_buffer_X550(struct ixgbe_hw 
*hw,
/* convert offset from words to bytes */
buffer.address = cpu_to_be32((offset + current_word) * 2);
buffer.length = cpu_to_be16(words_to_read * 2);
+   buffer.pad2 = 0;
+   buffer.pad3 = 0;
 
status = ixgbe_hic_unlocked(hw, (u32 *)&buffer, sizeof(buffer),
IXGBE_HI_COMMAND_TIMEOUT);
-- 
2.11.0


[PATCH AUTOSEL for 4.14 30/60] Bluetooth: hci_uart_set_flow_control: Fix NULL deref when using serdev

2017-12-12 Thread alexander . levin
From: Hans de Goede 

[ Upstream commit 7841d554809b518a22349e7e39b6b63f8a48d0fb ]

Fix a NULL pointer deref (hu->tty) when calling hci_uart_set_flow_control
on hci_uart-s using serdev.

Signed-off-by: Hans de Goede 
Signed-off-by: Marcel Holtmann 
Signed-off-by: Sasha Levin 
---
 drivers/bluetooth/hci_ldisc.c | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c
index a746627e784e..eec95019f15c 100644
--- a/drivers/bluetooth/hci_ldisc.c
+++ b/drivers/bluetooth/hci_ldisc.c
@@ -41,6 +41,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include 
@@ -298,6 +299,12 @@ void hci_uart_set_flow_control(struct hci_uart *hu, bool 
enable)
unsigned int set = 0;
unsigned int clear = 0;
 
+   if (hu->serdev) {
+   serdev_device_set_flow_control(hu->serdev, !enable);
+   serdev_device_set_rts(hu->serdev, !enable);
+   return;
+   }
+
if (enable) {
/* Disable hardware flow control */
ktermios = tty->termios;
-- 
2.11.0


[PATCH AUTOSEL for 4.14 03/60] clk: sunxi-ng: nm: Check if requested rate is supported by fractional clock

2017-12-12 Thread alexander . levin
From: Chen-Yu Tsai 

[ Upstream commit 4cdbc40d64d4b8303a97e29a52862e4d99502beb ]

The round_rate callback for N-M-factor style clocks does not check if
the requested clock rate is supported by the fractional clock mode.
While this doesn't affect usage in practice, since the clock rates
are also supported through N-M factors, it does not match the set_rate
code.

Add a check to the round_rate callback so it matches the set_rate
callback.

Fixes: 6174a1e24b0d ("clk: sunxi-ng: Add N-M-factor clock support")
Signed-off-by: Chen-Yu Tsai 
Signed-off-by: Maxime Ripard 
Signed-off-by: Sasha Levin 
---
 drivers/clk/sunxi-ng/ccu_nm.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/clk/sunxi-ng/ccu_nm.c b/drivers/clk/sunxi-ng/ccu_nm.c
index a32158e8f2e3..84a5e7f17f6f 100644
--- a/drivers/clk/sunxi-ng/ccu_nm.c
+++ b/drivers/clk/sunxi-ng/ccu_nm.c
@@ -99,6 +99,9 @@ static long ccu_nm_round_rate(struct clk_hw *hw, unsigned 
long rate,
struct ccu_nm *nm = hw_to_ccu_nm(hw);
struct _ccu_nm _nm;
 
+   if (ccu_frac_helper_has_rate(&nm->common, &nm->frac, rate))
+   return rate;
+
_nm.min_n = nm->n.min ?: 1;
_nm.max_n = nm->n.max ?: 1 << nm->n.width;
_nm.min_m = 1;
-- 
2.11.0


[PATCH AUTOSEL for 4.14 25/60] block,bfq: Disable writeback throttling

2017-12-12 Thread alexander . levin
From: Luca Miccio 

[ Upstream commit b5dc5d4d1f4ff9032eb6c21a3c571a1317dc9289 ]

Similarly to CFQ, BFQ has its write-throttling heuristics, and it
is better not to combine them with further write-throttling
heuristics of a different nature.
So this commit disables write-back throttling for a device if BFQ
is used as I/O scheduler for that device.

Signed-off-by: Luca Miccio 
Signed-off-by: Paolo Valente 
Tested-by: Oleksandr Natalenko 
Tested-by: Lee Tibbert 
Signed-off-by: Jens Axboe 
Signed-off-by: Sasha Levin 
---
 block/bfq-iosched.c | 3 ++-
 block/blk-wbt.c | 2 +-
 2 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
index a4783da90ba8..0f860cf0d56d 100644
--- a/block/bfq-iosched.c
+++ b/block/bfq-iosched.c
@@ -108,6 +108,7 @@
 #include "blk-mq-tag.h"
 #include "blk-mq-sched.h"
 #include "bfq-iosched.h"
+#include "blk-wbt.h"
 
 #define BFQ_BFQQ_FNS(name) \
 void bfq_mark_bfqq_##name(struct bfq_queue *bfqq)  \
@@ -4775,7 +4776,7 @@ static int bfq_init_queue(struct request_queue *q, struct 
elevator_type *e)
bfq_init_root_group(bfqd->root_group, bfqd);
bfq_init_entity(&bfqd->oom_bfqq.entity, bfqd->root_group);
 
-
+   wbt_disable_default(q);
return 0;
 
 out_free:
diff --git a/block/blk-wbt.c b/block/blk-wbt.c
index 6a9a0f03a67b..e59d59c11ebb 100644
--- a/block/blk-wbt.c
+++ b/block/blk-wbt.c
@@ -654,7 +654,7 @@ void wbt_set_write_cache(struct rq_wb *rwb, bool 
write_cache_on)
 }
 
 /*
- * Disable wbt, if enabled by default. Only called from CFQ.
+ * Disable wbt, if enabled by default.
  */
 void wbt_disable_default(struct request_queue *q)
 {
-- 
2.11.0


[PATCH AUTOSEL for 4.14 27/60] ip_gre: check packet length and mtu correctly in erspan tx

2017-12-12 Thread alexander . levin
From: William Tu 

[ Upstream commit f192970de860d3ab90aa9e2a22853201a57bde78 ]

Similarly to early patch for erspan_xmit(), the ARPHDR_ETHER device
is the length of the whole ether packet.  So skb->len should subtract
the dev->hard_header_len.

Fixes: 1a66a836da63 ("gre: add collect_md mode to ERSPAN tunnel")
Fixes: 84e54fe0a5ea ("gre: introduce native tunnel support for ERSPAN")
Signed-off-by: William Tu 
Cc: Xin Long 
Cc: David Laight 
Reviewed-by: Xin Long 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 net/ipv4/ip_gre.c | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 467e44d7587d..045331204097 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -579,8 +579,8 @@ static void erspan_fb_xmit(struct sk_buff *skb, struct 
net_device *dev,
if (gre_handle_offloads(skb, false))
goto err_free_rt;
 
-   if (skb->len > dev->mtu) {
-   pskb_trim(skb, dev->mtu);
+   if (skb->len > dev->mtu + dev->hard_header_len) {
+   pskb_trim(skb, dev->mtu + dev->hard_header_len);
truncate = true;
}
 
@@ -731,8 +731,8 @@ static netdev_tx_t erspan_xmit(struct sk_buff *skb,
if (skb_cow_head(skb, dev->needed_headroom))
goto free_skb;
 
-   if (skb->len - dev->hard_header_len > dev->mtu) {
-   pskb_trim(skb, dev->mtu);
+   if (skb->len > dev->mtu + dev->hard_header_len) {
+   pskb_trim(skb, dev->mtu + dev->hard_header_len);
truncate = true;
}
 
-- 
2.11.0


[PATCH AUTOSEL for 4.14 04/60] clk: sunxi-ng: sun5i: Fix bit offset of audio PLL post-divider

2017-12-12 Thread alexander . levin
From: Chen-Yu Tsai 

[ Upstream commit d51fe3ba9773c8b6fc79f82bbe75d64baf604292 ]

The post-divider for the audio PLL is in bits [29:26], as specified
in the user manual, not [19:16] as currently programmed in the code.
The post-divider has a default register value of 2, i.e. a divider
of 3. This means the clock rate fed to the audio codec would be off.

This was discovered when porting sigma-delta modulation for the PLL
to sun5i, which needs the post-divider to be 1.

Fix the bit offset, so we do actually force the post-divider to a
certain value.

Fixes: 5e73761786d6 ("clk: sunxi-ng: Add sun5i CCU driver")
Signed-off-by: Chen-Yu Tsai 
Signed-off-by: Maxime Ripard 
Signed-off-by: Sasha Levin 
---
 drivers/clk/sunxi-ng/ccu-sun5i.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/clk/sunxi-ng/ccu-sun5i.c b/drivers/clk/sunxi-ng/ccu-sun5i.c
index ab9e850b3707..2f385a57cd91 100644
--- a/drivers/clk/sunxi-ng/ccu-sun5i.c
+++ b/drivers/clk/sunxi-ng/ccu-sun5i.c
@@ -982,8 +982,8 @@ static void __init sun5i_ccu_init(struct device_node *node,
 
/* Force the PLL-Audio-1x divider to 4 */
val = readl(reg + SUN5I_PLL_AUDIO_REG);
-   val &= ~GENMASK(19, 16);
-   writel(val | (3 << 16), reg + SUN5I_PLL_AUDIO_REG);
+   val &= ~GENMASK(29, 26);
+   writel(val | (3 << 26), reg + SUN5I_PLL_AUDIO_REG);
 
/*
 * Use the peripheral PLL as the AHB parent, instead of CPU /
-- 
2.11.0


[PATCH AUTOSEL for 4.14 29/60] leds: pca955x: Don't invert requested value in pca955x_gpio_set_value()

2017-12-12 Thread alexander . levin
From: Andrew Jeffery 

[ Upstream commit 52ca7d0f7bdad832b291ed979146443533ee79c0 ]

The PCA9552 lines can be used either for driving LEDs or as GPIOs. The
manual states that for LEDs, the operation is open-drain:

 The LSn LED select registers determine the source of the LED data.

   00 = output is set LOW (LED on)
   01 = output is set high-impedance (LED off; default)
   10 = output blinks at PWM0 rate
   11 = output blinks at PWM1 rate

For GPIOs it suggests a pull-up so that the open-case drives the line
high:

 For use as output, connect external pull-up resistor to the pin
 and size it according to the DC recommended operating
 characteristics.  LED output pin is HIGH when the output is
 programmed as high-impedance, and LOW when the output is
 programmed LOW through the ‘LED selector’ register.  The output
 can be pulse-width controlled when PWM0 or PWM1 are used.

Now, I have a hardware design that uses the LED controller to control
LEDs. However, for $reasons, we're using the leds-gpio driver to drive
the them. The reasons are here are a tangent but lead to the discovery
of the inversion, which manifested as the LEDs being set to full
brightness at boot when we expected them to be off.

As we're driving the LEDs through leds-gpio, this means wending our way
through the gpiochip abstractions. So with that in mind we need to
describe an active-low GPIO configuration to drive the LEDs as though
they were GPIOs.

The set() gpiochip callback in leds-pca955x does the following:

 ...
 if (val)
pca955x_led_set(&led->led_cdev, LED_FULL);
 else
pca955x_led_set(&led->led_cdev, LED_OFF);
 ...

Where LED_FULL = 255. pca955x_led_set() in turn does:

 ...
 switch (value) {
 case LED_FULL:
ls = pca955x_ledsel(ls, ls_led, PCA955X_LS_LED_ON);
break;
 ...

Where PCA955X_LS_LED_ON is defined as:

 #define PCA955X_LS_LED_ON  0x0 /* Output LOW */

So here we have some type confusion: We've crossed domains from GPIO
behaviour to LED behaviour without accounting for possible inversions
in the process.

Stepping back to leds-gpio for a moment, during probe() we call
create_gpio_led(), which eventually executes:

 if (template->default_state == LEDS_GPIO_DEFSTATE_KEEP) {
state = gpiod_get_value_cansleep(led_dat->gpiod);
if (state < 0)
return state;
 } else {
state = (template->default_state == LEDS_GPIO_DEFSTATE_ON);
 }
 ...
 ret = gpiod_direction_output(led_dat->gpiod, state);

In the devicetree the GPIO is annotated as active-low, and
gpiod_get_value_cansleep() handles this for us:

 int gpiod_get_value_cansleep(const struct gpio_desc *desc)
 {
 int value;

 might_sleep_if(extra_checks);
 VALIDATE_DESC(desc);
 value = _gpiod_get_raw_value(desc);
 if (value < 0)
 return value;

 if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
 value = !value;

 return value;
 }

_gpiod_get_raw_value() in turn calls through the get() callback for the
gpiochip implementation, so returning to our get() implementation in
leds-pca955x we find we extract the raw value from hardware:

 static int pca955x_gpio_get_value(struct gpio_chip *gc, unsigned int 
offset)
 {
 struct pca955x *pca955x = gpiochip_get_data(gc);
 struct pca955x_led *led = &pca955x->leds[offset];
 u8 reg = pca955x_read_input(pca955x->client, led->led_num / 8);

 return !!(reg & (1 << (led->led_num % 8)));
 }

This behaviour is not symmetric with that of set(), where the val is
inverted by the driver.

Closing the loop on the GPIO_ACTIVE_LOW inversions,
gpiod_direction_output(), like gpiod_get_value_cansleep(), handles it
for us:

 int gpiod_direction_output(struct gpio_desc *desc, int value)
 {
  VALIDATE_DESC(desc);
  if (test_bit(FLAG_ACTIVE_LOW, &desc->flags))
   value = !value;
  else
   value = !!value;
  return _gpiod_direction_output_raw(desc, value);
 }

All-in-all, with a value of 'keep' for default-state property in a
leds-gpio child node, the current state of the hardware will in-fact be
inverted; precisely the opposite of what was intended.

Rework leds-pca955x so that we avoid the incorrect inversion and clarify
the semantics with respect to GPIO.

Signed-off-by: Andrew Jeffery 
Reviewed-by: Cédric Le Goater 
Tested-by: Joel Stanley 
Tested-by: Matt Spinler 
Signed-off-by: Jacek Anaszewski 
Signed-off-by: Sasha Levin 
---
 driv

[PATCH AUTOSEL for 4.14 26/60] md: always set THREAD_WAKEUP and wake up wqueue if thread existed

2017-12-12 Thread alexander . levin
From: Guoqing Jiang 

[ Upstream commit d1d90147c9680aaec4a5757932c2103c42c9c23b ]

Since commit 4ad23a976413 ("MD: use per-cpu counter for writes_pending"),
the wait_queue is only got invoked if THREAD_WAKEUP is not set previously.

With above change, I can see process_metadata_update could always hang on
the wait queue, because mddev->thread could stay on 'D' status and the
THREAD_WAKEUP flag is not cleared since there are lots of place to wake up
mddev->thread. Then deadlock happened as follows:

linux175:~ # ps aux|grep md|grep D
root20117   0.0 0.0 0   0 ? D   03:45   0:00 [md0_raid1]
root20125   0.0 0.0 0   0 ? D   03:45   0:00 [md0_cluster_rec]
linux175:~ # cat /proc/20117/stack
[] dlm_lock_sync+0x94/0xd0 [md_cluster]
[] lock_token+0x34/0xd0 [md_cluster]
[] metadata_update_start+0x64/0x110 [md_cluster]
[] md_update_sb.part.58+0x9b/0x860 [md_mod]
[] md_update_sb+0x15/0x30 [md_mod]
[] md_check_recovery+0x266/0x490 [md_mod]
[] raid1d+0x42/0x810 [raid1]
[] md_thread+0x122/0x150 [md_mod]
[] kthread+0x101/0x140
linux175:~ # cat /proc/20125/stack
[] recv_daemon+0x3f9/0x5c0 [md_cluster]
[] md_thread+0x122/0x150 [md_mod]
[] kthread+0x101/0x140

So let's revert the part of code in the commit to resovle the problem since
we can't get lots of benefits of previous change.

Fixes: 4ad23a976413 ("MD: use per-cpu counter for writes_pending")
Signed-off-by: Guoqing Jiang 
Signed-off-by: Shaohua Li 
Signed-off-by: Sasha Levin 
---
 drivers/md/md.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/md/md.c b/drivers/md/md.c
index 98ea86309ceb..6bf093cef958 100644
--- a/drivers/md/md.c
+++ b/drivers/md/md.c
@@ -7468,8 +7468,8 @@ void md_wakeup_thread(struct md_thread *thread)
 {
if (thread) {
pr_debug("md: waking up MD thread %s.\n", thread->tsk->comm);
-   if (!test_and_set_bit(THREAD_WAKEUP, &thread->flags))
-   wake_up(&thread->wqueue);
+   set_bit(THREAD_WAKEUP, &thread->flags);
+   wake_up(&thread->wqueue);
}
 }
 EXPORT_SYMBOL(md_wakeup_thread);
-- 
2.11.0


[PATCH AUTOSEL for 4.14 19/60] Bluetooth: avoid silent hci_bcm ACPI PM regression

2017-12-12 Thread alexander . levin
From: Johan Hovold 

[ Upstream commit 4294625e029028854596865be401b9c5c1f906ef ]

The hci_bcm platform-device hack which was used to implement
power management for ACPI devices is being replaced by a
serial-device-bus implementation.

Unfortunately, when the corresponding change to the ACPI code lands (a
change that will stop enumerating and registering the serial-device-node
child as a platform device) PM will break silently unless serdev
TTY-port controller support has been enabled. Specifically, hciattach
(btattach) would still succeed, but power management would no longer
work.

Although this is strictly a runtime dependency, let's make the driver
depend on SERIAL_DEV_CTRL_TTYPORT, which is the particular serdev
controller implementation used by the ACPI devices currently managed by
this driver, to avoid breaking PM without anyone noticing.

Note that the driver already has a (build-time) dependency on the serdev
bus code.

Signed-off-by: Johan Hovold 
Signed-off-by: Marcel Holtmann 
Signed-off-by: Sasha Levin 
---
 drivers/bluetooth/Kconfig | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
index 98a60db8e5d1..369dedf52d5f 100644
--- a/drivers/bluetooth/Kconfig
+++ b/drivers/bluetooth/Kconfig
@@ -170,6 +170,7 @@ config BT_HCIUART_BCM
bool "Broadcom protocol support"
depends on BT_HCIUART
depends on BT_HCIUART_SERDEV
+   depends on (!ACPI || SERIAL_DEV_CTRL_TTYPORT)
select BT_HCIUART_H4
select BT_BCM
help
-- 
2.11.0


[PATCH AUTOSEL for 4.14 39/60] powerpc/watchdog: Do not trigger SMP crash from touch_nmi_watchdog

2017-12-12 Thread alexander . levin
From: Nicholas Piggin 

[ Upstream commit 80e4d70b06863e0104e5a0dc78aa3710297fbd4b ]

In xmon, touch_nmi_watchdog() is not expected to be checking that
other CPUs have not touched the watchdog, so the code will just call
touch_nmi_watchdog() once before re-enabling hard interrupts.

Just update our CPU's state, and ignore apparently stuck SMP threads.

Arguably touch_nmi_watchdog should check for SMP lockups, and callers
should be fixed, but that's not trivial for the input code of xmon.

Signed-off-by: Nicholas Piggin 
Signed-off-by: Michael Ellerman 
Signed-off-by: Sasha Levin 
---
 arch/powerpc/kernel/watchdog.c | 7 +--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/kernel/watchdog.c b/arch/powerpc/kernel/watchdog.c
index 57190f384f63..ce848ff84edd 100644
--- a/arch/powerpc/kernel/watchdog.c
+++ b/arch/powerpc/kernel/watchdog.c
@@ -276,9 +276,12 @@ void arch_touch_nmi_watchdog(void)
 {
unsigned long ticks = tb_ticks_per_usec * wd_timer_period_ms * 1000;
int cpu = smp_processor_id();
+   u64 tb = get_tb();
 
-   if (get_tb() - per_cpu(wd_timer_tb, cpu) >= ticks)
-   watchdog_timer_interrupt(cpu);
+   if (tb - per_cpu(wd_timer_tb, cpu) >= ticks) {
+   per_cpu(wd_timer_tb, cpu) = tb;
+   wd_smp_clear_cpu_pending(cpu, tb);
+   }
 }
 EXPORT_SYMBOL(arch_touch_nmi_watchdog);
 
-- 
2.11.0


[PATCH AUTOSEL for 4.14 34/60] tracing: Exclude 'generic fields' from histograms

2017-12-12 Thread alexander . levin
From: Tom Zanussi 

[ Upstream commit a15f7fc20389a8827d5859907568b201234d4b79 ]

There are a small number of 'generic fields' (comm/COMM/cpu/CPU) that
are found by trace_find_event_field() but are only meant for
filtering.  Specifically, they unlike normal fields, they have a size
of 0 and thus wreak havoc when used as a histogram key.

Exclude these (return -EINVAL) when used as histogram keys.

Link: 
http://lkml.kernel.org/r/956154cbc3e8a4f0633d619b886c97f0f0edf7b4.1506105045.git.tom.zanu...@linux.intel.com

Signed-off-by: Tom Zanussi 
Signed-off-by: Steven Rostedt (VMware) 
Signed-off-by: Sasha Levin 
---
 kernel/trace/trace_events_hist.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index 1c21d0e2a145..7eb975a2d0e1 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -450,7 +450,7 @@ static int create_val_field(struct hist_trigger_data 
*hist_data,
}
 
field = trace_find_event_field(file->event_call, field_name);
-   if (!field) {
+   if (!field || !field->size) {
ret = -EINVAL;
goto out;
}
@@ -548,7 +548,7 @@ static int create_key_field(struct hist_trigger_data 
*hist_data,
}
 
field = trace_find_event_field(file->event_call, field_name);
-   if (!field) {
+   if (!field || !field->size) {
ret = -EINVAL;
goto out;
}
-- 
2.11.0


[PATCH AUTOSEL for 4.14 33/60] PCI/AER: Report non-fatal errors only to the affected endpoint

2017-12-12 Thread alexander . levin
From: Gabriele Paoloni 

[ Upstream commit 86acc790717fb60fb51ea3095084e331d8711c74 ]

Previously, if an non-fatal error was reported by an endpoint, we
called report_error_detected() for the endpoint, every sibling on the
bus, and their descendents.  If any of them did not implement the
.error_detected() method, do_recovery() failed, leaving all these
devices unrecovered.

For example, the system described in the bugzilla below has two devices:

  :74:02.0 [19e5:a230] SAS controller, driver has .error_detected()
  :74:03.0 [19e5:a235] SATA controller, driver lacks .error_detected()

When a device such as 74:02.0 reported a non-fatal error, do_recovery()
failed because 74:03.0 lacked an .error_detected() method.  But per PCIe
r3.1, sec 6.2.2.2.2, such an error does not compromise the Link and
does not affect 74:03.0:

  Non-fatal errors are uncorrectable errors which cause a particular
  transaction to be unreliable but the Link is otherwise fully functional.
  Isolating Non-fatal from Fatal errors provides Requester/Receiver logic
  in a device or system management software the opportunity to recover from
  the error without resetting the components on the Link and disturbing
  other transactions in progress.  Devices not associated with the
  transaction in error are not impacted by the error.

Report non-fatal errors only to the endpoint that reported them.  We really
want to check for AER_NONFATAL here, but the current code structure doesn't
allow that.  Looking for pci_channel_io_normal is the best we can do now.

Link: https://bugzilla.kernel.org/show_bug.cgi?id=197055
Fixes: 6c2b374d7485 ("PCI-Express AER implemetation: AER core and aerdriver")
Signed-off-by: Gabriele Paoloni 
Signed-off-by: Dongdong Liu 
[bhelgaas: changelog]
Signed-off-by: Bjorn Helgaas 

Signed-off-by: Sasha Levin 
---
 drivers/pci/pcie/aer/aerdrv_core.c | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/pcie/aer/aerdrv_core.c 
b/drivers/pci/pcie/aer/aerdrv_core.c
index 890efcc574cb..744805232155 100644
--- a/drivers/pci/pcie/aer/aerdrv_core.c
+++ b/drivers/pci/pcie/aer/aerdrv_core.c
@@ -390,7 +390,14 @@ static pci_ers_result_t broadcast_error_message(struct 
pci_dev *dev,
 * If the error is reported by an end point, we think this
 * error is related to the upstream link of the end point.
 */
-   pci_walk_bus(dev->bus, cb, &result_data);
+   if (state == pci_channel_io_normal)
+   /*
+* the error is non fatal so the bus is ok, just invoke
+* the callback for the function that logged the error.
+*/
+   cb(dev, &result_data);
+   else
+   pci_walk_bus(dev->bus, cb, &result_data);
}
 
return result_data.result;
-- 
2.11.0


[PATCH AUTOSEL for 4.14 44/60] scsi: lpfc: PLOGI failures during NPIV testing

2017-12-12 Thread alexander . levin
From: Dick Kennedy 

[ Upstream commit e8bcf0ae4c0346fdc78ebefe0eefcaa6a6622d38 ]

Local Reject/Invalid RPI errors seen during discovery.

Temporary RPI cleanup was occurring regardless of SLI rev. It's only
necessary on SLI-4.

Adjust the test for whether cleanup is necessary.

Signed-off-by: Dick Kennedy 
Signed-off-by: James Smart 
Reviewed-by: Johannes Thumshirn 
Signed-off-by: Martin K. Petersen 
Signed-off-by: Sasha Levin 
---
 drivers/scsi/lpfc/lpfc_hbadisc.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
index 499df9d17339..d9a03beb76a4 100644
--- a/drivers/scsi/lpfc/lpfc_hbadisc.c
+++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
@@ -4983,7 +4983,8 @@ lpfc_nlp_remove(struct lpfc_vport *vport, struct 
lpfc_nodelist *ndlp)
lpfc_cancel_retry_delay_tmo(vport, ndlp);
if ((ndlp->nlp_flag & NLP_DEFER_RM) &&
!(ndlp->nlp_flag & NLP_REG_LOGIN_SEND) &&
-   !(ndlp->nlp_flag & NLP_RPI_REGISTERED)) {
+   !(ndlp->nlp_flag & NLP_RPI_REGISTERED) &&
+   phba->sli_rev != LPFC_SLI_REV4) {
/* For this case we need to cleanup the default rpi
 * allocated by the firmware.
 */
-- 
2.11.0


[PATCH AUTOSEL for 4.14 37/60] ASoC: img-parallel-out: Add pm_runtime_get/put to set_fmt callback

2017-12-12 Thread alexander . levin
From: Ed Blake 

[ Upstream commit c70458890ff15d858bd347fa9f563818bcd6e457 ]

Add pm_runtime_get_sync and pm_runtime_put calls to set_fmt callback
function. This fixes a bus error during boot when CONFIG_SUSPEND is
defined when this function gets called while the device is runtime
disabled and device registers are accessed while the clock is disabled.

Signed-off-by: Ed Blake 
Signed-off-by: Mark Brown 
Signed-off-by: Sasha Levin 
---
 sound/soc/img/img-parallel-out.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/sound/soc/img/img-parallel-out.c b/sound/soc/img/img-parallel-out.c
index 23b0f0f6ec9c..2fc8a6372206 100644
--- a/sound/soc/img/img-parallel-out.c
+++ b/sound/soc/img/img-parallel-out.c
@@ -164,9 +164,11 @@ static int img_prl_out_set_fmt(struct snd_soc_dai *dai, 
unsigned int fmt)
return -EINVAL;
}
 
+   pm_runtime_get_sync(prl->dev);
reg = img_prl_out_readl(prl, IMG_PRL_OUT_CTL);
reg = (reg & ~IMG_PRL_OUT_CTL_EDGE_MASK) | control_set;
img_prl_out_writel(prl, reg, IMG_PRL_OUT_CTL);
+   pm_runtime_put(prl->dev);
 
return 0;
 }
-- 
2.11.0


[PATCH AUTOSEL for 4.14 41/60] ASoC: codecs: msm8916-wcd-analog: fix module autoload

2017-12-12 Thread alexander . levin
From: Nicolas Dechesne 

[ Upstream commit 46d69e141d479585c105a4d5b2337cd2ce6967e5 ]

If the driver is built as a module, autoload won't work because the module
alias information is not filled. So user-space can't match the registered
device with the corresponding module.

Export the module alias information using the MODULE_DEVICE_TABLE() macro.

Before this patch:

$ modinfo snd_soc_msm8916_analog | grep alias
$

After this patch:

$ modinfo snd_soc_msm8916_analog | grep alias
alias:  of:N*T*Cqcom,pm8916-wcd-analog-codecC*
alias:  of:N*T*Cqcom,pm8916-wcd-analog-codec

Signed-off-by: Nicolas Dechesne 
Signed-off-by: Mark Brown 
Signed-off-by: Sasha Levin 
---
 sound/soc/codecs/msm8916-wcd-analog.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/sound/soc/codecs/msm8916-wcd-analog.c 
b/sound/soc/codecs/msm8916-wcd-analog.c
index a42f8ebb9670..18933bf6473f 100644
--- a/sound/soc/codecs/msm8916-wcd-analog.c
+++ b/sound/soc/codecs/msm8916-wcd-analog.c
@@ -1242,6 +1242,8 @@ static const struct of_device_id 
pm8916_wcd_analog_spmi_match_table[] = {
{ }
 };
 
+MODULE_DEVICE_TABLE(of, pm8916_wcd_analog_spmi_match_table);
+
 static struct platform_driver pm8916_wcd_analog_spmi_driver = {
.driver = {
   .name = "qcom,pm8916-wcd-spmi-codec",
-- 
2.11.0


[PATCH AUTOSEL for 4.14 43/60] scsi: lpfc: Fix secure firmware updates

2017-12-12 Thread alexander . levin
From: Dick Kennedy 

[ Upstream commit 184fc2b9a8bcbda9c14d0a1e7fbecfc028c7702e ]

Firmware update fails with: status x17 add_status x56 on the final write

If multiple DMA buffers are used for the download, some firmware revs
have difficulty with signatures and crcs split across the dma buffer
boundaries.  Resolve by making all writes be a single 4k page in length.

Signed-off-by: Dick Kennedy 
Signed-off-by: James Smart 
Reviewed-by: Johannes Thumshirn 
Signed-off-by: Martin K. Petersen 
Signed-off-by: Sasha Levin 
---
 drivers/scsi/lpfc/lpfc_hw4.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h
index 1db0a38683f4..2b145966c73f 100644
--- a/drivers/scsi/lpfc/lpfc_hw4.h
+++ b/drivers/scsi/lpfc/lpfc_hw4.h
@@ -3636,7 +3636,7 @@ struct lpfc_mbx_get_port_name {
 #define MB_CEQ_STATUS_QUEUE_FLUSHING   0x4
 #define MB_CQE_STATUS_DMA_FAILED   0x5
 
-#define LPFC_MBX_WR_CONFIG_MAX_BDE 8
+#define LPFC_MBX_WR_CONFIG_MAX_BDE 1
 struct lpfc_mbx_wr_object {
struct mbox_header header;
union {
-- 
2.11.0


[PATCH AUTOSEL for 4.14 51/60] net: ipv6: send NS for DAD when link operationally up

2017-12-12 Thread alexander . levin
From: Mike Manning 

[ Upstream commit 1f372c7bfb23286d2bf4ce0423ab488e86b74bb2 ]

The NS for DAD are sent on admin up as long as a valid qdisc is found.
A race condition exists by which these packets will not egress the
interface if the operational state of the lower device is not yet up.
The solution is to delay DAD until the link is operationally up
according to RFC2863. Rather than only doing this, follow the existing
code checks by deferring IPv6 device initialization altogether. The fix
allows DAD on devices like tunnels that are controlled by userspace
control plane. The fix has no impact on regular deployments, but means
that there is no IPv6 connectivity until the port has been opened in
the case of port-based network access control, which should be
desirable.

Signed-off-by: Mike Manning 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 net/ipv6/addrconf.c | 12 ++--
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 8a1c846d3df9..2ec39404c449 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -303,10 +303,10 @@ static struct ipv6_devconf ipv6_devconf_dflt 
__read_mostly = {
.disable_policy = 0,
 };
 
-/* Check if a valid qdisc is available */
-static inline bool addrconf_qdisc_ok(const struct net_device *dev)
+/* Check if link is ready: is it up and is a valid qdisc available */
+static inline bool addrconf_link_ready(const struct net_device *dev)
 {
-   return !qdisc_tx_is_noop(dev);
+   return netif_oper_up(dev) && !qdisc_tx_is_noop(dev);
 }
 
 static void addrconf_del_rs_timer(struct inet6_dev *idev)
@@ -451,7 +451,7 @@ static struct inet6_dev *ipv6_add_dev(struct net_device 
*dev)
 
ndev->token = in6addr_any;
 
-   if (netif_running(dev) && addrconf_qdisc_ok(dev))
+   if (netif_running(dev) && addrconf_link_ready(dev))
ndev->if_flags |= IF_READY;
 
ipv6_mc_init_dev(ndev);
@@ -3404,7 +3404,7 @@ static int addrconf_notify(struct notifier_block *this, 
unsigned long event,
/* restore routes for permanent addresses */
addrconf_permanent_addr(dev);
 
-   if (!addrconf_qdisc_ok(dev)) {
+   if (!addrconf_link_ready(dev)) {
/* device is not ready yet. */
pr_info("ADDRCONF(NETDEV_UP): %s: link is not 
ready\n",
dev->name);
@@ -3419,7 +3419,7 @@ static int addrconf_notify(struct notifier_block *this, 
unsigned long event,
run_pending = 1;
}
} else if (event == NETDEV_CHANGE) {
-   if (!addrconf_qdisc_ok(dev)) {
+   if (!addrconf_link_ready(dev)) {
/* device is still not ready. */
break;
}
-- 
2.11.0


[PATCH AUTOSEL for 4.14 53/60] staging: greybus: light: Release memory obtained by kasprintf

2017-12-12 Thread alexander . levin
From: Arvind Yadav 

[ Upstream commit 04820da21050b35eed68aa046115d810163ead0c ]

Free memory region, if gb_lights_channel_config is not successful.

Signed-off-by: Arvind Yadav 
Reviewed-by: Rui Miguel Silva 
Signed-off-by: Greg Kroah-Hartman 
Signed-off-by: Sasha Levin 
---
 drivers/staging/greybus/light.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/staging/greybus/light.c b/drivers/staging/greybus/light.c
index 3f4148c92308..0f538b8c3a07 100644
--- a/drivers/staging/greybus/light.c
+++ b/drivers/staging/greybus/light.c
@@ -925,6 +925,8 @@ static void __gb_lights_led_unregister(struct gb_channel 
*channel)
return;
 
led_classdev_unregister(cdev);
+   kfree(cdev->name);
+   cdev->name = NULL;
channel->led = NULL;
 }
 
-- 
2.11.0


[PATCH AUTOSEL for 4.14 52/60] RDMA/hns: Avoid NULL pointer exception

2017-12-12 Thread alexander . levin
From: "Wei Hu(Xavier)" 

[ Upstream commit 5e437b1d7e8d31ff9a4b8e898eb3a6cee309edd9 ]

After the loop in hns_roce_v1_mr_free_work_fn function, it is possible that
all qps will have been freed (in which case ne will be 0).  If that
happens, then later in the function when we dereference hr_qp we will
get an exception.  Check ne is not 0 to make sure we actually have an
hr_qp left to work on.

This patch fixes the smatch error as below:
drivers/infiniband/hw/hns/hns_roce_hw_v1.c:1009 hns_roce_v1_mr_free_work_fn()
error: we previously assumed 'hr_qp' could be null

Signed-off-by: Wei Hu (Xavier) 
Signed-off-by: Lijun Ou 
Signed-off-by: Shaobo Xu 
Signed-off-by: Doug Ledford 
Signed-off-by: Sasha Levin 
---
 drivers/infiniband/hw/hns/hns_roce_hw_v1.c | 5 +
 1 file changed, 5 insertions(+)

diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c 
b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c
index 747efd1ae5a6..8208c30f03c5 100644
--- a/drivers/infiniband/hw/hns/hns_roce_hw_v1.c
+++ b/drivers/infiniband/hw/hns/hns_roce_hw_v1.c
@@ -1001,6 +1001,11 @@ static void hns_roce_v1_mr_free_work_fn(struct 
work_struct *work)
}
}
 
+   if (!ne) {
+   dev_err(dev, "Reseved loop qp is absent!\n");
+   goto free_work;
+   }
+
do {
ret = hns_roce_v1_poll_cq(&mr_free_cq->ib_cq, ne, wc);
if (ret < 0) {
-- 
2.11.0


[PATCH AUTOSEL for 4.14 46/60] i40e: fix client notify of VF reset

2017-12-12 Thread alexander . levin
From: Alan Brady 

[ Upstream commit c53d11f669c0e7d0daf46a717b6712ad0b09de99 ]

Currently there is a bug in which the PF driver fails to inform clients
of a VF reset which then causes clients to leak resources.  The bug
exists because we were incorrectly checking the I40E_VF_STATE_PRE_ENABLE
bit.

When a VF is first init we go through a reset to initialize variables
and allocate resources but we don't want to inform clients of this first
reset since the client isn't fully enabled yet so we set a state bit
signifying we're in a "pre-enabled" client state.  During the first
reset we should be clearing the bit, allowing all following resets to
notify the client of the reset when the bit is not set.  This patch
fixes the issue by negating the 'test_and_clear_bit' check to accurately
reflect the behavior we want.

Signed-off-by: Alan Brady 
Tested-by: Andrew Bowers 
Signed-off-by: Jeff Kirsher 
Signed-off-by: Sasha Levin 
---
 drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c 
b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
index fa25ea512e43..e368b0237a1b 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
@@ -1008,8 +1008,8 @@ static void i40e_cleanup_reset_vf(struct i40e_vf *vf)
set_bit(I40E_VF_STATE_ACTIVE, &vf->vf_states);
clear_bit(I40E_VF_STATE_DISABLED, &vf->vf_states);
/* Do not notify the client during VF init */
-   if (test_and_clear_bit(I40E_VF_STATE_PRE_ENABLE,
-  &vf->vf_states))
+   if (!test_and_clear_bit(I40E_VF_STATE_PRE_ENABLE,
+   &vf->vf_states))
i40e_notify_client_of_vf_reset(pf, abs_vf_id);
vf->num_vlan = 0;
}
-- 
2.11.0


[PATCH AUTOSEL for 4.14 14/60] scsi: cxgb4i: fix Tx skb leak

2017-12-12 Thread alexander . levin
From: Varun Prakash 

[ Upstream commit 9b3a081fb62158b50bcc90522ca2423017544367 ]

In case of connection reset Tx skb queue can have some skbs which are
not transmitted so purge Tx skb queue in release_offload_resources() to
avoid skb leak.

Signed-off-by: Varun Prakash 
Signed-off-by: Martin K. Petersen 
Signed-off-by: Sasha Levin 
---
 drivers/scsi/cxgbi/cxgb4i/cxgb4i.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c 
b/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
index 1d02cf9fe06c..30d5f0ef29bb 100644
--- a/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
+++ b/drivers/scsi/cxgbi/cxgb4i/cxgb4i.c
@@ -1575,6 +1575,7 @@ static void release_offload_resources(struct cxgbi_sock 
*csk)
csk, csk->state, csk->flags, csk->tid);
 
cxgbi_sock_free_cpl_skbs(csk);
+   cxgbi_sock_purge_write_queue(csk);
if (csk->wr_cred != csk->wr_max_cred) {
cxgbi_sock_purge_wr_queue(csk);
cxgbi_sock_reset_wr_list(csk);
-- 
2.11.0


[PATCH AUTOSEL for 4.14 40/60] sctp: silence warns on sctp_stream_init allocations

2017-12-12 Thread alexander . levin
From: Marcelo Ricardo Leitner 

[ Upstream commit 1ae2eaaa229bc350b6f38fbf4ab9c873532aecfb ]

As SCTP supports up to 65535 streams, that can lead to very large
allocations in sctp_stream_init(). As Xin Long noticed, systems with
small amounts of memory are more prone to not have enough memory and
dump warnings on dmesg initiated by user actions. Thus, silence them.

Also, if the reallocation of stream->out is not necessary, skip it and
keep the memory we already have.

Reported-by: Xin Long 
Tested-by: Xin Long 
Signed-off-by: Marcelo Ricardo Leitner 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 net/sctp/stream.c | 8 +++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/net/sctp/stream.c b/net/sctp/stream.c
index fa8371ff05c4..724adf2786a2 100644
--- a/net/sctp/stream.c
+++ b/net/sctp/stream.c
@@ -40,9 +40,14 @@ int sctp_stream_init(struct sctp_stream *stream, __u16 
outcnt, __u16 incnt,
 {
int i;
 
+   gfp |= __GFP_NOWARN;
+
/* Initial stream->out size may be very big, so free it and alloc
-* a new one with new outcnt to save memory.
+* a new one with new outcnt to save memory if needed.
 */
+   if (outcnt == stream->outcnt)
+   goto in;
+
kfree(stream->out);
 
stream->out = kcalloc(outcnt, sizeof(*stream->out), gfp);
@@ -53,6 +58,7 @@ int sctp_stream_init(struct sctp_stream *stream, __u16 
outcnt, __u16 incnt,
for (i = 0; i < stream->outcnt; i++)
stream->out[i].state = SCTP_STREAM_OPEN;
 
+in:
if (!incnt)
return 0;
 
-- 
2.11.0


[PATCH AUTOSEL for 4.14 54/60] clk: sunxi-ng: sun6i: Rename HDMI DDC clock to avoid name collision

2017-12-12 Thread alexander . levin
From: Chen-Yu Tsai 

[ Upstream commit 7f3ed79188f2f094d0ee366fa858857fb7f511ba ]

The HDMI DDC clock found in the CCU is the parent of the actual DDC
clock within the HDMI controller. That clock is also named "hdmi-ddc".

Rename the one in the CCU to "ddc". This makes more sense than renaming
the one in the HDMI controller to something else.

Fixes: c6e6c96d8fa6 ("clk: sunxi-ng: Add A31/A31s clocks")
Signed-off-by: Chen-Yu Tsai 
Signed-off-by: Maxime Ripard 
Signed-off-by: Sasha Levin 
---
 drivers/clk/sunxi-ng/ccu-sun6i-a31.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c 
b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
index 8af434815fba..241fb13f1c06 100644
--- a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
+++ b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
@@ -608,7 +608,7 @@ static SUNXI_CCU_M_WITH_MUX_GATE(hdmi_clk, "hdmi", 
lcd_ch1_parents,
 0x150, 0, 4, 24, 2, BIT(31),
 CLK_SET_RATE_PARENT);
 
-static SUNXI_CCU_GATE(hdmi_ddc_clk, "hdmi-ddc", "osc24M", 0x150, BIT(30), 0);
+static SUNXI_CCU_GATE(hdmi_ddc_clk, "ddc", "osc24M", 0x150, BIT(30), 0);
 
 static SUNXI_CCU_GATE(ps_clk, "ps", "lcd1-ch1", 0x140, BIT(31), 0);
 
-- 
2.11.0


[PATCH AUTOSEL for 4.14 35/60] percpu: don't forget to free the temporary struct pcpu_alloc_info

2017-12-12 Thread alexander . levin
From: Nicolas Pitre 

[ Upstream commit 438a50618095061920d3a30d4c5ca1ef2e0ff860 ]

Unlike the SMP case, the !SMP case does not free the memory for struct
pcpu_alloc_info allocated in setup_per_cpu_areas(). And to give it a
chance of being reused by the page allocator later, align it to a page
boundary just like its size.

Signed-off-by: Nicolas Pitre 
Acked-by: Dennis Zhou 
Signed-off-by: Tejun Heo 
Signed-off-by: Sasha Levin 
---
 mm/percpu.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/mm/percpu.c b/mm/percpu.c
index a0e0c82c1e4c..79e3549cab0f 100644
--- a/mm/percpu.c
+++ b/mm/percpu.c
@@ -1856,7 +1856,7 @@ struct pcpu_alloc_info * __init pcpu_alloc_alloc_info(int 
nr_groups,
  __alignof__(ai->groups[0].cpu_map[0]));
ai_size = base_size + nr_units * sizeof(ai->groups[0].cpu_map[0]);
 
-   ptr = memblock_virt_alloc_nopanic(PFN_ALIGN(ai_size), 0);
+   ptr = memblock_virt_alloc_nopanic(PFN_ALIGN(ai_size), PAGE_SIZE);
if (!ptr)
return NULL;
ai = ptr;
@@ -2719,6 +2719,7 @@ void __init setup_per_cpu_areas(void)
 
if (pcpu_setup_first_chunk(ai, fc) < 0)
panic("Failed to initialize percpu areas.");
+   pcpu_free_alloc_info(ai);
 }
 
 #endif /* CONFIG_SMP */
-- 
2.11.0


[PATCH AUTOSEL for 4.14 56/60] rtc: set the alarm to the next expiring timer

2017-12-12 Thread alexander . levin
From: Alexandre Belloni 

[ Upstream commit 74717b28cb32e1ad3c1042cafd76b264c8c0f68d ]

If there is any non expired timer in the queue, the RTC alarm is never set.
This is an issue when adding a timer that expires before the next non
expired timer.

Ensure the RTC alarm is set in that case.

Fixes: 2b2f5ff00f63 ("rtc: interface: ignore expired timers when enqueuing new 
timers")
Signed-off-by: Alexandre Belloni 
Signed-off-by: Sasha Levin 
---
 drivers/rtc/interface.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
index 8cec9a02c0b8..9eb32ead63db 100644
--- a/drivers/rtc/interface.c
+++ b/drivers/rtc/interface.c
@@ -779,7 +779,7 @@ static int rtc_timer_enqueue(struct rtc_device *rtc, struct 
rtc_timer *timer)
}
 
timerqueue_add(&rtc->timerqueue, &timer->node);
-   if (!next) {
+   if (!next || ktime_before(timer->node.expires, next->expires)) {
struct rtc_wkalrm alarm;
int err;
alarm.time = rtc_ktime_to_tm(timer->node.expires);
-- 
2.11.0


[PATCH AUTOSEL for 4.14 45/60] scsi: lpfc: Fix warning messages when NVME_TARGET_FC not defined

2017-12-12 Thread alexander . levin
From: Dick Kennedy 

[ Upstream commit 2299e4323d2bf6e0728fdc6b9e8e9704978d2dd7 ]

Warning messages when NVME_TARGET_FC not defined on ppc builds

The lpfc_nvmet_replenish_context() function is only meaningful when NVME
target mode enabled. Surround the function body with ifdefs for target
mode enablement.

Signed-off-by: Dick Kennedy 
Signed-off-by: James Smart 
Reported-by: Stephen Rothwell 
Reviewed-by: Johannes Thumshirn 
Signed-off-by: Martin K. Petersen 
Signed-off-by: Sasha Levin 
---
 drivers/scsi/lpfc/lpfc_nvmet.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/scsi/lpfc/lpfc_nvmet.c b/drivers/scsi/lpfc/lpfc_nvmet.c
index 3c5b054a56ac..7ac1a067d780 100644
--- a/drivers/scsi/lpfc/lpfc_nvmet.c
+++ b/drivers/scsi/lpfc/lpfc_nvmet.c
@@ -1464,6 +1464,7 @@ static struct lpfc_nvmet_ctxbuf *
 lpfc_nvmet_replenish_context(struct lpfc_hba *phba,
 struct lpfc_nvmet_ctx_info *current_infop)
 {
+#if (IS_ENABLED(CONFIG_NVME_TARGET_FC))
struct lpfc_nvmet_ctxbuf *ctx_buf = NULL;
struct lpfc_nvmet_ctx_info *get_infop;
int i;
@@ -1511,6 +1512,7 @@ lpfc_nvmet_replenish_context(struct lpfc_hba *phba,
get_infop = get_infop->nvmet_ctx_next_cpu;
}
 
+#endif
/* Nothing found, all contexts for the MRQ are in-flight */
return NULL;
 }
-- 
2.11.0


[PATCH AUTOSEL for 4.14 38/60] powerpc/xmon: Avoid tripping SMP hardlockup watchdog

2017-12-12 Thread alexander . levin
From: Nicholas Piggin 

[ Upstream commit 064996d62a33ffe10264b5af5dca92d54f60f806 ]

The SMP hardlockup watchdog cross-checks other CPUs for lockups, which
causes xmon headaches because it's assuming interrupts hard disabled
means no watchdog troubles. Try to improve that by calling
touch_nmi_watchdog() in obvious places where secondaries are spinning.

Also annotate these spin loops with spin_begin/end calls.

Signed-off-by: Nicholas Piggin 
Signed-off-by: Michael Ellerman 
Signed-off-by: Sasha Levin 
---
 arch/powerpc/xmon/xmon.c | 17 +
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c
index 33351c6704b1..d9a12102b111 100644
--- a/arch/powerpc/xmon/xmon.c
+++ b/arch/powerpc/xmon/xmon.c
@@ -530,14 +530,19 @@ static int xmon_core(struct pt_regs *regs, int fromipi)
 
  waiting:
secondary = 1;
+   spin_begin();
while (secondary && !xmon_gate) {
if (in_xmon == 0) {
-   if (fromipi)
+   if (fromipi) {
+   spin_end();
goto leave;
+   }
secondary = test_and_set_bit(0, &in_xmon);
}
-   barrier();
+   spin_cpu_relax();
+   touch_nmi_watchdog();
}
+   spin_end();
 
if (!secondary && !xmon_gate) {
/* we are the first cpu to come in */
@@ -568,21 +573,25 @@ static int xmon_core(struct pt_regs *regs, int fromipi)
mb();
xmon_gate = 1;
barrier();
+   touch_nmi_watchdog();
}
 
  cmdloop:
while (in_xmon) {
if (secondary) {
+   spin_begin();
if (cpu == xmon_owner) {
if (!test_and_set_bit(0, &xmon_taken)) {
secondary = 0;
+   spin_end();
continue;
}
/* missed it */
while (cpu == xmon_owner)
-   barrier();
+   spin_cpu_relax();
}
-   barrier();
+   spin_cpu_relax();
+   touch_nmi_watchdog();
} else {
cmd = cmds(regs);
if (cmd != 0) {
-- 
2.11.0


[PATCH AUTOSEL for 4.14 47/60] vfio/pci: Virtualize Maximum Payload Size

2017-12-12 Thread alexander . levin
From: Alex Williamson 

[ Upstream commit 523184972b282cd9ca17a76f6ca4742394856818 ]

With virtual PCI-Express chipsets, we now see userspace/guest drivers
trying to match the physical MPS setting to a virtual downstream port.
Of course a lone physical device surrounded by virtual interconnects
cannot make a correct decision for a proper MPS setting.  Instead,
let's virtualize the MPS control register so that writes through to
hardware are disallowed.  Userspace drivers like QEMU assume they can
write anything to the device and we'll filter out anything dangerous.
Since mismatched MPS can lead to AER and other faults, let's add it
to the kernel side rather than relying on userspace virtualization to
handle it.

Signed-off-by: Alex Williamson 
Reviewed-by: Eric Auger 
Signed-off-by: Sasha Levin 
---
 drivers/vfio/pci/vfio_pci_config.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/vfio/pci/vfio_pci_config.c 
b/drivers/vfio/pci/vfio_pci_config.c
index 5628fe114347..91335e6de88a 100644
--- a/drivers/vfio/pci/vfio_pci_config.c
+++ b/drivers/vfio/pci/vfio_pci_config.c
@@ -849,11 +849,13 @@ static int __init init_pci_cap_exp_perm(struct perm_bits 
*perm)
 
/*
 * Allow writes to device control fields, except devctl_phantom,
-* which could confuse IOMMU, and the ARI bit in devctl2, which
+* which could confuse IOMMU, MPS, which can break communication
+* with other physical devices, and the ARI bit in devctl2, which
 * is set at probe time.  FLR gets virtualized via our writefn.
 */
p_setw(perm, PCI_EXP_DEVCTL,
-  PCI_EXP_DEVCTL_BCR_FLR, ~PCI_EXP_DEVCTL_PHANTOM);
+  PCI_EXP_DEVCTL_BCR_FLR | PCI_EXP_DEVCTL_PAYLOAD,
+  ~PCI_EXP_DEVCTL_PHANTOM);
p_setw(perm, PCI_EXP_DEVCTL2, NO_VIRT, ~PCI_EXP_DEVCTL2_ARI);
return 0;
 }
-- 
2.11.0


[PATCH AUTOSEL for 4.14 32/60] i40e/i40evf: spread CPU affinity hints across online CPUs only

2017-12-12 Thread alexander . levin
From: Jacob Keller 

[ Upstream commit be664cbefc50977aaefc868ba6a1109ec9b7449d ]

Currently, when setting up the IRQ for a q_vector, we set an affinity
hint based on the v_idx of that q_vector. Meaning a loop iterates on
v_idx, which is an incremental value, and the cpumask is created based
on this value.

This is a problem in systems with multiple logical CPUs per core (like in
simultaneous multithreading (SMT) scenarios). If we disable some logical
CPUs, by turning SMT off for example, we will end up with a sparse
cpu_online_mask, i.e., only the first CPU in a core is online, and
incremental filling in q_vector cpumask might lead to multiple offline
CPUs being assigned to q_vectors.

Example: if we have a system with 8 cores each one containing 8 logical
CPUs (SMT == 8 in this case), we have 64 CPUs in total. But if SMT is
disabled, only the 1st CPU in each core remains online, so the
cpu_online_mask in this case would have only 8 bits set, in a sparse way.

In general case, when SMT is off the cpu_online_mask has only C bits set:
0, 1*N, 2*N, ..., C*(N-1)  where
C == # of cores;
N == # of logical CPUs per core.
In our example, only bits 0, 8, 16, 24, 32, 40, 48, 56 would be set.

Instead, we should only assign hints for CPUs which are online. Even
better, the kernel already provides a function, cpumask_local_spread()
which takes an index and returns a CPU, spreading the interrupts across
local NUMA nodes first, and then remote ones if necessary.

Since we generally have a 1:1 mapping between vectors and CPUs, there
is no real advantage to spreading vectors to local CPUs first. In order
to avoid mismatch of the default XPS hints, we'll pass -1 so that it
spreads across all CPUs without regard to the node locality.

Note that we don't need to change the q_vector->affinity_mask as this is
initialized to cpu_possible_mask, until an actual affinity is set and
then notified back to us.

Signed-off-by: Jacob Keller 
Tested-by: Andrew Bowers 
Signed-off-by: Jeff Kirsher 
Signed-off-by: Sasha Levin 
---
 drivers/net/ethernet/intel/i40e/i40e_main.c | 16 +++-
 drivers/net/ethernet/intel/i40evf/i40evf_main.c |  9 ++---
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c 
b/drivers/net/ethernet/intel/i40e/i40e_main.c
index ea20aacd5e1d..b2cde9b16d82 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
@@ -2874,14 +2874,15 @@ static void i40e_vsi_free_rx_resources(struct i40e_vsi 
*vsi)
 static void i40e_config_xps_tx_ring(struct i40e_ring *ring)
 {
struct i40e_vsi *vsi = ring->vsi;
+   int cpu;
 
if (!ring->q_vector || !ring->netdev)
return;
 
if ((vsi->tc_config.numtc <= 1) &&
!test_and_set_bit(__I40E_TX_XPS_INIT_DONE, &ring->state)) {
-   netif_set_xps_queue(ring->netdev,
-   get_cpu_mask(ring->q_vector->v_idx),
+   cpu = cpumask_local_spread(ring->q_vector->v_idx, -1);
+   netif_set_xps_queue(ring->netdev, get_cpu_mask(cpu),
ring->queue_index);
}
 
@@ -3471,6 +3472,7 @@ static int i40e_vsi_request_irq_msix(struct i40e_vsi 
*vsi, char *basename)
int tx_int_idx = 0;
int vector, err;
int irq_num;
+   int cpu;
 
for (vector = 0; vector < q_vectors; vector++) {
struct i40e_q_vector *q_vector = vsi->q_vectors[vector];
@@ -3506,10 +3508,14 @@ static int i40e_vsi_request_irq_msix(struct i40e_vsi 
*vsi, char *basename)
q_vector->affinity_notify.notify = i40e_irq_affinity_notify;
q_vector->affinity_notify.release = i40e_irq_affinity_release;
irq_set_affinity_notifier(irq_num, &q_vector->affinity_notify);
-   /* get_cpu_mask returns a static constant mask with
-* a permanent lifetime so it's ok to use here.
+   /* Spread affinity hints out across online CPUs.
+*
+* get_cpu_mask returns a static constant mask with
+* a permanent lifetime so it's ok to pass to
+* irq_set_affinity_hint without making a copy.
 */
-   irq_set_affinity_hint(irq_num, get_cpu_mask(q_vector->v_idx));
+   cpu = cpumask_local_spread(q_vector->v_idx, -1);
+   irq_set_affinity_hint(irq_num, get_cpu_mask(cpu));
}
 
vsi->irqs_ready = true;
diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c 
b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
index 1825d956bb00..1ccad6f30ebf 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
@@ -546,6 +546,7 @@ i40evf_request_traffic_irqs(struct i40evf_adapter *adapter, 
char *basename)
unsigned int vector, q_vectors;
unsigned int rx_int_idx = 0, tx_int_idx = 0;
int i

[PATCH AUTOSEL for 4.14 49/60] fm10k: ensure we process SM mbx when processing VF mbx

2017-12-12 Thread alexander . levin
From: Jacob Keller 

[ Upstream commit 17a91809942ca32c70026d2d5ba3348a2c4fdf8f ]

When we process VF mailboxes, the driver is likely going to also queue
up messages to the switch manager. This process merely queues up the
FIFO, but doesn't actually begin the transmission process. Because we
hold the mailbox lock during this VF processing, the PF<->SM mailbox is
not getting processed at this time. Ensure that we actually process the
PF<->SM mailbox in between each PF<->VF mailbox.

This should ensure prompt transmission of the messages queued up after
each VF message is received and handled.

Signed-off-by: Jacob Keller 
Tested-by: Krishneil Singh 
Signed-off-by: Jeff Kirsher 
Signed-off-by: Sasha Levin 
---
 drivers/net/ethernet/intel/fm10k/fm10k_iov.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c 
b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c
index f919199944a0..e72fd52bacfe 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c
@@ -126,6 +126,9 @@ s32 fm10k_iov_mbx(struct fm10k_intfc *interface)
struct fm10k_mbx_info *mbx = &vf_info->mbx;
u16 glort = vf_info->glort;
 
+   /* process the SM mailbox first to drain outgoing messages */
+   hw->mbx.ops.process(hw, &hw->mbx);
+
/* verify port mapping is valid, if not reset port */
if (vf_info->vf_flags && !fm10k_glort_valid_pf(hw, glort))
hw->iov.ops.reset_lport(hw, vf_info);
-- 
2.11.0


[PATCH AUTOSEL for 4.14 57/60] cpuidle: fix broadcast control when broadcast can not be entered

2017-12-12 Thread alexander . levin
From: Nicholas Piggin 

[ Upstream commit f187851b9b4a76952b1158b86434563dd2031103 ]

When failing to enter broadcast timer mode for an idle state that
requires it, a new state is selected that does not require broadcast,
but the broadcast variable remains set. This causes
tick_broadcast_exit to be called despite not having entered broadcast
mode.

This causes the WARN_ON_ONCE(!irqs_disabled()) to trigger in some
cases. It does not appear to cause problems for code today, but seems
to violate the interface so should be fixed.

Signed-off-by: Nicholas Piggin 
Reviewed-by: Thomas Gleixner 
Signed-off-by: Rafael J. Wysocki 
Signed-off-by: Sasha Levin 
---
 drivers/cpuidle/cpuidle.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
index 484cc8909d5c..ed4df58a855e 100644
--- a/drivers/cpuidle/cpuidle.c
+++ b/drivers/cpuidle/cpuidle.c
@@ -208,6 +208,7 @@ int cpuidle_enter_state(struct cpuidle_device *dev, struct 
cpuidle_driver *drv,
return -EBUSY;
}
target_state = &drv->states[index];
+   broadcast = false;
}
 
/* Take note of the planned idle state. */
-- 
2.11.0


[PATCH AUTOSEL for 4.14 42/60] fm10k: fix mis-ordered parameters in declaration for .ndo_set_vf_bw

2017-12-12 Thread alexander . levin
From: Jacob Keller 

[ Upstream commit 3e256ac5b1ec307e5dd5a4c99fbdbc651446c738 ]

We've had support for setting both a minimum and maximum bandwidth via
.ndo_set_vf_bw since commit 883a9ccbae56 ("fm10k: Add support for SR-IOV
to driver", 2014-09-20).

Likely because we do not support minimum rates, the declaration
mis-ordered the "unused" parameter, which causes warnings when analyzed
with cppcheck.

Fix this warning by properly declaring the min_rate and max_rate
variables in the declaration and definition (rather than using
"unused"). Also rename "rate" to max_rate so as to clarify that we only
support setting the maximum rate.

Signed-off-by: Jacob Keller 
Tested-by: Krishneil Singh 
Signed-off-by: Jeff Kirsher 
Signed-off-by: Sasha Levin 
---
 drivers/net/ethernet/intel/fm10k/fm10k.h | 4 ++--
 drivers/net/ethernet/intel/fm10k/fm10k_iov.c | 9 +
 2 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/intel/fm10k/fm10k.h 
b/drivers/net/ethernet/intel/fm10k/fm10k.h
index 689c413b7782..d2f9a2dd76a2 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k.h
+++ b/drivers/net/ethernet/intel/fm10k/fm10k.h
@@ -526,8 +526,8 @@ s32 fm10k_iov_update_pvid(struct fm10k_intfc *interface, 
u16 glort, u16 pvid);
 int fm10k_ndo_set_vf_mac(struct net_device *netdev, int vf_idx, u8 *mac);
 int fm10k_ndo_set_vf_vlan(struct net_device *netdev,
  int vf_idx, u16 vid, u8 qos, __be16 vlan_proto);
-int fm10k_ndo_set_vf_bw(struct net_device *netdev, int vf_idx, int rate,
-   int unused);
+int fm10k_ndo_set_vf_bw(struct net_device *netdev, int vf_idx,
+   int __always_unused min_rate, int max_rate);
 int fm10k_ndo_get_vf_config(struct net_device *netdev,
int vf_idx, struct ifla_vf_info *ivi);
 
diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c 
b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c
index 5f4dac0d36ef..f919199944a0 100644
--- a/drivers/net/ethernet/intel/fm10k/fm10k_iov.c
+++ b/drivers/net/ethernet/intel/fm10k/fm10k_iov.c
@@ -482,7 +482,7 @@ int fm10k_ndo_set_vf_vlan(struct net_device *netdev, int 
vf_idx, u16 vid,
 }
 
 int fm10k_ndo_set_vf_bw(struct net_device *netdev, int vf_idx,
-   int __always_unused unused, int rate)
+   int __always_unused min_rate, int max_rate)
 {
struct fm10k_intfc *interface = netdev_priv(netdev);
struct fm10k_iov_data *iov_data = interface->iov_data;
@@ -493,14 +493,15 @@ int fm10k_ndo_set_vf_bw(struct net_device *netdev, int 
vf_idx,
return -EINVAL;
 
/* rate limit cannot be less than 10Mbs or greater than link speed */
-   if (rate && ((rate < FM10K_VF_TC_MIN) || rate > FM10K_VF_TC_MAX))
+   if (max_rate &&
+   (max_rate < FM10K_VF_TC_MIN || max_rate > FM10K_VF_TC_MAX))
return -EINVAL;
 
/* store values */
-   iov_data->vf_info[vf_idx].rate = rate;
+   iov_data->vf_info[vf_idx].rate = max_rate;
 
/* update hardware configuration */
-   hw->iov.ops.configure_tc(hw, vf_idx, rate);
+   hw->iov.ops.configure_tc(hw, vf_idx, max_rate);
 
return 0;
 }
-- 
2.11.0


[PATCH AUTOSEL for 4.14 28/60] ipv6: grab rt->rt6i_ref before allocating pcpu rt

2017-12-12 Thread alexander . levin
From: Wei Wang 

[ Upstream commit a94b9367e044ba672c9f4105eb1516ff6ff4948a ]

After rwlock is replaced with rcu and spinlock, ip6_pol_route() will be
called with only rcu held. That means rt6 route deletion could happen
simultaneously with rt6_make_pcpu_rt(). This could potentially cause
memory leak if rt6_release() is called right before rt6_make_pcpu_rt()
on the same route.

This patch grabs rt->rt6i_ref safely before calling rt6_make_pcpu_rt()
to make sure rt6_release() will not get triggered while
rt6_make_pcpu_rt() is in progress. And rt6_release() is called after
rt6_make_pcpu_rt() is finished.

Note: As we are incrementing rt->rt6i_ref in ip6_pol_route(), there is a
very slim chance that fib6_purge_rt() will be triggered unnecessarily
when deleting a route if ip6_pol_route() running on another thread picks
this route as well and tries to make pcpu cache for it.

Signed-off-by: Wei Wang 
Signed-off-by: Martin KaFai Lau 
Signed-off-by: Eric Dumazet 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 net/ipv6/route.c | 58 
 1 file changed, 29 insertions(+), 29 deletions(-)

diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index a96d5b385d8f..406037b336aa 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -1055,7 +1055,6 @@ static struct rt6_info *rt6_get_pcpu_route(struct 
rt6_info *rt)
 
 static struct rt6_info *rt6_make_pcpu_route(struct rt6_info *rt)
 {
-   struct fib6_table *table = rt->rt6i_table;
struct rt6_info *pcpu_rt, *prev, **p;
 
pcpu_rt = ip6_rt_pcpu_alloc(rt);
@@ -1066,28 +1065,20 @@ static struct rt6_info *rt6_make_pcpu_route(struct 
rt6_info *rt)
return net->ipv6.ip6_null_entry;
}
 
-   read_lock_bh(&table->tb6_lock);
-   if (rt->rt6i_pcpu) {
-   p = this_cpu_ptr(rt->rt6i_pcpu);
-   prev = cmpxchg(p, NULL, pcpu_rt);
-   if (prev) {
-   /* If someone did it before us, return prev instead */
-   dst_release_immediate(&pcpu_rt->dst);
-   pcpu_rt = prev;
-   }
-   } else {
-   /* rt has been removed from the fib6 tree
-* before we have a chance to acquire the read_lock.
-* In this case, don't brother to create a pcpu rt
-* since rt is going away anyway.  The next
-* dst_check() will trigger a re-lookup.
-*/
+   dst_hold(&pcpu_rt->dst);
+   p = this_cpu_ptr(rt->rt6i_pcpu);
+   prev = cmpxchg(p, NULL, pcpu_rt);
+   if (prev) {
+   /* If someone did it before us, return prev instead */
+   /* release refcnt taken by ip6_rt_pcpu_alloc() */
dst_release_immediate(&pcpu_rt->dst);
-   pcpu_rt = rt;
+   /* release refcnt taken by above dst_hold() */
+   dst_release_immediate(&pcpu_rt->dst);
+   dst_hold(&prev->dst);
+   pcpu_rt = prev;
}
-   dst_hold(&pcpu_rt->dst);
+
rt6_dst_from_metrics_check(pcpu_rt);
-   read_unlock_bh(&table->tb6_lock);
return pcpu_rt;
 }
 
@@ -1177,19 +1168,28 @@ struct rt6_info *ip6_pol_route(struct net *net, struct 
fib6_table *table,
if (pcpu_rt) {
read_unlock_bh(&table->tb6_lock);
} else {
-   /* We have to do the read_unlock first
-* because rt6_make_pcpu_route() may trigger
-* ip6_dst_gc() which will take the write_lock.
-*/
-   dst_hold(&rt->dst);
-   read_unlock_bh(&table->tb6_lock);
-   pcpu_rt = rt6_make_pcpu_route(rt);
-   dst_release(&rt->dst);
+   /* atomic_inc_not_zero() is needed when using rcu */
+   if (atomic_inc_not_zero(&rt->rt6i_ref)) {
+   /* We have to do the read_unlock first
+* because rt6_make_pcpu_route() may trigger
+* ip6_dst_gc() which will take the write_lock.
+*
+* No dst_hold() on rt is needed because 
grabbing
+* rt->rt6i_ref makes sure rt can't be released.
+*/
+   read_unlock_bh(&table->tb6_lock);
+   pcpu_rt = rt6_make_pcpu_route(rt);
+   rt6_release(rt);
+   } else {
+   /* rt is already removed from tree */
+   read_unlock_bh(&table->tb6_lock);
+   pcpu_rt = net->ipv6.ip6_null_entry;
+   dst_hold(&pcpu_rt->dst);
+   }
}
 
trac

[PATCH AUTOSEL for 4.14 50/60] ibmvnic: Set state UP

2017-12-12 Thread alexander . levin
From: Mick Tarsel 

[ Upstream commit e876a8a7e9dd89dc88c12ca2e81beb478dbe9897 ]

State is initially reported as UNKNOWN. Before register call
netif_carrier_off(). Once the device is opened, call netif_carrier_on() in
order to set the state to UP.

Signed-off-by: Mick Tarsel 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/ethernet/ibm/ibmvnic.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/ethernet/ibm/ibmvnic.c 
b/drivers/net/ethernet/ibm/ibmvnic.c
index c66abd476023..3b0db01ead1f 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -927,6 +927,7 @@ static int ibmvnic_open(struct net_device *netdev)
}
 
rc = __ibmvnic_open(netdev);
+   netif_carrier_on(netdev);
mutex_unlock(&adapter->reset_lock);
 
return rc;
@@ -3899,6 +3900,7 @@ static int ibmvnic_probe(struct vio_dev *dev, const 
struct vio_device_id *id)
if (rc)
goto ibmvnic_init_fail;
 
+   netif_carrier_off(netdev);
rc = register_netdev(netdev);
if (rc) {
dev_err(&dev->dev, "failed to register netdev rc=%d\n", rc);
-- 
2.11.0


[PATCH AUTOSEL for 4.14 58/60] drm/vc4: Avoid using vrefresh==0 mode in DSI htotal math.

2017-12-12 Thread alexander . levin
From: Eric Anholt 

[ Upstream commit af2eca53206c59ce9308a4f5f46c4a104a179b6b ]

The incoming mode might have a missing vrefresh field if it came from
drmModeSetCrtc(), which the kernel is supposed to calculate using
drm_mode_vrefresh().  We could either use that or the adjusted_mode's
original vrefresh value.

However, we can maintain a more exact vrefresh value (not just the
integer approximation), by scaling by the ratio of our clocks.

v2: Use math suggested by Andrzej Hajda instead.
v3: Simplify math now that adjusted_mode->clock isn't padded.
v4: Drop some parens.

Signed-off-by: Eric Anholt 
Link: 
https://patchwork.freedesktop.org/patch/msgid/20170815234722.20700-2-e...@anholt.net
Reviewed-by: Andrzej Hajda 
Signed-off-by: Sasha Levin 
---
 drivers/gpu/drm/vc4/vc4_dsi.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/vc4/vc4_dsi.c b/drivers/gpu/drm/vc4/vc4_dsi.c
index d1e0dc908048..04796d7d0fdb 100644
--- a/drivers/gpu/drm/vc4/vc4_dsi.c
+++ b/drivers/gpu/drm/vc4/vc4_dsi.c
@@ -866,7 +866,8 @@ static bool vc4_dsi_encoder_mode_fixup(struct drm_encoder 
*encoder,
adjusted_mode->clock = pixel_clock_hz / 1000 + 1;
 
/* Given the new pixel clock, adjust HFP to keep vrefresh the same. */
-   adjusted_mode->htotal = pixel_clock_hz / (mode->vrefresh * 
mode->vtotal);
+   adjusted_mode->htotal = adjusted_mode->clock * mode->htotal /
+   mode->clock;
adjusted_mode->hsync_end += adjusted_mode->htotal - mode->htotal;
adjusted_mode->hsync_start += adjusted_mode->htotal - mode->htotal;
 
-- 
2.11.0


[PATCH AUTOSEL for 4.14 60/60] IB/opa_vnic: Properly return the total MACs in UC MAC list

2017-12-12 Thread alexander . levin
From: Niranjana Vishwanathapura 

[ Upstream commit b77eb45e0d9c324245d165656ab3b38b6f386436 ]

Do not include EM specified MAC address in total MACs of the
UC MAC list.

Reviewed-by: Sudeep Dutt 
Signed-off-by: Niranjana Vishwanathapura 
Signed-off-by: Dennis Dalessandro 
Signed-off-by: Doug Ledford 
Signed-off-by: Sasha Levin 
---
 drivers/infiniband/ulp/opa_vnic/opa_vnic_vema_iface.c | 8 +---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/infiniband/ulp/opa_vnic/opa_vnic_vema_iface.c 
b/drivers/infiniband/ulp/opa_vnic/opa_vnic_vema_iface.c
index c2733964379c..9655cc3aa3a0 100644
--- a/drivers/infiniband/ulp/opa_vnic/opa_vnic_vema_iface.c
+++ b/drivers/infiniband/ulp/opa_vnic/opa_vnic_vema_iface.c
@@ -348,7 +348,7 @@ void opa_vnic_query_mcast_macs(struct opa_vnic_adapter 
*adapter,
 void opa_vnic_query_ucast_macs(struct opa_vnic_adapter *adapter,
   struct opa_veswport_iface_macs *macs)
 {
-   u16 start_idx, tot_macs, num_macs, idx = 0, count = 0;
+   u16 start_idx, tot_macs, num_macs, idx = 0, count = 0, em_macs = 0;
struct netdev_hw_addr *ha;
 
start_idx = be16_to_cpu(macs->start_idx);
@@ -359,8 +359,10 @@ void opa_vnic_query_ucast_macs(struct opa_vnic_adapter 
*adapter,
 
/* Do not include EM specified MAC address */
if (!memcmp(adapter->info.vport.base_mac_addr, ha->addr,
-   ARRAY_SIZE(adapter->info.vport.base_mac_addr)))
+   ARRAY_SIZE(adapter->info.vport.base_mac_addr))) {
+   em_macs++;
continue;
+   }
 
if (start_idx > idx++)
continue;
@@ -383,7 +385,7 @@ void opa_vnic_query_ucast_macs(struct opa_vnic_adapter 
*adapter,
}
 
tot_macs = netdev_hw_addr_list_count(&adapter->netdev->dev_addrs) +
-  netdev_uc_count(adapter->netdev);
+  netdev_uc_count(adapter->netdev) - em_macs;
macs->tot_macs_in_lst = cpu_to_be16(tot_macs);
macs->num_macs_in_msg = cpu_to_be16(count);
macs->gen_count = cpu_to_be16(adapter->info.vport.uc_macs_gen_count);
-- 
2.11.0


[PATCH AUTOSEL for 4.14 59/60] IB/opa_vnic: Properly clear Mac Table Digest

2017-12-12 Thread alexander . levin
From: Scott Franco 

[ Upstream commit 4bbdfe25600c1909c26747d0b5c39fd0e409bb87 ]

Clear the MAC table digest when the MAC table is freed.

Reviewed-by: Niranjana Vishwanathapura 
Signed-off-by: Scott Franco 
Signed-off-by: Dennis Dalessandro 
Signed-off-by: Doug Ledford 
Signed-off-by: Sasha Levin 
---
 drivers/infiniband/ulp/opa_vnic/opa_vnic_encap.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/infiniband/ulp/opa_vnic/opa_vnic_encap.c 
b/drivers/infiniband/ulp/opa_vnic/opa_vnic_encap.c
index afa938bd26d6..a72278e9cd27 100644
--- a/drivers/infiniband/ulp/opa_vnic/opa_vnic_encap.c
+++ b/drivers/infiniband/ulp/opa_vnic/opa_vnic_encap.c
@@ -139,6 +139,7 @@ void opa_vnic_release_mac_tbl(struct opa_vnic_adapter 
*adapter)
rcu_assign_pointer(adapter->mactbl, NULL);
synchronize_rcu();
opa_vnic_free_mac_tbl(mactbl);
+   adapter->info.vport.mac_tbl_digest = 0;
mutex_unlock(&adapter->mactbl_lock);
 }
 
-- 
2.11.0


[PATCH AUTOSEL for 4.9 002/100] ALSA: hda - add support for docking station for HP 820 G2

2017-12-12 Thread alexander . levin
From: Jaroslav Kysela 

[ Upstream commit 04d5466a976b096364a39a63ac264c1b3a5f8fa1 ]

This tested patch adds missing initialization for Line-In/Out PINs for
the docking station for HP 820 G2.

Signed-off-by: Jaroslav Kysela 
Signed-off-by: Takashi Iwai 
Signed-off-by: Sasha Levin 
---
 sound/pci/hda/patch_realtek.c | 14 +-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
index d7fa7373cb94..ba40596b9d92 100644
--- a/sound/pci/hda/patch_realtek.c
+++ b/sound/pci/hda/patch_realtek.c
@@ -4854,6 +4854,7 @@ enum {
ALC286_FIXUP_HP_GPIO_LED,
ALC280_FIXUP_HP_GPIO2_MIC_HOTKEY,
ALC280_FIXUP_HP_DOCK_PINS,
+   ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED,
ALC280_FIXUP_HP_9480M,
ALC288_FIXUP_DELL_HEADSET_MODE,
ALC288_FIXUP_DELL1_MIC_NO_PRESENCE,
@@ -5394,6 +5395,16 @@ static const struct hda_fixup alc269_fixups[] = {
.chained = true,
.chain_id = ALC280_FIXUP_HP_GPIO4
},
+   [ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED] = {
+   .type = HDA_FIXUP_PINS,
+   .v.pins = (const struct hda_pintbl[]) {
+   { 0x1b, 0x21011020 }, /* line-out */
+   { 0x18, 0x2181103f }, /* line-in */
+   { },
+   },
+   .chained = true,
+   .chain_id = ALC269_FIXUP_HP_GPIO_MIC1_LED
+   },
[ALC280_FIXUP_HP_9480M] = {
.type = HDA_FIXUP_FUNC,
.v.func = alc280_fixup_hp_9480m,
@@ -5646,7 +5657,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
SND_PCI_QUIRK(0x103c, 0x2256, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
SND_PCI_QUIRK(0x103c, 0x2257, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
SND_PCI_QUIRK(0x103c, 0x2259, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
-   SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_GPIO_MIC1_LED),
+   SND_PCI_QUIRK(0x103c, 0x225a, "HP", ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED),
SND_PCI_QUIRK(0x103c, 0x2260, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
SND_PCI_QUIRK(0x103c, 0x2263, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
SND_PCI_QUIRK(0x103c, 0x2264, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
@@ -5812,6 +5823,7 @@ static const struct hda_model_fixup alc269_fixup_models[] 
= {
{.id = ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC, .name = 
"headset-mode-no-hp-mic"},
{.id = ALC269_FIXUP_LENOVO_DOCK, .name = "lenovo-dock"},
{.id = ALC269_FIXUP_HP_GPIO_LED, .name = "hp-gpio-led"},
+   {.id = ALC269_FIXUP_HP_DOCK_GPIO_MIC1_LED, .name = 
"hp-dock-gpio-mic1-led"},
{.id = ALC269_FIXUP_DELL1_MIC_NO_PRESENCE, .name = 
"dell-headset-multi"},
{.id = ALC269_FIXUP_DELL2_MIC_NO_PRESENCE, .name = "dell-headset-dock"},
{.id = ALC283_FIXUP_CHROME_BOOK, .name = "alc283-dac-wcaps"},
-- 
2.11.0


[PATCH AUTOSEL for 4.9 003/100] ALSA: hda - add support for docking station for HP 840 G3

2017-12-12 Thread alexander . levin
From: Jaroslav Kysela 

[ Upstream commit cc3a47a248d7791ef0d2c81a35c46769e55e4c6c ]

This tested patch adds missing initialization for Line-In/Out PINs for
the docking station for HP 840 G3.

Signed-off-by: Jaroslav Kysela 
Signed-off-by: Takashi Iwai 
Signed-off-by: Sasha Levin 
---
 sound/pci/hda/patch_conexant.c | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
index f2e4e99ce651..2c3065c1f3fb 100644
--- a/sound/pci/hda/patch_conexant.c
+++ b/sound/pci/hda/patch_conexant.c
@@ -261,6 +261,7 @@ enum {
CXT_FIXUP_HP_530,
CXT_FIXUP_CAP_MIX_AMP_5047,
CXT_FIXUP_MUTE_LED_EAPD,
+   CXT_FIXUP_HP_DOCK,
CXT_FIXUP_HP_SPECTRE,
CXT_FIXUP_HP_GATE_MIC,
 };
@@ -778,6 +779,14 @@ static const struct hda_fixup cxt_fixups[] = {
.type = HDA_FIXUP_FUNC,
.v.func = cxt_fixup_mute_led_eapd,
},
+   [CXT_FIXUP_HP_DOCK] = {
+   .type = HDA_FIXUP_PINS,
+   .v.pins = (const struct hda_pintbl[]) {
+   { 0x16, 0x21011020 }, /* line-out */
+   { 0x18, 0x2181103f }, /* line-in */
+   { }
+   }
+   },
[CXT_FIXUP_HP_SPECTRE] = {
.type = HDA_FIXUP_PINS,
.v.pins = (const struct hda_pintbl[]) {
@@ -839,6 +848,7 @@ static const struct snd_pci_quirk cxt5066_fixups[] = {
SND_PCI_QUIRK(0x1025, 0x0543, "Acer Aspire One 522", 
CXT_FIXUP_STEREO_DMIC),
SND_PCI_QUIRK(0x1025, 0x054c, "Acer Aspire 3830TG", 
CXT_FIXUP_ASPIRE_DMIC),
SND_PCI_QUIRK(0x1025, 0x054f, "Acer Aspire 4830T", 
CXT_FIXUP_ASPIRE_DMIC),
+   SND_PCI_QUIRK(0x103c, 0x8079, "HP EliteBook 840 G3", CXT_FIXUP_HP_DOCK),
SND_PCI_QUIRK(0x103c, 0x8174, "HP Spectre x360", CXT_FIXUP_HP_SPECTRE),
SND_PCI_QUIRK(0x103c, 0x8115, "HP Z1 Gen3", CXT_FIXUP_HP_GATE_MIC),
SND_PCI_QUIRK(0x1043, 0x138d, "Asus", CXT_FIXUP_HEADPHONE_MIC_PIN),
@@ -872,6 +882,7 @@ static const struct hda_model_fixup cxt5066_fixup_models[] 
= {
{ .id = CXT_PINCFG_LEMOTE_A1205, .name = "lemote-a1205" },
{ .id = CXT_FIXUP_OLPC_XO, .name = "olpc-xo" },
{ .id = CXT_FIXUP_MUTE_LED_EAPD, .name = "mute-led-eapd" },
+   { .id = CXT_FIXUP_HP_DOCK, .name = "hp-dock" },
{}
 };
 
-- 
2.11.0


[PATCH AUTOSEL for 4.9 001/100] cxl: Route eeh events to all slices for pci_channel_io_perm_failure state

2017-12-12 Thread alexander . levin
From: Vaibhav Jain 

[ Upstream commit 07f5ab6002a4f0b633f3495157166f9f6180871b ]

Fix a boundary condition where in some cases an eeh event with state ==
pci_channel_io_perm_failure wont be passed on to a driver attached to
the virtual PCI device associated with a slice. This will happen in case
the slice just before (n-1) doesn't have any vPHB bus associated with
it, that results in an early return from cxl_pci_error_detected()
callback.

With state == pci_channel_io_perm_failure, the adapter will be removed
irrespective of the return value of cxl_vphb_error_detected(). So we now
always return PCI_ERS_RESULT_DISCONNECTED for this case i.e even if
the AFU isn't using a vPHB (currently returns PCI_ERS_RESULT_NONE).

Fixes: e4f5fc001a6("cxl: Do not create vPHB if there are no AFU configuration 
records")
Signed-off-by: Vaibhav Jain 
Reviewed-by: Matthew R. Ochs 
Reviewed-by: Andrew Donnellan 
Acked-by: Frederic Barrat 
Signed-off-by: Michael Ellerman 
Signed-off-by: Sasha Levin 
---
 drivers/misc/cxl/pci.c | 13 ++---
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/drivers/misc/cxl/pci.c b/drivers/misc/cxl/pci.c
index eef202d4399b..9b8628273b1b 100644
--- a/drivers/misc/cxl/pci.c
+++ b/drivers/misc/cxl/pci.c
@@ -1793,15 +1793,14 @@ static pci_ers_result_t cxl_pci_error_detected(struct 
pci_dev *pdev,
 
/* If we're permanently dead, give up. */
if (state == pci_channel_io_perm_failure) {
-   /* Tell the AFU drivers; but we don't care what they
-* say, we're going away.
-*/
for (i = 0; i < adapter->slices; i++) {
afu = adapter->afu[i];
-   /* Only participate in EEH if we are on a virtual PHB */
-   if (afu->phb == NULL)
-   return PCI_ERS_RESULT_NONE;
-   cxl_vphb_error_detected(afu, state);
+   /*
+* Tell the AFU drivers; but we don't care what they
+* say, we're going away.
+*/
+   if (afu->phb != NULL)
+   cxl_vphb_error_detected(afu, state);
}
return PCI_ERS_RESULT_DISCONNECT;
}
-- 
2.11.0


[PATCH AUTOSEL for 4.14 36/60] ASoC: codecs: msm8916-wcd-analog: fix micbias level

2017-12-12 Thread alexander . levin
From: Jean-François Têtu 

[ Upstream commit 664611e7e02f76fbc5470ef545b2657ed25c292b ]

The macro used to set the microphone bias level causes the
snd_soc_write() call to overwrite other fields in the CDC_A_MICB_1_VAL
register. The macro also does not return the proper level value
to use. This fixes this by preserving all bits from the register
that are not the level while setting the level.

Signed-off-by: Jean-François Têtu 
Acked-by: Srinivas Kandagatla 
Signed-off-by: Mark Brown 
Signed-off-by: Sasha Levin 
---
 sound/soc/codecs/msm8916-wcd-analog.c | 7 ---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/sound/soc/codecs/msm8916-wcd-analog.c 
b/sound/soc/codecs/msm8916-wcd-analog.c
index 549c269acc7d..a42f8ebb9670 100644
--- a/sound/soc/codecs/msm8916-wcd-analog.c
+++ b/sound/soc/codecs/msm8916-wcd-analog.c
@@ -104,7 +104,7 @@
 #define CDC_A_MICB_1_VAL   (0xf141)
 #define MICB_MIN_VAL 1600
 #define MICB_STEP_SIZE 50
-#define MICB_VOLTAGE_REGVAL(v) ((v - MICB_MIN_VAL)/MICB_STEP_SIZE)
+#define MICB_VOLTAGE_REGVAL(v) (((v - MICB_MIN_VAL)/MICB_STEP_SIZE) << 
3)
 #define MICB_1_VAL_MICB_OUT_VAL_MASK   GENMASK(7, 3)
 #define MICB_1_VAL_MICB_OUT_VAL_V2P70V ((0x16)  << 3)
 #define MICB_1_VAL_MICB_OUT_VAL_V1P80V ((0x4)  << 3)
@@ -349,8 +349,9 @@ static void pm8916_wcd_analog_micbias_enable(struct 
snd_soc_codec *codec)
| MICB_1_CTL_EXT_PRECHARG_EN_ENABLE);
 
if (wcd->micbias_mv) {
-   snd_soc_write(codec, CDC_A_MICB_1_VAL,
- MICB_VOLTAGE_REGVAL(wcd->micbias_mv));
+   snd_soc_update_bits(codec, CDC_A_MICB_1_VAL,
+   MICB_1_VAL_MICB_OUT_VAL_MASK,
+   MICB_VOLTAGE_REGVAL(wcd->micbias_mv));
/*
 * Special headset needs MICBIAS as 2.7V so wait for
 * 50 msec for the MICBIAS to reach 2.7 volts.
-- 
2.11.0


[PATCH AUTOSEL for 4.9 009/100] nvme-loop: handle cpu unplug when re-establishing the controller

2017-12-12 Thread alexander . levin
From: Sagi Grimberg 

[ Upstream commit 945dd5bacc8978439af276976b5dcbbd42333dbc ]

If a cpu unplug event has occured, we need to take the minimum
of the provided nr_io_queues and the number of online cpus,
otherwise we won't be able to connect them as blk-mq mapping
won't dispatch to those queues.

Reviewed-by: Christoph Hellwig 
Signed-off-by: Sagi Grimberg 
Signed-off-by: Sasha Levin 
---
 drivers/nvme/target/loop.c | 88 ++
 1 file changed, 50 insertions(+), 38 deletions(-)

diff --git a/drivers/nvme/target/loop.c b/drivers/nvme/target/loop.c
index d5df77d686b2..b6193f32ea1f 100644
--- a/drivers/nvme/target/loop.c
+++ b/drivers/nvme/target/loop.c
@@ -223,8 +223,6 @@ static void nvme_loop_submit_async_event(struct nvme_ctrl 
*arg, int aer_idx)
 static int nvme_loop_init_iod(struct nvme_loop_ctrl *ctrl,
struct nvme_loop_iod *iod, unsigned int queue_idx)
 {
-   BUG_ON(queue_idx >= ctrl->queue_count);
-
iod->req.cmd = &iod->cmd;
iod->req.rsp = &iod->rsp;
iod->queue = &ctrl->queues[queue_idx];
@@ -314,6 +312,43 @@ static void nvme_loop_free_ctrl(struct nvme_ctrl *nctrl)
kfree(ctrl);
 }
 
+static void nvme_loop_destroy_io_queues(struct nvme_loop_ctrl *ctrl)
+{
+   int i;
+
+   for (i = 1; i < ctrl->queue_count; i++)
+   nvmet_sq_destroy(&ctrl->queues[i].nvme_sq);
+}
+
+static int nvme_loop_init_io_queues(struct nvme_loop_ctrl *ctrl)
+{
+   struct nvmf_ctrl_options *opts = ctrl->ctrl.opts;
+   unsigned int nr_io_queues;
+   int ret, i;
+
+   nr_io_queues = min(opts->nr_io_queues, num_online_cpus());
+   ret = nvme_set_queue_count(&ctrl->ctrl, &nr_io_queues);
+   if (ret || !nr_io_queues)
+   return ret;
+
+   dev_info(ctrl->ctrl.device, "creating %d I/O queues.\n", nr_io_queues);
+
+   for (i = 1; i <= nr_io_queues; i++) {
+   ctrl->queues[i].ctrl = ctrl;
+   ret = nvmet_sq_init(&ctrl->queues[i].nvme_sq);
+   if (ret)
+   goto out_destroy_queues;
+
+   ctrl->queue_count++;
+   }
+
+   return 0;
+
+out_destroy_queues:
+   nvme_loop_destroy_io_queues(ctrl);
+   return ret;
+}
+
 static int nvme_loop_configure_admin_queue(struct nvme_loop_ctrl *ctrl)
 {
int error;
@@ -385,17 +420,13 @@ static int nvme_loop_configure_admin_queue(struct 
nvme_loop_ctrl *ctrl)
 
 static void nvme_loop_shutdown_ctrl(struct nvme_loop_ctrl *ctrl)
 {
-   int i;
-
nvme_stop_keep_alive(&ctrl->ctrl);
 
if (ctrl->queue_count > 1) {
nvme_stop_queues(&ctrl->ctrl);
blk_mq_tagset_busy_iter(&ctrl->tag_set,
nvme_cancel_request, &ctrl->ctrl);
-
-   for (i = 1; i < ctrl->queue_count; i++)
-   nvmet_sq_destroy(&ctrl->queues[i].nvme_sq);
+   nvme_loop_destroy_io_queues(ctrl);
}
 
if (ctrl->ctrl.state == NVME_CTRL_LIVE)
@@ -467,19 +498,14 @@ static void nvme_loop_reset_ctrl_work(struct work_struct 
*work)
if (ret)
goto out_disable;
 
-   for (i = 1; i <= ctrl->ctrl.opts->nr_io_queues; i++) {
-   ctrl->queues[i].ctrl = ctrl;
-   ret = nvmet_sq_init(&ctrl->queues[i].nvme_sq);
-   if (ret)
-   goto out_free_queues;
-
-   ctrl->queue_count++;
-   }
+   ret = nvme_loop_init_io_queues(ctrl);
+   if (ret)
+   goto out_destroy_admin;
 
-   for (i = 1; i <= ctrl->ctrl.opts->nr_io_queues; i++) {
+   for (i = 1; i < ctrl->queue_count; i++) {
ret = nvmf_connect_io_queue(&ctrl->ctrl, i);
if (ret)
-   goto out_free_queues;
+   goto out_destroy_io;
}
 
changed = nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_LIVE);
@@ -492,9 +518,9 @@ static void nvme_loop_reset_ctrl_work(struct work_struct 
*work)
 
return;
 
-out_free_queues:
-   for (i = 1; i < ctrl->queue_count; i++)
-   nvmet_sq_destroy(&ctrl->queues[i].nvme_sq);
+out_destroy_io:
+   nvme_loop_destroy_io_queues(ctrl);
+out_destroy_admin:
nvme_loop_destroy_admin_queue(ctrl);
 out_disable:
dev_warn(ctrl->ctrl.device, "Removing after reset failure\n");
@@ -533,25 +559,12 @@ static const struct nvme_ctrl_ops nvme_loop_ctrl_ops = {
 
 static int nvme_loop_create_io_queues(struct nvme_loop_ctrl *ctrl)
 {
-   struct nvmf_ctrl_options *opts = ctrl->ctrl.opts;
int ret, i;
 
-   ret = nvme_set_queue_count(&ctrl->ctrl, &opts->nr_io_queues);
-   if (ret || !opts->nr_io_queues)
+   ret = nvme_loop_init_io_queues(ctrl);
+   if (ret)
return ret;
 
-   dev_info(ctrl->ctrl.device, "creating %d I/O queues.\n",
-   opts->nr_io_queues);
-
-   for (i = 1; i <= opts->nr_io_queues; i++) {
-   ctrl->queues[i].

[PATCH AUTOSEL for 4.9 006/100] HID: corsair: Add driver Scimitar Pro RGB gaming mouse 1b1c:1b3e support to hid-corsair

2017-12-12 Thread alexander . levin
From: Oscar Campos 

[ Upstream commit 01adc47e885f1127b29d76d0dfb21d8262f9d6b4 ]

This mouse sold by Corsair as Scimitar PRO RGB defines two consecutive
Logical Minimum items in its Application (Consumer.0001) report making
it non parseable. This patch fixes the report descriptor overriding
byte 77 in rdesc from 0x16 (Logical Minimum with 16 bits value) to 0x26
(Logical Maximum with 16 bits value).

Signed-off-by: Oscar Campos 
Signed-off-by: Jiri Kosina 
Signed-off-by: Sasha Levin 
---
 drivers/hid/Kconfig   |  1 +
 drivers/hid/hid-core.c|  1 +
 drivers/hid/hid-corsair.c | 47 +++
 3 files changed, 49 insertions(+)

diff --git a/drivers/hid/Kconfig b/drivers/hid/Kconfig
index cd4599c0523b..38d731ce9bdd 100644
--- a/drivers/hid/Kconfig
+++ b/drivers/hid/Kconfig
@@ -190,6 +190,7 @@ config HID_CORSAIR
 
Supported devices:
- Vengeance K90
+   - Scimitar PRO RGB
 
 config HID_PRODIKEYS
tristate "Prodikeys PC-MIDI Keyboard support"
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 4f3f5749b0c1..32a6c1b56044 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -1872,6 +1872,7 @@ static const struct hid_device_id 
hid_have_special_driver[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_AK1D) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CHICONY, 
USB_DEVICE_ID_CHICONY_ACER_SWITCH12) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K90) },
+   { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, 
USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CREATIVELABS, 
USB_DEVICE_ID_PRODIKEYS_PCMIDI) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CYGNAL, USB_DEVICE_ID_CYGNAL_CP2112) },
{ HID_USB_DEVICE(USB_VENDOR_ID_CYPRESS, 
USB_DEVICE_ID_CYPRESS_BARCODE_1) },
diff --git a/drivers/hid/hid-corsair.c b/drivers/hid/hid-corsair.c
index c0303f61c26a..9ba5d98a1180 100644
--- a/drivers/hid/hid-corsair.c
+++ b/drivers/hid/hid-corsair.c
@@ -3,8 +3,10 @@
  *
  * Supported devices:
  *  - Vengeance K90 Keyboard
+ *  - Scimitar PRO RGB Gaming Mouse
  *
  * Copyright (c) 2015 Clement Vuchener
+ * Copyright (c) 2017 Oscar Campos
  */
 
 /*
@@ -670,10 +672,51 @@ static int corsair_input_mapping(struct hid_device *dev,
return 0;
 }
 
+/*
+ * The report descriptor of Corsair Scimitar RGB Pro gaming mouse is
+ * non parseable as they define two consecutive Logical Minimum for
+ * the Usage Page (Consumer) in rdescs bytes 75 and 77 being 77 0x16
+ * that should be obviousy 0x26 for Logical Magimum of 16 bits. This
+ * prevents poper parsing of the report descriptor due Logical
+ * Minimum being larger than Logical Maximum.
+ *
+ * This driver fixes the report descriptor for:
+ * - USB ID b1c:1b3e, sold as Scimitar RGB Pro Gaming mouse
+ */
+
+static __u8 *corsair_mouse_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+unsigned int *rsize)
+{
+   struct usb_interface *intf = to_usb_interface(hdev->dev.parent);
+
+   if (intf->cur_altsetting->desc.bInterfaceNumber == 1) {
+   /*
+* Corsair Scimitar RGB Pro report descriptor is broken and
+* defines two different Logical Minimum for the Consumer
+* Application. The byte 77 should be a 0x26 defining a 16
+* bits integer for the Logical Maximum but it is a 0x16
+* instead (Logical Minimum)
+*/
+   switch (hdev->product) {
+   case USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB:
+   if (*rsize >= 172 && rdesc[75] == 0x15 && rdesc[77] == 
0x16
+   && rdesc[78] == 0xff && rdesc[79] == 0x0f) {
+   hid_info(hdev, "Fixing up report descriptor\n");
+   rdesc[77] = 0x26;
+   }
+   break;
+   }
+
+   }
+   return rdesc;
+}
+
 static const struct hid_device_id corsair_devices[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR, USB_DEVICE_ID_CORSAIR_K90),
.driver_data = CORSAIR_USE_K90_MACRO |
   CORSAIR_USE_K90_BACKLIGHT },
+   { HID_USB_DEVICE(USB_VENDOR_ID_CORSAIR,
+USB_DEVICE_ID_CORSAIR_SCIMITAR_PRO_RGB) },
{}
 };
 
@@ -686,10 +729,14 @@ static struct hid_driver corsair_driver = {
.event = corsair_event,
.remove = corsair_remove,
.input_mapping = corsair_input_mapping,
+   .report_fixup = corsair_mouse_report_fixup,
 };
 
 module_hid_driver(corsair_driver);
 
 MODULE_LICENSE("GPL");
+/* Original K90 driver author */
 MODULE_AUTHOR("Clement Vuchener");
+/* Scimitar PRO RGB driver author */
+MODULE_AUTHOR("Oscar Campos");
 MODULE_DESCRIPTION("HID driver for Corsair devices");
-- 
2.11.0


[PATCH AUTOSEL for 4.9 018/100] sctp: out_qlen should be updated when pruning unsent queue

2017-12-12 Thread alexander . levin
From: Xin Long 

[ Upstream commit 23bb09cfbe04076ef647da3889a5a5ab6cbe6f15 ]

This patch is to fix the issue that sctp_prsctp_prune_sent forgot
to update q->out_qlen when removing a chunk from unsent queue.

Fixes: 8dbdf1f5b09c ("sctp: implement prsctp PRIO policy")
Signed-off-by: Xin Long 
Acked-by: Marcelo Ricardo Leitner 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 net/sctp/outqueue.c | 11 +--
 1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
index 582585393d35..0994ce491e7c 100644
--- a/net/sctp/outqueue.c
+++ b/net/sctp/outqueue.c
@@ -382,17 +382,18 @@ static int sctp_prsctp_prune_sent(struct sctp_association 
*asoc,
 }
 
 static int sctp_prsctp_prune_unsent(struct sctp_association *asoc,
-   struct sctp_sndrcvinfo *sinfo,
-   struct list_head *queue, int msg_len)
+   struct sctp_sndrcvinfo *sinfo, int msg_len)
 {
+   struct sctp_outq *q = &asoc->outqueue;
struct sctp_chunk *chk, *temp;
 
-   list_for_each_entry_safe(chk, temp, queue, list) {
+   list_for_each_entry_safe(chk, temp, &q->out_chunk_list, list) {
if (!SCTP_PR_PRIO_ENABLED(chk->sinfo.sinfo_flags) ||
chk->sinfo.sinfo_timetolive <= sinfo->sinfo_timetolive)
continue;
 
list_del_init(&chk->list);
+   q->out_qlen -= chk->skb->len;
asoc->sent_cnt_removable--;
asoc->abandoned_unsent[SCTP_PR_INDEX(PRIO)]++;
 
@@ -431,9 +432,7 @@ void sctp_prsctp_prune(struct sctp_association *asoc,
return;
}
 
-   sctp_prsctp_prune_unsent(asoc, sinfo,
-&asoc->outqueue.out_chunk_list,
-msg_len);
+   sctp_prsctp_prune_unsent(asoc, sinfo, msg_len);
 }
 
 /* Mark all the eligible packets on a transport for retransmission.  */
-- 
2.11.0


[PATCH AUTOSEL for 4.9 011/100] r8152: fix the list rx_done may be used without initialization

2017-12-12 Thread alexander . levin
From: hayeswang 

[ Upstream commit 98d068ab52b4b11d403995ed14154660797e7136 ]

The list rx_done would be initialized when the linking on occurs.
Therefore, if a napi is scheduled without any linking on before,
the following kernel panic would happen.

BUG: unable to handle kernel NULL pointer dereference at 008
IP: [] r8152_poll+0xe1e/0x1210 [r8152]
PGD 0
Oops: 0002 [#1] SMP

Signed-off-by: Hayes Wang 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/usb/r8152.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index afb953a258cd..823219cf95ef 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -1362,6 +1362,7 @@ static int alloc_all_mem(struct r8152 *tp)
spin_lock_init(&tp->rx_lock);
spin_lock_init(&tp->tx_lock);
INIT_LIST_HEAD(&tp->tx_free);
+   INIT_LIST_HEAD(&tp->rx_done);
skb_queue_head_init(&tp->tx_queue);
skb_queue_head_init(&tp->rx_queue);
 
-- 
2.11.0


[PATCH AUTOSEL for 4.9 010/100] cpuidle: Validate cpu_dev in cpuidle_add_sysfs()

2017-12-12 Thread alexander . levin
From: Vaidyanathan Srinivasan 

[ Upstream commit ad0a45fd9c14feebd000b6e84189d0edff265170 ]

If a given cpu is not in cpu_present and cpu hotplug
is disabled, arch can skip setting up the cpu_dev.

Arch cpuidle driver should pass correct cpu mask
for registration, but failing to do so by the driver
causes error to propagate and crash like this:

[   30.076045] Unable to handle kernel paging request for data at address 
0x0048
[   30.076100] Faulting instruction address: 0xc07b2f30
cpu 0x4d: Vector: 300 (Data Access) at [c03feb18b670]
pc: c07b2f30: kobject_get+0x20/0x70
lr: c07b3c94: kobject_add_internal+0x54/0x3f0
sp: c03feb18b8f0
   msr: 90009033
   dar: 48
 dsisr: 4000
  current = 0xc03fd2ed8300
  paca= 0xcfbab500   softe: 0irq_happened: 0x01
pid   = 1, comm = swapper/0
Linux version 4.11.0-rc2-svaidy+ (sv@sagarika) (gcc version 6.2.0
20161005 (Ubuntu 6.2.0-5ubuntu12) ) #10 SMP Sun Mar 19 00:08:09 IST 2017
enter ? for help
[c03feb18b960] c07b3c94 kobject_add_internal+0x54/0x3f0
[c03feb18b9f0] c07b43a4 kobject_init_and_add+0x64/0xa0
[c03feb18ba70] c0e284f4 cpuidle_add_sysfs+0xb4/0x130
[c03feb18baf0] c0e26038 cpuidle_register_device+0x118/0x1c0
[c03feb18bb30] c0e26c48 cpuidle_register+0x78/0x120
[c03feb18bbc0] c168fd9c powernv_processor_idle_init+0x110/0x1c4
[c03feb18bc40] c000cff8 do_one_initcall+0x68/0x1d0
[c03feb18bd00] c16242f4 kernel_init_freeable+0x280/0x360
[c03feb18bdc0] c000d864 kernel_init+0x24/0x160
[c03feb18be30] c000b4e8 ret_from_kernel_thread+0x5c/0x74

Validating cpu_dev fixes the crash and reports correct error message like:

[   30.163506] Failed to register cpuidle device for cpu136
[   30.173329] Registration of powernv driver failed.

Signed-off-by: Vaidyanathan Srinivasan 
[ rjw: Comment massage ]
Signed-off-by: Rafael J. Wysocki 

Signed-off-by: Sasha Levin 
---
 drivers/cpuidle/sysfs.c | 12 
 1 file changed, 12 insertions(+)

diff --git a/drivers/cpuidle/sysfs.c b/drivers/cpuidle/sysfs.c
index 832a2c3f01ff..9e98a5fbbc1d 100644
--- a/drivers/cpuidle/sysfs.c
+++ b/drivers/cpuidle/sysfs.c
@@ -613,6 +613,18 @@ int cpuidle_add_sysfs(struct cpuidle_device *dev)
struct device *cpu_dev = get_cpu_device((unsigned long)dev->cpu);
int error;
 
+   /*
+* Return if cpu_device is not setup for this CPU.
+*
+* This could happen if the arch did not set up cpu_device
+* since this CPU is not in cpu_present mask and the
+* driver did not send a correct CPU mask during registration.
+* Without this check we would end up passing bogus
+* value for &cpu_dev->kobj in kobject_init_and_add()
+*/
+   if (!cpu_dev)
+   return -ENODEV;
+
kdev = kzalloc(sizeof(*kdev), GFP_KERNEL);
if (!kdev)
return -ENOMEM;
-- 
2.11.0


[PATCH AUTOSEL for 4.9 019/100] net: qmi_wwan: Add USB IDs for MDM6600 modem on Motorola Droid 4

2017-12-12 Thread alexander . levin
From: Tony Lindgren 

[ Upstream commit 4071898bf0f4d79ff353db327af2a15123272548 ]

This gets qmicli working with the MDM6600 modem.

Cc: Bjørn Mork 
Reviewed-by: Sebastian Reichel 
Tested-by: Sebastian Reichel 
Signed-off-by: Tony Lindgren 
Acked-by: Bjørn Mork 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/usb/qmi_wwan.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
index 9cf11c83993a..23596b20b638 100644
--- a/drivers/net/usb/qmi_wwan.c
+++ b/drivers/net/usb/qmi_wwan.c
@@ -580,6 +580,10 @@ static const struct usb_device_id products[] = {
USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 
USB_CLASS_VENDOR_SPEC, 0x01, 0x69),
.driver_info= (unsigned long)&qmi_wwan_info,
},
+   {   /* Motorola Mapphone devices with MDM6600 */
+   USB_VENDOR_AND_INTERFACE_INFO(0x22b8, USB_CLASS_VENDOR_SPEC, 
0xfb, 0xff),
+   .driver_info= (unsigned long)&qmi_wwan_info,
+   },
 
/* 2. Combined interface devices matching on class+protocol */
{   /* Huawei E367 and possibly others in "Windows mode" */
-- 
2.11.0


[PATCH AUTOSEL for 4.9 020/100] hwmon: (max31790) Set correct PWM value

2017-12-12 Thread alexander . levin
From: Alex Hemme 

[ Upstream commit dd7406dd334a98ada3ff5371847a3eeb4ba16313 ]

Traced fans not spinning to incorrect PWM value being written.
The passed in value was written instead of the calulated value.

Fixes: 54187ff9d766 ("hwmon: (max31790) Convert to use new hwmon registration 
API")
Signed-off-by: Alex Hemme 
Signed-off-by: Guenter Roeck 
Signed-off-by: Sasha Levin 
---
 drivers/hwmon/max31790.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/hwmon/max31790.c b/drivers/hwmon/max31790.c
index c1b9275978f9..281491cca510 100644
--- a/drivers/hwmon/max31790.c
+++ b/drivers/hwmon/max31790.c
@@ -311,7 +311,7 @@ static int max31790_write_pwm(struct device *dev, u32 attr, 
int channel,
data->pwm[channel] = val << 8;
err = i2c_smbus_write_word_swapped(client,
   MAX31790_REG_PWMOUT(channel),
-  val);
+  data->pwm[channel]);
break;
case hwmon_pwm_enable:
fan_config = data->fan_config[channel];
-- 
2.11.0


[PATCH AUTOSEL for 4.9 024/100] netfilter: nfnl_cthelper: Fix memory leak

2017-12-12 Thread alexander . levin
From: Jeffy Chen 

[ Upstream commit f83bf8da1135ca635aac8f062cad3f001fcf3a26 ]

We have memory leaks of nf_conntrack_helper & expect_policy.

Signed-off-by: Jeffy Chen 
Signed-off-by: Pablo Neira Ayuso 
Signed-off-by: Sasha Levin 
---
 net/netfilter/nfnetlink_cthelper.c | 12 +---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/net/netfilter/nfnetlink_cthelper.c 
b/net/netfilter/nfnetlink_cthelper.c
index 86325959fef0..ad65eb548157 100644
--- a/net/netfilter/nfnetlink_cthelper.c
+++ b/net/netfilter/nfnetlink_cthelper.c
@@ -216,7 +216,7 @@ nfnl_cthelper_create(const struct nlattr * const tb[],
 
ret = nfnl_cthelper_parse_expect_policy(helper, tb[NFCTH_POLICY]);
if (ret < 0)
-   goto err;
+   goto err1;
 
strncpy(helper->name, nla_data(tb[NFCTH_NAME]), NF_CT_HELPER_NAME_LEN);
helper->data_len = ntohl(nla_get_be32(tb[NFCTH_PRIV_DATA_LEN]));
@@ -247,10 +247,12 @@ nfnl_cthelper_create(const struct nlattr * const tb[],
 
ret = nf_conntrack_helper_register(helper);
if (ret < 0)
-   goto err;
+   goto err2;
 
return 0;
-err:
+err2:
+   kfree(helper->expect_policy);
+err1:
kfree(helper);
return ret;
 }
@@ -696,6 +698,8 @@ static int nfnl_cthelper_del(struct net *net, struct sock 
*nfnl,
 
found = true;
nf_conntrack_helper_unregister(cur);
+   kfree(cur->expect_policy);
+   kfree(cur);
}
}
/* Make sure we return success if we flush and there is no helpers */
@@ -759,6 +763,8 @@ static void __exit nfnl_cthelper_exit(void)
continue;
 
nf_conntrack_helper_unregister(cur);
+   kfree(cur->expect_policy);
+   kfree(cur);
}
}
 }
-- 
2.11.0


[PATCH AUTOSEL for 4.9 022/100] usb: gadget: udc: remove pointer dereference after free

2017-12-12 Thread alexander . levin
From: "Gustavo A. R. Silva" 

[ Upstream commit 1f459262b0e1649a1e5ad12fa4c66eb76c2220ce ]

Remove pointer dereference after free.

Addresses-Coverity-ID: 1091173
Acked-by: Michal Nazarewicz 
Signed-off-by: Gustavo A. R. Silva 
Signed-off-by: Felipe Balbi 
Signed-off-by: Sasha Levin 
---
 drivers/usb/gadget/udc/pch_udc.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/usb/gadget/udc/pch_udc.c b/drivers/usb/gadget/udc/pch_udc.c
index a97da645c1b9..8a365aad66fe 100644
--- a/drivers/usb/gadget/udc/pch_udc.c
+++ b/drivers/usb/gadget/udc/pch_udc.c
@@ -1523,7 +1523,6 @@ static void pch_udc_free_dma_chain(struct pch_udc_dev 
*dev,
td = phys_to_virt(addr);
addr2 = (dma_addr_t)td->next;
pci_pool_free(dev->data_requests, td, addr);
-   td->next = 0x00;
addr = addr2;
}
req->chain_len = 1;
-- 
2.11.0


[PATCH AUTOSEL for 4.9 021/100] usb: gadget: f_uvc: Sanity check wMaxPacketSize for SuperSpeed

2017-12-12 Thread alexander . levin
From: Roger Quadros 

[ Upstream commit 16bb05d98c904a4f6c5ce7e2d992299f794acbf2 ]

As per USB3.0 Specification "Table 9-20. Standard Endpoint Descriptor",
for interrupt and isochronous endpoints, wMaxPacketSize must be set to
1024 if the endpoint defines bMaxBurst to be greater than zero.

Reviewed-by: Laurent Pinchart 
Signed-off-by: Roger Quadros 
Signed-off-by: Felipe Balbi 
Signed-off-by: Sasha Levin 
---
 drivers/usb/gadget/function/f_uvc.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/usb/gadget/function/f_uvc.c 
b/drivers/usb/gadget/function/f_uvc.c
index c7689d05356c..f8a1881609a2 100644
--- a/drivers/usb/gadget/function/f_uvc.c
+++ b/drivers/usb/gadget/function/f_uvc.c
@@ -594,6 +594,14 @@ uvc_function_bind(struct usb_configuration *c, struct 
usb_function *f)
opts->streaming_maxpacket = clamp(opts->streaming_maxpacket, 1U, 3072U);
opts->streaming_maxburst = min(opts->streaming_maxburst, 15U);
 
+   /* For SS, wMaxPacketSize has to be 1024 if bMaxBurst is not 0 */
+   if (opts->streaming_maxburst &&
+   (opts->streaming_maxpacket % 1024) != 0) {
+   opts->streaming_maxpacket = roundup(opts->streaming_maxpacket, 
1024);
+   INFO(cdev, "overriding streaming_maxpacket to %d\n",
+opts->streaming_maxpacket);
+   }
+
/* Fill in the FS/HS/SS Video Streaming specific descriptors from the
 * module parameters.
 *
-- 
2.11.0


[PATCH AUTOSEL for 4.9 023/100] netfilter: nfnl_cthelper: fix runtime expectation policy updates

2017-12-12 Thread alexander . levin
From: Pablo Neira Ayuso 

[ Upstream commit 2c422257550f123049552b39f7af6e3428a60f43 ]

We only allow runtime updates of expectation policies for timeout and
maximum number of expectations, otherwise reject the update.

Signed-off-by: Pablo Neira Ayuso 
Acked-by: Liping Zhang 
Signed-off-by: Sasha Levin 
---
 net/netfilter/nfnetlink_cthelper.c | 86 +-
 1 file changed, 84 insertions(+), 2 deletions(-)

diff --git a/net/netfilter/nfnetlink_cthelper.c 
b/net/netfilter/nfnetlink_cthelper.c
index b1fcfa08f0b4..86325959fef0 100644
--- a/net/netfilter/nfnetlink_cthelper.c
+++ b/net/netfilter/nfnetlink_cthelper.c
@@ -256,6 +256,89 @@ nfnl_cthelper_create(const struct nlattr * const tb[],
 }
 
 static int
+nfnl_cthelper_update_policy_one(const struct nf_conntrack_expect_policy 
*policy,
+   struct nf_conntrack_expect_policy *new_policy,
+   const struct nlattr *attr)
+{
+   struct nlattr *tb[NFCTH_POLICY_MAX + 1];
+   int err;
+
+   err = nla_parse_nested(tb, NFCTH_POLICY_MAX, attr,
+  nfnl_cthelper_expect_pol);
+   if (err < 0)
+   return err;
+
+   if (!tb[NFCTH_POLICY_NAME] ||
+   !tb[NFCTH_POLICY_EXPECT_MAX] ||
+   !tb[NFCTH_POLICY_EXPECT_TIMEOUT])
+   return -EINVAL;
+
+   if (nla_strcmp(tb[NFCTH_POLICY_NAME], policy->name))
+   return -EBUSY;
+
+   new_policy->max_expected =
+   ntohl(nla_get_be32(tb[NFCTH_POLICY_EXPECT_MAX]));
+   new_policy->timeout =
+   ntohl(nla_get_be32(tb[NFCTH_POLICY_EXPECT_TIMEOUT]));
+
+   return 0;
+}
+
+static int nfnl_cthelper_update_policy_all(struct nlattr *tb[],
+  struct nf_conntrack_helper *helper)
+{
+   struct nf_conntrack_expect_policy new_policy[helper->expect_class_max + 
1];
+   struct nf_conntrack_expect_policy *policy;
+   int i, err;
+
+   /* Check first that all policy attributes are well-formed, so we don't
+* leave things in inconsistent state on errors.
+*/
+   for (i = 0; i < helper->expect_class_max + 1; i++) {
+
+   if (!tb[NFCTH_POLICY_SET + i])
+   return -EINVAL;
+
+   err = nfnl_cthelper_update_policy_one(&helper->expect_policy[i],
+ &new_policy[i],
+ tb[NFCTH_POLICY_SET + i]);
+   if (err < 0)
+   return err;
+   }
+   /* Now we can safely update them. */
+   for (i = 0; i < helper->expect_class_max + 1; i++) {
+   policy = (struct nf_conntrack_expect_policy *)
+   &helper->expect_policy[i];
+   policy->max_expected = new_policy->max_expected;
+   policy->timeout = new_policy->timeout;
+   }
+
+   return 0;
+}
+
+static int nfnl_cthelper_update_policy(struct nf_conntrack_helper *helper,
+  const struct nlattr *attr)
+{
+   struct nlattr *tb[NFCTH_POLICY_SET_MAX + 1];
+   unsigned int class_max;
+   int err;
+
+   err = nla_parse_nested(tb, NFCTH_POLICY_SET_MAX, attr,
+  nfnl_cthelper_expect_policy_set);
+   if (err < 0)
+   return err;
+
+   if (!tb[NFCTH_POLICY_SET_NUM])
+   return -EINVAL;
+
+   class_max = ntohl(nla_get_be32(tb[NFCTH_POLICY_SET_NUM]));
+   if (helper->expect_class_max + 1 != class_max)
+   return -EBUSY;
+
+   return nfnl_cthelper_update_policy_all(tb, helper);
+}
+
+static int
 nfnl_cthelper_update(const struct nlattr * const tb[],
 struct nf_conntrack_helper *helper)
 {
@@ -265,8 +348,7 @@ nfnl_cthelper_update(const struct nlattr * const tb[],
return -EBUSY;
 
if (tb[NFCTH_POLICY]) {
-   ret = nfnl_cthelper_parse_expect_policy(helper,
-   tb[NFCTH_POLICY]);
+   ret = nfnl_cthelper_update_policy(helper, tb[NFCTH_POLICY]);
if (ret < 0)
return ret;
}
-- 
2.11.0


[PATCH AUTOSEL for 4.9 026/100] r8152: fix the rx early size of RTL8153

2017-12-12 Thread alexander . levin
From: hayeswang 

[ Upstream commit b20cb60e2b865638459e6ec82ad3536d3734e555 ]

revert commit a59e6d815226 ("r8152: correct the rx early size") and
fix the rx early size as

(rx buffer size - rx packet size - rx desc size - alignment) / 4

Signed-off-by: Hayes Wang 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/usb/r8152.c | 7 ---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index 823219cf95ef..5bc0377cdcdd 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -32,7 +32,7 @@
 #define NETNEXT_VERSION"08"
 
 /* Information for net */
-#define NET_VERSION"8"
+#define NET_VERSION"9"
 
 #define DRIVER_VERSION "v1." NETNEXT_VERSION "." NET_VERSION
 #define DRIVER_AUTHOR "Realtek linux nic maintainers "
@@ -501,6 +501,8 @@ enum rtl_register_content {
 #define RTL8153_RMSRTL8153_MAX_PACKET
 #define RTL8152_TX_TIMEOUT (5 * HZ)
 #define RTL8152_NAPI_WEIGHT64
+#define rx_reserved_size(x)((x) + VLAN_ETH_HLEN + CRC_SIZE + \
+sizeof(struct rx_desc) + RX_ALIGN)
 
 /* rtl8152 flags */
 enum rtl8152_flags {
@@ -2253,8 +2255,7 @@ static void r8153_set_rx_early_timeout(struct r8152 *tp)
 
 static void r8153_set_rx_early_size(struct r8152 *tp)
 {
-   u32 mtu = tp->netdev->mtu;
-   u32 ocp_data = (agg_buf_sz - mtu - VLAN_ETH_HLEN - VLAN_HLEN) / 8;
+   u32 ocp_data = (agg_buf_sz - rx_reserved_size(tp->netdev->mtu)) / 4;
 
ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE, ocp_data);
 }
-- 
2.11.0


[PATCH AUTOSEL for 4.9 008/100] arm: kprobes: Align stack to 8-bytes in test code

2017-12-12 Thread alexander . levin
From: Jon Medhurst 

[ Upstream commit 974310d047f3c7788a51d10c8d255eebdb1fa857 ]

kprobes test cases need to have a stack that is aligned to an 8-byte
boundary because they call other functions (and the ARM ABI mandates
that alignment) and because test cases include 64-bit accesses to the
stack. Unfortunately, GCC doesn't ensure this alignment for inline
assembler and for the code in question seems to always misalign it by
pushing just the LR register onto the stack. We therefore need to
explicitly perform stack alignment at the start of each test case.

Without this fix, some test cases will generate alignment faults on
systems where alignment is enforced. Even if the kernel is configured to
handle these faults in software, triggering them is ugly. It also
exposes limitations in the fault handling code which doesn't cope with
writes to the stack. E.g. when handling this instruction

   strd r6, [sp, #-64]!

the fault handling code will write to a stack location below the SP
value at the point the fault occurred, which coincides with where the
exception handler has pushed the saved register context. This results in
corruption of those registers.

Signed-off-by: Jon Medhurst 
Signed-off-by: Sasha Levin 
---
 arch/arm/probes/kprobes/test-core.c | 11 ---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/arch/arm/probes/kprobes/test-core.c 
b/arch/arm/probes/kprobes/test-core.c
index 9775de22e2ff..a48354de1aa1 100644
--- a/arch/arm/probes/kprobes/test-core.c
+++ b/arch/arm/probes/kprobes/test-core.c
@@ -976,7 +976,10 @@ static void coverage_end(void)
 void __naked __kprobes_test_case_start(void)
 {
__asm__ __volatile__ (
-   "stmdb  sp!, {r4-r11}   \n\t"
+   "movr2, sp  \n\t"
+   "bicr3, r2, #7  \n\t"
+   "movsp, r3  \n\t"
+   "stmdb  sp!, {r2-r11}   \n\t"
"subsp, sp, #"__stringify(TEST_MEMORY_SIZE)"\n\t"
"bicr0, lr, #1  @ r0 = inline data  \n\t"
"movr1, sp  \n\t"
@@ -996,7 +999,8 @@ void __naked __kprobes_test_case_end_32(void)
"movne  pc, r0  \n\t"
"movr0, r4  \n\t"
"addsp, sp, #"__stringify(TEST_MEMORY_SIZE)"\n\t"
-   "ldmia  sp!, {r4-r11}   \n\t"
+   "ldmia  sp!, {r2-r11}   \n\t"
+   "movsp, r2  \n\t"
"movpc, r0  \n\t"
);
 }
@@ -1012,7 +1016,8 @@ void __naked __kprobes_test_case_end_16(void)
"bxne   r0  \n\t"
"movr0, r4  \n\t"
"addsp, sp, #"__stringify(TEST_MEMORY_SIZE)"\n\t"
-   "ldmia  sp!, {r4-r11}   \n\t"
+   "ldmia  sp!, {r2-r11}   \n\t"
+   "movsp, r2  \n\t"
"bx r0  \n\t"
);
 }
-- 
2.11.0


[PATCH AUTOSEL for 4.9 013/100] vsock: track pkt owner vsock

2017-12-12 Thread alexander . levin
From: Peng Tao 

[ Upstream commit 36d277bac8080202684e67162ebb157f16631581 ]

So that we can cancel a queued pkt later if necessary.

Signed-off-by: Peng Tao 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 include/linux/virtio_vsock.h| 3 +++
 net/vmw_vsock/virtio_transport_common.c | 7 +++
 2 files changed, 10 insertions(+)

diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h
index 9638bfeb0d1f..584f9a647ad4 100644
--- a/include/linux/virtio_vsock.h
+++ b/include/linux/virtio_vsock.h
@@ -48,6 +48,8 @@ struct virtio_vsock_pkt {
struct virtio_vsock_hdr hdr;
struct work_struct work;
struct list_head list;
+   /* socket refcnt not held, only use for cancellation */
+   struct vsock_sock *vsk;
void *buf;
u32 len;
u32 off;
@@ -56,6 +58,7 @@ struct virtio_vsock_pkt {
 
 struct virtio_vsock_pkt_info {
u32 remote_cid, remote_port;
+   struct vsock_sock *vsk;
struct msghdr *msg;
u32 pkt_len;
u16 type;
diff --git a/net/vmw_vsock/virtio_transport_common.c 
b/net/vmw_vsock/virtio_transport_common.c
index 62c056ea403b..9c07c76c504d 100644
--- a/net/vmw_vsock/virtio_transport_common.c
+++ b/net/vmw_vsock/virtio_transport_common.c
@@ -57,6 +57,7 @@ virtio_transport_alloc_pkt(struct virtio_vsock_pkt_info *info,
pkt->len= len;
pkt->hdr.len= cpu_to_le32(len);
pkt->reply  = info->reply;
+   pkt->vsk= info->vsk;
 
if (info->msg && len > 0) {
pkt->buf = kmalloc(len, GFP_KERNEL);
@@ -180,6 +181,7 @@ static int virtio_transport_send_credit_update(struct 
vsock_sock *vsk,
struct virtio_vsock_pkt_info info = {
.op = VIRTIO_VSOCK_OP_CREDIT_UPDATE,
.type = type,
+   .vsk = vsk,
};
 
return virtio_transport_send_pkt_info(vsk, &info);
@@ -519,6 +521,7 @@ int virtio_transport_connect(struct vsock_sock *vsk)
struct virtio_vsock_pkt_info info = {
.op = VIRTIO_VSOCK_OP_REQUEST,
.type = VIRTIO_VSOCK_TYPE_STREAM,
+   .vsk = vsk,
};
 
return virtio_transport_send_pkt_info(vsk, &info);
@@ -534,6 +537,7 @@ int virtio_transport_shutdown(struct vsock_sock *vsk, int 
mode)
  VIRTIO_VSOCK_SHUTDOWN_RCV : 0) |
 (mode & SEND_SHUTDOWN ?
  VIRTIO_VSOCK_SHUTDOWN_SEND : 0),
+   .vsk = vsk,
};
 
return virtio_transport_send_pkt_info(vsk, &info);
@@ -560,6 +564,7 @@ virtio_transport_stream_enqueue(struct vsock_sock *vsk,
.type = VIRTIO_VSOCK_TYPE_STREAM,
.msg = msg,
.pkt_len = len,
+   .vsk = vsk,
};
 
return virtio_transport_send_pkt_info(vsk, &info);
@@ -581,6 +586,7 @@ static int virtio_transport_reset(struct vsock_sock *vsk,
.op = VIRTIO_VSOCK_OP_RST,
.type = VIRTIO_VSOCK_TYPE_STREAM,
.reply = !!pkt,
+   .vsk = vsk,
};
 
/* Send RST only if the original pkt is not a RST pkt */
@@ -826,6 +832,7 @@ virtio_transport_send_response(struct vsock_sock *vsk,
.remote_cid = le64_to_cpu(pkt->hdr.src_cid),
.remote_port = le32_to_cpu(pkt->hdr.src_port),
.reply = true,
+   .vsk = vsk,
};
 
return virtio_transport_send_pkt_info(vsk, &info);
-- 
2.11.0


[PATCH AUTOSEL for 4.9 027/100] tipc: fix nametbl deadlock at tipc_nametbl_unsubscribe

2017-12-12 Thread alexander . levin
From: Ying Xue 

[ Upstream commit 557d054c01da0337ca81de9e9d9206d57245b57e ]

Until now, tipc_nametbl_unsubscribe() is called at subscriptions
reference count cleanup. Usually the subscriptions cleanup is
called at subscription timeout or at subscription cancel or at
subscriber delete.

We have ignored the possibility of this being called from other
locations, which causes deadlock as we try to grab the
tn->nametbl_lock while holding it already.

   CPU1: CPU2:
-- 
tipc_nametbl_publish
spin_lock_bh(&tn->nametbl_lock)
tipc_nametbl_insert_publ
tipc_nameseq_insert_publ
tipc_subscrp_report_overlap
tipc_subscrp_get
tipc_subscrp_send_event
 tipc_close_conn
 tipc_subscrb_release_cb
 tipc_subscrb_delete
 tipc_subscrp_put
tipc_subscrp_put
tipc_subscrp_kref_release
tipc_nametbl_unsubscribe
spin_lock_bh(&tn->nametbl_lock)
<>

   CPU1:  CPU2:
-- 
tipc_nametbl_stop
spin_lock_bh(&tn->nametbl_lock)
tipc_purge_publications
tipc_nameseq_remove_publ
tipc_subscrp_report_overlap
tipc_subscrp_get
tipc_subscrp_send_event
 tipc_close_conn
 tipc_subscrb_release_cb
 tipc_subscrb_delete
 tipc_subscrp_put
tipc_subscrp_put
tipc_subscrp_kref_release
tipc_nametbl_unsubscribe
spin_lock_bh(&tn->nametbl_lock)
<>

In this commit, we advance the calling of tipc_nametbl_unsubscribe()
from the refcount cleanup to the intended callers.

Fixes: d094c4d5f5c7 ("tipc: add subscription refcount to avoid invalid delete")
Reported-by: John Thompson 
Acked-by: Jon Maloy 
Signed-off-by: Ying Xue 
Signed-off-by: Parthasarathy Bhuvaragan 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 net/tipc/subscr.c | 7 ++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/net/tipc/subscr.c b/net/tipc/subscr.c
index 9d94e65d0894..271cd66e4b3b 100644
--- a/net/tipc/subscr.c
+++ b/net/tipc/subscr.c
@@ -141,6 +141,11 @@ void tipc_subscrp_report_overlap(struct tipc_subscription 
*sub, u32 found_lower,
 static void tipc_subscrp_timeout(unsigned long data)
 {
struct tipc_subscription *sub = (struct tipc_subscription *)data;
+   struct tipc_subscriber *subscriber = sub->subscriber;
+
+   spin_lock_bh(&subscriber->lock);
+   tipc_nametbl_unsubscribe(sub);
+   spin_unlock_bh(&subscriber->lock);
 
/* Notify subscriber of timeout */
tipc_subscrp_send_event(sub, sub->evt.s.seq.lower, sub->evt.s.seq.upper,
@@ -173,7 +178,6 @@ static void tipc_subscrp_kref_release(struct kref *kref)
struct tipc_subscriber *subscriber = sub->subscriber;
 
spin_lock_bh(&subscriber->lock);
-   tipc_nametbl_unsubscribe(sub);
list_del(&sub->subscrp_list);
atomic_dec(&tn->subscription_count);
spin_unlock_bh(&subscriber->lock);
@@ -205,6 +209,7 @@ static void tipc_subscrb_subscrp_delete(struct 
tipc_subscriber *subscriber,
if (s && memcmp(s, &sub->evt.s, sizeof(struct tipc_subscr)))
continue;
 
+   tipc_nametbl_unsubscribe(sub);
tipc_subscrp_get(sub);
spin_unlock_bh(&subscriber->lock);
tipc_subscrp_delete(sub);
-- 
2.11.0


[PATCH AUTOSEL for 4.9 034/100] ARM: dts: ti: fix PCI bus dtc warnings

2017-12-12 Thread alexander . levin
From: Rob Herring 

[ Upstream commit 7d79f6098d82f8c09914d7799bc96891ad9c3baf ]

dtc recently added PCI bus checks. Fix these warnings.

Signed-off-by: Rob Herring 
Cc: "Benoît Cousson" 
Cc: Tony Lindgren 
Cc: linux-o...@vger.kernel.org
Signed-off-by: Tony Lindgren 
Signed-off-by: Sasha Levin 
---
 arch/arm/boot/dts/dra7.dtsi | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/arm/boot/dts/dra7.dtsi b/arch/arm/boot/dts/dra7.dtsi
index 064d84f87e45..ce54a70b7695 100644
--- a/arch/arm/boot/dts/dra7.dtsi
+++ b/arch/arm/boot/dts/dra7.dtsi
@@ -282,6 +282,7 @@
device_type = "pci";
ranges = <0x8100 0 0  0x03000 0 
0x0001
  0x8200 0 0x20013000 0x13000 0 
0xffed000>;
+   bus-range = <0x00 0xff>;
#interrupt-cells = <1>;
num-lanes = <1>;
linux,pci-domain = <0>;
@@ -318,6 +319,7 @@
device_type = "pci";
ranges = <0x8100 0 0  0x03000 0 
0x0001
  0x8200 0 0x30013000 0x13000 0 
0xffed000>;
+   bus-range = <0x00 0xff>;
#interrupt-cells = <1>;
num-lanes = <1>;
linux,pci-domain = <1>;
-- 
2.11.0


[PATCH AUTOSEL for 4.9 038/100] ASoC: STI: Fix reader substream pointer set

2017-12-12 Thread alexander . levin
From: Arnaud Pouliquen 

[ Upstream commit 3c9d3f1bc2defd418b5933bbc928096c9c686d3b ]

reader->substream is used in IRQ handler for error case but is never set.
Set value to pcm substream on DAI startup and clean it on dai shutdown.

Signed-off-by: Arnaud Pouliquen 
Signed-off-by: Mark Brown 
Signed-off-by: Sasha Levin 
---
 sound/soc/sti/uniperif_reader.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/sound/soc/sti/uniperif_reader.c b/sound/soc/sti/uniperif_reader.c
index 0e1c3ee56675..9735b4caaed3 100644
--- a/sound/soc/sti/uniperif_reader.c
+++ b/sound/soc/sti/uniperif_reader.c
@@ -364,6 +364,8 @@ static int uni_reader_startup(struct snd_pcm_substream 
*substream,
struct uniperif *reader = priv->dai_data.uni;
int ret;
 
+   reader->substream = substream;
+
if (!UNIPERIF_TYPE_IS_TDM(reader))
return 0;
 
@@ -393,6 +395,7 @@ static void uni_reader_shutdown(struct snd_pcm_substream 
*substream,
/* Stop the reader */
uni_reader_stop(reader);
}
+   reader->substream = NULL;
 }
 
 static const struct snd_soc_dai_ops uni_reader_dai_ops = {
-- 
2.11.0


[PATCH AUTOSEL for 4.9 035/100] hwmon: (asus_atk0110) fix uninitialized data access

2017-12-12 Thread alexander . levin
From: Arnd Bergmann 

[ Upstream commit a2125d02443e9a4e68bcfd9f8004fa23239e8329 ]

The latest gcc-7 snapshot adds a warning to point out that when
atk_read_value_old or atk_read_value_new fails, we copy
uninitialized data into sensor->cached_value:

drivers/hwmon/asus_atk0110.c: In function 'atk_input_show':
drivers/hwmon/asus_atk0110.c:651:26: error: 'value' may be used uninitialized 
in this function [-Werror=maybe-uninitialized]

Adding an error check avoids this. All versions of the driver
are affected.

Fixes: 2c03d07ad54d ("hwmon: Add Asus ATK0110 support")
Signed-off-by: Arnd Bergmann 
Reviewed-by: Luca Tettamanti 
Signed-off-by: Guenter Roeck 
Signed-off-by: Sasha Levin 
---
 drivers/hwmon/asus_atk0110.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/hwmon/asus_atk0110.c b/drivers/hwmon/asus_atk0110.c
index cccef87963e0..975c43d446f8 100644
--- a/drivers/hwmon/asus_atk0110.c
+++ b/drivers/hwmon/asus_atk0110.c
@@ -646,6 +646,9 @@ static int atk_read_value(struct atk_sensor_data *sensor, 
u64 *value)
else
err = atk_read_value_new(sensor, value);
 
+   if (err)
+   return err;
+
sensor->is_valid = true;
sensor->last_updated = jiffies;
sensor->cached_value = *value;
-- 
2.11.0


[PATCH AUTOSEL for 4.9 032/100] KVM: x86: correct async page present tracepoint

2017-12-12 Thread alexander . levin
From: Wanpeng Li 

[ Upstream commit 24dccf83a121b8a4ad5c2ad383a8184ef6c266ee ]

After async pf setup successfully, there is a broadcast wakeup w/ special
token 0x which tells vCPU that it should wake up all processes
waiting for APFs though there is no real process waiting at the moment.

The async page present tracepoint print prematurely and fails to catch the
special token setup. This patch fixes it by moving the async page present
tracepoint after the special token setup.

Before patch:

qemu-system-x86-8499  [006] ...1  5973.473292: kvm_async_pf_ready: token 0x0 
gva 0x0

After patch:

qemu-system-x86-8499  [006] ...1  5973.473292: kvm_async_pf_ready: token 
0x gva 0x0

Cc: Paolo Bonzini 
Cc: Radim Krčmář 
Signed-off-by: Wanpeng Li 
Signed-off-by: Paolo Bonzini 
Signed-off-by: Sasha Levin 
---
 arch/x86/kvm/x86.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 02d45296a97c..c568066b3ae8 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -8429,11 +8429,11 @@ void kvm_arch_async_page_present(struct kvm_vcpu *vcpu,
 {
struct x86_exception fault;
 
-   trace_kvm_async_pf_ready(work->arch.token, work->gva);
if (work->wakeup_all)
work->arch.token = ~0; /* broadcast wakeup */
else
kvm_del_async_pf_gfn(vcpu, work->arch.gfn);
+   trace_kvm_async_pf_ready(work->arch.token, work->gva);
 
if ((vcpu->arch.apf.msr_val & KVM_ASYNC_PF_ENABLED) &&
!apf_put_user(vcpu, KVM_PV_REASON_PAGE_READY)) {
-- 
2.11.0


[PATCH AUTOSEL for 4.9 033/100] KVM: VMX: Fix enable VPID conditions

2017-12-12 Thread alexander . levin
From: Wanpeng Li 

[ Upstream commit 08d839c4b134b8328ec42f2157a9ca4b93227c03 ]

This can be reproduced by running L2 on L1, and disable VPID on L0
if w/o commit "KVM: nVMX: Fix nested VPID vmx exec control", the L2
crash as below:

KVM: entry failed, hardware error 0x7
EAX= EBX= ECX= EDX=000306c3
ESI= EDI= EBP= ESP=
EIP=fff0 EFL=0002 [---] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =   9300
CS =f000   9b00
SS =   9300
DS =   9300
FS =   9300
GS =   9300
LDT=   8200
TR =   8b00
GDT=  
IDT=  
CR0=6010 CR2= CR3= CR4=
DR0= DR1= DR2= 
DR3=
DR6=0ff0 DR7=0400
EFER=

Reference SDM 30.3 INVVPID:

Protected Mode Exceptions
- #UD
  - If not in VMX operation.
  - If the logical processor does not support VPIDs 
(IA32_VMX_PROCBASED_CTLS2[37]=0).
  - If the logical processor supports VPIDs (IA32_VMX_PROCBASED_CTLS2[37]=1) 
but does
not support the INVVPID instruction (IA32_VMX_EPT_VPID_CAP[32]=0).

So we should check both VPID enable bit in vmx exec control and INVVPID support 
bit
in vmx capability MSRs to enable VPID. This patch adds the guarantee to not 
enable
VPID if either INVVPID or single-context/all-context invalidation is not 
exposed in
vmx capability MSRs.

Reviewed-by: David Hildenbrand 
Reviewed-by: Jim Mattson 
Cc: Paolo Bonzini 
Cc: Radim Krčmář 
Signed-off-by: Wanpeng Li 
Signed-off-by: Paolo Bonzini 
Signed-off-by: Sasha Levin 
---
 arch/x86/kvm/vmx.c | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 3ec670af9cae..221ccd8f9ab0 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -1199,6 +1199,11 @@ static inline bool cpu_has_vmx_invvpid_global(void)
return vmx_capability.vpid & VMX_VPID_EXTENT_GLOBAL_CONTEXT_BIT;
 }
 
+static inline bool cpu_has_vmx_invvpid(void)
+{
+   return vmx_capability.vpid & VMX_VPID_INVVPID_BIT;
+}
+
 static inline bool cpu_has_vmx_ept(void)
 {
return vmcs_config.cpu_based_2nd_exec_ctrl &
@@ -6439,8 +6444,10 @@ static __init int hardware_setup(void)
if (boot_cpu_has(X86_FEATURE_NX))
kvm_enable_efer_bits(EFER_NX);
 
-   if (!cpu_has_vmx_vpid())
+   if (!cpu_has_vmx_vpid() || !cpu_has_vmx_invvpid() ||
+   !(cpu_has_vmx_invvpid_single() || cpu_has_vmx_invvpid_global()))
enable_vpid = 0;
+
if (!cpu_has_vmx_shadow_vmcs())
enable_shadow_vmcs = 0;
if (enable_shadow_vmcs)
-- 
2.11.0


[PATCH AUTOSEL for 4.9 040/100] s390/qeth: size calculation outbound buffers

2017-12-12 Thread alexander . levin
From: Julian Wiedmann 

[ Upstream commit 7d969d2e8890f546c8cec634b3aa5f57d4eef883 ]

Depending on the device type, hard_start_xmit() builds different output
buffer formats. For instance with HiperSockets, on both L2 and L3 we
strip the ETH header from the skb - L3 doesn't need it, and L2 carries
it in the buffer's header element.
For this, we pass data_offset = ETH_HLEN all the way down to
__qeth_fill_buffer(), where skb->data is then adjusted accordingly.
But the initial size calculation still considers the *full* skb length
(including the ETH header). So qeth_get_elements_no() can erroneously
reject a skb as too big, even though it would actually fit into an
output buffer once the ETH header has been trimmed off later.

Fix this by passing an additional offset to qeth_get_elements_no(),
that indicates where in the skb the on-wire data actually begins.
Since the current code uses data_offset=-1 for some special handling
on OSA, we need to clamp data_offset to 0...

On HiperSockets this helps when sending ~MTU-size skbs with weird page
alignment. No change for OSA or AF_IUCV.

Signed-off-by: Julian Wiedmann 
Signed-off-by: Ursula Braun 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/s390/net/qeth_core.h  | 3 ++-
 drivers/s390/net/qeth_core_main.c | 5 +++--
 drivers/s390/net/qeth_l2_main.c   | 5 +++--
 drivers/s390/net/qeth_l3_main.c   | 5 +++--
 4 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h
index d55e6438bb5e..1f29ba7ca887 100644
--- a/drivers/s390/net/qeth_core.h
+++ b/drivers/s390/net/qeth_core.h
@@ -969,7 +969,8 @@ int qeth_bridgeport_query_ports(struct qeth_card *card,
 int qeth_bridgeport_setrole(struct qeth_card *card, enum qeth_sbp_roles role);
 int qeth_bridgeport_an_set(struct qeth_card *card, int enable);
 int qeth_get_priority_queue(struct qeth_card *, struct sk_buff *, int, int);
-int qeth_get_elements_no(struct qeth_card *, struct sk_buff *, int);
+int qeth_get_elements_no(struct qeth_card *card, struct sk_buff *skb,
+int extra_elems, int data_offset);
 int qeth_get_elements_for_frags(struct sk_buff *);
 int qeth_do_send_packet_fast(struct qeth_card *, struct qeth_qdio_out_q *,
struct sk_buff *, struct qeth_hdr *, int, int, int);
diff --git a/drivers/s390/net/qeth_core_main.c 
b/drivers/s390/net/qeth_core_main.c
index 21ef8023430f..39a3ae02d186 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -3837,6 +3837,7 @@ EXPORT_SYMBOL_GPL(qeth_get_elements_for_frags);
  * @card:  qeth card structure, to check max. elems.
  * @skb:   SKB address
  * @extra_elems:   extra elems needed, to check against max.
+ * @data_offset:   range starts at skb->data + data_offset
  *
  * Returns the number of pages, and thus QDIO buffer elements, needed to cover
  * skb data, including linear part and fragments. Checks if the result plus
@@ -3844,10 +3845,10 @@ EXPORT_SYMBOL_GPL(qeth_get_elements_for_frags);
  * Note: extra_elems is not included in the returned result.
  */
 int qeth_get_elements_no(struct qeth_card *card,
-struct sk_buff *skb, int extra_elems)
+struct sk_buff *skb, int extra_elems, int data_offset)
 {
int elements = qeth_get_elements_for_range(
-   (addr_t)skb->data,
+   (addr_t)skb->data + data_offset,
(addr_t)skb->data + skb_headlen(skb)) +
qeth_get_elements_for_frags(skb);
 
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
index 8530477caab8..7917ea493e7c 100644
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -865,7 +865,7 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, 
struct net_device *dev)
 * chaining we can not send long frag lists
 */
if ((card->info.type != QETH_CARD_TYPE_IQD) &&
-   !qeth_get_elements_no(card, new_skb, 0)) {
+   !qeth_get_elements_no(card, new_skb, 0, 0)) {
int lin_rc = skb_linearize(new_skb);
 
if (card->options.performance_stats) {
@@ -910,7 +910,8 @@ static int qeth_l2_hard_start_xmit(struct sk_buff *skb, 
struct net_device *dev)
}
}
 
-   elements = qeth_get_elements_no(card, new_skb, elements_needed);
+   elements = qeth_get_elements_no(card, new_skb, elements_needed,
+   (data_offset > 0) ? data_offset : 0);
if (!elements) {
if (data_offset >= 0)
kmem_cache_free(qeth_core_header_cache, hdr);
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
index 03a2619166ca..98aac5cbce58 100644
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -2867,7 +286

[PATCH AUTOSEL for 4.9 037/100] HID: xinmo: fix for out of range for THT 2P arcade controller.

2017-12-12 Thread alexander . levin
From: Peter Stein 

[ Upstream commit 9257821c5a1dc57ef3a37f7cbcebaf548395c964 ]

There is a new clone of the XIN MO arcade controller which has same issue with
out of range like the original.  This fix will solve the issue where 2
directions on the joystick are not recognized by the new THT 2P arcade
controller with device ID 0x75e1.  In details the new device ID is added the
hid-id list and the hid-xinmo source code.

Signed-off-by: Peter Stein 
Signed-off-by: Jiri Kosina 
Signed-off-by: Sasha Levin 
---
 drivers/hid/hid-core.c  | 1 +
 drivers/hid/hid-ids.h   | 1 +
 drivers/hid/hid-xinmo.c | 1 +
 3 files changed, 3 insertions(+)

diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
index 32a6c1b56044..721d388753b2 100644
--- a/drivers/hid/hid-core.c
+++ b/drivers/hid/hid-core.c
@@ -2106,6 +2106,7 @@ static const struct hid_device_id 
hid_have_special_driver[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_WALTOP, 
USB_DEVICE_ID_WALTOP_SIRIUS_BATTERY_FREE_TABLET) },
{ HID_USB_DEVICE(USB_VENDOR_ID_X_TENSIONS, 
USB_DEVICE_ID_SPEEDLINK_VAD_CEZANNE) },
{ HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, 
USB_DEVICE_ID_XIN_MO_DUAL_ARCADE) },
+   { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, USB_DEVICE_ID_THT_2P_ARCADE) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0005) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ZEROPLUS, 0x0030) },
{ HID_USB_DEVICE(USB_VENDOR_ID_ZYDACRON, 
USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL) },
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index eb697e25b20e..4379d77da615 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -1079,6 +1079,7 @@
 
 #define USB_VENDOR_ID_XIN_MO   0x16c0
 #define USB_DEVICE_ID_XIN_MO_DUAL_ARCADE   0x05e1
+#define USB_DEVICE_ID_THT_2P_ARCADE0x75e1
 
 #define USB_VENDOR_ID_XIROKU   0x1477
 #define USB_DEVICE_ID_XIROKU_SPX   0x1006
diff --git a/drivers/hid/hid-xinmo.c b/drivers/hid/hid-xinmo.c
index 7df5227a7e61..9ad7731d2e10 100644
--- a/drivers/hid/hid-xinmo.c
+++ b/drivers/hid/hid-xinmo.c
@@ -46,6 +46,7 @@ static int xinmo_event(struct hid_device *hdev, struct 
hid_field *field,
 
 static const struct hid_device_id xinmo_devices[] = {
{ HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, 
USB_DEVICE_ID_XIN_MO_DUAL_ARCADE) },
+   { HID_USB_DEVICE(USB_VENDOR_ID_XIN_MO, USB_DEVICE_ID_THT_2P_ARCADE) },
{ }
 };
 
-- 
2.11.0


[PATCH AUTOSEL for 4.9 041/100] s390/qeth: no ETH header for outbound AF_IUCV

2017-12-12 Thread alexander . levin
From: Julian Wiedmann 

[ Upstream commit acd9776b5c45ef02d1a210969a6fcc058afb76e3 ]

With AF_IUCV traffic, the skb passed to hard_start_xmit() has a 14 byte
slot at skb->data, intended for an ETH header. qeth_l3_fill_af_iucv_hdr()
fills this ETH header... and then immediately moves it to the
skb's headroom, where it disappears and is never seen again.

But it's still possible for us to return NETDEV_TX_BUSY after the skb has
been modified. Since we didn't get a private copy of the skb, the next
time the skb is delivered to hard_start_xmit() it no longer has the
expected layout (we moved the ETH header to the headroom, so skb->data
now starts at the IUCV_TRANS header). So when qeth_l3_fill_af_iucv_hdr()
does another round of rebuilding, the resulting qeth header ends up
all wrong. On transmission, the buffer is then rejected by
the HiperSockets device with SBALF15 = x'04'.
When this error is passed back to af_iucv as TX_NOTIFY_UNREACHABLE, it
tears down the offending socket.

As the ETH header for AF_IUCV serves no purpose, just align the code to
what we do for IP traffic on L3 HiperSockets: keep the ETH header at
skb->data, and pass down data_offset = ETH_HLEN to qeth_fill_buffer().
When mapping the payload into the SBAL elements, the ETH header is then
stripped off. This avoids the skb manipulations in
qeth_l3_fill_af_iucv_hdr(), and any buffer re-entering hard_start_xmit()
after NETDEV_TX_BUSY is now processed properly.

Signed-off-by: Julian Wiedmann 
Signed-off-by: Ursula Braun 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/s390/net/qeth_l3_main.c | 15 ---
 1 file changed, 4 insertions(+), 11 deletions(-)

diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
index 98aac5cbce58..6eb9e2610414 100644
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -2609,17 +2609,13 @@ static void qeth_l3_fill_af_iucv_hdr(struct qeth_card 
*card,
char daddr[16];
struct af_iucv_trans_hdr *iucv_hdr;
 
-   skb_pull(skb, 14);
-   card->dev->header_ops->create(skb, card->dev, 0,
- card->dev->dev_addr, card->dev->dev_addr,
- card->dev->addr_len);
-   skb_pull(skb, 14);
-   iucv_hdr = (struct af_iucv_trans_hdr *)skb->data;
memset(hdr, 0, sizeof(struct qeth_hdr));
hdr->hdr.l3.id = QETH_HEADER_TYPE_LAYER3;
hdr->hdr.l3.ext_flags = 0;
-   hdr->hdr.l3.length = skb->len;
+   hdr->hdr.l3.length = skb->len - ETH_HLEN;
hdr->hdr.l3.flags = QETH_HDR_IPV6 | QETH_CAST_UNICAST;
+
+   iucv_hdr = (struct af_iucv_trans_hdr *) (skb->data + ETH_HLEN);
memset(daddr, 0, sizeof(daddr));
daddr[0] = 0xfe;
daddr[1] = 0x80;
@@ -2823,10 +2819,7 @@ static int qeth_l3_hard_start_xmit(struct sk_buff *skb, 
struct net_device *dev)
if ((card->info.type == QETH_CARD_TYPE_IQD) &&
!skb_is_nonlinear(skb)) {
new_skb = skb;
-   if (new_skb->protocol == ETH_P_AF_IUCV)
-   data_offset = 0;
-   else
-   data_offset = ETH_HLEN;
+   data_offset = ETH_HLEN;
hdr = kmem_cache_alloc(qeth_core_header_cache, GFP_ATOMIC);
if (!hdr)
goto tx_drop;
-- 
2.11.0


[PATCH AUTOSEL for 4.9 036/100] i2c: mux: pca954x: Add missing pca9546 definition to chip_desc

2017-12-12 Thread alexander . levin
From: Mike Looijmans 

[ Upstream commit dbe4d69d252e9e65c6c46826980b77b11a142065 ]

The spec for the pca9546 was missing. This chip is the same as the pca9545
except that it lacks interrupt lines. While the i2c_device_id table mapped
the pca9546 to the pca9545 definition the compatible table did not.

Signed-off-by: Mike Looijmans 
Signed-off-by: Peter Rosin 
Signed-off-by: Sasha Levin 
---
 drivers/i2c/muxes/i2c-mux-pca954x.c | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/i2c/muxes/i2c-mux-pca954x.c 
b/drivers/i2c/muxes/i2c-mux-pca954x.c
index 9c4ac26c014e..6f673b0cc803 100644
--- a/drivers/i2c/muxes/i2c-mux-pca954x.c
+++ b/drivers/i2c/muxes/i2c-mux-pca954x.c
@@ -96,6 +96,10 @@ static const struct chip_desc chips[] = {
.nchans = 4,
.muxtype = pca954x_isswi,
},
+   [pca_9546] = {
+   .nchans = 4,
+   .muxtype = pca954x_isswi,
+   },
[pca_9547] = {
.nchans = 8,
.enable = 0x8,
@@ -113,7 +117,7 @@ static const struct i2c_device_id pca954x_id[] = {
{ "pca9543", pca_9543 },
{ "pca9544", pca_9544 },
{ "pca9545", pca_9545 },
-   { "pca9546", pca_9545 },
+   { "pca9546", pca_9546 },
{ "pca9547", pca_9547 },
{ "pca9548", pca_9548 },
{ }
-- 
2.11.0


[PATCH AUTOSEL for 4.9 029/100] pinctrl: st: add irq_request/release_resources callbacks

2017-12-12 Thread alexander . levin
From: Patrice Chotard 

[ Upstream commit e855fa9a65c40788b5069abb0d094537daa22e05 ]

When using GPIO as IRQ source, the GPIO must be configured
in INPUT. Callbacks dedicated for this was missing in
pinctrl-st driver.

This fix the following kernel error when trying to lock a gpio
as IRQ:

[7.521095] gpio gpiochip7: (PIO11): gpiochip_lock_as_irq: tried to flag a 
GPIO set as output for IRQ
[7.526018] gpio gpiochip7: (PIO11): unable to lock HW IRQ 6 for IRQ
[7.529405] genirq: Failed to request resources for 0-0053 (irq 81) on 
irqchip GPIO

Signed-off-by: Patrice Chotard 
Signed-off-by: Linus Walleij 
Signed-off-by: Sasha Levin 
---
 drivers/pinctrl/pinctrl-st.c | 30 --
 1 file changed, 24 insertions(+), 6 deletions(-)

diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c
index b7bb37167969..50c45bdf93be 100644
--- a/drivers/pinctrl/pinctrl-st.c
+++ b/drivers/pinctrl/pinctrl-st.c
@@ -1285,6 +1285,22 @@ static void st_gpio_irq_unmask(struct irq_data *d)
writel(BIT(d->hwirq), bank->base + REG_PIO_SET_PMASK);
 }
 
+static int st_gpio_irq_request_resources(struct irq_data *d)
+{
+   struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+
+   st_gpio_direction_input(gc, d->hwirq);
+
+   return gpiochip_lock_as_irq(gc, d->hwirq);
+}
+
+static void st_gpio_irq_release_resources(struct irq_data *d)
+{
+   struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
+
+   gpiochip_unlock_as_irq(gc, d->hwirq);
+}
+
 static int st_gpio_irq_set_type(struct irq_data *d, unsigned type)
 {
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
@@ -1438,12 +1454,14 @@ static struct gpio_chip st_gpio_template = {
 };
 
 static struct irq_chip st_gpio_irqchip = {
-   .name   = "GPIO",
-   .irq_disable= st_gpio_irq_mask,
-   .irq_mask   = st_gpio_irq_mask,
-   .irq_unmask = st_gpio_irq_unmask,
-   .irq_set_type   = st_gpio_irq_set_type,
-   .flags  = IRQCHIP_SKIP_SET_WAKE,
+   .name   = "GPIO",
+   .irq_request_resources  = st_gpio_irq_request_resources,
+   .irq_release_resources  = st_gpio_irq_release_resources,
+   .irq_disable= st_gpio_irq_mask,
+   .irq_mask   = st_gpio_irq_mask,
+   .irq_unmask = st_gpio_irq_unmask,
+   .irq_set_type   = st_gpio_irq_set_type,
+   .flags  = IRQCHIP_SKIP_SET_WAKE,
 };
 
 static int st_gpiolib_register_bank(struct st_pinctrl *info,
-- 
2.11.0


[PATCH AUTOSEL for 4.9 039/100] r8152: prevent the driver from transmitting packets with carrier off

2017-12-12 Thread alexander . levin
From: hayeswang 

[ Upstream commit 2f25abe6bac573928a990ccbdac75873add8127e ]

The linking status may be changed when autosuspend. And, after
autoresume, the driver may try to transmit packets when the device
is carrier off, because the interrupt transfer doesn't update the
linking status, yet. And, if the device is in ALDPS mode, the device
would stop working.

The another similar case is
 1. unplug the cable.
 2. interrupt transfer queue a work_queue for linking change.
 3. device enters the ALDPS mode.
 4. a tx occurs before the work_queue is called.

Signed-off-by: Hayes Wang 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/usb/r8152.c | 18 --
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index 5bc0377cdcdd..b2d7c7e32250 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -1294,6 +1294,7 @@ static void intr_callback(struct urb *urb)
}
} else {
if (netif_carrier_ok(tp->netdev)) {
+   netif_stop_queue(tp->netdev);
set_bit(RTL8152_LINK_CHG, &tp->flags);
schedule_delayed_work(&tp->schedule, 0);
}
@@ -3167,6 +3168,9 @@ static void set_carrier(struct r8152 *tp)
napi_enable(&tp->napi);
netif_wake_queue(netdev);
netif_info(tp, link, netdev, "carrier on\n");
+   } else if (netif_queue_stopped(netdev) &&
+  skb_queue_len(&tp->tx_queue) < tp->tx_qlen) {
+   netif_wake_queue(netdev);
}
} else {
if (netif_carrier_ok(netdev)) {
@@ -3700,8 +3704,18 @@ static int rtl8152_resume(struct usb_interface *intf)
tp->rtl_ops.autosuspend_en(tp, false);
napi_disable(&tp->napi);
set_bit(WORK_ENABLE, &tp->flags);
-   if (netif_carrier_ok(tp->netdev))
-   rtl_start_rx(tp);
+
+   if (netif_carrier_ok(tp->netdev)) {
+   if (rtl8152_get_speed(tp) & LINK_STATUS) {
+   rtl_start_rx(tp);
+   } else {
+   netif_carrier_off(tp->netdev);
+   tp->rtl_ops.disable(tp);
+   netif_info(tp, link, tp->netdev,
+  "linking down\n");
+   }
+   }
+
napi_enable(&tp->napi);
clear_bit(SELECTIVE_SUSPEND, &tp->flags);
smp_mb__after_atomic();
-- 
2.11.0


[PATCH AUTOSEL for 4.9 042/100] bna: avoid writing uninitialized data into hw registers

2017-12-12 Thread alexander . levin
From: Arnd Bergmann 

[ Upstream commit a5af83925363eb85d467933e3d6ec5a87001eb7c ]

The latest gcc-7 snapshot warns about bfa_ioc_send_enable/bfa_ioc_send_disable
writing undefined values into the hardware registers:

drivers/net/ethernet/brocade/bna/bfa_ioc.c: In function 
'bfa_iocpf_sm_disabling_entry':
arch/arm/include/asm/io.h:109:22: error: '*((void *)&disable_req+4)' is used 
uninitialized in this function [-Werror=uninitialized]
arch/arm/include/asm/io.h:109:22: error: '*((void *)&disable_req+8)' is used 
uninitialized in this function [-Werror=uninitialized]

The two functions look like they should do the same thing, but only one
of them initializes the time stamp and clscode field. The fact that we
only get a warning for one of the two functions seems to be arbitrary,
based on the inlining decisions in the compiler.

To address this, I'm making both functions do the same thing:

- set the clscode from the ioc structure in both
- set the time stamp from ktime_get_real_seconds (which also
  avoids the signed-integer overflow in 2038 and extends the
  well-defined behavior until 2106).
- zero-fill the reserved field

Fixes: 8b230ed8ec96 ("bna: Brocade 10Gb Ethernet device driver")
Signed-off-by: Arnd Bergmann 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/ethernet/brocade/bna/bfa_ioc.c | 10 +++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/brocade/bna/bfa_ioc.c 
b/drivers/net/ethernet/brocade/bna/bfa_ioc.c
index 9e59663a6ead..0f6811860ad5 100644
--- a/drivers/net/ethernet/brocade/bna/bfa_ioc.c
+++ b/drivers/net/ethernet/brocade/bna/bfa_ioc.c
@@ -1930,13 +1930,13 @@ static void
 bfa_ioc_send_enable(struct bfa_ioc *ioc)
 {
struct bfi_ioc_ctrl_req enable_req;
-   struct timeval tv;
 
bfi_h2i_set(enable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_ENABLE_REQ,
bfa_ioc_portid(ioc));
enable_req.clscode = htons(ioc->clscode);
-   do_gettimeofday(&tv);
-   enable_req.tv_sec = ntohl(tv.tv_sec);
+   enable_req.rsvd = htons(0);
+   /* overflow in 2106 */
+   enable_req.tv_sec = ntohl(ktime_get_real_seconds());
bfa_ioc_mbox_send(ioc, &enable_req, sizeof(struct bfi_ioc_ctrl_req));
 }
 
@@ -1947,6 +1947,10 @@ bfa_ioc_send_disable(struct bfa_ioc *ioc)
 
bfi_h2i_set(disable_req.mh, BFI_MC_IOC, BFI_IOC_H2I_DISABLE_REQ,
bfa_ioc_portid(ioc));
+   disable_req.clscode = htons(ioc->clscode);
+   disable_req.rsvd = htons(0);
+   /* overflow in 2106 */
+   disable_req.tv_sec = ntohl(ktime_get_real_seconds());
bfa_ioc_mbox_send(ioc, &disable_req, sizeof(struct bfi_ioc_ctrl_req));
 }
 
-- 
2.11.0


[PATCH AUTOSEL for 4.9 045/100] infiniband: Fix alignment of mmap cookies to support VIPT caching

2017-12-12 Thread alexander . levin
From: Jason Gunthorpe 

[ Upstream commit cb8864559631754ac93d5734b165ccd0cad4728c ]

When vmalloc_user is used to create memory that is supposed to be mmap'd
to user space, it is necessary for the mmap cookie (eg the offset) to be
aligned to SHMLBA.

This creates a situation where all virtual mappings of the same physical
page share the same virtual cache index and guarantees VIPT coherence.
Otherwise the cache is non-coherent and the kernel will not see writes
by userspace when reading the shared page (or vice-versa).

Reported-by: Josh Beavers 
Signed-off-by: Jason Gunthorpe 
Signed-off-by: Doug Ledford 
Signed-off-by: Sasha Levin 
---
 drivers/infiniband/sw/rdmavt/mmap.c  | 4 ++--
 drivers/infiniband/sw/rxe/rxe_mmap.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/infiniband/sw/rdmavt/mmap.c 
b/drivers/infiniband/sw/rdmavt/mmap.c
index e202b8142759..6b712eecbd37 100644
--- a/drivers/infiniband/sw/rdmavt/mmap.c
+++ b/drivers/infiniband/sw/rdmavt/mmap.c
@@ -170,9 +170,9 @@ struct rvt_mmap_info *rvt_create_mmap_info(struct 
rvt_dev_info *rdi,
 
spin_lock_irq(&rdi->mmap_offset_lock);
if (rdi->mmap_offset == 0)
-   rdi->mmap_offset = PAGE_SIZE;
+   rdi->mmap_offset = ALIGN(PAGE_SIZE, SHMLBA);
ip->offset = rdi->mmap_offset;
-   rdi->mmap_offset += size;
+   rdi->mmap_offset += ALIGN(size, SHMLBA);
spin_unlock_irq(&rdi->mmap_offset_lock);
 
INIT_LIST_HEAD(&ip->pending_mmaps);
diff --git a/drivers/infiniband/sw/rxe/rxe_mmap.c 
b/drivers/infiniband/sw/rxe/rxe_mmap.c
index c572a4c09359..bd812e00988e 100644
--- a/drivers/infiniband/sw/rxe/rxe_mmap.c
+++ b/drivers/infiniband/sw/rxe/rxe_mmap.c
@@ -156,10 +156,10 @@ struct rxe_mmap_info *rxe_create_mmap_info(struct rxe_dev 
*rxe,
spin_lock_bh(&rxe->mmap_offset_lock);
 
if (rxe->mmap_offset == 0)
-   rxe->mmap_offset = PAGE_SIZE;
+   rxe->mmap_offset = ALIGN(PAGE_SIZE, SHMLBA);
 
ip->info.offset = rxe->mmap_offset;
-   rxe->mmap_offset += size;
+   rxe->mmap_offset += ALIGN(size, SHMLBA);
 
spin_unlock_bh(&rxe->mmap_offset_lock);
 
-- 
2.11.0


[PATCH AUTOSEL for 4.9 043/100] i40iw: Receive netdev events post INET_NOTIFIER state

2017-12-12 Thread alexander . levin
From: Shiraz Saleem 

[ Upstream commit 871a8623d3b40221ad1103aff715dfee0aa4dacf ]

Netdev notification events are de-registered only when all
client iwdev instances are removed. If a single client is closed
and re-opened, netdev events could arrive even before the Control
Queue-Pair (CQP) is created, causing a NULL pointer dereference crash
in i40iw_get_cqp_request. Fix this by allowing netdev event
notification only after we have reached the INET_NOTIFIER state with
respect to device initialization.

Reported-by: Stefan Assmann 
Signed-off-by: Shiraz Saleem 
Reviewed-by: Yuval Shaia 
Signed-off-by: Doug Ledford 
Signed-off-by: Sasha Levin 
---
 drivers/infiniband/hw/i40iw/i40iw_utils.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/drivers/infiniband/hw/i40iw/i40iw_utils.c 
b/drivers/infiniband/hw/i40iw/i40iw_utils.c
index 6fd043b1d714..7db2001775cb 100644
--- a/drivers/infiniband/hw/i40iw/i40iw_utils.c
+++ b/drivers/infiniband/hw/i40iw/i40iw_utils.c
@@ -159,6 +159,9 @@ int i40iw_inetaddr_event(struct notifier_block *notifier,
return NOTIFY_DONE;
 
iwdev = &hdl->device;
+   if (iwdev->init_state < INET_NOTIFIER)
+   return NOTIFY_DONE;
+
netdev = iwdev->ldev->netdev;
upper_dev = netdev_master_upper_dev_get(netdev);
if (netdev != event_netdev)
@@ -231,6 +234,9 @@ int i40iw_inet6addr_event(struct notifier_block *notifier,
return NOTIFY_DONE;
 
iwdev = &hdl->device;
+   if (iwdev->init_state < INET_NOTIFIER)
+   return NOTIFY_DONE;
+
netdev = iwdev->ldev->netdev;
if (netdev != event_netdev)
return NOTIFY_DONE;
@@ -280,6 +286,8 @@ int i40iw_net_event(struct notifier_block *notifier, 
unsigned long event, void *
if (!iwhdl)
return NOTIFY_DONE;
iwdev = &iwhdl->device;
+   if (iwdev->init_state < INET_NOTIFIER)
+   return NOTIFY_DONE;
p = (__be32 *)neigh->primary_key;
i40iw_copy_ip_ntohl(local_ipaddr, p);
if (neigh->nud_state & NUD_VALID) {
-- 
2.11.0


[PATCH AUTOSEL for 4.9 031/100] kvm: vmx: Flush TLB when the APIC-access address changes

2017-12-12 Thread alexander . levin
From: Jim Mattson 

[ Upstream commit fb6c8198431311027c3434d4e94ab8bc040f7aea ]

Quoting from the Intel SDM, volume 3, section 28.3.3.4: Guidelines for
Use of the INVEPT Instruction:

If EPT was in use on a logical processor at one time with EPTP X, it
is recommended that software use the INVEPT instruction with the
"single-context" INVEPT type and with EPTP X in the INVEPT descriptor
before a VM entry on the same logical processor that enables EPT with
EPTP X and either (a) the "virtualize APIC accesses" VM-execution
control was changed from 0 to 1; or (b) the value of the APIC-access
address was changed.

In the nested case, the burden falls on L1, unless L0 enables EPT in
vmcs02 when L1 doesn't enable EPT in vmcs12.

Signed-off-by: Jim Mattson 
Signed-off-by: Radim Krčmář 
Signed-off-by: Sasha Levin 
---
 arch/x86/kvm/vmx.c | 18 +-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index f0d3de153e29..3ec670af9cae 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -3816,6 +3816,12 @@ static void vmx_flush_tlb(struct kvm_vcpu *vcpu)
__vmx_flush_tlb(vcpu, to_vmx(vcpu)->vpid);
 }
 
+static void vmx_flush_tlb_ept_only(struct kvm_vcpu *vcpu)
+{
+   if (enable_ept)
+   vmx_flush_tlb(vcpu);
+}
+
 static void vmx_decache_cr0_guest_bits(struct kvm_vcpu *vcpu)
 {
ulong cr0_guest_owned_bits = vcpu->arch.cr0_guest_owned_bits;
@@ -8513,6 +8519,7 @@ static void vmx_set_virtual_x2apic_mode(struct kvm_vcpu 
*vcpu, bool set)
} else {
sec_exec_control &= ~SECONDARY_EXEC_VIRTUALIZE_X2APIC_MODE;
sec_exec_control |= SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES;
+   vmx_flush_tlb_ept_only(vcpu);
}
vmcs_write32(SECONDARY_VM_EXEC_CONTROL, sec_exec_control);
 
@@ -8538,8 +8545,10 @@ static void vmx_set_apic_access_page_addr(struct 
kvm_vcpu *vcpu, hpa_t hpa)
 */
if (!is_guest_mode(vcpu) ||
!nested_cpu_has2(get_vmcs12(&vmx->vcpu),
-SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES))
+SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) {
vmcs_write64(APIC_ACCESS_ADDR, hpa);
+   vmx_flush_tlb_ept_only(vcpu);
+   }
 }
 
 static void vmx_hwapic_isr_update(struct kvm_vcpu *vcpu, int max_isr)
@@ -10114,6 +10123,9 @@ static void prepare_vmcs02(struct kvm_vcpu *vcpu, 
struct vmcs12 *vmcs12)
if (nested_cpu_has_ept(vmcs12)) {
kvm_mmu_unload(vcpu);
nested_ept_init_mmu_context(vcpu);
+   } else if (nested_cpu_has2(vmcs12,
+  SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) {
+   vmx_flush_tlb_ept_only(vcpu);
}
 
if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_EFER)
@@ -10854,6 +10866,10 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, 
u32 exit_reason,
vmx->nested.change_vmcs01_virtual_x2apic_mode = false;
vmx_set_virtual_x2apic_mode(vcpu,
vcpu->arch.apic_base & X2APIC_ENABLE);
+   } else if (!nested_cpu_has_ept(vmcs12) &&
+  nested_cpu_has2(vmcs12,
+  SECONDARY_EXEC_VIRTUALIZE_APIC_ACCESSES)) {
+   vmx_flush_tlb_ept_only(vcpu);
}
 
/* This is needed for same reason as it was needed in prepare_vmcs02 */
-- 
2.11.0


[PATCH AUTOSEL for 4.9 047/100] net: Do not allow negative values for busy_read and busy_poll sysctl interfaces

2017-12-12 Thread alexander . levin
From: Alexander Duyck 

[ Upstream commit 95f255211396958c718aef8c45e3923b5211ea7b ]

This change basically codifies what I think was already the limitations on
the busy_poll and busy_read sysctl interfaces.  We weren't checking the
lower bounds and as such could input negative values. The behavior when
that was used was dependent on the architecture. In order to prevent any
issues with that I am just disabling support for values less than 0 since
this way we don't have to worry about any odd behaviors.

By limiting the sysctl values this way it also makes it consistent with how
we handle the SO_BUSY_POLL socket option since the value appears to be
reported as a signed integer value and negative values are rejected.

Signed-off-by: Alexander Duyck 
Acked-by: Eric Dumazet 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 net/core/sysctl_net_core.c | 6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/net/core/sysctl_net_core.c b/net/core/sysctl_net_core.c
index 0df2aa652530..a7f05f0130e8 100644
--- a/net/core/sysctl_net_core.c
+++ b/net/core/sysctl_net_core.c
@@ -369,14 +369,16 @@ static struct ctl_table net_core_table[] = {
.data   = &sysctl_net_busy_poll,
.maxlen = sizeof(unsigned int),
.mode   = 0644,
-   .proc_handler   = proc_dointvec
+   .proc_handler   = proc_dointvec_minmax,
+   .extra1 = &zero,
},
{
.procname   = "busy_read",
.data   = &sysctl_net_busy_read,
.maxlen = sizeof(unsigned int),
.mode   = 0644,
-   .proc_handler   = proc_dointvec
+   .proc_handler   = proc_dointvec_minmax,
+   .extra1 = &zero,
},
 #endif
 #ifdef CONFIG_NET_SCHED
-- 
2.11.0


[PATCH AUTOSEL for 4.9 054/100] netfilter: nf_nat_snmp: Fix panic when snmp_trap_helper fails to register

2017-12-12 Thread alexander . levin
From: Gao Feng 

[ Upstream commit 75c689dca98851d65ef5a27e5ce26b625b68751c ]

In the commit 93557f53e1fb ("netfilter: nf_conntrack: nf_conntrack snmp
helper"), the snmp_helper is replaced by nf_nat_snmp_hook. So the
snmp_helper is never registered. But it still tries to unregister the
snmp_helper, it could cause the panic.

Now remove the useless snmp_helper and the unregister call in the
error handler.

Fixes: 93557f53e1fb ("netfilter: nf_conntrack: nf_conntrack snmp helper")
Signed-off-by: Gao Feng 
Signed-off-by: Pablo Neira Ayuso 
Signed-off-by: Sasha Levin 
---
 net/ipv4/netfilter/nf_nat_snmp_basic.c | 19 +--
 1 file changed, 1 insertion(+), 18 deletions(-)

diff --git a/net/ipv4/netfilter/nf_nat_snmp_basic.c 
b/net/ipv4/netfilter/nf_nat_snmp_basic.c
index 5a8f7c360887..53e49f5011d3 100644
--- a/net/ipv4/netfilter/nf_nat_snmp_basic.c
+++ b/net/ipv4/netfilter/nf_nat_snmp_basic.c
@@ -1260,16 +1260,6 @@ static const struct nf_conntrack_expect_policy 
snmp_exp_policy = {
.timeout= 180,
 };
 
-static struct nf_conntrack_helper snmp_helper __read_mostly = {
-   .me = THIS_MODULE,
-   .help   = help,
-   .expect_policy  = &snmp_exp_policy,
-   .name   = "snmp",
-   .tuple.src.l3num= AF_INET,
-   .tuple.src.u.udp.port   = cpu_to_be16(SNMP_PORT),
-   .tuple.dst.protonum = IPPROTO_UDP,
-};
-
 static struct nf_conntrack_helper snmp_trap_helper __read_mostly = {
.me = THIS_MODULE,
.help   = help,
@@ -1288,17 +1278,10 @@ static struct nf_conntrack_helper snmp_trap_helper 
__read_mostly = {
 
 static int __init nf_nat_snmp_basic_init(void)
 {
-   int ret = 0;
-
BUG_ON(nf_nat_snmp_hook != NULL);
RCU_INIT_POINTER(nf_nat_snmp_hook, help);
 
-   ret = nf_conntrack_helper_register(&snmp_trap_helper);
-   if (ret < 0) {
-   nf_conntrack_helper_unregister(&snmp_helper);
-   return ret;
-   }
-   return ret;
+   return nf_conntrack_helper_register(&snmp_trap_helper);
 }
 
 static void __exit nf_nat_snmp_basic_fini(void)
-- 
2.11.0


[PATCH AUTOSEL for 4.9 053/100] netfilter: nfnl_cthelper: fix a race when walk the nf_ct_helper_hash table

2017-12-12 Thread alexander . levin
From: Liping Zhang 

[ Upstream commit 83d90219a5df8d950855ce73229a97b63605c317 ]

The nf_ct_helper_hash table is protected by nf_ct_helper_mutex, while
nfct_helper operation is protected by nfnl_lock(NFNL_SUBSYS_CTHELPER).
So it's possible that one CPU is walking the nf_ct_helper_hash for
cthelper add/get/del, another cpu is doing nf_conntrack_helpers_unregister
at the same time. This is dangrous, and may cause use after free error.

Note, delete operation will flush all cthelpers added via nfnetlink, so
using rcu to do protect is not easy.

Now introduce a dummy list to record all the cthelpers added via
nfnetlink, then we can walk the dummy list instead of walking the
nf_ct_helper_hash. Also, keep nfnl_cthelper_dump_table unchanged, it
may be invoked without nfnl_lock(NFNL_SUBSYS_CTHELPER) held.

Signed-off-by: Liping Zhang 
Signed-off-by: Pablo Neira Ayuso 
Signed-off-by: Sasha Levin 
---
 net/netfilter/nfnetlink_cthelper.c | 177 +
 1 file changed, 81 insertions(+), 96 deletions(-)

diff --git a/net/netfilter/nfnetlink_cthelper.c 
b/net/netfilter/nfnetlink_cthelper.c
index ad65eb548157..28d065394c09 100644
--- a/net/netfilter/nfnetlink_cthelper.c
+++ b/net/netfilter/nfnetlink_cthelper.c
@@ -32,6 +32,13 @@ MODULE_LICENSE("GPL");
 MODULE_AUTHOR("Pablo Neira Ayuso ");
 MODULE_DESCRIPTION("nfnl_cthelper: User-space connection tracking helpers");
 
+struct nfnl_cthelper {
+   struct list_headlist;
+   struct nf_conntrack_helper  helper;
+};
+
+static LIST_HEAD(nfnl_cthelper_list);
+
 static int
 nfnl_userspace_cthelper(struct sk_buff *skb, unsigned int protoff,
struct nf_conn *ct, enum ip_conntrack_info ctinfo)
@@ -205,14 +212,16 @@ nfnl_cthelper_create(const struct nlattr * const tb[],
 struct nf_conntrack_tuple *tuple)
 {
struct nf_conntrack_helper *helper;
+   struct nfnl_cthelper *nfcth;
int ret;
 
if (!tb[NFCTH_TUPLE] || !tb[NFCTH_POLICY] || !tb[NFCTH_PRIV_DATA_LEN])
return -EINVAL;
 
-   helper = kzalloc(sizeof(struct nf_conntrack_helper), GFP_KERNEL);
-   if (helper == NULL)
+   nfcth = kzalloc(sizeof(*nfcth), GFP_KERNEL);
+   if (nfcth == NULL)
return -ENOMEM;
+   helper = &nfcth->helper;
 
ret = nfnl_cthelper_parse_expect_policy(helper, tb[NFCTH_POLICY]);
if (ret < 0)
@@ -249,11 +258,12 @@ nfnl_cthelper_create(const struct nlattr * const tb[],
if (ret < 0)
goto err2;
 
+   list_add_tail(&nfcth->list, &nfnl_cthelper_list);
return 0;
 err2:
kfree(helper->expect_policy);
 err1:
-   kfree(helper);
+   kfree(nfcth);
return ret;
 }
 
@@ -379,7 +389,8 @@ static int nfnl_cthelper_new(struct net *net, struct sock 
*nfnl,
const char *helper_name;
struct nf_conntrack_helper *cur, *helper = NULL;
struct nf_conntrack_tuple tuple;
-   int ret = 0, i;
+   struct nfnl_cthelper *nlcth;
+   int ret = 0;
 
if (!tb[NFCTH_NAME] || !tb[NFCTH_TUPLE])
return -EINVAL;
@@ -390,31 +401,22 @@ static int nfnl_cthelper_new(struct net *net, struct sock 
*nfnl,
if (ret < 0)
return ret;
 
-   rcu_read_lock();
-   for (i = 0; i < nf_ct_helper_hsize && !helper; i++) {
-   hlist_for_each_entry_rcu(cur, &nf_ct_helper_hash[i], hnode) {
+   list_for_each_entry(nlcth, &nfnl_cthelper_list, list) {
+   cur = &nlcth->helper;
 
-   /* skip non-userspace conntrack helpers. */
-   if (!(cur->flags & NF_CT_HELPER_F_USERSPACE))
-   continue;
+   if (strncmp(cur->name, helper_name, NF_CT_HELPER_NAME_LEN))
+   continue;
 
-   if (strncmp(cur->name, helper_name,
-   NF_CT_HELPER_NAME_LEN) != 0)
-   continue;
+   if ((tuple.src.l3num != cur->tuple.src.l3num ||
+tuple.dst.protonum != cur->tuple.dst.protonum))
+   continue;
 
-   if ((tuple.src.l3num != cur->tuple.src.l3num ||
-tuple.dst.protonum != cur->tuple.dst.protonum))
-   continue;
+   if (nlh->nlmsg_flags & NLM_F_EXCL)
+   return -EEXIST;
 
-   if (nlh->nlmsg_flags & NLM_F_EXCL) {
-   ret = -EEXIST;
-   goto err;
-   }
-   helper = cur;
-   break;
-   }
+   helper = cur;
+   break;
}
-   rcu_read_unlock();
 
if (helper == NULL)
ret = nfnl_cthelper_create(tb, &tuple);
@@ -422,9 +424,6 @@ static int nfnl_cthelper_new(struct net *net, struct sock 
*nfnl,
ret = nf

[PATCH AUTOSEL for 4.9 044/100] IB/core: Protect against self-requeue of a cq work item

2017-12-12 Thread alexander . levin
From: Sagi Grimberg 

[ Upstream commit 86f46aba8d1ac3ed0904542158a9b9cb9c7a143c ]

We need to make sure that the cq work item does not
run when we are destroying the cq. Unlike flush_work,
cancel_work_sync protects against self-requeue of the
work item (which we can do in ib_cq_poll_work).

Signed-off-by: Sagi Grimberg 
Reviewed-by: Christoph Hellwig 
Reviewed-by: Bart Van Assche --
Reviewed-by: Leon Romanovsky 
Signed-off-by: Doug Ledford 
Signed-off-by: Sasha Levin 
---
 drivers/infiniband/core/cq.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/infiniband/core/cq.c b/drivers/infiniband/core/cq.c
index a754fc727de5..ff12b8d176ce 100644
--- a/drivers/infiniband/core/cq.c
+++ b/drivers/infiniband/core/cq.c
@@ -196,7 +196,7 @@ void ib_free_cq(struct ib_cq *cq)
irq_poll_disable(&cq->iop);
break;
case IB_POLL_WORKQUEUE:
-   flush_work(&cq->work);
+   cancel_work_sync(&cq->work);
break;
default:
WARN_ON_ONCE(1);
-- 
2.11.0


[PATCH AUTOSEL for 4.9 049/100] IB/rxe: increment msn only when completing a request

2017-12-12 Thread alexander . levin
From: David Marchand 

[ Upstream commit 9fcd67d1772c43d2f23e8fca56acc7219e991676 ]

According to C9-147, MSN should only be incremented when the last packet of
a multi packet request has been received.

"Logically, the requester associates a sequential Send Sequence Number
(SSN) with each WQE posted to the send queue. The SSN bears a one-
to-one relationship to the MSN returned by the responder in each re-
sponse packet. Therefore, when the requester receives a response, it in-
terprets the MSN as representing the SSN of the most recent request
completed by the responder to determine which send WQE(s) can be
completed."

Fixes: 8700e3e7c485 ("Soft RoCE driver")

Signed-off-by: David Marchand 
Signed-off-by: Doug Ledford 
Signed-off-by: Sasha Levin 
---
 drivers/infiniband/sw/rxe/rxe_resp.c | 9 -
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/drivers/infiniband/sw/rxe/rxe_resp.c 
b/drivers/infiniband/sw/rxe/rxe_resp.c
index 7705820cdac6..8c0ddd7165ae 100644
--- a/drivers/infiniband/sw/rxe/rxe_resp.c
+++ b/drivers/infiniband/sw/rxe/rxe_resp.c
@@ -799,18 +799,17 @@ static enum resp_states execute(struct rxe_qp *qp, struct 
rxe_pkt_info *pkt)
/* Unreachable */
WARN_ON(1);
 
-   /* We successfully processed this new request. */
-   qp->resp.msn++;
-
/* next expected psn, read handles this separately */
qp->resp.psn = (pkt->psn + 1) & BTH_PSN_MASK;
 
qp->resp.opcode = pkt->opcode;
qp->resp.status = IB_WC_SUCCESS;
 
-   if (pkt->mask & RXE_COMP_MASK)
+   if (pkt->mask & RXE_COMP_MASK) {
+   /* We successfully processed this new request. */
+   qp->resp.msn++;
return RESPST_COMPLETE;
-   else if (qp_type(qp) == IB_QPT_RC)
+   } else if (qp_type(qp) == IB_QPT_RC)
return RESPST_ACKNOWLEDGE;
else
return RESPST_CLEANUP;
-- 
2.11.0


[PATCH AUTOSEL for 4.9 046/100] nbd: set queue timeout properly

2017-12-12 Thread alexander . levin
From: Josef Bacik 

[ Upstream commit f8586855031a1d6b243f013c3082631346fddfad ]

We can't just set the timeout on the tagset, we have to set it on the
queue as it would have been setup already at this point.

Signed-off-by: Josef Bacik 
Signed-off-by: Jens Axboe 
Signed-off-by: Sasha Levin 
---
 drivers/block/nbd.c | 5 -
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index 98b767d3171e..7d506cb73e54 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -654,7 +654,10 @@ static int __nbd_ioctl(struct block_device *bdev, struct 
nbd_device *nbd,
return nbd_size_set(nbd, bdev, nbd->blksize, arg);
 
case NBD_SET_TIMEOUT:
-   nbd->tag_set.timeout = arg * HZ;
+   if (arg) {
+   nbd->tag_set.timeout = arg * HZ;
+   blk_queue_rq_timeout(nbd->disk->queue, arg * HZ);
+   }
return 0;
 
case NBD_SET_FLAGS:
-- 
2.11.0


  1   2   3   4   5   6   7   8   9   10   >