Re: [PATCH v2 2/2] mwifiex: Make use of the new sdio_trigger_replug() API to reset

2019-07-24 Thread Kalle Valo
Doug Anderson  writes:

> Hi,
>
> On Wed, Jul 24, 2019 at 4:35 AM Kalle Valo  wrote:
>>
>> Douglas Anderson  wrote:
>>
>> > As described in the patch ("mmc: core: Add sdio_trigger_replug()
>> > API"), the current mwifiex_sdio_card_reset() is broken in the cases
>> > where we're running Bluetooth on a second SDIO func on the same card
>> > as WiFi.  The problem goes away if we just use the
>> > sdio_trigger_replug() API call.
>> >
>> > NOTE: Even though with this new solution there is less of a reason to
>> > do our work from a workqueue (the unplug / plug mechanism we're using
>> > is possible for a human to perform at any time so the stack is
>> > supposed to handle it without it needing to be called from a special
>> > context), we still need a workqueue because the Marvell reset function
>> > could called from a context where sleeping is invalid and thus we
>> > can't claim the host.  One example is Marvell's wakeup_timer_fn().
>> >
>> > Cc: Andreas Fenkart 
>> > Cc: Brian Norris 
>> > Fixes: b4336a282db8 ("mwifiex: sdio: reset adapter using mmc_hw_reset")
>> > Signed-off-by: Douglas Anderson 
>> > Reviewed-by: Brian Norris 
>>
>> I assume this is going via some other tree so I'm dropping this from my
>> queue. If I should apply this please resend once the dependency is in
>> wireless-drivers-next.
>>
>> Patch set to Not Applicable.
>
> Thanks.  For now I'll assume that Ulf will pick it up if/when he is
> happy with patch #1 in this series.  Would you be willing to provide
> your Ack on this patch to make it clear to Ulf you're OK with that?

Sure, I was planning to do that already in my previous email but forgot.

Acked-by: Kalle Valo 

-- 
Kalle Valo


Re: [PATCH v4 1/3] driver core: platform: Add an error message to platform_get_irq*()

2019-07-24 Thread Markus Elfring
…
> +++ b/drivers/base/platform.c
> @@ -99,12 +99,7 @@ void __iomem *devm_platform_ioremap_resource(struct 
> platform_device *pdev,
…
> -int platform_get_irq(struct platform_device *dev, unsigned int num)
> +static int __platform_get_irq(struct platform_device *dev, unsigned int num)
>  {
…
I suggest to avoid the usage of double underscores in such identifiers.
Will an other function name be more appropriate here?

Regards,
Markus


[PATCH 4.19 110/271] ath10k: add missing error handling

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 4b553f3ca4cbde67399aa3a756c37eb92145b8a1 ]

In function ath10k_sdio_mbox_rx_alloc() [sdio.c],
ath10k_sdio_mbox_alloc_rx_pkt() is called without handling the error cases.
This will make the driver think the allocation for skb is successful and
try to access the skb. If we enable failslab, system will easily crash with
NULL pointer dereferencing.

Call trace of CONFIG_FAILSLAB:
ath10k_sdio_irq_handler+0x570/0xa88 [ath10k_sdio]
process_sdio_pending_irqs+0x4c/0x174
sdio_run_irqs+0x3c/0x64
sdio_irq_work+0x1c/0x28

Fixes: d96db25d2025 ("ath10k: add initial SDIO support")
Signed-off-by: Claire Chang 
Reviewed-by: Brian Norris 
Signed-off-by: Kalle Valo 
Signed-off-by: Sasha Levin 
---
 drivers/net/wireless/ath/ath10k/sdio.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/drivers/net/wireless/ath/ath10k/sdio.c 
b/drivers/net/wireless/ath/ath10k/sdio.c
index 7f61591ce0de..cb527a21f1ac 100644
--- a/drivers/net/wireless/ath/ath10k/sdio.c
+++ b/drivers/net/wireless/ath/ath10k/sdio.c
@@ -613,6 +613,10 @@ static int ath10k_sdio_mbox_rx_alloc(struct ath10k *ar,
full_len,
last_in_bundle,
last_in_bundle);
+   if (ret) {
+   ath10k_warn(ar, "alloc_rx_pkt error %d\n", ret);
+   goto err;
+   }
}
 
ar_sdio->n_rx_pkts = i;
-- 
2.20.1





[PATCH 4.19 105/271] rtlwifi: rtl8192cu: fix error handle when usb probe failed

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 6c0ed66f1a5b84e2a812c7c2d6571a5621bf3396 ]

rtl_usb_probe() must do error handle rtl_deinit_core() only if
rtl_init_core() is done, otherwise goto error_out2.

| usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
| rtl_usb: reg 0xf0, usbctrl_vendorreq TimeOut! status:0xffb9 value=0x0
| rtl8192cu: Chip version 0x10
| rtl_usb: reg 0xa, usbctrl_vendorreq TimeOut! status:0xffb9 value=0x0
| rtl_usb: Too few input end points found
| INFO: trying to register non-static key.
| the code is fine but needs lockdep annotation.
| turning off the locking correctness validator.
| CPU: 0 PID: 12 Comm: kworker/0:1 Not tainted 5.1.0-rc4-319354-g9a33b36 #3
| Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS
| Google 01/01/2011
| Workqueue: usb_hub_wq hub_event
| Call Trace:
|   __dump_stack lib/dump_stack.c:77 [inline]
|   dump_stack+0xe8/0x16e lib/dump_stack.c:113
|   assign_lock_key kernel/locking/lockdep.c:786 [inline]
|   register_lock_class+0x11b8/0x1250 kernel/locking/lockdep.c:1095
|   __lock_acquire+0xfb/0x37c0 kernel/locking/lockdep.c:3582
|   lock_acquire+0x10d/0x2f0 kernel/locking/lockdep.c:4211
|   __raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline]
|   _raw_spin_lock_irqsave+0x44/0x60 kernel/locking/spinlock.c:152
|   rtl_c2hcmd_launcher+0xd1/0x390
| drivers/net/wireless/realtek/rtlwifi/base.c:2344
|   rtl_deinit_core+0x25/0x2d0 drivers/net/wireless/realtek/rtlwifi/base.c:574
|   rtl_usb_probe.cold+0x861/0xa70
| drivers/net/wireless/realtek/rtlwifi/usb.c:1093
|   usb_probe_interface+0x31d/0x820 drivers/usb/core/driver.c:361
|   really_probe+0x2da/0xb10 drivers/base/dd.c:509
|   driver_probe_device+0x21d/0x350 drivers/base/dd.c:671
|   __device_attach_driver+0x1d8/0x290 drivers/base/dd.c:778
|   bus_for_each_drv+0x163/0x1e0 drivers/base/bus.c:454
|   __device_attach+0x223/0x3a0 drivers/base/dd.c:844
|   bus_probe_device+0x1f1/0x2a0 drivers/base/bus.c:514
|   device_add+0xad2/0x16e0 drivers/base/core.c:2106
|   usb_set_configuration+0xdf7/0x1740 drivers/usb/core/message.c:2021
|   generic_probe+0xa2/0xda drivers/usb/core/generic.c:210
|   usb_probe_device+0xc0/0x150 drivers/usb/core/driver.c:266
|   really_probe+0x2da/0xb10 drivers/base/dd.c:509
|   driver_probe_device+0x21d/0x350 drivers/base/dd.c:671
|   __device_attach_driver+0x1d8/0x290 drivers/base/dd.c:778
|   bus_for_each_drv+0x163/0x1e0 drivers/base/bus.c:454
|   __device_attach+0x223/0x3a0 drivers/base/dd.c:844
|   bus_probe_device+0x1f1/0x2a0 drivers/base/bus.c:514
|   device_add+0xad2/0x16e0 drivers/base/core.c:2106
|   usb_new_device.cold+0x537/0xccf drivers/usb/core/hub.c:2534
|   hub_port_connect drivers/usb/core/hub.c:5089 [inline]
|   hub_port_connect_change drivers/usb/core/hub.c:5204 [inline]
|   port_event drivers/usb/core/hub.c:5350 [inline]
|   hub_event+0x138e/0x3b00 drivers/usb/core/hub.c:5432
|   process_one_work+0x90f/0x1580 kernel/workqueue.c:2269
|   worker_thread+0x9b/0xe20 kernel/workqueue.c:2415
|   kthread+0x313/0x420 kernel/kthread.c:253
|   ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:352

Reported-by: syzbot+1fcc5ef45175fc774...@syzkaller.appspotmail.com
Signed-off-by: Ping-Ke Shih 
Acked-by: Larry Finger 
Signed-off-by: Kalle Valo 
Signed-off-by: Sasha Levin 
---
 drivers/net/wireless/realtek/rtlwifi/usb.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtlwifi/usb.c 
b/drivers/net/wireless/realtek/rtlwifi/usb.c
index 2ac5004d7a40..5adb939afee8 100644
--- a/drivers/net/wireless/realtek/rtlwifi/usb.c
+++ b/drivers/net/wireless/realtek/rtlwifi/usb.c
@@ -1081,13 +1081,13 @@ int rtl_usb_probe(struct usb_interface *intf,
rtlpriv->cfg->ops->read_eeprom_info(hw);
err = _rtl_usb_init(hw);
if (err)
-   goto error_out;
+   goto error_out2;
rtl_usb_init_sw(hw);
/* Init mac80211 sw */
err = rtl_init_core(hw);
if (err) {
pr_err("Can't allocate sw for mac80211\n");
-   goto error_out;
+   goto error_out2;
}
if (rtlpriv->cfg->ops->init_sw_vars(hw)) {
pr_err("Can't init_sw_vars\n");
@@ -1108,6 +1108,7 @@ int rtl_usb_probe(struct usb_interface *intf,
 
 error_out:
rtl_deinit_core(hw);
+error_out2:
_rtl_usb_io_handler_release(hw);
usb_put_dev(udev);
complete(>firmware_loading_complete);
-- 
2.20.1





Trabaja conmigo

2019-07-24 Thread lzz




Hola,

Tenemos algunas finanzas en su nombre de familia amablemente Póngase en 
contacto conmigo aquí [(info.attltz...@gmail.com)] para más información.


Saludos,
Lutz


[PATCH 4.19 083/271] x86/cacheinfo: Fix a -Wtype-limits warning

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 1b7aebf0487613033aff26420e32fa2076d52846 ]

cpuinfo_x86.x86_model is an unsigned type, so comparing against zero
will generate a compilation warning:

  arch/x86/kernel/cpu/cacheinfo.c: In function 'cacheinfo_amd_init_llc_id':
  arch/x86/kernel/cpu/cacheinfo.c:662:19: warning: comparison is always true \
due to limited range of data type [-Wtype-limits]

Remove the unnecessary lower bound check.

 [ bp: Massage. ]

Fixes: 68091ee7ac3c ("x86/CPU/AMD: Calculate last level cache ID from number of 
sharing threads")
Signed-off-by: Qian Cai 
Signed-off-by: Borislav Petkov 
Reviewed-by: Sean Christopherson 
Cc: "Gustavo A. R. Silva" 
Cc: "H. Peter Anvin" 
Cc: Ingo Molnar 
Cc: Masami Hiramatsu 
Cc: Pu Wen 
Cc: Suravee Suthikulpanit 
Cc: Thomas Gleixner 
Cc: x86-ml 
Link: https://lkml.kernel.org/r/1560954773-11967-1-git-send-email-...@lca.pw
Signed-off-by: Sasha Levin 
---
 arch/x86/kernel/cpu/cacheinfo.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/arch/x86/kernel/cpu/cacheinfo.c b/arch/x86/kernel/cpu/cacheinfo.c
index 0c5fcbd998cf..9d863e8f9b3f 100644
--- a/arch/x86/kernel/cpu/cacheinfo.c
+++ b/arch/x86/kernel/cpu/cacheinfo.c
@@ -651,8 +651,7 @@ void cacheinfo_amd_init_llc_id(struct cpuinfo_x86 *c, int 
cpu, u8 node_id)
if (c->x86 < 0x17) {
/* LLC is at the node level. */
per_cpu(cpu_llc_id, cpu) = node_id;
-   } else if (c->x86 == 0x17 &&
-  c->x86_model >= 0 && c->x86_model <= 0x1F) {
+   } else if (c->x86 == 0x17 && c->x86_model <= 0x1F) {
/*
 * LLC is at the core complex level.
 * Core complex ID is ApicId[3] for these processors.
-- 
2.20.1





[PATCH 4.19 119/271] ixgbe: Check DDM existence in transceiver before access

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 655c91414579d7bb115a4f7898ee726fc18e0984 ]

Some transceivers may comply with SFF-8472 but not implement the Digital
Diagnostic Monitoring (DDM) interface described in it. The existence of
such area is specified by bit 6 of byte 92, set to 1 if implemented.

Currently, due to not checking this bit ixgbe fails trying to read SFP
module's eeprom with the follow message:

ethtool -m enP51p1s0f0
Cannot get Module EEPROM data: Input/output error

Because it fails to read the additional 256 bytes in which it was assumed
to exist the DDM data.

This issue was noticed using a Mellanox Passive DAC PN 01FT738. The eeprom
data was confirmed by Mellanox as correct and present in other Passive
DACs in from other manufacturers.

Signed-off-by: "Mauro S. M. Rodrigues" 
Reviewed-by: Jesse Brandeburg 
Tested-by: Andrew Bowers 
Signed-off-by: Jeff Kirsher 
Signed-off-by: Sasha Levin 
---
 drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 3 ++-
 drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h | 1 +
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
index e5a8461fe6a9..8829bd95d0d3 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
@@ -3223,7 +3223,8 @@ static int ixgbe_get_module_info(struct net_device *dev,
page_swap = true;
}
 
-   if (sff8472_rev == IXGBE_SFF_SFF_8472_UNSUP || page_swap) {
+   if (sff8472_rev == IXGBE_SFF_SFF_8472_UNSUP || page_swap ||
+   !(addr_mode & IXGBE_SFF_DDM_IMPLEMENTED)) {
/* We have a SFP, but it does not support SFF-8472 */
modinfo->type = ETH_MODULE_SFF_8079;
modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN;
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
index 64e44e01c973..c56baad04ee6 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
@@ -45,6 +45,7 @@
 #define IXGBE_SFF_SOFT_RS_SELECT_10G   0x8
 #define IXGBE_SFF_SOFT_RS_SELECT_1G0x0
 #define IXGBE_SFF_ADDRESSING_MODE  0x4
+#define IXGBE_SFF_DDM_IMPLEMENTED  0x40
 #define IXGBE_SFF_QSFP_DA_ACTIVE_CABLE 0x1
 #define IXGBE_SFF_QSFP_DA_PASSIVE_CABLE0x8
 #define IXGBE_SFF_QSFP_CONNECTOR_NOT_SEPARABLE 0x23
-- 
2.20.1





[PATCH 4.19 081/271] vhost_net: disable zerocopy by default

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 098eadce3c622c07b328d0a43dda379b38cf7c5e ]

Vhost_net was known to suffer from HOL[1] issues which is not easy to
fix. Several downstream disable the feature by default. What's more,
the datapath was split and datacopy path got the support of batching
and XDP support recently which makes it faster than zerocopy part for
small packets transmission.

It looks to me that disable zerocopy by default is more
appropriate. It cold be enabled by default again in the future if we
fix the above issues.

[1] https://patchwork.kernel.org/patch/3787671/

Signed-off-by: Jason Wang 
Acked-by: Michael S. Tsirkin 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/vhost/net.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c
index 39155d7cc894..ae704658b528 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -36,7 +36,7 @@
 
 #include "vhost.h"
 
-static int experimental_zcopytx = 1;
+static int experimental_zcopytx = 0;
 module_param(experimental_zcopytx, int, 0444);
 MODULE_PARM_DESC(experimental_zcopytx, "Enable Zero Copy TX;"
   " 1 -Enable; 0 - Disable");
-- 
2.20.1





[PATCH 4.19 107/271] x86/build: Add set -e to mkcapflags.sh to delete broken capflags.c

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit bc53d3d777f81385c1bb08b07bd1c06450ecc2c1 ]

Without 'set -e', shell scripts continue running even after any
error occurs. The missed 'set -e' is a typical bug in shell scripting.

For example, when a disk space shortage occurs while this script is
running, it actually ends up with generating a truncated capflags.c.

Yet, mkcapflags.sh continues running and exits with 0. So, the build
system assumes it has succeeded.

It will not be re-generated in the next invocation of Make since its
timestamp is newer than that of any of the source files.

Add 'set -e' so that any error in this script is caught and propagated
to the build system.

Since 9c2af1c7377a ("kbuild: add .DELETE_ON_ERROR special target"),
make automatically deletes the target on any failure. So, the broken
capflags.c will be deleted automatically.

Signed-off-by: Masahiro Yamada 
Signed-off-by: Thomas Gleixner 
Cc: "H. Peter Anvin" 
Cc: Borislav Petkov 
Link: 
https://lkml.kernel.org/r/20190625072622.17679-1-yamada.masah...@socionext.com
Signed-off-by: Sasha Levin 
---
 arch/x86/kernel/cpu/mkcapflags.sh | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/arch/x86/kernel/cpu/mkcapflags.sh 
b/arch/x86/kernel/cpu/mkcapflags.sh
index d0dfb892c72f..aed45b8895d5 100644
--- a/arch/x86/kernel/cpu/mkcapflags.sh
+++ b/arch/x86/kernel/cpu/mkcapflags.sh
@@ -4,6 +4,8 @@
 # Generate the x86_cap/bug_flags[] arrays from include/asm/cpufeatures.h
 #
 
+set -e
+
 IN=$1
 OUT=$2
 
-- 
2.20.1





Re: WARNING in __mmdrop

2019-07-24 Thread Michael S. Tsirkin
On Tue, Jul 23, 2019 at 09:31:35PM +0800, Jason Wang wrote:
> 
> On 2019/7/23 下午5:26, Michael S. Tsirkin wrote:
> > On Tue, Jul 23, 2019 at 04:49:01PM +0800, Jason Wang wrote:
> > > On 2019/7/23 下午4:10, Michael S. Tsirkin wrote:
> > > > On Tue, Jul 23, 2019 at 03:53:06PM +0800, Jason Wang wrote:
> > > > > On 2019/7/23 下午3:23, Michael S. Tsirkin wrote:
> > > > > > > > Really let's just use kfree_rcu. It's way cleaner: fire and 
> > > > > > > > forget.
> > > > > > > Looks not, you need rate limit the fire as you've figured out?
> > > > > > See the discussion that followed. Basically no, it's good enough
> > > > > > already and is only going to be better.
> > > > > > 
> > > > > > > And in fact,
> > > > > > > the synchronization is not even needed, does it help if I leave a 
> > > > > > > comment to
> > > > > > > explain?
> > > > > > Let's try to figure it out in the mail first. I'm pretty sure the
> > > > > > current logic is wrong.
> > > > > Here is what the code what to achieve:
> > > > > 
> > > > > - The map was protected by RCU
> > > > > 
> > > > > - Writers are: MMU notifier invalidation callbacks, file operations 
> > > > > (ioctls
> > > > > etc), meta_prefetch (datapath)
> > > > > 
> > > > > - Readers are: memory accessor
> > > > > 
> > > > > Writer are synchronized through mmu_lock. RCU is used to synchronized
> > > > > between writers and readers.
> > > > > 
> > > > > The synchronize_rcu() in vhost_reset_vq_maps() was used to 
> > > > > synchronized it
> > > > > with readers (memory accessors) in the path of file operations. But 
> > > > > in this
> > > > > case, vq->mutex was already held, this means it has been serialized 
> > > > > with
> > > > > memory accessor. That's why I think it could be removed safely.
> > > > > 
> > > > > Anything I miss here?
> > > > > 
> > > > So invalidate callbacks need to reset the map, and they do
> > > > not have vq mutex. How can they do this and free
> > > > the map safely? They need synchronize_rcu or kfree_rcu right?
> > > Invalidation callbacks need but file operations (e.g ioctl) not.
> > > 
> > > 
> > > > And I worry somewhat that synchronize_rcu in an MMU notifier
> > > > is a problem, MMU notifiers are supposed to be quick:
> > > Looks not, since it can allow to be blocked and lots of driver depends on
> > > this. (E.g mmu_notifier_range_blockable()).
> > Right, they can block. So why don't we take a VQ mutex and be
> > done with it then? No RCU tricks.
> 
> 
> This is how I want to go with RFC and V1. But I end up with deadlock between
> vq locks and some MM internal locks. So I decide to use RCU which is 100%
> under the control of vhost.
> 
> Thanks

And I guess the deadlock is because GUP is taking mmu locks which are
taken on mmu notifier path, right?  How about we add a seqlock and take
that in invalidate callbacks?  We can then drop the VQ lock before GUP,
and take it again immediately after.

something like
if (!vq_meta_mapped(vq)) {
vq_meta_setup();
mutex_unlock(vq->mutex)
vq_meta_map();
mutex_lock(vq->mutex)

/* recheck both sock->private_data and seqlock count. */
if changed - bail out
}

And also requires that VQ uaddrs is defined like this:
- writers must have both vq mutex and dev mutex
- readers must have either vq mutex or dev mutex


That's a big change though. For now, how about switching to a per-vq SRCU?
That is only a little bit more expensive than RCU, and we
can use synchronize_srcu_expedited.

-- 
MST


[PATCH 4.19 113/271] ASoC: Intel: hdac_hdmi: Set ops to NULL on remove

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 0f6ff78540bd1b4df1e0f17806b0ce2e1dff0d78 ]

When we unload Skylake driver we may end up calling
hdac_component_master_unbind(), it uses acomp->audio_ops, which we set
in hdmi_codec_probe(), so we need to set it to NULL in hdmi_codec_remove(),
otherwise we will dereference no longer existing pointer.

Signed-off-by: Amadeusz Sławiński 
Reviewed-by: Pierre-Louis Bossart 
Signed-off-by: Mark Brown 
Signed-off-by: Sasha Levin 
---
 sound/soc/codecs/hdac_hdmi.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/sound/soc/codecs/hdac_hdmi.c b/sound/soc/codecs/hdac_hdmi.c
index 63487240b61e..098196610542 100644
--- a/sound/soc/codecs/hdac_hdmi.c
+++ b/sound/soc/codecs/hdac_hdmi.c
@@ -1854,6 +1854,12 @@ static void hdmi_codec_remove(struct snd_soc_component 
*component)
 {
struct hdac_hdmi_priv *hdmi = snd_soc_component_get_drvdata(component);
struct hdac_device *hdev = hdmi->hdev;
+   int ret;
+
+   ret = snd_hdac_acomp_register_notifier(hdev->bus, NULL);
+   if (ret < 0)
+   dev_err(>dev, "notifier unregister failed: err: %d\n",
+   ret);
 
pm_runtime_disable(>dev);
 }
-- 
2.20.1





[PATCH 4.19 115/271] clocksource/drivers/exynos_mct: Increase priority over ARM arch timer

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 6282edb72bed5324352522d732080d4c1b9dfed6 ]

Exynos SoCs based on CA7/CA15 have 2 timer interfaces: custom Exynos MCT
(Multi Core Timer) and standard ARM Architected Timers.

There are use cases, where both timer interfaces are used simultanously.
One of such examples is using Exynos MCT for the main system timer and
ARM Architected Timers for the KVM and virtualized guests (KVM requires
arch timers).

Exynos Multi-Core Timer driver (exynos_mct) must be however started
before ARM Architected Timers (arch_timer), because they both share some
common hardware blocks (global system counter) and turning on MCT is
needed to get ARM Architected Timer working properly.

To ensure selecting Exynos MCT as the main system timer, increase MCT
timer rating. To ensure proper starting order of both timers during
suspend/resume cycle, increase MCT hotplug priority over ARM Archictected
Timers.

Signed-off-by: Marek Szyprowski 
Reviewed-by: Krzysztof Kozlowski 
Reviewed-by: Chanwoo Choi 
Signed-off-by: Daniel Lezcano 
Signed-off-by: Sasha Levin 
---
 drivers/clocksource/exynos_mct.c | 4 ++--
 include/linux/cpuhotplug.h   | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/clocksource/exynos_mct.c b/drivers/clocksource/exynos_mct.c
index d55c30f6981d..aaf5bfa9bd9c 100644
--- a/drivers/clocksource/exynos_mct.c
+++ b/drivers/clocksource/exynos_mct.c
@@ -211,7 +211,7 @@ static void exynos4_frc_resume(struct clocksource *cs)
 
 static struct clocksource mct_frc = {
.name   = "mct-frc",
-   .rating = 400,
+   .rating = 450,  /* use value higher than ARM arch timer */
.read   = exynos4_frc_read,
.mask   = CLOCKSOURCE_MASK(32),
.flags  = CLOCK_SOURCE_IS_CONTINUOUS,
@@ -466,7 +466,7 @@ static int exynos4_mct_starting_cpu(unsigned int cpu)
evt->set_state_oneshot_stopped = set_state_shutdown;
evt->tick_resume = set_state_shutdown;
evt->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
-   evt->rating = 450;
+   evt->rating = 500;  /* use value higher than ARM arch timer */
 
exynos4_mct_write(TICK_BASE_CNT, mevt->base + MCT_L_TCNTB_OFFSET);
 
diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h
index dec0372efe2e..d67c0035165c 100644
--- a/include/linux/cpuhotplug.h
+++ b/include/linux/cpuhotplug.h
@@ -116,10 +116,10 @@ enum cpuhp_state {
CPUHP_AP_PERF_ARM_ACPI_STARTING,
CPUHP_AP_PERF_ARM_STARTING,
CPUHP_AP_ARM_L2X0_STARTING,
+   CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING,
CPUHP_AP_ARM_ARCH_TIMER_STARTING,
CPUHP_AP_ARM_GLOBAL_TIMER_STARTING,
CPUHP_AP_JCORE_TIMER_STARTING,
-   CPUHP_AP_EXYNOS4_MCT_TIMER_STARTING,
CPUHP_AP_ARM_TWD_STARTING,
CPUHP_AP_QCOM_TIMER_STARTING,
CPUHP_AP_ARMADA_TIMER_STARTING,
-- 
2.20.1





[PATCH 4.19 134/271] iwlwifi: mvm: Drop large non sta frames

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit ac70499ee97231a418dc1a4d6c9dc102e8f64631 ]

In some buggy scenarios we could possible attempt to transmit frames larger
than maximum MSDU size. Since our devices don't know how to handle this,
it may result in asserts, hangs etc.
This can happen, for example, when we receive a large multicast frame
and try to transmit it back to the air in AP mode.
Since in a legal scenario this should never happen, drop such frames and
warn about it.

Signed-off-by: Andrei Otcheretianski 
Signed-off-by: Luca Coelho 
Signed-off-by: Sasha Levin 
---
 drivers/net/wireless/intel/iwlwifi/mvm/tx.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c 
b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
index 2d21f0a1fa00..ffae299c3492 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
@@ -641,6 +641,9 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct 
sk_buff *skb)
 
memcpy(, skb->cb, sizeof(info));
 
+   if (WARN_ON_ONCE(skb->len > IEEE80211_MAX_DATA_LEN + hdrlen))
+   return -1;
+
if (WARN_ON_ONCE(info.flags & IEEE80211_TX_CTL_AMPDU))
return -1;
 
-- 
2.20.1





[PATCH 4.19 117/271] rslib: Fix decoding of shortened codes

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 2034a42d1747fc1e1eeef2c6f1789c4d0762cb9c ]

The decoding of shortenend codes is broken. It only works as expected if
there are no erasures.

When decoding with erasures, Lambda (the error and erasure locator
polynomial) is initialized from the given erasure positions. The pad
parameter is not accounted for by the initialisation code, and hence
Lambda is initialized from incorrect erasure positions.

The fix is to adjust the erasure positions by the supplied pad.

Signed-off-by: Ferdinand Blomqvist 
Signed-off-by: Thomas Gleixner 
Link: 
https://lkml.kernel.org/r/20190620141039.9874-3-ferdinand.blomqv...@gmail.com
Signed-off-by: Sasha Levin 
---
 lib/reed_solomon/decode_rs.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/reed_solomon/decode_rs.c b/lib/reed_solomon/decode_rs.c
index 1db74eb098d0..3313bf944ff1 100644
--- a/lib/reed_solomon/decode_rs.c
+++ b/lib/reed_solomon/decode_rs.c
@@ -99,9 +99,9 @@
if (no_eras > 0) {
/* Init lambda to be the erasure locator polynomial */
lambda[1] = alpha_to[rs_modnn(rs,
- prim * (nn - 1 - eras_pos[0]))];
+   prim * (nn - 1 - (eras_pos[0] + pad)))];
for (i = 1; i < no_eras; i++) {
-   u = rs_modnn(rs, prim * (nn - 1 - eras_pos[i]));
+   u = rs_modnn(rs, prim * (nn - 1 - (eras_pos[i] + pad)));
for (j = i + 1; j > 0; j--) {
tmp = index_of[lambda[j - 1]];
if (tmp != nn) {
-- 
2.20.1





Re: [PATCH v2 0/1] mm/memory-failure: Poison read receives SIGKILL instead of SIGBUS issue

2019-07-24 Thread Jane Chu

On 7/24/2019 3:52 PM, Dan Williams wrote:

On Wed, Jul 24, 2019 at 3:35 PM Jane Chu  wrote:


Changes in v2:
  - move 'tk' allocations internal to add_to_kill(), suggested by Dan;


Oh, sorry if it wasn't clear, this should move to its own patch that
only does the cleanup, and then the follow on fix patch becomes
smaller and more straightforward.



Make sense, thanks! I'll split up the patch next.

thanks,
-jane


[PATCH 4.19 133/271] igb: clear out skb->tstamp after reading the txtime

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 1e08511d5d01884a3c9070afd52a47799312074a ]

If a packet which is utilizing the launchtime feature (via SO_TXTIME socket
option) also requests the hardware transmit timestamp, the hardware
timestamp is not delivered to the userspace. This is because the value in
skb->tstamp is mistaken as the software timestamp.

Applications, like ptp4l, request a hardware timestamp by setting the
SOF_TIMESTAMPING_TX_HARDWARE socket option. Whenever a new timestamp is
detected by the driver (this work is done in igb_ptp_tx_work() which calls
igb_ptp_tx_hwtstamps() in igb_ptp.c[1]), it will queue the timestamp in the
ERR_QUEUE for the userspace to read. When the userspace is ready, it will
issue a recvmsg() call to collect this timestamp.  The problem is in this
recvmsg() call. If the skb->tstamp is not cleared out, it will be
interpreted as a software timestamp and the hardware tx timestamp will not
be successfully sent to the userspace. Look at skb_is_swtx_tstamp() and the
callee function __sock_recv_timestamp() in net/socket.c for more details.

Signed-off-by: Vedang Patel 
Tested-by: Aaron Brown 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/ethernet/intel/igb/igb_main.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/net/ethernet/intel/igb/igb_main.c 
b/drivers/net/ethernet/intel/igb/igb_main.c
index 5aa083d9a6c9..ab76a5f77cd0 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -5703,6 +5703,7 @@ static void igb_tx_ctxtdesc(struct igb_ring *tx_ring,
 */
if (tx_ring->launchtime_enable) {
ts = ns_to_timespec64(first->skb->tstamp);
+   first->skb->tstamp = 0;
context_desc->seqnum_seed = cpu_to_le32(ts.tv_nsec / 32);
} else {
context_desc->seqnum_seed = 0;
-- 
2.20.1





[PATCH 4.19 132/271] net: mvpp2: prs: Dont override the sign bit in SRAM parser shift

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 8ec3ede559956f8ad58db7b57d25ac724bab69e9 ]

The Header Parser allows identifying various fields in the packet
headers, used for various kind of filtering and classification
steps.

This is a re-entrant process, where the offset in the packet header
depends on the previous lookup results. This offset is represented in
the SRAM results of the TCAM, as a shift to be operated.

This shift can be negative in some cases, such as in IPv6 parsing.

This commit prevents overriding the sign bit when setting the shift
value, which could cause instabilities when parsing IPv6 flows.

Fixes: 3f518509dedc ("ethernet: Add new driver for Marvell Armada 375 network 
unit")
Suggested-by: Alan Winkowski 
Signed-off-by: Maxime Chevallier 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c 
b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c
index ae2240074d8e..5692c6087bbb 100644
--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c
+++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_prs.c
@@ -312,7 +312,8 @@ static void mvpp2_prs_sram_shift_set(struct mvpp2_prs_entry 
*pe, int shift,
}
 
/* Set value */
-   pe->sram[MVPP2_BIT_TO_WORD(MVPP2_PRS_SRAM_SHIFT_OFFS)] = shift & 
MVPP2_PRS_SRAM_SHIFT_MASK;
+   pe->sram[MVPP2_BIT_TO_WORD(MVPP2_PRS_SRAM_SHIFT_OFFS)] |=
+   shift & MVPP2_PRS_SRAM_SHIFT_MASK;
 
/* Reset and set operation */
mvpp2_prs_sram_bits_clear(pe, MVPP2_PRS_SRAM_OP_SEL_SHIFT_OFFS,
-- 
2.20.1





[PATCH 4.19 078/271] perf/x86/intel/uncore: Handle invalid event coding for free-running counter

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 543ac280b3576c0009e8c0fcd4d6bfc9978d7bd0 ]

Counting with invalid event coding for free-running counter may cause
OOPs, e.g. uncore_iio_free_running_0/event=1/.

Current code only validate the event with free-running event format,
event=0xff,umask=0xXY. Non-free-running event format never be checked
for the PMU with free-running counters.

Add generic hw_config() to check and reject the invalid event coding
for free-running PMU.

Signed-off-by: Kan Liang 
Signed-off-by: Peter Zijlstra (Intel) 
Cc: Linus Torvalds 
Cc: Peter Zijlstra 
Cc: Thomas Gleixner 
Cc: a...@kernel.org
Cc: eran...@google.com
Fixes: 0f519f0352e3 ("perf/x86/intel/uncore: Support IIO free-running counters 
on SKX")
Link: 
https://lkml.kernel.org/r/1556672028-119221-2-git-send-email-kan.li...@linux.intel.com
Signed-off-by: Ingo Molnar 
Signed-off-by: Sasha Levin 
---
 arch/x86/events/intel/uncore.h   | 10 ++
 arch/x86/events/intel/uncore_snbep.c |  1 +
 2 files changed, 11 insertions(+)

diff --git a/arch/x86/events/intel/uncore.h b/arch/x86/events/intel/uncore.h
index cc6dd4f78158..42fa3974c421 100644
--- a/arch/x86/events/intel/uncore.h
+++ b/arch/x86/events/intel/uncore.h
@@ -402,6 +402,16 @@ static inline bool is_freerunning_event(struct perf_event 
*event)
   (((cfg >> 8) & 0xff) >= UNCORE_FREERUNNING_UMASK_START);
 }
 
+/* Check and reject invalid config */
+static inline int uncore_freerunning_hw_config(struct intel_uncore_box *box,
+  struct perf_event *event)
+{
+   if (is_freerunning_event(event))
+   return 0;
+
+   return -EINVAL;
+}
+
 static inline void uncore_disable_box(struct intel_uncore_box *box)
 {
if (box->pmu->type->ops->disable_box)
diff --git a/arch/x86/events/intel/uncore_snbep.c 
b/arch/x86/events/intel/uncore_snbep.c
index b10e04387f38..8e4e8e423839 100644
--- a/arch/x86/events/intel/uncore_snbep.c
+++ b/arch/x86/events/intel/uncore_snbep.c
@@ -3585,6 +3585,7 @@ static struct uncore_event_desc 
skx_uncore_iio_freerunning_events[] = {
 
 static struct intel_uncore_ops skx_uncore_iio_freerunning_ops = {
.read_counter   = uncore_msr_read_counter,
+   .hw_config  = uncore_freerunning_hw_config,
 };
 
 static struct attribute *skx_uncore_iio_freerunning_formats_attr[] = {
-- 
2.20.1





Re: [PATCH 1/3] iio: imu: st_lsm6sdx: move some register definitions to sensor_settings struct

2019-07-24 Thread Martin Kepplinger
On 15.07.19 15:19, Martin Kepplinger wrote:
> Move some register definitions to the per-device array of struct
> st_lsm6dsx_sensor_settings in order to simplify adding new sensor
> devices to the driver.
> 
> Also, remove completely unused register definitions.
> 
> Signed-off-by: Martin Kepplinger 
> ---
>  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h  |  6 
>  drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 31 ++--
>  2 files changed, 28 insertions(+), 9 deletions(-)
> 

this series has been resent (and rebased) to be more readable:
https://lore.kernel.org/linux-iio/20190725053132.9589-1-martin.kepplin...@puri.sm/

thanks,
 martin


[PATCH 4.19 123/271] EDAC: Fix global-out-of-bounds write when setting edac_mc_poll_msec

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit d8655e7630dafa88bc37f101640e39c736399771 ]

Commit 9da21b1509d8 ("EDAC: Poll timeout cannot be zero, p2") assumes
edac_mc_poll_msec to be unsigned long, but the type of the variable still
remained as int. Setting edac_mc_poll_msec can trigger out-of-bounds
write.

Reproducer:

  # echo 1001 > /sys/module/edac_core/parameters/edac_mc_poll_msec

KASAN report:

  BUG: KASAN: global-out-of-bounds in edac_set_poll_msec+0x140/0x150
  Write of size 8 at addr b91b2d00 by task bash/1996

  CPU: 1 PID: 1996 Comm: bash Not tainted 5.2.0-rc6+ #23
  Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.12.0-2.fc30 
04/01/2014
  Call Trace:
   dump_stack+0xca/0x13e
   print_address_description.cold+0x5/0x246
   __kasan_report.cold+0x75/0x9a
   ? edac_set_poll_msec+0x140/0x150
   kasan_report+0xe/0x20
   edac_set_poll_msec+0x140/0x150
   ? dimmdev_location_show+0x30/0x30
   ? vfs_lock_file+0xe0/0xe0
   ? _raw_spin_lock+0x87/0xe0
   param_attr_store+0x1b5/0x310
   ? param_array_set+0x4f0/0x4f0
   module_attr_store+0x58/0x80
   ? module_attr_show+0x80/0x80
   sysfs_kf_write+0x13d/0x1a0
   kernfs_fop_write+0x2bc/0x460
   ? sysfs_kf_bin_read+0x270/0x270
   ? kernfs_notify+0x1f0/0x1f0
   __vfs_write+0x81/0x100
   vfs_write+0x1e1/0x560
   ksys_write+0x126/0x250
   ? __ia32_sys_read+0xb0/0xb0
   ? do_syscall_64+0x1f/0x390
   do_syscall_64+0xc1/0x390
   entry_SYSCALL_64_after_hwframe+0x49/0xbe
  RIP: 0033:0x7fa7caa5e970
  Code: 73 01 c3 48 8b 0d 28 d5 2b 00 f7 d8 64 89 01 48 83 c8 ff c3 66 0f 1f 44 
00 00 83 3d 99 2d 2c 00 00 75 10 b8 01 00 00 00 04
  RSP: 002b:7fff6acfdfe8 EFLAGS: 0246 ORIG_RAX: 0001
  RAX: ffda RBX: 0005 RCX: 7fa7caa5e970
  RDX: 0005 RSI: 00e95c08 RDI: 0001
  RBP: 00e95c08 R08: 7fa7cad1e760 R09: 7fa7cb36a700
  R10: 0073 R11: 0246 R12: 0005
  R13: 0001 R14: 7fa7cad1d600 R15: 0005

  The buggy address belongs to the variable:
   edac_mc_poll_msec+0x0/0x40

  Memory state around the buggy address:
   b91b2c00: 00 00 00 00 fa fa fa fa 00 00 00 00 fa fa fa fa
   b91b2c80: 00 00 00 00 fa fa fa fa 00 00 00 00 fa fa fa fa
  >b91b2d00: 04 fa fa fa fa fa fa fa 04 fa fa fa fa fa fa fa
 ^
   b91b2d80: 04 fa fa fa fa fa fa fa 00 00 00 00 00 00 00 00
   b91b2e00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

Fix it by changing the type of edac_mc_poll_msec to unsigned int.
The reason why this patch adopts unsigned int rather than unsigned long
is msecs_to_jiffies() assumes arg to be unsigned int. We can avoid
integer conversion bugs and unsigned int will be large enough for
edac_mc_poll_msec.

Reviewed-by: James Morse 
Fixes: 9da21b1509d8 ("EDAC: Poll timeout cannot be zero, p2")
Signed-off-by: Eiichi Tsukata 
Signed-off-by: Tony Luck 
Signed-off-by: Sasha Levin 
---
 drivers/edac/edac_mc_sysfs.c | 16 
 drivers/edac/edac_module.h   |  2 +-
 2 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/edac/edac_mc_sysfs.c b/drivers/edac/edac_mc_sysfs.c
index e50610b5bd06..d4545a9222a0 100644
--- a/drivers/edac/edac_mc_sysfs.c
+++ b/drivers/edac/edac_mc_sysfs.c
@@ -26,7 +26,7 @@
 static int edac_mc_log_ue = 1;
 static int edac_mc_log_ce = 1;
 static int edac_mc_panic_on_ue;
-static int edac_mc_poll_msec = 1000;
+static unsigned int edac_mc_poll_msec = 1000;
 
 /* Getter functions for above */
 int edac_mc_get_log_ue(void)
@@ -45,30 +45,30 @@ int edac_mc_get_panic_on_ue(void)
 }
 
 /* this is temporary */
-int edac_mc_get_poll_msec(void)
+unsigned int edac_mc_get_poll_msec(void)
 {
return edac_mc_poll_msec;
 }
 
 static int edac_set_poll_msec(const char *val, const struct kernel_param *kp)
 {
-   unsigned long l;
+   unsigned int i;
int ret;
 
if (!val)
return -EINVAL;
 
-   ret = kstrtoul(val, 0, );
+   ret = kstrtouint(val, 0, );
if (ret)
return ret;
 
-   if (l < 1000)
+   if (i < 1000)
return -EINVAL;
 
-   *((unsigned long *)kp->arg) = l;
+   *((unsigned int *)kp->arg) = i;
 
/* notify edac_mc engine to reset the poll period */
-   edac_mc_reset_delay_period(l);
+   edac_mc_reset_delay_period(i);
 
return 0;
 }
@@ -82,7 +82,7 @@ MODULE_PARM_DESC(edac_mc_log_ue,
 module_param(edac_mc_log_ce, int, 0644);
 MODULE_PARM_DESC(edac_mc_log_ce,
 "Log correctable error to console: 0=off 1=on");
-module_param_call(edac_mc_poll_msec, edac_set_poll_msec, param_get_int,
+module_param_call(edac_mc_poll_msec, edac_set_poll_msec, param_get_uint,
  _mc_poll_msec, 0644);
 MODULE_PARM_DESC(edac_mc_poll_msec, "Polling period in milliseconds");
 
diff --git a/drivers/edac/edac_module.h b/drivers/edac/edac_module.h
index dec88dcea036..c9f0e73872a6 100644
--- a/drivers/edac/edac_module.h
+++ 

[PATCH 4.19 138/271] bnx2x: Prevent ptp_task to be rescheduled indefinitely

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 3c91f25c2f72ba6001775a5932857c1d2131c531 ]

Currently bnx2x ptp worker tries to read a register with timestamp
information in case of TX packet timestamping and in case it fails,
the routine reschedules itself indefinitely. This was reported as a
kworker always at 100% of CPU usage, which was narrowed down to be
bnx2x ptp_task.

By following the ioctl handler, we could narrow down the problem to
an NTP tool (chrony) requesting HW timestamping from bnx2x NIC with
RX filter zeroed; this isn't reproducible for example with ptp4l
(from linuxptp) since this tool requests a supported RX filter.
It seems NIC FW timestamp mechanism cannot work well with
RX_FILTER_NONE - driver's PTP filter init routine skips a register
write to the adapter if there's not a supported filter request.

This patch addresses the problem of bnx2x ptp thread's everlasting
reschedule by retrying the register read 10 times; between the read
attempts the thread sleeps for an increasing amount of time starting
in 1ms to give FW some time to perform the timestamping. If it still
fails after all retries, we bail out in order to prevent an unbound
resource consumption from bnx2x.

The patch also adds an ethtool statistic for accounting the skipped
TX timestamp packets and it reduces the priority of timestamping
error messages to prevent log flooding. The code was tested using
both linuxptp and chrony.

Reported-and-tested-by: Przemyslaw Hausman 
Suggested-by: Sudarsana Reddy Kalluru 
Signed-off-by: Guilherme G. Piccoli 
Acked-by: Sudarsana Reddy Kalluru 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 .../net/ethernet/broadcom/bnx2x/bnx2x_cmn.c   |  5 ++-
 .../ethernet/broadcom/bnx2x/bnx2x_ethtool.c   |  4 ++-
 .../net/ethernet/broadcom/bnx2x/bnx2x_main.c  | 33 ++-
 .../net/ethernet/broadcom/bnx2x/bnx2x_stats.h |  3 ++
 4 files changed, 34 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c 
b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
index 5a727d4729da..e3ce29951c5e 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
@@ -3858,9 +3858,12 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct 
net_device *dev)
 
if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
if (!(bp->flags & TX_TIMESTAMPING_EN)) {
+   bp->eth_stats.ptp_skip_tx_ts++;
BNX2X_ERR("Tx timestamping was not enabled, this packet 
will not be timestamped\n");
} else if (bp->ptp_tx_skb) {
-   BNX2X_ERR("The device supports only a single 
outstanding packet to timestamp, this packet will not be timestamped\n");
+   bp->eth_stats.ptp_skip_tx_ts++;
+   netdev_err_once(bp->dev,
+   "Device supports only a single 
outstanding packet to timestamp, this packet won't be timestamped\n");
} else {
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
/* schedule check for Tx timestamp */
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c 
b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
index c428b0655c26..00f9ed93360c 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
@@ -182,7 +182,9 @@ static const struct {
{ STATS_OFFSET32(driver_filtered_tx_pkt),
4, false, "driver_filtered_tx_pkt" },
{ STATS_OFFSET32(eee_tx_lpi),
-   4, true, "Tx LPI entry count"}
+   4, true, "Tx LPI entry count"},
+   { STATS_OFFSET32(ptp_skip_tx_ts),
+   4, false, "ptp_skipped_tx_tstamp" },
 };
 
 #define BNX2X_NUM_STATSARRAY_SIZE(bnx2x_stats_arr)
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c 
b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index a585f1025a58..2c9af0f420e5 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -15244,11 +15244,24 @@ static void bnx2x_ptp_task(struct work_struct *work)
u32 val_seq;
u64 timestamp, ns;
struct skb_shared_hwtstamps shhwtstamps;
+   bool bail = true;
+   int i;
+
+   /* FW may take a while to complete timestamping; try a bit and if it's
+* still not complete, may indicate an error state - bail out then.
+*/
+   for (i = 0; i < 10; i++) {
+   /* Read Tx timestamp registers */
+   val_seq = REG_RD(bp, port ? NIG_REG_P1_TLLH_PTP_BUF_SEQID :
+NIG_REG_P0_TLLH_PTP_BUF_SEQID);
+   if (val_seq & 0x1) {
+   bail = false;
+   break;
+   }
+   msleep(1 << i);
+   }
 

[PATCH 4.19 137/271] perf stat: Fix group lookup for metric group

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 2f87f33f4226523df9c9cc28f9874ea02fcc3d3f ]

The metric group code tries to find a group it added earlier in the
evlist. Fix the lookup to handle groups with partially overlaps
correctly. When a sub string match fails and we reset the match, we have
to compare the first element again.

I also renamed the find_evsel function to find_evsel_group to make its
purpose clearer.

With the earlier changes this fixes:

Before:

  % perf stat -M UPI,IPC sleep 1
  ...
 1,032,922  uops_retired.retire_slots #  1.1 UPI
 1,896,096  inst_retired.any
 1,896,096  inst_retired.any
 1,177,254  cpu_clk_unhalted.thread

After:

  % perf stat -M UPI,IPC sleep 1
  ...
1,013,193  uops_retired.retire_slots #  1.1 UPI
   932,033  inst_retired.any
   932,033  inst_retired.any  #  0.9 IPC
 1,091,245  cpu_clk_unhalted.thread

Signed-off-by: Andi Kleen 
Acked-by: Jiri Olsa 
Cc: Kan Liang 
Fixes: b18f3e365019 ("perf stat: Support JSON metrics in perf stat")
Link: http://lkml.kernel.org/r/20190624193711.35241-4-a...@firstfloor.org
Signed-off-by: Arnaldo Carvalho de Melo 
Signed-off-by: Sasha Levin 
---
 tools/perf/util/metricgroup.c | 47 ++-
 1 file changed, 35 insertions(+), 12 deletions(-)

diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
index a28f9b5cc4ff..8b3dafe3fac3 100644
--- a/tools/perf/util/metricgroup.c
+++ b/tools/perf/util/metricgroup.c
@@ -94,26 +94,49 @@ struct egroup {
const char *metric_expr;
 };
 
-static struct perf_evsel *find_evsel(struct perf_evlist *perf_evlist,
-const char **ids,
-int idnum,
-struct perf_evsel **metric_events)
+static bool record_evsel(int *ind, struct perf_evsel **start,
+int idnum,
+struct perf_evsel **metric_events,
+struct perf_evsel *ev)
+{
+   metric_events[*ind] = ev;
+   if (*ind == 0)
+   *start = ev;
+   if (++*ind == idnum) {
+   metric_events[*ind] = NULL;
+   return true;
+   }
+   return false;
+}
+
+static struct perf_evsel *find_evsel_group(struct perf_evlist *perf_evlist,
+  const char **ids,
+  int idnum,
+  struct perf_evsel **metric_events)
 {
struct perf_evsel *ev, *start = NULL;
int ind = 0;
 
evlist__for_each_entry (perf_evlist, ev) {
+   if (ev->collect_stat)
+   continue;
if (!strcmp(ev->name, ids[ind])) {
-   metric_events[ind] = ev;
-   if (ind == 0)
-   start = ev;
-   if (++ind == idnum) {
-   metric_events[ind] = NULL;
+   if (record_evsel(, , idnum,
+metric_events, ev))
return start;
-   }
} else {
+   /*
+* We saw some other event that is not
+* in our list of events. Discard
+* the whole match and start again.
+*/
ind = 0;
start = NULL;
+   if (!strcmp(ev->name, ids[ind])) {
+   if (record_evsel(, , idnum,
+metric_events, ev))
+   return start;
+   }
}
}
/*
@@ -143,8 +166,8 @@ static int metricgroup__setup_events(struct list_head 
*groups,
ret = -ENOMEM;
break;
}
-   evsel = find_evsel(perf_evlist, eg->ids, eg->idnum,
-  metric_events);
+   evsel = find_evsel_group(perf_evlist, eg->ids, eg->idnum,
+metric_events);
if (!evsel) {
pr_debug("Cannot resolve %s: %s\n",
eg->metric_name, eg->metric_expr);
-- 
2.20.1





[PATCH 4.19 125/271] bcache: check CACHE_SET_IO_DISABLE bit in bch_journal()

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 383ff2183ad16a8842d1fbd9dd3e1cbd66813e64 ]

When too many I/O errors happen on cache set and CACHE_SET_IO_DISABLE
bit is set, bch_journal() may continue to work because the journaling
bkey might be still in write set yet. The caller of bch_journal() may
believe the journal still work but the truth is in-memory journal write
set won't be written into cache device any more. This behavior may
introduce potential inconsistent metadata status.

This patch checks CACHE_SET_IO_DISABLE bit at the head of bch_journal(),
if the bit is set, bch_journal() returns NULL immediately to notice
caller to know journal does not work.

Signed-off-by: Coly Li 
Signed-off-by: Jens Axboe 
Signed-off-by: Sasha Levin 
---
 drivers/md/bcache/journal.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c
index f880e5eba8dd..8d4d63b51553 100644
--- a/drivers/md/bcache/journal.c
+++ b/drivers/md/bcache/journal.c
@@ -810,6 +810,10 @@ atomic_t *bch_journal(struct cache_set *c,
struct journal_write *w;
atomic_t *ret;
 
+   /* No journaling if CACHE_SET_IO_DISABLE set already */
+   if (unlikely(test_bit(CACHE_SET_IO_DISABLE, >flags)))
+   return NULL;
+
if (!CACHE_SYNC(>sb))
return NULL;
 
-- 
2.20.1





[PATCH 4.19 143/271] bonding: validate ip header before check IPPROTO_IGMP

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 9d1bc24b52fb8c5d859f9a47084bf1179470e04c ]

bond_xmit_roundrobin() checks for IGMP packets but it parses
the IP header even before checking skb->protocol.

We should validate the IP header with pskb_may_pull() before
using iph->protocol.

Reported-and-tested-by: syzbot+e5be16aa39ad6e755...@syzkaller.appspotmail.com
Fixes: a2fd940f4cff ("bonding: fix broken multicast with round-robin mode")
Cc: Jay Vosburgh 
Cc: Veaceslav Falico 
Cc: Andy Gospodarek 
Signed-off-by: Cong Wang 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/bonding/bond_main.c | 37 -
 1 file changed, 23 insertions(+), 14 deletions(-)

diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 7e162fff01ab..be0b785becd0 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -3852,8 +3852,8 @@ static netdev_tx_t bond_xmit_roundrobin(struct sk_buff 
*skb,
struct net_device *bond_dev)
 {
struct bonding *bond = netdev_priv(bond_dev);
-   struct iphdr *iph = ip_hdr(skb);
struct slave *slave;
+   int slave_cnt;
u32 slave_id;
 
/* Start with the curr_active_slave that joined the bond as the
@@ -3862,23 +3862,32 @@ static netdev_tx_t bond_xmit_roundrobin(struct sk_buff 
*skb,
 * send the join/membership reports.  The curr_active_slave found
 * will send all of this type of traffic.
 */
-   if (iph->protocol == IPPROTO_IGMP && skb->protocol == htons(ETH_P_IP)) {
-   slave = rcu_dereference(bond->curr_active_slave);
-   if (slave)
-   bond_dev_queue_xmit(bond, skb, slave->dev);
-   else
-   bond_xmit_slave_id(bond, skb, 0);
-   } else {
-   int slave_cnt = READ_ONCE(bond->slave_cnt);
+   if (skb->protocol == htons(ETH_P_IP)) {
+   int noff = skb_network_offset(skb);
+   struct iphdr *iph;
 
-   if (likely(slave_cnt)) {
-   slave_id = bond_rr_gen_slave_id(bond);
-   bond_xmit_slave_id(bond, skb, slave_id % slave_cnt);
-   } else {
-   bond_tx_drop(bond_dev, skb);
+   if (unlikely(!pskb_may_pull(skb, noff + sizeof(*iph
+   goto non_igmp;
+
+   iph = ip_hdr(skb);
+   if (iph->protocol == IPPROTO_IGMP) {
+   slave = rcu_dereference(bond->curr_active_slave);
+   if (slave)
+   bond_dev_queue_xmit(bond, skb, slave->dev);
+   else
+   bond_xmit_slave_id(bond, skb, 0);
+   return NETDEV_TX_OK;
}
}
 
+non_igmp:
+   slave_cnt = READ_ONCE(bond->slave_cnt);
+   if (likely(slave_cnt)) {
+   slave_id = bond_rr_gen_slave_id(bond);
+   bond_xmit_slave_id(bond, skb, slave_id % slave_cnt);
+   } else {
+   bond_tx_drop(bond_dev, skb);
+   }
return NETDEV_TX_OK;
 }
 
-- 
2.20.1





[PATCH 4.19 148/271] Bluetooth: Add new 13d3:3501 QCA_ROME device

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 881cec4f6b4da78e54b73c046a60f39315964c7d ]

Without the QCA ROME setup routine this adapter fails to establish a SCO
connection.

T:  Bus=01 Lev=01 Prnt=01 Port=04 Cnt=01 Dev#=  2 Spd=12  MxCh= 0
D:  Ver= 1.10 Cls=e0(wlcon) Sub=01 Prot=01 MxPS=64 #Cfgs=  1
P:  Vendor=13d3 ProdID=3501 Rev=00.01
C:  #Ifs= 2 Cfg#= 1 Atr=e0 MxPwr=100mA
I:  If#=0x0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb
I:  If#=0x1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb

Signed-off-by: João Paulo Rechi Vita 
Signed-off-by: Marcel Holtmann 
Signed-off-by: Sasha Levin 
---
 drivers/bluetooth/btusb.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index f494fa30a912..75cf605f54e5 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -279,6 +279,7 @@ static const struct usb_device_id blacklist_table[] = {
{ USB_DEVICE(0x04ca, 0x301a), .driver_info = BTUSB_QCA_ROME },
{ USB_DEVICE(0x13d3, 0x3491), .driver_info = BTUSB_QCA_ROME },
{ USB_DEVICE(0x13d3, 0x3496), .driver_info = BTUSB_QCA_ROME },
+   { USB_DEVICE(0x13d3, 0x3501), .driver_info = BTUSB_QCA_ROME },
 
/* Broadcom BCM2035 */
{ USB_DEVICE(0x0a5c, 0x2009), .driver_info = BTUSB_BCM92035 },
-- 
2.20.1





[PATCH 4.19 177/271] crypto: crypto4xx - fix AES CTR blocksize value

2019-07-24 Thread Greg Kroah-Hartman
From: Christian Lamparter 

commit bfa2ba7d9e6b20aca82b99e6842fe18842ae3a0f upstream.

This patch fixes a issue with crypto4xx's ctr(aes) that was
discovered by libcapi's kcapi-enc-test.sh test.

The some of the ctr(aes) encryptions test were failing on the
non-power-of-two test:

kcapi-enc - Error: encryption failed with error 0
kcapi-enc - Error: decryption failed with error 0
[FAILED: 32-bit - 5.1.0-rc1+] 15 bytes: STDIN / STDOUT enc test (128 bits):
original file (1d100e..cc96184c) and generated file (e3b0c442..1b7852b855)
[FAILED: 32-bit - 5.1.0-rc1+] 15 bytes: STDIN / STDOUT enc test (128 bits)
(openssl generated CT): original file (e3b0..5) and generated file (3..8e)
[PASSED: 32-bit - 5.1.0-rc1+] 15 bytes: STDIN / STDOUT enc test (128 bits)
(openssl generated PT)
[FAILED: 32-bit - 5.1.0-rc1+] 15 bytes: STDIN / STDOUT enc test (password):
original file (1d1..84c) and generated file (e3b..852b855)

But the 16, 32, 512, 65536 tests always worked.

Thankfully, this isn't a hidden hardware problem like previously,
instead this turned out to be a copy and paste issue.

With this patch, all the tests are passing with and
kcapi-enc-test.sh gives crypto4xx's a clean bill of health:
 "Number of failures: 0" :).

Cc: sta...@vger.kernel.org
Fixes: 98e87e3d933b ("crypto: crypto4xx - add aes-ctr support")
Fixes: f2a13e7cba9e ("crypto: crypto4xx - enable AES RFC3686, ECB, CFB and OFB 
offloads")
Signed-off-by: Christian Lamparter 
Signed-off-by: Herbert Xu 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/crypto/amcc/crypto4xx_core.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/drivers/crypto/amcc/crypto4xx_core.c
+++ b/drivers/crypto/amcc/crypto4xx_core.c
@@ -1186,7 +1186,7 @@ static struct crypto4xx_alg_common crypt
.cra_flags = CRYPTO_ALG_NEED_FALLBACK |
CRYPTO_ALG_ASYNC |
CRYPTO_ALG_KERN_DRIVER_ONLY,
-   .cra_blocksize = AES_BLOCK_SIZE,
+   .cra_blocksize = 1,
.cra_ctxsize = sizeof(struct crypto4xx_ctx),
.cra_module = THIS_MODULE,
},
@@ -1206,7 +1206,7 @@ static struct crypto4xx_alg_common crypt
.cra_priority = CRYPTO4XX_CRYPTO_PRIORITY,
.cra_flags = CRYPTO_ALG_ASYNC |
CRYPTO_ALG_KERN_DRIVER_ONLY,
-   .cra_blocksize = AES_BLOCK_SIZE,
+   .cra_blocksize = 1,
.cra_ctxsize = sizeof(struct crypto4xx_ctx),
.cra_module = THIS_MODULE,
},




[PATCH 4.19 145/271] tools: bpftool: Fix json dump crash on powerpc

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit aa52bcbe0e72fac36b1862db08b9c09c4caefae3 ]

Michael reported crash with by bpf program in json mode on powerpc:

  # bpftool prog -p dump jited id 14
  [{
"name": "0xda9aa760",
"insns": [{
"pc": "0x0",
"operation": "nop",
"operands": [null
]
},{
"pc": "0x4",
"operation": "nop",
"operands": [null
]
},{
"pc": "0x8",
"operation": "mflr",
  Segmentation fault (core dumped)

The code is assuming char pointers in format, which is not always
true at least for powerpc. Fixing this by dumping the whole string
into buffer based on its format.

Please note that libopcodes code does not check return values from
fprintf callback, but as per Jakub suggestion returning -1 on allocation
failure so we do the best effort to propagate the error.

Fixes: 107f041212c1 ("tools: bpftool: add JSON output for `bpftool prog dump 
jited *` command")
Reported-by: Michael Petlan 
Signed-off-by: Jiri Olsa 
Reviewed-by: Quentin Monnet 
Reviewed-by: Jakub Kicinski 
Signed-off-by: Daniel Borkmann 
Signed-off-by: Sasha Levin 
---
 tools/bpf/bpftool/jit_disasm.c | 11 +++
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/tools/bpf/bpftool/jit_disasm.c b/tools/bpf/bpftool/jit_disasm.c
index 87439320ef70..73d7252729fa 100644
--- a/tools/bpf/bpftool/jit_disasm.c
+++ b/tools/bpf/bpftool/jit_disasm.c
@@ -10,6 +10,8 @@
  * Licensed under the GNU General Public License, version 2.0 (GPLv2)
  */
 
+#define _GNU_SOURCE
+#include 
 #include 
 #include 
 #include 
@@ -51,11 +53,13 @@ static int fprintf_json(void *out, const char *fmt, ...)
char *s;
 
va_start(ap, fmt);
+   if (vasprintf(, fmt, ap) < 0)
+   return -1;
+   va_end(ap);
+
if (!oper_count) {
int i;
 
-   s = va_arg(ap, char *);
-
/* Strip trailing spaces */
i = strlen(s) - 1;
while (s[i] == ' ')
@@ -68,11 +72,10 @@ static int fprintf_json(void *out, const char *fmt, ...)
} else if (!strcmp(fmt, ",")) {
   /* Skip */
} else {
-   s = va_arg(ap, char *);
jsonw_string(json_wtr, s);
oper_count++;
}
-   va_end(ap);
+   free(s);
return 0;
 }
 
-- 
2.20.1





[PATCH 4.19 127/271] bcache: check c->gc_thread by IS_ERR_OR_NULL in cache_set_flush()

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit b387e9b58679c60f5b1e4313939bd4878204fc37 ]

When system memory is in heavy pressure, bch_gc_thread_start() from
run_cache_set() may fail due to out of memory. In such condition,
c->gc_thread is assigned to -ENOMEM, not NULL pointer. Then in following
failure code path bch_cache_set_error(), when cache_set_flush() gets
called, the code piece to stop c->gc_thread is broken,
 if (!IS_ERR_OR_NULL(c->gc_thread))
 kthread_stop(c->gc_thread);

And KASAN catches such NULL pointer deference problem, with the warning
information:

[  561.207881] 
==
[  561.207900] BUG: KASAN: null-ptr-deref in kthread_stop+0x3b/0x440
[  561.207904] Write of size 4 at addr 001c by task kworker/15:1/313

[  561.207913] CPU: 15 PID: 313 Comm: kworker/15:1 Tainted: GW 
5.0.0-vanilla+ #3
[  561.207916] Hardware name: Lenovo ThinkSystem SR650 
-[7X05CTO1WW]-/-[7X05CTO1WW]-, BIOS -[IVE136T-2.10]- 03/22/2019
[  561.207935] Workqueue: events cache_set_flush [bcache]
[  561.207940] Call Trace:
[  561.207948]  dump_stack+0x9a/0xeb
[  561.207955]  ? kthread_stop+0x3b/0x440
[  561.207960]  ? kthread_stop+0x3b/0x440
[  561.207965]  kasan_report+0x176/0x192
[  561.207973]  ? kthread_stop+0x3b/0x440
[  561.207981]  kthread_stop+0x3b/0x440
[  561.207995]  cache_set_flush+0xd4/0x6d0 [bcache]
[  561.208008]  process_one_work+0x856/0x1620
[  561.208015]  ? find_held_lock+0x39/0x1d0
[  561.208028]  ? drain_workqueue+0x380/0x380
[  561.208048]  worker_thread+0x87/0xb80
[  561.208058]  ? __kthread_parkme+0xb6/0x180
[  561.208067]  ? process_one_work+0x1620/0x1620
[  561.208072]  kthread+0x326/0x3e0
[  561.208079]  ? kthread_create_worker_on_cpu+0xc0/0xc0
[  561.208090]  ret_from_fork+0x3a/0x50
[  561.208110] 
==
[  561.208113] Disabling lock debugging due to kernel taint
[  561.208115] irq event stamp: 11800231
[  561.208126] hardirqs last  enabled at (11800231): [] 
do_syscall_64+0x18/0x410
[  561.208127] BUG: unable to handle kernel NULL pointer dereference at 
001c
[  561.208129] #PF error: [WRITE]
[  561.312253] hardirqs last disabled at (11800230): [] 
trace_hardirqs_off_thunk+0x1a/0x1c
[  561.312259] softirqs last  enabled at (11799832): [] 
__do_softirq+0x5c7/0x8c3
[  561.405975] PGD 0 P4D 0
[  561.442494] softirqs last disabled at (11799821): [] 
irq_exit+0x1ac/0x1e0
[  561.791359] Oops: 0002 [#1] SMP KASAN NOPTI
[  561.791362] CPU: 15 PID: 313 Comm: kworker/15:1 Tainted: GB   W 
5.0.0-vanilla+ #3
[  561.791363] Hardware name: Lenovo ThinkSystem SR650 
-[7X05CTO1WW]-/-[7X05CTO1WW]-, BIOS -[IVE136T-2.10]- 03/22/2019
[  561.791371] Workqueue: events cache_set_flush [bcache]
[  561.791374] RIP: 0010:kthread_stop+0x3b/0x440
[  561.791376] Code: 00 00 65 8b 05 26 d5 e0 7c 89 c0 48 0f a3 05 ec aa df 02 
0f 82 dc 02 00 00 4c 8d 63 20 be 04 00 00 00 4c 89 e7 e8 65 c5 53 00  ff 43 
20 48 8d 7b 24 48 b8 00 00 00 00 00 fc ff df 48 89 fa 48
[  561.791377] RSP: 0018:88872fc8fd10 EFLAGS: 00010286
[  561.838895] bcache: bch_count_io_errors() nvme0n1: IO error on writing btree.
[  561.838916] bcache: bch_count_io_errors() nvme0n1: IO error on writing btree.
[  561.838934] bcache: bch_count_io_errors() nvme0n1: IO error on writing btree.
[  561.838948] bcache: bch_count_io_errors() nvme0n1: IO error on writing btree.
[  561.838966] bcache: bch_count_io_errors() nvme0n1: IO error on writing btree.
[  561.838979] bcache: bch_count_io_errors() nvme0n1: IO error on writing btree.
[  561.838996] bcache: bch_count_io_errors() nvme0n1: IO error on writing btree.
[  563.067028] RAX:  RBX: fffc RCX: 832dd314
[  563.067030] RDX:  RSI: 0004 RDI: 0297
[  563.067032] RBP: 88872fc8fe88 R08: fbfff0b8213d R09: fbfff0b8213d
[  563.067034] R10: 0001 R11: fbfff0b8213c R12: 001c
[  563.408618] R13: 88dc61cc0f68 R14: 888102b94900 R15: 88dc61cc0f68
[  563.408620] FS:  () GS:888f7dc0() 
knlGS:
[  563.408622] CS:  0010 DS:  ES:  CR0: 80050033
[  563.408623] CR2: 001c CR3: 000f48a1a004 CR4: 007606e0
[  563.408625] DR0:  DR1:  DR2: 
[  563.408627] DR3:  DR6: fffe0ff0 DR7: 0400
[  563.904795] bcache: bch_count_io_errors() nvme0n1: IO error on writing btree.
[  563.915796] PKRU: 5554
[  563.915797] Call Trace:
[  563.915807]  cache_set_flush+0xd4/0x6d0 [bcache]
[  563.915812]  process_one_work+0x856/0x1620
[  564.001226] bcache: bch_count_io_errors() nvme0n1: IO error on writing btree.
[  564.033563]  ? find_held_lock+0x39/0x1d0
[  564.033567]  ? drain_workqueue+0x380/0x380
[  564.033574]  worker_thread+0x87/0xb80
[  564.062823] bcache: bch_count_io_errors() nvme0n1: IO 

[PATCH 4.19 154/271] gtp: fix suspicious RCU usage

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit e198987e7dd7d3645a53875151cd6f8fc425b706 ]

gtp_encap_enable_socket() and gtp_encap_destroy() are not protected
by rcu_read_lock(). and it's not safe to write sk->sk_user_data.
This patch make these functions to use lock_sock() instead of
rcu_dereference_sk_user_data().

Test commands:
gtp-link add gtp1

Splat looks like:
[   83.238315] =
[   83.239127] WARNING: suspicious RCU usage
[   83.239702] 5.2.0-rc6+ #49 Not tainted
[   83.240268] -
[   83.241205] drivers/net/gtp.c:799 suspicious rcu_dereference_check() usage!
[   83.243828]
[   83.243828] other info that might help us debug this:
[   83.243828]
[   83.246325]
[   83.246325] rcu_scheduler_active = 2, debug_locks = 1
[   83.247314] 1 lock held by gtp-link/1008:
[   83.248523]  #0: 17772c7f (rtnl_mutex){+.+.}, at: 
__rtnl_newlink+0x5f5/0x11b0
[   83.251503]
[   83.251503] stack backtrace:
[   83.252173] CPU: 0 PID: 1008 Comm: gtp-link Not tainted 5.2.0-rc6+ #49
[   83.253271] Hardware name: innotek GmbH VirtualBox/VirtualBox, BIOS 
VirtualBox 12/01/2006
[   83.254562] Call Trace:
[   83.254995]  dump_stack+0x7c/0xbb
[   83.255567]  gtp_encap_enable_socket+0x2df/0x360 [gtp]
[   83.256415]  ? gtp_find_dev+0x1a0/0x1a0 [gtp]
[   83.257161]  ? memset+0x1f/0x40
[   83.257843]  gtp_newlink+0x90/0xa21 [gtp]
[   83.258497]  ? __netlink_ns_capable+0xc3/0xf0
[   83.259260]  __rtnl_newlink+0xb9f/0x11b0
[   83.260022]  ? rtnl_link_unregister+0x230/0x230
[ ... ]

Fixes: 1e3a3abd8b28 ("gtp: make GTP sockets in gtp_newlink optional")
Signed-off-by: Taehee Yoo 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/gtp.c | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c
index 83488f2bf7a0..f45a806b6c06 100644
--- a/drivers/net/gtp.c
+++ b/drivers/net/gtp.c
@@ -293,12 +293,14 @@ static void gtp_encap_destroy(struct sock *sk)
 {
struct gtp_dev *gtp;
 
-   gtp = rcu_dereference_sk_user_data(sk);
+   lock_sock(sk);
+   gtp = sk->sk_user_data;
if (gtp) {
udp_sk(sk)->encap_type = 0;
rcu_assign_sk_user_data(sk, NULL);
sock_put(sk);
}
+   release_sock(sk);
 }
 
 static void gtp_encap_disable_sock(struct sock *sk)
@@ -800,7 +802,8 @@ static struct sock *gtp_encap_enable_socket(int fd, int 
type,
goto out_sock;
}
 
-   if (rcu_dereference_sk_user_data(sock->sk)) {
+   lock_sock(sock->sk);
+   if (sock->sk->sk_user_data) {
sk = ERR_PTR(-EBUSY);
goto out_sock;
}
@@ -816,6 +819,7 @@ static struct sock *gtp_encap_enable_socket(int fd, int 
type,
setup_udp_tunnel_sock(sock_net(sock->sk), sock, );
 
 out_sock:
+   release_sock(sock->sk);
sockfd_put(sock);
return sk;
 }
-- 
2.20.1





[PATCH 4.19 156/271] gtp: fix use-after-free in gtp_encap_destroy()

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 1788b8569f5de27da09087fa3f6580d2aa04cc75 ]

gtp_encap_destroy() is called twice.
1. When interface is deleted.
2. When udp socket is destroyed.
either gtp->sk0 or gtp->sk1u could be freed by sock_put() in
gtp_encap_destroy(). so, when gtp_encap_destroy() is called again,
it would uses freed sk pointer.

patch makes gtp_encap_destroy() to set either gtp->sk0 or gtp->sk1u to
null. in addition, both gtp->sk0 and gtp->sk1u pointer are protected
by rtnl_lock. so, rtnl_lock() is added.

Test command:
   gtp-link add gtp1 &
   killall gtp-link
   ip link del gtp1

Splat looks like:
[   83.182767] BUG: KASAN: use-after-free in __lock_acquire+0x3a20/0x46a0
[   83.184128] Read of size 8 at addr 8880cc7d5360 by task ip/1008
[   83.185567] CPU: 1 PID: 1008 Comm: ip Not tainted 5.2.0-rc6+ #50
[   83.188469] Call Trace:
[ ... ]
[   83.200126]  lock_acquire+0x141/0x380
[   83.200575]  ? lock_sock_nested+0x3a/0xf0
[   83.201069]  _raw_spin_lock_bh+0x38/0x70
[   83.201551]  ? lock_sock_nested+0x3a/0xf0
[   83.202044]  lock_sock_nested+0x3a/0xf0
[   83.202520]  gtp_encap_destroy+0x18/0xe0 [gtp]
[   83.203065]  gtp_encap_disable.isra.14+0x13/0x50 [gtp]
[   83.203687]  gtp_dellink+0x56/0x170 [gtp]
[   83.204190]  rtnl_delete_link+0xb4/0x100
[ ... ]
[   83.236513] Allocated by task 976:
[   83.236925]  save_stack+0x19/0x80
[   83.237332]  __kasan_kmalloc.constprop.3+0xa0/0xd0
[   83.237894]  kmem_cache_alloc+0xd8/0x280
[   83.238360]  sk_prot_alloc.isra.42+0x50/0x200
[   83.238874]  sk_alloc+0x32/0x940
[   83.239264]  inet_create+0x283/0xc20
[   83.239684]  __sock_create+0x2dd/0x540
[   83.240136]  __sys_socket+0xca/0x1a0
[   83.240550]  __x64_sys_socket+0x6f/0xb0
[   83.240998]  do_syscall_64+0x9c/0x450
[   83.241466]  entry_SYSCALL_64_after_hwframe+0x49/0xbe
[   83.242061]
[   83.242249] Freed by task 0:
[   83.242616]  save_stack+0x19/0x80
[   83.243013]  __kasan_slab_free+0x111/0x150
[   83.243498]  kmem_cache_free+0x89/0x250
[   83.24]  __sk_destruct+0x38f/0x5a0
[   83.245366]  rcu_core+0x7e9/0x1c20
[   83.245766]  __do_softirq+0x213/0x8fa

Fixes: 1e3a3abd8b28 ("gtp: make GTP sockets in gtp_newlink optional")
Signed-off-by: Taehee Yoo 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/gtp.c | 17 +++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/drivers/net/gtp.c b/drivers/net/gtp.c
index 6f1ad7ccaea6..61e9b288d2dc 100644
--- a/drivers/net/gtp.c
+++ b/drivers/net/gtp.c
@@ -289,13 +289,17 @@ static int gtp1u_udp_encap_recv(struct gtp_dev *gtp, 
struct sk_buff *skb)
return gtp_rx(pctx, skb, hdrlen, gtp->role);
 }
 
-static void gtp_encap_destroy(struct sock *sk)
+static void __gtp_encap_destroy(struct sock *sk)
 {
struct gtp_dev *gtp;
 
lock_sock(sk);
gtp = sk->sk_user_data;
if (gtp) {
+   if (gtp->sk0 == sk)
+   gtp->sk0 = NULL;
+   else
+   gtp->sk1u = NULL;
udp_sk(sk)->encap_type = 0;
rcu_assign_sk_user_data(sk, NULL);
sock_put(sk);
@@ -303,12 +307,19 @@ static void gtp_encap_destroy(struct sock *sk)
release_sock(sk);
 }
 
+static void gtp_encap_destroy(struct sock *sk)
+{
+   rtnl_lock();
+   __gtp_encap_destroy(sk);
+   rtnl_unlock();
+}
+
 static void gtp_encap_disable_sock(struct sock *sk)
 {
if (!sk)
return;
 
-   gtp_encap_destroy(sk);
+   __gtp_encap_destroy(sk);
 }
 
 static void gtp_encap_disable(struct gtp_dev *gtp)
@@ -1047,6 +1058,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct 
genl_info *info)
return -EINVAL;
}
 
+   rtnl_lock();
rcu_read_lock();
 
gtp = gtp_find_dev(sock_net(skb->sk), info->attrs);
@@ -1071,6 +1083,7 @@ static int gtp_genl_new_pdp(struct sk_buff *skb, struct 
genl_info *info)
 
 out_unlock:
rcu_read_unlock();
+   rtnl_unlock();
return err;
 }
 
-- 
2.20.1





[PATCH 4.19 167/271] Revert "scsi: ncr5380: Increase register polling limit"

2019-07-24 Thread Greg Kroah-Hartman
From: Finn Thain 

commit 25fcf94a2fa89dd3e73e965ebb0b38a2a4f72aa4 upstream.

This reverts commit 4822827a69d7cd3bc5a07b7637484ebd2cf88db6.

The purpose of that commit was to suppress a timeout warning message which
appeared to be caused by target latency. But suppressing the warning is
undesirable as the warning may indicate a messed up transfer count.

Another problem with that commit is that 15 ms is too long to keep
interrupts disabled as interrupt latency can cause system clock drift and
other problems.

Cc: Michael Schmitz 
Cc: sta...@vger.kernel.org
Fixes: 4822827a69d7 ("scsi: ncr5380: Increase register polling limit")
Signed-off-by: Finn Thain 
Tested-by: Stan Johnson 
Tested-by: Michael Schmitz 
Signed-off-by: Martin K. Petersen 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/scsi/NCR5380.h |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/drivers/scsi/NCR5380.h
+++ b/drivers/scsi/NCR5380.h
@@ -235,7 +235,7 @@ struct NCR5380_cmd {
 #define NCR5380_PIO_CHUNK_SIZE 256
 
 /* Time limit (ms) to poll registers when IRQs are disabled, e.g. during PDMA 
*/
-#define NCR5380_REG_POLL_TIME  15
+#define NCR5380_REG_POLL_TIME  10
 
 static inline struct scsi_cmnd *NCR5380_to_scmd(struct NCR5380_cmd *ncmd_ptr)
 {




[PATCH 4.19 149/271] Bluetooth: 6lowpan: search for destination address in all peers

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit b188b03270b7f8568fc714101ce82fbf5e811c5a ]

Handle overlooked case where the target address is assigned to a peer
and neither route nor gateway exist.

For one peer, no checks are performed to see if it is meant to receive
packets for a given address.

As soon as there is a second peer however, checks are performed
to deal with routes and gateways for handling complex setups with
multiple hops to a target address.
This logic assumed that no route and no gateway imply that the
destination address can not be reached, which is false in case of a
direct peer.

Acked-by: Jukka Rissanen 
Tested-by: Michael Scott 
Signed-off-by: Josua Mayer 
Signed-off-by: Marcel Holtmann 
Signed-off-by: Sasha Levin 
---
 net/bluetooth/6lowpan.c | 14 ++
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c
index 4e2576fc0c59..357475cceec6 100644
--- a/net/bluetooth/6lowpan.c
+++ b/net/bluetooth/6lowpan.c
@@ -187,10 +187,16 @@ static inline struct lowpan_peer *peer_lookup_dst(struct 
lowpan_btle_dev *dev,
}
 
if (!rt) {
-   nexthop = _cb(skb)->gw;
-
-   if (ipv6_addr_any(nexthop))
-   return NULL;
+   if (ipv6_addr_any(_cb(skb)->gw)) {
+   /* There is neither route nor gateway,
+* probably the destination is a direct peer.
+*/
+   nexthop = daddr;
+   } else {
+   /* There is a known gateway
+*/
+   nexthop = _cb(skb)->gw;
+   }
} else {
nexthop = rt6_nexthop(rt, daddr);
 
-- 
2.20.1





[PATCH 4.19 126/271] bcache: acquire bch_register_lock later in cached_dev_free()

2019-07-24 Thread Greg Kroah-Hartman
[ Upstream commit 80265d8dfd77792e133793cef44a21323aac2908 ]

When enable lockdep engine, a lockdep warning can be observed when
reboot or shutdown system,

[ 3142.764557][T1] bcache: bcache_reboot() Stopping all devices:
[ 3142.776265][ T2649]
[ 3142.777159][ T2649] ==
[ 3142.780039][ T2649] WARNING: possible circular locking dependency detected
[ 3142.782869][ T2649] 5.2.0-rc4-lp151.20-default+ #1 Tainted: GW
[ 3142.785684][ T2649] --
[ 3142.788479][ T2649] kworker/3:67/2649 is trying to acquire lock:
[ 3142.790738][ T2649] aaf02291 
((wq_completion)bcache_writeback_wq){+.+.}, at: flush_workqueue+0x87/0x4c0
[ 3142.794678][ T2649]
[ 3142.794678][ T2649] but task is already holding lock:
[ 3142.797402][ T2649] 4fcf89c5 (_register_lock){+.+.}, at: 
cached_dev_free+0x17/0x120 [bcache]
[ 3142.801462][ T2649]
[ 3142.801462][ T2649] which lock already depends on the new lock.
[ 3142.801462][ T2649]
[ 3142.805277][ T2649]
[ 3142.805277][ T2649] the existing dependency chain (in reverse order) is:
[ 3142.808902][ T2649]
[ 3142.808902][ T2649] -> #2 (_register_lock){+.+.}:
[ 3142.812396][ T2649]__mutex_lock+0x7a/0x9d0
[ 3142.814184][ T2649]cached_dev_free+0x17/0x120 [bcache]
[ 3142.816415][ T2649]process_one_work+0x2a4/0x640
[ 3142.818413][ T2649]worker_thread+0x39/0x3f0
[ 3142.820276][ T2649]kthread+0x125/0x140
[ 3142.822061][ T2649]ret_from_fork+0x3a/0x50
[ 3142.823965][ T2649]
[ 3142.823965][ T2649] -> #1 ((work_completion)(>work)#2){+.+.}:
[ 3142.827244][ T2649]process_one_work+0x277/0x640
[ 3142.829160][ T2649]worker_thread+0x39/0x3f0
[ 3142.830958][ T2649]kthread+0x125/0x140
[ 3142.832674][ T2649]ret_from_fork+0x3a/0x50
[ 3142.834915][ T2649]
[ 3142.834915][ T2649] -> #0 ((wq_completion)bcache_writeback_wq){+.+.}:
[ 3142.838121][ T2649]lock_acquire+0xb4/0x1c0
[ 3142.840025][ T2649]flush_workqueue+0xae/0x4c0
[ 3142.842035][ T2649]drain_workqueue+0xa9/0x180
[ 3142.844042][ T2649]destroy_workqueue+0x17/0x250
[ 3142.846142][ T2649]cached_dev_free+0x52/0x120 [bcache]
[ 3142.848530][ T2649]process_one_work+0x2a4/0x640
[ 3142.850663][ T2649]worker_thread+0x39/0x3f0
[ 3142.852464][ T2649]kthread+0x125/0x140
[ 3142.854106][ T2649]ret_from_fork+0x3a/0x50
[ 3142.855880][ T2649]
[ 3142.855880][ T2649] other info that might help us debug this:
[ 3142.855880][ T2649]
[ 3142.859663][ T2649] Chain exists of:
[ 3142.859663][ T2649]   (wq_completion)bcache_writeback_wq --> 
(work_completion)(>work)#2 --> _register_lock
[ 3142.859663][ T2649]
[ 3142.865424][ T2649]  Possible unsafe locking scenario:
[ 3142.865424][ T2649]
[ 3142.868022][ T2649]CPU0CPU1
[ 3142.869885][ T2649]
[ 3142.871751][ T2649]   lock(_register_lock);
[ 3142.873379][ T2649]
lock((work_completion)(>work)#2);
[ 3142.876399][ T2649]lock(_register_lock);
[ 3142.879727][ T2649]   lock((wq_completion)bcache_writeback_wq);
[ 3142.882064][ T2649]
[ 3142.882064][ T2649]  *** DEADLOCK ***
[ 3142.882064][ T2649]
[ 3142.885060][ T2649] 3 locks held by kworker/3:67/2649:
[ 3142.887245][ T2649]  #0: e774cdd0 ((wq_completion)events){+.+.}, at: 
process_one_work+0x21e/0x640
[ 3142.890815][ T2649]  #1: f7df89da 
((work_completion)(>work)#2){+.+.}, at: process_one_work+0x21e/0x640
[ 3142.894884][ T2649]  #2: 4fcf89c5 (_register_lock){+.+.}, at: 
cached_dev_free+0x17/0x120 [bcache]
[ 3142.898797][ T2649]
[ 3142.898797][ T2649] stack backtrace:
[ 3142.900961][ T2649] CPU: 3 PID: 2649 Comm: kworker/3:67 Tainted: GW  
   5.2.0-rc4-lp151.20-default+ #1
[ 3142.904789][ T2649] Hardware name: VMware, Inc. VMware Virtual 
Platform/440BX Desktop Reference Platform, BIOS 6.00 04/13/2018
[ 3142.909168][ T2649] Workqueue: events cached_dev_free [bcache]
[ 3142.911422][ T2649] Call Trace:
[ 3142.912656][ T2649]  dump_stack+0x85/0xcb
[ 3142.914181][ T2649]  print_circular_bug+0x19a/0x1f0
[ 3142.916193][ T2649]  __lock_acquire+0x16cd/0x1850
[ 3142.917936][ T2649]  ? __lock_acquire+0x6a8/0x1850
[ 3142.919704][ T2649]  ? lock_acquire+0xb4/0x1c0
[ 3142.921335][ T2649]  ? find_held_lock+0x34/0xa0
[ 3142.923052][ T2649]  lock_acquire+0xb4/0x1c0
[ 3142.924635][ T2649]  ? flush_workqueue+0x87/0x4c0
[ 3142.926375][ T2649]  flush_workqueue+0xae/0x4c0
[ 3142.928047][ T2649]  ? flush_workqueue+0x87/0x4c0
[ 3142.929824][ T2649]  ? drain_workqueue+0xa9/0x180
[ 3142.931686][ T2649]  drain_workqueue+0xa9/0x180
[ 3142.933534][ T2649]  destroy_workqueue+0x17/0x250
[ 3142.935787][ T2649]  cached_dev_free+0x52/0x120 [bcache]
[ 3142.937795][ T2649]  process_one_work+0x2a4/0x640
[ 3142.939803][ T2649]  worker_thread+0x39/0x3f0
[ 3142.941487][ T2649]  ? 

[PATCH 4.19 189/271] Input: gtco - bounds check collection indent level

2019-07-24 Thread Greg Kroah-Hartman
From: Grant Hernandez 

commit 2a017fd82c5402b3c8df5e3d6e5165d9e6147dc1 upstream.

The GTCO tablet input driver configures itself from an HID report sent
via USB during the initial enumeration process. Some debugging messages
are generated during the parsing. A debugging message indentation
counter is not bounds checked, leading to the ability for a specially
crafted HID report to cause '-' and null bytes be written past the end
of the indentation array. As long as the kernel has CONFIG_DYNAMIC_DEBUG
enabled, this code will not be optimized out.  This was discovered
during code review after a previous syzkaller bug was found in this
driver.

Signed-off-by: Grant Hernandez 
Cc: sta...@vger.kernel.org
Signed-off-by: Dmitry Torokhov 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/input/tablet/gtco.c |   20 +---
 1 file changed, 17 insertions(+), 3 deletions(-)

--- a/drivers/input/tablet/gtco.c
+++ b/drivers/input/tablet/gtco.c
@@ -78,6 +78,7 @@ Scott Hill sh...@gtcocalcomp.com
 
 /* Max size of a single report */
 #define REPORT_MAX_SIZE   10
+#define MAX_COLLECTION_LEVELS  10
 
 
 /* Bitmask whether pen is in range */
@@ -223,8 +224,7 @@ static void parse_hid_report_descriptor(
char  maintype = 'x';
char  globtype[12];
int   indent = 0;
-   char  indentstr[10] = "";
-
+   char  indentstr[MAX_COLLECTION_LEVELS + 1] = { 0 };
 
dev_dbg(ddev, "==>>PARSE<<==\n");
 
@@ -350,6 +350,13 @@ static void parse_hid_report_descriptor(
case TAG_MAIN_COL_START:
maintype = 'S';
 
+   if (indent == MAX_COLLECTION_LEVELS) {
+   dev_err(ddev, "Collection level %d 
would exceed limit of %d\n",
+   indent + 1,
+   MAX_COLLECTION_LEVELS);
+   break;
+   }
+
if (data == 0) {
dev_dbg(ddev, "==>> 
Physical\n");
strcpy(globtype, "Physical");
@@ -369,8 +376,15 @@ static void parse_hid_report_descriptor(
break;
 
case TAG_MAIN_COL_END:
-   dev_dbg(ddev, "<<==\n");
maintype = 'E';
+
+   if (indent == 0) {
+   dev_err(ddev, "Collection level already 
at zero\n");
+   break;
+   }
+
+   dev_dbg(ddev, "<<==\n");
+
indent--;
for (x = 0; x < indent; x++)
indentstr[x] = '-';




[PATCH 4.19 187/271] bcache: fix mistaken sysfs entry for io_error counter

2019-07-24 Thread Greg Kroah-Hartman
From: Coly Li 

commit 5461999848e0462c14f306a62923d22de820a59c upstream.

In bch_cached_dev_files[] from driver/md/bcache/sysfs.c, sysfs_errors is
incorrectly inserted in. The correct entry should be sysfs_io_errors.

This patch fixes the problem and now I/O errors of cached device can be
read from /sys/block/bcache/bcache/io_errors.

Fixes: c7b7bd07404c5 ("bcache: add io_disable to struct cached_dev")
Signed-off-by: Coly Li 
Cc: sta...@vger.kernel.org
Signed-off-by: Jens Axboe 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/md/bcache/sysfs.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/drivers/md/bcache/sysfs.c
+++ b/drivers/md/bcache/sysfs.c
@@ -175,7 +175,7 @@ SHOW(__bch_cached_dev)
var_print(writeback_percent);
sysfs_hprint(writeback_rate,
 wb ? atomic_long_read(>writeback_rate.rate) << 9 : 0);
-   sysfs_hprint(io_errors, atomic_read(>io_errors));
+   sysfs_printf(io_errors, "%i", atomic_read(>io_errors));
sysfs_printf(io_error_limit,"%i", dc->error_limit);
sysfs_printf(io_disable,"%i", dc->io_disable);
var_print(writeback_rate_update_seconds);
@@ -426,7 +426,7 @@ static struct attribute *bch_cached_dev_
_writeback_rate_p_term_inverse,
_writeback_rate_minimum,
_writeback_rate_debug,
-   _errors,
+   _io_errors,
_io_error_limit,
_io_disable,
_dirty_data,




[PATCH 4.19 192/271] Input: alps - fix a mismatch between a condition check and its comment

2019-07-24 Thread Greg Kroah-Hartman
From: Hui Wang 

commit 771a081e44a9baa1991ef011cc453ef425591740 upstream.

In the function alps_is_cs19_trackpoint(), we check if the param[1] is
in the 0x20~0x2f range, but the code we wrote for this checking is not
correct:
(param[1] & 0x20) does not mean param[1] is in the range of 0x20~0x2f,
it also means the param[1] is in the range of 0x30~0x3f, 0x60~0x6f...

Now fix it with a new condition checking ((param[1] & 0xf0) == 0x20).

Fixes: 7e4935ccc323 ("Input: alps - don't handle ALPS cs19 trackpoint-only 
device")
Cc: sta...@vger.kernel.org
Signed-off-by: Hui Wang 
Signed-off-by: Dmitry Torokhov 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/input/mouse/alps.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/drivers/input/mouse/alps.c
+++ b/drivers/input/mouse/alps.c
@@ -2879,7 +2879,7 @@ static bool alps_is_cs19_trackpoint(stru
 * trackpoint-only devices have their variant_ids equal
 * TP_VARIANT_ALPS and their firmware_ids are in 0x20~0x2f range.
 */
-   return param[0] == TP_VARIANT_ALPS && (param[1] & 0x20);
+   return param[0] == TP_VARIANT_ALPS && ((param[1] & 0xf0) == 0x20);
 }
 
 static int alps_identify(struct psmouse *psmouse, struct alps_data *priv)




[PATCH 4.19 186/271] bcache: ignore read-ahead request failure on backing device

2019-07-24 Thread Greg Kroah-Hartman
From: Coly Li 

commit 578df99b1b0531d19af956530fe4da63d01a1604 upstream.

When md raid device (e.g. raid456) is used as backing device, read-ahead
requests on a degrading and recovering md raid device might be failured
immediately by md raid code, but indeed this md raid array can still be
read or write for normal I/O requests. Therefore such failed read-ahead
request are not real hardware failure. Further more, after degrading and
recovering accomplished, read-ahead requests will be handled by md raid
array again.

For such condition, I/O failures of read-ahead requests don't indicate
real health status (because normal I/O still be served), they should not
be counted into I/O error counter dc->io_errors.

Since there is no simple way to detect whether the backing divice is a
md raid device, this patch simply ignores I/O failures for read-ahead
bios on backing device, to avoid bogus backing device failure on a
degrading md raid array.

Suggested-and-tested-by: Thorsten Knabe 
Signed-off-by: Coly Li 
Cc: sta...@vger.kernel.org
Signed-off-by: Jens Axboe 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/md/bcache/io.c |   12 
 1 file changed, 12 insertions(+)

--- a/drivers/md/bcache/io.c
+++ b/drivers/md/bcache/io.c
@@ -58,6 +58,18 @@ void bch_count_backing_io_errors(struct
 
WARN_ONCE(!dc, "NULL pointer of struct cached_dev");
 
+   /*
+* Read-ahead requests on a degrading and recovering md raid
+* (e.g. raid6) device might be failured immediately by md
+* raid code, which is not a real hardware media failure. So
+* we shouldn't count failed REQ_RAHEAD bio to dc->io_errors.
+*/
+   if (bio->bi_opf & REQ_RAHEAD) {
+   pr_warn_ratelimited("%s: Read-ahead I/O failed on backing 
device, ignore",
+   dc->backing_dev_name);
+   return;
+   }
+
errors = atomic_add_return(1, >io_errors);
if (errors < dc->error_limit)
pr_err("%s: IO error on backing device, unrecoverable",




[PATCH 4.19 180/271] crypto: ccp - memset structure fields to zero before reuse

2019-07-24 Thread Greg Kroah-Hartman
From: Hook, Gary 

commit 20e833dc36355ed642d00067641a679c618303fa upstream.

The AES GCM function reuses an 'op' data structure, which members
contain values that must be cleared for each (re)use.

This fix resolves a crypto self-test failure:
alg: aead: gcm-aes-ccp encryption test failed (wrong result) on test vector 2, 
cfg="two even aligned splits"

Fixes: 36cf515b9bbe ("crypto: ccp - Enable support for AES GCM on v5 CCPs")
Cc: 
Signed-off-by: Gary R Hook 
Signed-off-by: Herbert Xu 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/crypto/ccp/ccp-ops.c |   12 +++-
 1 file changed, 11 insertions(+), 1 deletion(-)

--- a/drivers/crypto/ccp/ccp-ops.c
+++ b/drivers/crypto/ccp/ccp-ops.c
@@ -625,6 +625,7 @@ static int ccp_run_aes_gcm_cmd(struct cc
 
unsigned long long *final;
unsigned int dm_offset;
+   unsigned int jobid;
unsigned int ilen;
bool in_place = true; /* Default value */
int ret;
@@ -663,9 +664,11 @@ static int ccp_run_aes_gcm_cmd(struct cc
p_tag = scatterwalk_ffwd(sg_tag, p_inp, ilen);
}
 
+   jobid = CCP_NEW_JOBID(cmd_q->ccp);
+
memset(, 0, sizeof(op));
op.cmd_q = cmd_q;
-   op.jobid = CCP_NEW_JOBID(cmd_q->ccp);
+   op.jobid = jobid;
op.sb_key = cmd_q->sb_key; /* Pre-allocated */
op.sb_ctx = cmd_q->sb_ctx; /* Pre-allocated */
op.init = 1;
@@ -816,6 +819,13 @@ static int ccp_run_aes_gcm_cmd(struct cc
final[0] = cpu_to_be64(aes->aad_len * 8);
final[1] = cpu_to_be64(ilen * 8);
 
+   memset(, 0, sizeof(op));
+   op.cmd_q = cmd_q;
+   op.jobid = jobid;
+   op.sb_key = cmd_q->sb_key; /* Pre-allocated */
+   op.sb_ctx = cmd_q->sb_ctx; /* Pre-allocated */
+   op.init = 1;
+   op.u.aes.type = aes->type;
op.u.aes.mode = CCP_AES_MODE_GHASH;
op.u.aes.action = CCP_AES_GHASHFINAL;
op.src.type = CCP_MEMTYPE_SYSTEM;




[PATCH 4.19 196/271] iwlwifi: pcie: fix ALIVE interrupt handling for gen2 devices w/o MSI-X

2019-07-24 Thread Greg Kroah-Hartman
From: Emmanuel Grumbach 

commit ec46ae30245ecb41d73f8254613db07c653fb498 upstream.

We added code to restock the buffer upon ALIVE interrupt
when MSI-X is disabled. This was added as part of the context
info code. This code was added only if the ISR debug level
is set which is very unlikely to be related.
Move this code to run even when the ISR debug level is not
set.

Note that gen2 devices work with MSI-X in most cases so that
this path is seldom used.

Cc: sta...@vger.kernel.org
Signed-off-by: Emmanuel Grumbach 
Signed-off-by: Luca Coelho 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/net/wireless/intel/iwlwifi/pcie/rx.c |   34 ---
 1 file changed, 16 insertions(+), 18 deletions(-)

--- a/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/rx.c
@@ -1778,25 +1778,23 @@ irqreturn_t iwl_pcie_irq_handler(int irq
goto out;
}
 
-   if (iwl_have_debug_level(IWL_DL_ISR)) {
-   /* NIC fires this, but we don't use it, redundant with WAKEUP */
-   if (inta & CSR_INT_BIT_SCD) {
-   IWL_DEBUG_ISR(trans,
- "Scheduler finished to transmit the 
frame/frames.\n");
-   isr_stats->sch++;
-   }
+   /* NIC fires this, but we don't use it, redundant with WAKEUP */
+   if (inta & CSR_INT_BIT_SCD) {
+   IWL_DEBUG_ISR(trans,
+ "Scheduler finished to transmit the 
frame/frames.\n");
+   isr_stats->sch++;
+   }
 
-   /* Alive notification via Rx interrupt will do the real work */
-   if (inta & CSR_INT_BIT_ALIVE) {
-   IWL_DEBUG_ISR(trans, "Alive interrupt\n");
-   isr_stats->alive++;
-   if (trans->cfg->gen2) {
-   /*
-* We can restock, since firmware configured
-* the RFH
-*/
-   iwl_pcie_rxmq_restock(trans, trans_pcie->rxq);
-   }
+   /* Alive notification via Rx interrupt will do the real work */
+   if (inta & CSR_INT_BIT_ALIVE) {
+   IWL_DEBUG_ISR(trans, "Alive interrupt\n");
+   isr_stats->alive++;
+   if (trans->cfg->gen2) {
+   /*
+* We can restock, since firmware configured
+* the RFH
+*/
+   iwl_pcie_rxmq_restock(trans, trans_pcie->rxq);
}
}
 




Re: [PATCH 1/4] mailbox: arm_mhuv2: add device tree binding documentation

2019-07-24 Thread Jassi Brar
On Sun, Jul 21, 2019 at 4:58 PM Jassi Brar  wrote:
>
> On Wed, Jul 17, 2019 at 2:26 PM Tushar Khandelwal
>  wrote:
>
> > diff --git a/Documentation/devicetree/bindings/mailbox/arm,mhuv2.txt 
> > b/Documentation/devicetree/bindings/mailbox/arm,mhuv2.txt
> > new file mode 100644
> > index ..3a05593414bc
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/mailbox/arm,mhuv2.txt
> > @@ -0,0 +1,108 @@
> > +Arm MHUv2 Mailbox Driver
> > +
> > +
> > +The Arm Message-Handling-Unit (MHU) Version 2 is a mailbox controller that 
> > has
> > +between 1 and 124 channel windows to provide unidirectional communication 
> > with
> > +remote processor(s).
> > +
> > +Given the unidirectional nature of the device, an MHUv2 mailbox may only be
> > +written to or read from. If a pair of MHU devices is implemented between 
> > two
> > +processing elements to provide bidirectional communication, these must be
> > +specified as two separate mailboxes.
> > +
> > +A device tree node for an Arm MHUv2 device must specify either a receiver 
> > frame
> > +or a sender frame, indicating which end of the unidirectional MHU device 
> > which
> > +the device node entry describes.
> > +
> > +An MHU device must be specified with a transport protocol. The transport
> > +protocol of an MHU device determines the method of data transmission as 
> > well as
> > +the number of provided mailboxes.
> > +Following are the possible transport protocol types:
> > +- Single-word: An MHU device implements as many mailboxes as it
> > +   provides channel windows. Data is transmitted through
> > +   the MHU registers.
> > +- Multi-word:  An MHU device implements a single mailbox. All channel 
> > windows
> > +   will be used during transmission. Data is transmitted 
> > through
> > +   the MHU registers.
> > +- Doorbell:An MHU device implements as many mailboxes as there are flag
> > +   bits available in its channel windows. Optionally, data may
> > +   be transmitted through a shared memory region, wherein the 
> > MHU
> > +   is used strictly as an interrupt generation mechanism.
> > +
> > +Mailbox Device Node:
> > +
> > +
> > +Required properties:
> > +
> > +- compatible:  Shall be "arm,mhuv2" & "arm,primecell"
> > +- reg: Contains the mailbox register address range (base
> > +   address and length)
> > +- #mbox-cells  Shall be 1 - the index of the channel needed.
> > +- mhu-frameFrame type of the device.
> > +   Shall be either "sender" or "receiver"
> > +- mhu-protocol Transport protocol of the device. Shall be one of the
> > +   following: "single-word", "multi-word", "doorbell"
> > +
> > +Required properties (receiver frame):
> > +-
> > +- interrupts:  Contains the interrupt information corresponding to the
> > +   combined interrupt of the receiver frame
> > +
> > +Example:
> > +
> > +
> > +   mbox_mw_tx: mhu@1000 {
> > +   compatible = "arm,mhuv2","arm,primecell";
> > +   reg = <0x1000 0x1000>;
> > +   clocks = <>;
> > +   clock-names = "apb_pclk";
> > +   #mbox-cells = <1>;
> > +   mhu-protocol = "multi-word";
> > +   mhu-frame = "sender";
> > +   };
> > +
> > +   mbox_sw_tx: mhu@1000 {
> > +   compatible = "arm,mhuv2","arm,primecell";
> > +   reg = <0x1100 0x1000>;
> > +   clocks = <>;
> > +   clock-names = "apb_pclk";
> > +   #mbox-cells = <1>;
> > +   mhu-protocol = "single-word";
> > +   mhu-frame = "sender";
> > +   };
> > +
> > +   mbox_db_rx: mhu@1000 {
> > +   compatible = "arm,mhuv2","arm,primecell";
> > +   reg = <0x1200 0x1000>;
> > +   clocks = <>;
> > +   clock-names = "apb_pclk";
> > +   #mbox-cells = <1>;
> > +   interrupts = <0 45 4>;
> > +   interrupt-names = "mhu_rx";
> > +   mhu-protocol = "doorbell";
> > +   mhu-frame = "receiver";
> > +   };
> > +
> > +   mhu_client: scb@2e00 {
> > +   compatible = "fujitsu,mb86s70-scb-1.0";
> > +   reg = <0 0x2e00 0x4000>;
> > +   mboxes =
> > +   // For multi-word frames, client may only instantiate a 
> > single
> > +   // mailbox for a mailbox controller
> > +   <_mw_tx 0>,
> > +
> > +   // For single-word frames, client may instantiate as many
> > +   // mailboxes as there are channel windows in the MHU
> > +<_sw_tx 0>,
> > +<_sw_tx 1>,
> > +<_sw_tx 2>,
> > +<_sw_tx 3>,
> > +
> > +   // For doorbell frames, client may instantiate as many 
> 

[PATCH 4.19 197/271] iwlwifi: dont WARN when calling iwl_get_shared_mem_conf with RF-Kill

2019-07-24 Thread Greg Kroah-Hartman
From: Emmanuel Grumbach 

commit 0d53cfd0cca3c729a089c39eef0e7d8ae7662974 upstream.

iwl_mvm_send_cmd returns 0 when the command won't be sent
because RF-Kill is asserted. Do the same when we call
iwl_get_shared_mem_conf since it is not sent through
iwl_mvm_send_cmd but directly calls the transport layer.

Cc: sta...@vger.kernel.org
Signed-off-by: Emmanuel Grumbach 
Signed-off-by: Luca Coelho 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/net/wireless/intel/iwlwifi/fw/smem.c |   12 +---
 1 file changed, 9 insertions(+), 3 deletions(-)

--- a/drivers/net/wireless/intel/iwlwifi/fw/smem.c
+++ b/drivers/net/wireless/intel/iwlwifi/fw/smem.c
@@ -8,7 +8,7 @@
  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
- * Copyright(c) 2018 Intel Corporation
+ * Copyright(c) 2018 - 2019 Intel Corporation
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of version 2 of the GNU General Public License as
@@ -31,7 +31,7 @@
  * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
  * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
- * Copyright(c) 2018 Intel Corporation
+ * Copyright(c) 2018 - 2019 Intel Corporation
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -134,6 +134,7 @@ void iwl_get_shared_mem_conf(struct iwl_
.len = { 0, },
};
struct iwl_rx_packet *pkt;
+   int ret;
 
if (fw_has_capa(>fw->ucode_capa,
IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG))
@@ -141,8 +142,13 @@ void iwl_get_shared_mem_conf(struct iwl_
else
cmd.id = SHARED_MEM_CFG;
 
-   if (WARN_ON(iwl_trans_send_cmd(fwrt->trans, )))
+   ret = iwl_trans_send_cmd(fwrt->trans, );
+
+   if (ret) {
+   WARN(ret != -ERFKILL,
+"Could not send the SMEM command: %d\n", ret);
return;
+   }
 
pkt = cmd.resp_pkt;
if (fwrt->trans->cfg->device_family >= IWL_DEVICE_FAMILY_22000)




[PATCH 4.19 202/271] pnfs: Fix a problem where we gratuitously start doing I/O through the MDS

2019-07-24 Thread Greg Kroah-Hartman
From: Trond Myklebust 

commit 58bbeab425c6c5e318f5b6ae31d351331ddfb34b upstream.

If the client has to stop in pnfs_update_layout() to wait for another
layoutget to complete, it currently exits and defaults to I/O through
the MDS if the layoutget was successful.

Fixes: d03360aaf5cc ("pNFS: Ensure we return the error if someone kills...")
Signed-off-by: Trond Myklebust 
Cc: sta...@vger.kernel.org # v4.20+
Signed-off-by: Greg Kroah-Hartman 

---
 fs/nfs/pnfs.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1867,7 +1867,7 @@ lookup_again:
spin_unlock(>i_lock);
lseg = ERR_PTR(wait_var_event_killable(>plh_outstanding,
!atomic_read(>plh_outstanding)));
-   if (IS_ERR(lseg) || !list_empty(>plh_segs))
+   if (IS_ERR(lseg))
goto out_put_layout_hdr;
pnfs_put_layout_hdr(lo);
goto lookup_again;




[PATCH 4.19 200/271] pnfs/flexfiles: Fix PTR_ERR() dereferences in ff_layout_track_ds_error

2019-07-24 Thread Greg Kroah-Hartman
From: Trond Myklebust 

commit 8e04fdfadda75a849c649f7e50fe7d97772e1fcb upstream.

mirror->mirror_ds can be NULL if uninitialised, but can contain
a PTR_ERR() if call to GETDEVICEINFO failed.

Fixes: 65990d1afbd2 ("pNFS/flexfiles: Fix a deadlock on LAYOUTGET")
Signed-off-by: Trond Myklebust 
Cc: sta...@vger.kernel.org # 4.10+
Signed-off-by: Greg Kroah-Hartman 

---
 fs/nfs/flexfilelayout/flexfilelayoutdev.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/fs/nfs/flexfilelayout/flexfilelayoutdev.c
+++ b/fs/nfs/flexfilelayout/flexfilelayoutdev.c
@@ -307,7 +307,7 @@ int ff_layout_track_ds_error(struct nfs4
if (status == 0)
return 0;
 
-   if (mirror->mirror_ds == NULL)
+   if (IS_ERR_OR_NULL(mirror->mirror_ds))
return -EINVAL;
 
dserr = kmalloc(sizeof(*dserr), gfp_flags);




[PATCH 4.19 223/271] x86/boot: Fix memory leak in default_get_smp_config()

2019-07-24 Thread Greg Kroah-Hartman
From: David Rientjes 

commit e74bd96989dd42a51a73eddb4a5510a6f5e42ac3 upstream.

When default_get_smp_config() is called with early == 1 and mpf->feature1
is non-zero, mpf is leaked because the return path does not do
early_memunmap().

Fix this and share a common exit routine.

Fixes: 5997efb96756 ("x86/boot: Use memremap() to map the MPF and MPC data")
Reported-by: Cfir Cohen 
Signed-off-by: David Rientjes 
Signed-off-by: Thomas Gleixner 
Cc: sta...@vger.kernel.org
Link: 
https://lkml.kernel.org/r/alpine.deb.2.21.1907091942570.28...@chino.kir.corp.google.com
Signed-off-by: Greg Kroah-Hartman 

---
 arch/x86/kernel/mpparse.c |   10 --
 1 file changed, 4 insertions(+), 6 deletions(-)

--- a/arch/x86/kernel/mpparse.c
+++ b/arch/x86/kernel/mpparse.c
@@ -547,17 +547,15 @@ void __init default_get_smp_config(unsig
 * local APIC has default address
 */
mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
-   return;
+   goto out;
}
 
pr_info("Default MP configuration #%d\n", mpf->feature1);
construct_default_ISA_mptable(mpf->feature1);
 
} else if (mpf->physptr) {
-   if (check_physptr(mpf, early)) {
-   early_memunmap(mpf, sizeof(*mpf));
-   return;
-   }
+   if (check_physptr(mpf, early))
+   goto out;
} else
BUG();
 
@@ -566,7 +564,7 @@ void __init default_get_smp_config(unsig
/*
 * Only use the first configuration found.
 */
-
+out:
early_memunmap(mpf, sizeof(*mpf));
 }
 




[PATCH 4.19 203/271] lib/scatterlist: Fix mapping iterator when sg->offset is greater than PAGE_SIZE

2019-07-24 Thread Greg Kroah-Hartman
From: Christophe Leroy 

commit aeb87246537a83c2aff482f3f34a2e0991e02cbc upstream.

All mapping iterator logic is based on the assumption that sg->offset
is always lower than PAGE_SIZE.

But there are situations where sg->offset is such that the SG item
is on the second page. In that case sg_copy_to_buffer() fails
properly copying the data into the buffer. One of the reason is
that the data will be outside the kmapped area used to access that
data.

This patch fixes the issue by adjusting the mapping iterator
offset and pgoffset fields such that offset is always lower than
PAGE_SIZE.

Signed-off-by: Christophe Leroy 
Fixes: 4225fc8555a9 ("lib/scatterlist: use page iterator in the mapping 
iterator")
Cc: sta...@vger.kernel.org
Signed-off-by: Herbert Xu 
Signed-off-by: Greg Kroah-Hartman 

---
 lib/scatterlist.c |9 +
 1 file changed, 5 insertions(+), 4 deletions(-)

--- a/lib/scatterlist.c
+++ b/lib/scatterlist.c
@@ -652,17 +652,18 @@ static bool sg_miter_get_next_page(struc
 {
if (!miter->__remaining) {
struct scatterlist *sg;
-   unsigned long pgoffset;
 
if (!__sg_page_iter_next(>piter))
return false;
 
sg = miter->piter.sg;
-   pgoffset = miter->piter.sg_pgoffset;
 
-   miter->__offset = pgoffset ? 0 : sg->offset;
+   miter->__offset = miter->piter.sg_pgoffset ? 0 : sg->offset;
+   miter->piter.sg_pgoffset += miter->__offset >> PAGE_SHIFT;
+   miter->__offset &= PAGE_SIZE - 1;
miter->__remaining = sg->offset + sg->length -
-   (pgoffset << PAGE_SHIFT) - miter->__offset;
+(miter->piter.sg_pgoffset << PAGE_SHIFT) -
+miter->__offset;
miter->__remaining = min_t(unsigned long, miter->__remaining,
   PAGE_SIZE - miter->__offset);
}




[PATCH 4.19 206/271] ALSA: seq: Break too long mutex context in the write loop

2019-07-24 Thread Greg Kroah-Hartman
From: Takashi Iwai 

commit ede34f397ddb063b145b9e7d79c6026f819ded13 upstream.

The fix for the racy writes and ioctls to sequencer widened the
application of client->ioctl_mutex to the whole write loop.  Although
it does unlock/relock for the lengthy operation like the event dup,
the loop keeps the ioctl_mutex for the whole time in other
situations.  This may take quite long time if the user-space would
give a huge buffer, and this is a likely cause of some weird behavior
spotted by syzcaller fuzzer.

This patch puts a simple workaround, just adding a mutex break in the
loop when a large number of events have been processed.  This
shouldn't hit any performance drop because the threshold is set high
enough for usual operations.

Fixes: 7bd800915677 ("ALSA: seq: More protection for concurrent write and ioctl 
races")
Reported-by: syzbot+97aae04ce27e39cbf...@syzkaller.appspotmail.com
Reported-by: syzbot+4c595632b98bb8ffc...@syzkaller.appspotmail.com
Cc: 
Signed-off-by: Takashi Iwai 
Signed-off-by: Greg Kroah-Hartman 

---
 sound/core/seq/seq_clientmgr.c |   11 ++-
 1 file changed, 10 insertions(+), 1 deletion(-)

--- a/sound/core/seq/seq_clientmgr.c
+++ b/sound/core/seq/seq_clientmgr.c
@@ -1004,7 +1004,7 @@ static ssize_t snd_seq_write(struct file
 {
struct snd_seq_client *client = file->private_data;
int written = 0, len;
-   int err;
+   int err, handled;
struct snd_seq_event event;
 
if (!(snd_seq_file_flags(file) & SNDRV_SEQ_LFLG_OUTPUT))
@@ -1017,6 +1017,8 @@ static ssize_t snd_seq_write(struct file
if (!client->accept_output || client->pool == NULL)
return -ENXIO;
 
+ repeat:
+   handled = 0;
/* allocate the pool now if the pool is not allocated yet */ 
mutex_lock(>ioctl_mutex);
if (client->pool->size > 0 && !snd_seq_write_pool_allocated(client)) {
@@ -1076,12 +1078,19 @@ static ssize_t snd_seq_write(struct file
   0, 0, >ioctl_mutex);
if (err < 0)
break;
+   handled++;
 
__skip_event:
/* Update pointers and counts */
count -= len;
buf += len;
written += len;
+
+   /* let's have a coffee break if too many events are queued */
+   if (++handled >= 200) {
+   mutex_unlock(>ioctl_mutex);
+   goto repeat;
+   }
}
 
  out:




[PATCH 4.19 210/271] media: coda: Remove unbalanced and unneeded mutex unlock

2019-07-24 Thread Greg Kroah-Hartman
From: Ezequiel Garcia 

commit 766b9b168f6c75c350dd87c3e0bc6a9b322f0013 upstream.

The mutex unlock in the threaded interrupt handler is not paired
with any mutex lock. Remove it.

This bug has been here for a really long time, so it applies
to any stable repo.

Reviewed-by: Philipp Zabel 
Signed-off-by: Ezequiel Garcia 
Signed-off-by: Hans Verkuil 
Cc: sta...@vger.kernel.org
Signed-off-by: Mauro Carvalho Chehab 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/media/platform/coda/coda-bit.c |1 -
 1 file changed, 1 deletion(-)

--- a/drivers/media/platform/coda/coda-bit.c
+++ b/drivers/media/platform/coda/coda-bit.c
@@ -2309,7 +2309,6 @@ irqreturn_t coda_irq_handler(int irq, vo
if (ctx == NULL) {
v4l2_err(>v4l2_dev,
 "Instance released before the end of transaction\n");
-   mutex_unlock(>coda_mutex);
return IRQ_HANDLED;
}
 




[PATCH 4.19 175/271] crypto: arm64/sha2-ce - correct digest for empty data in finup

2019-07-24 Thread Greg Kroah-Hartman
From: Elena Petrova 

commit 6bd934de1e393466b319d29c4427598fda096c57 upstream.

The sha256-ce finup implementation for ARM64 produces wrong digest
for empty input (len=0). Expected: the actual digest, result: initial
value of SHA internal state. The error is in sha256_ce_finup:
for empty data `finalize` will be 1, so the code is relying on
sha2_ce_transform to make the final round. However, in
sha256_base_do_update, the block function will not be called when
len == 0.

Fix it by setting finalize to 0 if data is empty.

Fixes: 03802f6a80b3a ("crypto: arm64/sha2-ce - move SHA-224/256 ARMv8 
implementation to base layer")
Cc: sta...@vger.kernel.org
Signed-off-by: Elena Petrova 
Reviewed-by: Ard Biesheuvel 
Signed-off-by: Herbert Xu 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm64/crypto/sha2-ce-glue.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/arch/arm64/crypto/sha2-ce-glue.c
+++ b/arch/arm64/crypto/sha2-ce-glue.c
@@ -59,7 +59,7 @@ static int sha256_ce_finup(struct shash_
   unsigned int len, u8 *out)
 {
struct sha256_ce_state *sctx = shash_desc_ctx(desc);
-   bool finalize = !sctx->sst.count && !(len % SHA256_BLOCK_SIZE);
+   bool finalize = !sctx->sst.count && !(len % SHA256_BLOCK_SIZE) && len;
 
if (!may_use_simd()) {
if (len)




[PATCH 4.19 219/271] dm zoned: fix zone state management race

2019-07-24 Thread Greg Kroah-Hartman
From: Damien Le Moal 

commit 3b8cafdd5436f9298b3bf6eb831df5eef5ee82b6 upstream.

dm-zoned uses the zone flag DMZ_ACTIVE to indicate that a zone of the
backend device is being actively read or written and so cannot be
reclaimed. This flag is set as long as the zone atomic reference
counter is not 0. When this atomic is decremented and reaches 0 (e.g.
on BIO completion), the active flag is cleared and set again whenever
the zone is reused and BIO issued with the atomic counter incremented.
These 2 operations (atomic inc/dec and flag set/clear) are however not
always executed atomically under the target metadata mutex lock and
this causes the warning:

WARN_ON(!test_bit(DMZ_ACTIVE, >flags));

in dmz_deactivate_zone() to be displayed. This problem is regularly
triggered with xfstests generic/209, generic/300, generic/451 and
xfs/077 with XFS being used as the file system on the dm-zoned target
device. Similarly, xfstests ext4/303, ext4/304, generic/209 and
generic/300 trigger the warning with ext4 use.

This problem can be easily fixed by simply removing the DMZ_ACTIVE flag
and managing the "ACTIVE" state by directly looking at the reference
counter value. To do so, the functions dmz_activate_zone() and
dmz_deactivate_zone() are changed to inline functions respectively
calling atomic_inc() and atomic_dec(), while the dmz_is_active() macro
is changed to an inline function calling atomic_read().

Fixes: 3b1a94c88b79 ("dm zoned: drive-managed zoned block device target")
Cc: sta...@vger.kernel.org
Reported-by: Masato Suzuki 
Signed-off-by: Damien Le Moal 
Signed-off-by: Mike Snitzer 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/md/dm-zoned-metadata.c |   24 
 drivers/md/dm-zoned.h  |   28 
 2 files changed, 24 insertions(+), 28 deletions(-)

--- a/drivers/md/dm-zoned-metadata.c
+++ b/drivers/md/dm-zoned-metadata.c
@@ -1594,30 +1594,6 @@ struct dm_zone *dmz_get_zone_for_reclaim
 }
 
 /*
- * Activate a zone (increment its reference count).
- */
-void dmz_activate_zone(struct dm_zone *zone)
-{
-   set_bit(DMZ_ACTIVE, >flags);
-   atomic_inc(>refcount);
-}
-
-/*
- * Deactivate a zone. This decrement the zone reference counter
- * and clears the active state of the zone once the count reaches 0,
- * indicating that all BIOs to the zone have completed. Returns
- * true if the zone was deactivated.
- */
-void dmz_deactivate_zone(struct dm_zone *zone)
-{
-   if (atomic_dec_and_test(>refcount)) {
-   WARN_ON(!test_bit(DMZ_ACTIVE, >flags));
-   clear_bit_unlock(DMZ_ACTIVE, >flags);
-   smp_mb__after_atomic();
-   }
-}
-
-/*
  * Get the zone mapping a chunk, if the chunk is mapped already.
  * If no mapping exist and the operation is WRITE, a zone is
  * allocated and used to map the chunk.
--- a/drivers/md/dm-zoned.h
+++ b/drivers/md/dm-zoned.h
@@ -115,7 +115,6 @@ enum {
DMZ_BUF,
 
/* Zone internal state */
-   DMZ_ACTIVE,
DMZ_RECLAIM,
DMZ_SEQ_WRITE_ERR,
 };
@@ -128,7 +127,6 @@ enum {
 #define dmz_is_empty(z)((z)->wp_block == 0)
 #define dmz_is_offline(z)  test_bit(DMZ_OFFLINE, &(z)->flags)
 #define dmz_is_readonly(z) test_bit(DMZ_READ_ONLY, &(z)->flags)
-#define dmz_is_active(z)   test_bit(DMZ_ACTIVE, &(z)->flags)
 #define dmz_in_reclaim(z)  test_bit(DMZ_RECLAIM, &(z)->flags)
 #define dmz_seq_write_err(z)   test_bit(DMZ_SEQ_WRITE_ERR, &(z)->flags)
 
@@ -188,8 +186,30 @@ void dmz_unmap_zone(struct dmz_metadata
 unsigned int dmz_nr_rnd_zones(struct dmz_metadata *zmd);
 unsigned int dmz_nr_unmap_rnd_zones(struct dmz_metadata *zmd);
 
-void dmz_activate_zone(struct dm_zone *zone);
-void dmz_deactivate_zone(struct dm_zone *zone);
+/*
+ * Activate a zone (increment its reference count).
+ */
+static inline void dmz_activate_zone(struct dm_zone *zone)
+{
+   atomic_inc(>refcount);
+}
+
+/*
+ * Deactivate a zone. This decrement the zone reference counter
+ * indicating that all BIOs to the zone have completed when the count is 0.
+ */
+static inline void dmz_deactivate_zone(struct dm_zone *zone)
+{
+   atomic_dec(>refcount);
+}
+
+/*
+ * Test if a zone is active, that is, has a refcount > 0.
+ */
+static inline bool dmz_is_active(struct dm_zone *zone)
+{
+   return atomic_read(>refcount);
+}
 
 int dmz_lock_zone_reclaim(struct dm_zone *zone);
 void dmz_unlock_zone_reclaim(struct dm_zone *zone);




[PATCH 4.19 173/271] crypto: ccp - Validate the the error value used to index error messages

2019-07-24 Thread Greg Kroah-Hartman
From: Hook, Gary 

commit 52393d617af7b554f03531e6756facf2ea687d2e upstream.

The error code read from the queue status register is only 6 bits wide,
but we need to verify its value is within range before indexing the error
messages.

Fixes: 81422badb3907 ("crypto: ccp - Make syslog errors human-readable")
Cc: 
Reported-by: Cfir Cohen 
Signed-off-by: Gary R Hook 
Signed-off-by: Herbert Xu 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/crypto/ccp/ccp-dev.c |   96 ++-
 drivers/crypto/ccp/ccp-dev.h |2 
 2 files changed, 52 insertions(+), 46 deletions(-)

--- a/drivers/crypto/ccp/ccp-dev.c
+++ b/drivers/crypto/ccp/ccp-dev.c
@@ -35,56 +35,62 @@ struct ccp_tasklet_data {
 };
 
 /* Human-readable error strings */
+#define CCP_MAX_ERROR_CODE 64
 static char *ccp_error_codes[] = {
"",
-   "ERR 01: ILLEGAL_ENGINE",
-   "ERR 02: ILLEGAL_KEY_ID",
-   "ERR 03: ILLEGAL_FUNCTION_TYPE",
-   "ERR 04: ILLEGAL_FUNCTION_MODE",
-   "ERR 05: ILLEGAL_FUNCTION_ENCRYPT",
-   "ERR 06: ILLEGAL_FUNCTION_SIZE",
-   "ERR 07: Zlib_MISSING_INIT_EOM",
-   "ERR 08: ILLEGAL_FUNCTION_RSVD",
-   "ERR 09: ILLEGAL_BUFFER_LENGTH",
-   "ERR 10: VLSB_FAULT",
-   "ERR 11: ILLEGAL_MEM_ADDR",
-   "ERR 12: ILLEGAL_MEM_SEL",
-   "ERR 13: ILLEGAL_CONTEXT_ID",
-   "ERR 14: ILLEGAL_KEY_ADDR",
-   "ERR 15: 0xF Reserved",
-   "ERR 16: Zlib_ILLEGAL_MULTI_QUEUE",
-   "ERR 17: Zlib_ILLEGAL_JOBID_CHANGE",
-   "ERR 18: CMD_TIMEOUT",
-   "ERR 19: IDMA0_AXI_SLVERR",
-   "ERR 20: IDMA0_AXI_DECERR",
-   "ERR 21: 0x15 Reserved",
-   "ERR 22: IDMA1_AXI_SLAVE_FAULT",
-   "ERR 23: IDMA1_AIXI_DECERR",
-   "ERR 24: 0x18 Reserved",
-   "ERR 25: ZLIBVHB_AXI_SLVERR",
-   "ERR 26: ZLIBVHB_AXI_DECERR",
-   "ERR 27: 0x1B Reserved",
-   "ERR 27: ZLIB_UNEXPECTED_EOM",
-   "ERR 27: ZLIB_EXTRA_DATA",
-   "ERR 30: ZLIB_BTYPE",
-   "ERR 31: ZLIB_UNDEFINED_SYMBOL",
-   "ERR 32: ZLIB_UNDEFINED_DISTANCE_S",
-   "ERR 33: ZLIB_CODE_LENGTH_SYMBOL",
-   "ERR 34: ZLIB _VHB_ILLEGAL_FETCH",
-   "ERR 35: ZLIB_UNCOMPRESSED_LEN",
-   "ERR 36: ZLIB_LIMIT_REACHED",
-   "ERR 37: ZLIB_CHECKSUM_MISMATCH0",
-   "ERR 38: ODMA0_AXI_SLVERR",
-   "ERR 39: ODMA0_AXI_DECERR",
-   "ERR 40: 0x28 Reserved",
-   "ERR 41: ODMA1_AXI_SLVERR",
-   "ERR 42: ODMA1_AXI_DECERR",
-   "ERR 43: LSB_PARITY_ERR",
+   "ILLEGAL_ENGINE",
+   "ILLEGAL_KEY_ID",
+   "ILLEGAL_FUNCTION_TYPE",
+   "ILLEGAL_FUNCTION_MODE",
+   "ILLEGAL_FUNCTION_ENCRYPT",
+   "ILLEGAL_FUNCTION_SIZE",
+   "Zlib_MISSING_INIT_EOM",
+   "ILLEGAL_FUNCTION_RSVD",
+   "ILLEGAL_BUFFER_LENGTH",
+   "VLSB_FAULT",
+   "ILLEGAL_MEM_ADDR",
+   "ILLEGAL_MEM_SEL",
+   "ILLEGAL_CONTEXT_ID",
+   "ILLEGAL_KEY_ADDR",
+   "0xF Reserved",
+   "Zlib_ILLEGAL_MULTI_QUEUE",
+   "Zlib_ILLEGAL_JOBID_CHANGE",
+   "CMD_TIMEOUT",
+   "IDMA0_AXI_SLVERR",
+   "IDMA0_AXI_DECERR",
+   "0x15 Reserved",
+   "IDMA1_AXI_SLAVE_FAULT",
+   "IDMA1_AIXI_DECERR",
+   "0x18 Reserved",
+   "ZLIBVHB_AXI_SLVERR",
+   "ZLIBVHB_AXI_DECERR",
+   "0x1B Reserved",
+   "ZLIB_UNEXPECTED_EOM",
+   "ZLIB_EXTRA_DATA",
+   "ZLIB_BTYPE",
+   "ZLIB_UNDEFINED_SYMBOL",
+   "ZLIB_UNDEFINED_DISTANCE_S",
+   "ZLIB_CODE_LENGTH_SYMBOL",
+   "ZLIB _VHB_ILLEGAL_FETCH",
+   "ZLIB_UNCOMPRESSED_LEN",
+   "ZLIB_LIMIT_REACHED",
+   "ZLIB_CHECKSUM_MISMATCH0",
+   "ODMA0_AXI_SLVERR",
+   "ODMA0_AXI_DECERR",
+   "0x28 Reserved",
+   "ODMA1_AXI_SLVERR",
+   "ODMA1_AXI_DECERR",
 };
 
-void ccp_log_error(struct ccp_device *d, int e)
+void ccp_log_error(struct ccp_device *d, unsigned int e)
 {
-   dev_err(d->dev, "CCP error: %s (0x%x)\n", ccp_error_codes[e], e);
+   if (WARN_ON(e >= CCP_MAX_ERROR_CODE))
+   return;
+
+   if (e < ARRAY_SIZE(ccp_error_codes))
+   dev_err(d->dev, "CCP error %d: %s\n", e, ccp_error_codes[e]);
+   else
+   dev_err(d->dev, "CCP error %d: Unknown Error\n", e);
 }
 
 /* List of CCPs, CCP count, read-write access lock, and access functions
--- a/drivers/crypto/ccp/ccp-dev.h
+++ b/drivers/crypto/ccp/ccp-dev.h
@@ -632,7 +632,7 @@ struct ccp5_desc {
 void ccp_add_device(struct ccp_device *ccp);
 void ccp_del_device(struct ccp_device *ccp);
 
-extern void ccp_log_error(struct ccp_device *, int);
+extern void ccp_log_error(struct ccp_device *, unsigned int);
 
 struct ccp_device *ccp_alloc_struct(struct sp_device *sp);
 bool ccp_queues_suspended(struct ccp_device *ccp);




[PATCH 4.19 166/271] scsi: NCR5380: Always re-enable reselection interrupt

2019-07-24 Thread Greg Kroah-Hartman
From: Finn Thain 

commit 57f31326518e98ee4cabf9a04efe00ed57c54147 upstream.

The reselection interrupt gets disabled during selection and must be
re-enabled when hostdata->connected becomes NULL. If it isn't re-enabled a
disconnected command may time-out or the target may wedge the bus while
trying to reselect the host. This can happen after a command is aborted.

Fix this by enabling the reselection interrupt in NCR5380_main() after
calls to NCR5380_select() and NCR5380_information_transfer() return.

Cc: Michael Schmitz 
Cc: sta...@vger.kernel.org # v4.9+
Fixes: 8b00c3d5d40d ("ncr5380: Implement new eh_abort_handler")
Signed-off-by: Finn Thain 
Tested-by: Stan Johnson 
Tested-by: Michael Schmitz 
Signed-off-by: Martin K. Petersen 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/scsi/NCR5380.c |   12 ++--
 1 file changed, 2 insertions(+), 10 deletions(-)

--- a/drivers/scsi/NCR5380.c
+++ b/drivers/scsi/NCR5380.c
@@ -710,6 +710,8 @@ static void NCR5380_main(struct work_str
NCR5380_information_transfer(instance);
done = 0;
}
+   if (!hostdata->connected)
+   NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
spin_unlock_irq(>lock);
if (!done)
cond_resched();
@@ -1106,8 +1108,6 @@ static struct scsi_cmnd *NCR5380_select(
spin_lock_irq(>lock);
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
NCR5380_reselect(instance);
-   if (!hostdata->connected)
-   NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
shost_printk(KERN_ERR, instance, "reselection after won 
arbitration?\n");
goto out;
}
@@ -1115,7 +1115,6 @@ static struct scsi_cmnd *NCR5380_select(
if (err < 0) {
spin_lock_irq(>lock);
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-   NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
 
/* Can't touch cmd if it has been reclaimed by the scsi ML */
if (!hostdata->selecting)
@@ -1153,7 +1152,6 @@ static struct scsi_cmnd *NCR5380_select(
if (err < 0) {
shost_printk(KERN_ERR, instance, "select: REQ timeout\n");
NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
-   NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
goto out;
}
if (!hostdata->selecting) {
@@ -1820,9 +1818,6 @@ static void NCR5380_information_transfer
 */
NCR5380_write(TARGET_COMMAND_REG, 0);
 
-   /* Enable reselect interrupts */
-   NCR5380_write(SELECT_ENABLE_REG, 
hostdata->id_mask);
-
maybe_release_dma_irq(instance);
return;
case MESSAGE_REJECT:
@@ -1854,8 +1849,6 @@ static void NCR5380_information_transfer
 */
NCR5380_write(TARGET_COMMAND_REG, 0);
 
-   /* Enable reselect interrupts */
-   NCR5380_write(SELECT_ENABLE_REG, 
hostdata->id_mask);
 #ifdef SUN3_SCSI_VME
dregs->csr |= CSR_DMA_ENABLE;
 #endif
@@ -1957,7 +1950,6 @@ static void NCR5380_information_transfer
cmd->result = DID_ERROR << 16;
complete_cmd(instance, cmd);
maybe_release_dma_irq(instance);
-   NCR5380_write(SELECT_ENABLE_REG, 
hostdata->id_mask);
return;
}
msgout = NOP;




[PATCH 4.19 238/271] HID: wacom: correct touch resolution x/y typo

2019-07-24 Thread Greg Kroah-Hartman
From: Aaron Armstrong Skomra 

commit 68c20cc2164cc5c7c73f8012ae6491afdb1f7f72 upstream.

This affects the 2nd-gen Intuos Pro Medium and Large
when using their Bluetooth connection.

Fixes: 4922cd26f03c ("HID: wacom: Support 2nd-gen Intuos Pro's Bluetooth 
classic interface")
Cc:  # v4.11+
Signed-off-by: Aaron Armstrong Skomra 
Reviewed-by: Jason Gerecke 
Signed-off-by: Jiri Kosina 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/hid/wacom_wac.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -3734,7 +3734,7 @@ int wacom_setup_touch_input_capabilities
 0, 5920, 4, 0);
}
input_abs_set_res(input_dev, ABS_MT_POSITION_X, 40);
-   input_abs_set_res(input_dev, ABS_MT_POSITION_X, 40);
+   input_abs_set_res(input_dev, ABS_MT_POSITION_Y, 40);
 
/* fall through */
 




[PATCH 4.19 227/271] drm/edid: parse CEA blocks embedded in DisplayID

2019-07-24 Thread Greg Kroah-Hartman
From: Andres Rodriguez 

commit e28ad544f462231d3fd081a7316339359efbb481 upstream.

DisplayID blocks allow embedding of CEA blocks. The payloads are
identical to traditional top level CEA extension blocks, but the header
is slightly different.

This change allows the CEA parser to find a CEA block inside a DisplayID
block. Additionally, it adds support for parsing the embedded CTA
header. No further changes are necessary due to payload parity.

This change fixes audio support for the Valve Index HMD.

Signed-off-by: Andres Rodriguez 
Reviewed-by: Dave Airlie 
Cc: Jani Nikula 
Cc:  # v4.15
Signed-off-by: Dave Airlie 
Link: 
https://patchwork.freedesktop.org/patch/msgid/20190619180901.17901-1-andre...@gmail.com
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/gpu/drm/drm_edid.c  |   81 ++--
 include/drm/drm_displayid.h |   10 +
 2 files changed, 80 insertions(+), 11 deletions(-)

--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1349,6 +1349,7 @@ MODULE_PARM_DESC(edid_fixup,
 
 static void drm_get_displayid(struct drm_connector *connector,
  struct edid *edid);
+static int validate_displayid(u8 *displayid, int length, int idx);
 
 static int drm_edid_block_checksum(const u8 *raw_edid)
 {
@@ -2932,16 +2933,46 @@ static u8 *drm_find_edid_extension(const
return edid_ext;
 }
 
-static u8 *drm_find_cea_extension(const struct edid *edid)
-{
-   return drm_find_edid_extension(edid, CEA_EXT);
-}
 
 static u8 *drm_find_displayid_extension(const struct edid *edid)
 {
return drm_find_edid_extension(edid, DISPLAYID_EXT);
 }
 
+static u8 *drm_find_cea_extension(const struct edid *edid)
+{
+   int ret;
+   int idx = 1;
+   int length = EDID_LENGTH;
+   struct displayid_block *block;
+   u8 *cea;
+   u8 *displayid;
+
+   /* Look for a top level CEA extension block */
+   cea = drm_find_edid_extension(edid, CEA_EXT);
+   if (cea)
+   return cea;
+
+   /* CEA blocks can also be found embedded in a DisplayID block */
+   displayid = drm_find_displayid_extension(edid);
+   if (!displayid)
+   return NULL;
+
+   ret = validate_displayid(displayid, length, idx);
+   if (ret)
+   return NULL;
+
+   idx += sizeof(struct displayid_hdr);
+   for_each_displayid_db(displayid, block, idx, length) {
+   if (block->tag == DATA_BLOCK_CTA) {
+   cea = (u8 *)block;
+   break;
+   }
+   }
+
+   return cea;
+}
+
 /*
  * Calculate the alternate clock for the CEA mode
  * (60Hz vs. 59.94Hz etc.)
@@ -3665,13 +3696,38 @@ cea_revision(const u8 *cea)
 static int
 cea_db_offsets(const u8 *cea, int *start, int *end)
 {
-   /* Data block offset in CEA extension block */
-   *start = 4;
-   *end = cea[2];
-   if (*end == 0)
-   *end = 127;
-   if (*end < 4 || *end > 127)
-   return -ERANGE;
+   /* DisplayID CTA extension blocks and top-level CEA EDID
+* block header definitions differ in the following bytes:
+*   1) Byte 2 of the header specifies length differently,
+*   2) Byte 3 is only present in the CEA top level block.
+*
+* The different definitions for byte 2 follow.
+*
+* DisplayID CTA extension block defines byte 2 as:
+*   Number of payload bytes
+*
+* CEA EDID block defines byte 2 as:
+*   Byte number (decimal) within this block where the 18-byte
+*   DTDs begin. If no non-DTD data is present in this extension
+*   block, the value should be set to 04h (the byte after next).
+*   If set to 00h, there are no DTDs present in this block and
+*   no non-DTD data.
+*/
+   if (cea[0] == DATA_BLOCK_CTA) {
+   *start = 3;
+   *end = *start + cea[2];
+   } else if (cea[0] == CEA_EXT) {
+   /* Data block offset in CEA extension block */
+   *start = 4;
+   *end = cea[2];
+   if (*end == 0)
+   *end = 127;
+   if (*end < 4 || *end > 127)
+   return -ERANGE;
+   } else {
+   return -ENOTSUPP;
+   }
+
return 0;
 }
 
@@ -5218,6 +5274,9 @@ static int drm_parse_display_id(struct d
case DATA_BLOCK_TYPE_1_DETAILED_TIMING:
/* handled in mode gathering code. */
break;
+   case DATA_BLOCK_CTA:
+   /* handled in the cea parser code. */
+   break;
default:
DRM_DEBUG_KMS("found DisplayID tag 0x%x, unhandled\n", 
block->tag);
break;
--- a/include/drm/drm_displayid.h
+++ b/include/drm/drm_displayid.h
@@ -40,6 +40,7 @@
 #define DATA_BLOCK_DISPLAY_INTERFACE 0x0f
 #define 

[PATCH 4.19 226/271] perf/x86/amd/uncore: Set the thread mask for F17h L3 PMCs

2019-07-24 Thread Greg Kroah-Hartman
From: Kim Phillips 

commit 2f217d58a8a086d3399fecce39fb358848e799c4 upstream.

Fill in the L3 performance event select register ThreadMask
bitfield, to enable per hardware thread accounting.

Signed-off-by: Kim Phillips 
Signed-off-by: Peter Zijlstra (Intel) 
Cc: 
Cc: Alexander Shishkin 
Cc: Arnaldo Carvalho de Melo 
Cc: Borislav Petkov 
Cc: Gary Hook 
Cc: H. Peter Anvin 
Cc: Janakarajan Natarajan 
Cc: Jiri Olsa 
Cc: Linus Torvalds 
Cc: Martin Liska 
Cc: Namhyung Kim 
Cc: Peter Zijlstra 
Cc: Pu Wen 
Cc: Stephane Eranian 
Cc: Suravee Suthikulpanit 
Cc: Thomas Gleixner 
Cc: Vince Weaver 
Link: https://lkml.kernel.org/r/20190628215906.4276-2-kim.phill...@amd.com
Signed-off-by: Ingo Molnar 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/x86/events/amd/uncore.c |   15 +++
 1 file changed, 11 insertions(+), 4 deletions(-)

--- a/arch/x86/events/amd/uncore.c
+++ b/arch/x86/events/amd/uncore.c
@@ -210,15 +210,22 @@ static int amd_uncore_event_init(struct
hwc->config = event->attr.config & AMD64_RAW_EVENT_MASK_NB;
hwc->idx = -1;
 
+   if (event->cpu < 0)
+   return -EINVAL;
+
/*
 * SliceMask and ThreadMask need to be set for certain L3 events in
 * Family 17h. For other events, the two fields do not affect the count.
 */
-   if (l3_mask && is_llc_event(event))
-   hwc->config |= (AMD64_L3_SLICE_MASK | AMD64_L3_THREAD_MASK);
+   if (l3_mask && is_llc_event(event)) {
+   int thread = 2 * (cpu_data(event->cpu).cpu_core_id % 4);
 
-   if (event->cpu < 0)
-   return -EINVAL;
+   if (smp_num_siblings > 1)
+   thread += cpu_data(event->cpu).apicid & 1;
+
+   hwc->config |= (1ULL << (AMD64_L3_THREAD_SHIFT + thread) &
+   AMD64_L3_THREAD_MASK) | AMD64_L3_SLICE_MASK;
+   }
 
uncore = event_to_amd_uncore(event);
if (!uncore)




Re: [PATCH REBASE v4 05/14] arm64, mm: Make randomization selected by generic topdown mmap layout

2019-07-24 Thread Alexandre Ghiti

On 7/24/19 7:11 PM, Luis Chamberlain wrote:

On Wed, Jul 24, 2019 at 01:58:41AM -0400, Alexandre Ghiti wrote:

diff --git a/mm/util.c b/mm/util.c
index 0781e5575cb3..16f1e56e2996 100644
--- a/mm/util.c
+++ b/mm/util.c
@@ -321,7 +321,15 @@ unsigned long randomize_stack_top(unsigned long stack_top)
  }
  
  #ifdef CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT

-#ifdef CONFIG_ARCH_HAS_ELF_RANDOMIZE
+unsigned long arch_randomize_brk(struct mm_struct *mm)
+{
+   /* Is the current task 32bit ? */
+   if (!IS_ENABLED(CONFIG_64BIT) || is_compat_task())
+   return randomize_page(mm->brk, SZ_32M);
+
+   return randomize_page(mm->brk, SZ_1G);
+}
+
  unsigned long arch_mmap_rnd(void)
  {
unsigned long rnd;
@@ -335,7 +343,6 @@ unsigned long arch_mmap_rnd(void)
  
  	return rnd << PAGE_SHIFT;

  }

So arch_randomize_brk is no longer ifdef'd around
CONFIG_ARCH_HAS_ELF_RANDOMIZE either and yet the header
still has it. Is that intentional?



Yes, CONFIG_ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT selects 
CONFIG_ARCH_HAS_ELF_RANDOMIZE, that's what's new about v4: the generic

functions proposed in this series come with elf randomization.


Alex



   Luis

___
linux-riscv mailing list
linux-ri...@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-riscv


[PATCH 4.19 217/271] drm/nouveau/i2c: Enable i2c pads & busses during preinit

2019-07-24 Thread Greg Kroah-Hartman
From: Lyude Paul 

commit 7cb95eeea6706c790571042a06782e378b2561ea upstream.

It turns out that while disabling i2c bus access from software when the
GPU is suspended was a step in the right direction with:

commit 342406e4fbba ("drm/nouveau/i2c: Disable i2c bus access after
->fini()")

We also ended up accidentally breaking the vbios init scripts on some
older Tesla GPUs, as apparently said scripts can actually use the i2c
bus. Since these scripts are executed before initializing any
subdevices, we end up failing to acquire access to the i2c bus which has
left a number of cards with their fan controllers uninitialized. Luckily
this doesn't break hardware - it just means the fan gets stuck at 100%.

This also means that we've always been using our i2c busses before
initializing them during the init scripts for older GPUs, we just didn't
notice it until we started preventing them from being used until init.
It's pretty impressive this never caused us any issues before!

So, fix this by initializing our i2c pad and busses during subdev
pre-init. We skip initializing aux busses during pre-init, as those are
guaranteed to only ever be used by nouveau for DP aux transactions.

Signed-off-by: Lyude Paul 
Tested-by: Marc Meledandri 
Fixes: 342406e4fbba ("drm/nouveau/i2c: Disable i2c bus access after ->fini()")
Cc: sta...@vger.kernel.org
Signed-off-by: Ben Skeggs 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c |   20 
 1 file changed, 20 insertions(+)

--- a/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/base.c
@@ -185,6 +185,25 @@ nvkm_i2c_fini(struct nvkm_subdev *subdev
 }
 
 static int
+nvkm_i2c_preinit(struct nvkm_subdev *subdev)
+{
+   struct nvkm_i2c *i2c = nvkm_i2c(subdev);
+   struct nvkm_i2c_bus *bus;
+   struct nvkm_i2c_pad *pad;
+
+   /*
+* We init our i2c busses as early as possible, since they may be
+* needed by the vbios init scripts on some cards
+*/
+   list_for_each_entry(pad, >pad, head)
+   nvkm_i2c_pad_init(pad);
+   list_for_each_entry(bus, >bus, head)
+   nvkm_i2c_bus_init(bus);
+
+   return 0;
+}
+
+static int
 nvkm_i2c_init(struct nvkm_subdev *subdev)
 {
struct nvkm_i2c *i2c = nvkm_i2c(subdev);
@@ -238,6 +257,7 @@ nvkm_i2c_dtor(struct nvkm_subdev *subdev
 static const struct nvkm_subdev_func
 nvkm_i2c = {
.dtor = nvkm_i2c_dtor,
+   .preinit = nvkm_i2c_preinit,
.init = nvkm_i2c_init,
.fini = nvkm_i2c_fini,
.intr = nvkm_i2c_intr,




[PATCH 4.19 218/271] padata: use smp_mb in padata_reorder to avoid orphaned padata jobs

2019-07-24 Thread Greg Kroah-Hartman
From: Daniel Jordan 

commit cf144f81a99d1a3928f90b0936accfd3f45c9a0a upstream.

Testing padata with the tcrypt module on a 5.2 kernel...

# modprobe tcrypt alg="pcrypt(rfc4106(gcm(aes)))" type=3
# modprobe tcrypt mode=211 sec=1

...produces this splat:

INFO: task modprobe:10075 blocked for more than 120 seconds.
  Not tainted 5.2.0-base+ #16
modprobeD0 10075  10064 0x80004080
Call Trace:
 ? __schedule+0x4dd/0x610
 ? ring_buffer_unlock_commit+0x23/0x100
 schedule+0x6c/0x90
 schedule_timeout+0x3b/0x320
 ? trace_buffer_unlock_commit_regs+0x4f/0x1f0
 wait_for_common+0x160/0x1a0
 ? wake_up_q+0x80/0x80
 { crypto_wait_req } # entries in braces added by hand
 { do_one_aead_op }
 { test_aead_jiffies }
 test_aead_speed.constprop.17+0x681/0xf30 [tcrypt]
 do_test+0x4053/0x6a2b [tcrypt]
 ? 0xa00f4000
 tcrypt_mod_init+0x50/0x1000 [tcrypt]
 ...

The second modprobe command never finishes because in padata_reorder,
CPU0's load of reorder_objects is executed before the unlocking store in
spin_unlock_bh(pd->lock), causing CPU0 to miss CPU1's increment:

CPU0 CPU1

padata_reorder   padata_do_serial
  LOAD reorder_objects  // 0
   INC reorder_objects  // 1
   padata_reorder
 TRYLOCK pd->lock   // failed
  UNLOCK pd->lock

CPU0 deletes the timer before returning from padata_reorder and since no
other job is submitted to padata, modprobe waits indefinitely.

Add a pair of full barriers to guarantee proper ordering:

CPU0 CPU1

padata_reorder   padata_do_serial
  UNLOCK pd->lock
  smp_mb()
  LOAD reorder_objects
   INC reorder_objects
   smp_mb__after_atomic()
   padata_reorder
 TRYLOCK pd->lock

smp_mb__after_atomic is needed so the read part of the trylock operation
comes after the INC, as Andrea points out.   Thanks also to Andrea for
help with writing a litmus test.

Fixes: 16295bec6398 ("padata: Generic parallelization/serialization interface")
Signed-off-by: Daniel Jordan 
Cc: 
Cc: Andrea Parri 
Cc: Boqun Feng 
Cc: Herbert Xu 
Cc: Paul E. McKenney 
Cc: Peter Zijlstra 
Cc: Steffen Klassert 
Cc: linux-a...@vger.kernel.org
Cc: linux-cry...@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Herbert Xu 
Signed-off-by: Greg Kroah-Hartman 

---
 kernel/padata.c |   12 
 1 file changed, 12 insertions(+)

--- a/kernel/padata.c
+++ b/kernel/padata.c
@@ -267,7 +267,12 @@ static void padata_reorder(struct parall
 * The next object that needs serialization might have arrived to
 * the reorder queues in the meantime, we will be called again
 * from the timer function if no one else cares for it.
+*
+* Ensure reorder_objects is read after pd->lock is dropped so we see
+* an increment from another task in padata_do_serial.  Pairs with
+* smp_mb__after_atomic in padata_do_serial.
 */
+   smp_mb();
if (atomic_read(>reorder_objects)
&& !(pinst->flags & PADATA_RESET))
mod_timer(>timer, jiffies + HZ);
@@ -387,6 +392,13 @@ void padata_do_serial(struct padata_priv
list_add_tail(>list, >reorder.list);
spin_unlock(>reorder.lock);
 
+   /*
+* Ensure the atomic_inc of reorder_objects above is ordered correctly
+* with the trylock of pd->lock in padata_reorder.  Pairs with smp_mb
+* in padata_reorder.
+*/
+   smp_mb__after_atomic();
+
put_cpu();
 
/* If we're running on the wrong CPU, call padata_reorder() via a




[PATCH 4.19 254/271] parisc: Fix kernel panic due invalid values in IAOQ0 or IAOQ1

2019-07-24 Thread Greg Kroah-Hartman
From: Helge Deller 

commit 10835c854685393a921b68f529bf740fa7c9984d upstream.

On parisc the privilege level of a process is stored in the lowest two bits of
the instruction pointers (IAOQ0 and IAOQ1). On Linux we use privilege level 0
for the kernel and privilege level 3 for user-space. So userspace should not be
allowed to modify IAOQ0 or IAOQ1 of a ptraced process to change it's privilege
level to e.g. 0 to try to gain kernel privileges.

This patch prevents such modifications by always setting the two lowest bits to
one (which relates to privilege level 3 for user-space) if IAOQ0 or IAOQ1 are
modified via ptrace calls in the native and compat ptrace paths.

Link: https://bugs.gentoo.org/481768
Reported-by: Jeroen Roovers 
Cc: 
Tested-by: Rolf Eike Beer 
Signed-off-by: Helge Deller 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/parisc/kernel/ptrace.c |   28 ++--
 1 file changed, 18 insertions(+), 10 deletions(-)

--- a/arch/parisc/kernel/ptrace.c
+++ b/arch/parisc/kernel/ptrace.c
@@ -167,6 +167,9 @@ long arch_ptrace(struct task_struct *chi
if ((addr & (sizeof(unsigned long)-1)) ||
 addr >= sizeof(struct pt_regs))
break;
+   if (addr == PT_IAOQ0 || addr == PT_IAOQ1) {
+   data |= 3; /* ensure userspace privilege */
+   }
if ((addr >= PT_GR1 && addr <= PT_GR31) ||
addr == PT_IAOQ0 || addr == PT_IAOQ1 ||
(addr >= PT_FR0 && addr <= PT_FR31 + 4) ||
@@ -228,16 +231,18 @@ long arch_ptrace(struct task_struct *chi
 
 static compat_ulong_t translate_usr_offset(compat_ulong_t offset)
 {
-   if (offset < 0)
-   return sizeof(struct pt_regs);
-   else if (offset <= 32*4)/* gr[0..31] */
-   return offset * 2 + 4;
-   else if (offset <= 32*4+32*8)   /* gr[0..31] + fr[0..31] */
-   return offset + 32*4;
-   else if (offset < sizeof(struct pt_regs)/2 + 32*4)
-   return offset * 2 + 4 - 32*8;
+   compat_ulong_t pos;
+
+   if (offset < 32*4)  /* gr[0..31] */
+   pos = offset * 2 + 4;
+   else if (offset < 32*4+32*8)/* fr[0] ... fr[31] */
+   pos = (offset - 32*4) + PT_FR0;
+   else if (offset < sizeof(struct pt_regs)/2 + 32*4) /* sr[0] ... ipsw */
+   pos = (offset - 32*4 - 32*8) * 2 + PT_SR0 + 4;
else
-   return sizeof(struct pt_regs);
+   pos = sizeof(struct pt_regs);
+
+   return pos;
 }
 
 long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
@@ -281,9 +286,12 @@ long compat_arch_ptrace(struct task_stru
addr = translate_usr_offset(addr);
if (addr >= sizeof(struct pt_regs))
break;
+   if (addr == PT_IAOQ0+4 || addr == PT_IAOQ1+4) {
+   data |= 3; /* ensure userspace privilege */
+   }
if (addr >= PT_FR0 && addr <= PT_FR31 + 4) {
/* Special case, fp regs are 64 bits anyway */
-   *(__u64 *) ((char *) task_regs(child) + addr) = 
data;
+   *(__u32 *) ((char *) task_regs(child) + addr) = 
data;
ret = 0;
}
else if ((addr >= PT_GR1+4 && addr <= PT_GR31+4) ||




[PATCH 4.19 263/271] intel_th: msu: Fix single mode with disabled IOMMU

2019-07-24 Thread Greg Kroah-Hartman
From: Alexander Shishkin 

commit 918b8646497b5dba6ae82d4a7325f01b258972b9 upstream.

Commit 4e0eaf239fb3 ("intel_th: msu: Fix single mode with IOMMU") switched
the single mode code to use dma mapping pages obtained from the page
allocator, but with IOMMU disabled, that may lead to using SWIOTLB bounce
buffers and without additional sync'ing, produces empty trace buffers.

Fix this by using a DMA32 GFP flag to the page allocation in single mode,
as the device supports full 32-bit DMA addressing.

Signed-off-by: Alexander Shishkin 
Fixes: 4e0eaf239fb3 ("intel_th: msu: Fix single mode with IOMMU")
Reviewed-by: Andy Shevchenko 
Reported-by: Ammy Yi 
Cc: stable 
Link: 
https://lore.kernel.org/r/20190621161930.60785-4-alexander.shish...@linux.intel.com
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/hwtracing/intel_th/msu.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/drivers/hwtracing/intel_th/msu.c
+++ b/drivers/hwtracing/intel_th/msu.c
@@ -632,7 +632,7 @@ static int msc_buffer_contig_alloc(struc
goto err_out;
 
ret = -ENOMEM;
-   page = alloc_pages(GFP_KERNEL | __GFP_ZERO, order);
+   page = alloc_pages(GFP_KERNEL | __GFP_ZERO | GFP_DMA32, order);
if (!page)
goto err_free_sgt;
 




[PATCH 4.19 264/271] Bluetooth: Add SMP workaround Microsoft Surface Precision Mouse bug

2019-07-24 Thread Greg Kroah-Hartman
From: Szymon Janc 

commit 1d87b88ba26eabd4745e158ecfd87c93a9b51dc2 upstream.

Microsoft Surface Precision Mouse provides bogus identity address when
pairing. It connects with Static Random address but provides Public
Address in SMP Identity Address Information PDU. Address has same
value but type is different. Workaround this by dropping IRK if ID
address discrepancy is detected.

> HCI Event: LE Meta Event (0x3e) plen 19
  LE Connection Complete (0x01)
Status: Success (0x00)
Handle: 75
Role: Master (0x00)
Peer address type: Random (0x01)
Peer address: E0:52:33:93:3B:21 (Static)
Connection interval: 50.00 msec (0x0028)
Connection latency: 0 (0x)
Supervision timeout: 420 msec (0x002a)
Master clock accuracy: 0x00



> ACL Data RX: Handle 75 flags 0x02 dlen 12
  SMP: Identity Address Information (0x09) len 7
Address type: Public (0x00)
Address: E0:52:33:93:3B:21

Signed-off-by: Szymon Janc 
Tested-by: Maarten Fonville 
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=199461
Cc: sta...@vger.kernel.org
Signed-off-by: Marcel Holtmann 
Signed-off-by: Greg Kroah-Hartman 

---
 net/bluetooth/smp.c |   13 +
 1 file changed, 13 insertions(+)

--- a/net/bluetooth/smp.c
+++ b/net/bluetooth/smp.c
@@ -2580,6 +2580,19 @@ static int smp_cmd_ident_addr_info(struc
goto distribute;
}
 
+   /* Drop IRK if peer is using identity address during pairing but is
+* providing different address as identity information.
+*
+* Microsoft Surface Precision Mouse is known to have this bug.
+*/
+   if (hci_is_identity_address(>dst, hcon->dst_type) &&
+   (bacmp(>bdaddr, >dst) ||
+info->addr_type != hcon->dst_type)) {
+   bt_dev_err(hcon->hdev,
+  "ignoring IRK with invalid identity address");
+   goto distribute;
+   }
+
bacpy(>id_addr, >bdaddr);
smp->id_addr_type = info->addr_type;
 




[PATCH 4.19 266/271] blk-throttle: fix zero wait time for iops throttled group

2019-07-24 Thread Greg Kroah-Hartman
From: Konstantin Khlebnikov 

commit 3a10f999ffd464d01c5a05592a15470a3c4bbc36 upstream.

After commit 991f61fe7e1d ("Blk-throttle: reduce tail io latency when
iops limit is enforced") wait time could be zero even if group is
throttled and cannot issue requests right now. As a result
throtl_select_dispatch() turns into busy-loop under irq-safe queue
spinlock.

Fix is simple: always round up target time to the next throttle slice.

Fixes: 991f61fe7e1d ("Blk-throttle: reduce tail io latency when iops limit is 
enforced")
Signed-off-by: Konstantin Khlebnikov 
Cc: sta...@vger.kernel.org # v4.19+
Signed-off-by: Jens Axboe 
Signed-off-by: Greg Kroah-Hartman 

---
 block/blk-throttle.c |9 +++--
 1 file changed, 3 insertions(+), 6 deletions(-)

--- a/block/blk-throttle.c
+++ b/block/blk-throttle.c
@@ -892,13 +892,10 @@ static bool tg_with_in_iops_limit(struct
unsigned long jiffy_elapsed, jiffy_wait, jiffy_elapsed_rnd;
u64 tmp;
 
-   jiffy_elapsed = jiffy_elapsed_rnd = jiffies - tg->slice_start[rw];
+   jiffy_elapsed = jiffies - tg->slice_start[rw];
 
-   /* Slice has just started. Consider one slice interval */
-   if (!jiffy_elapsed)
-   jiffy_elapsed_rnd = tg->td->throtl_slice;
-
-   jiffy_elapsed_rnd = roundup(jiffy_elapsed_rnd, tg->td->throtl_slice);
+   /* Round up to the next throttle slice, wait time must be nonzero */
+   jiffy_elapsed_rnd = roundup(jiffy_elapsed + 1, tg->td->throtl_slice);
 
/*
 * jiffy_elapsed_rnd should not be a big value as minimum iops can be




[PATCH 4.19 216/271] kconfig: fix missing choice values in auto.conf

2019-07-24 Thread Greg Kroah-Hartman
From: Masahiro Yamada 

commit 8e2442a5f86e1f77b86401fce274a7f622740bc4 upstream.

Since commit 00c864f8903d ("kconfig: allow all config targets to write
auto.conf if missing"), Kconfig creates include/config/auto.conf in the
defconfig stage when it is missing.

Joonas Kylmälä reported incorrect auto.conf generation under some
circumstances.

To reproduce it, apply the following diff:

|  --- a/arch/arm/configs/imx_v6_v7_defconfig
|  +++ b/arch/arm/configs/imx_v6_v7_defconfig
|  @@ -345,14 +345,7 @@ CONFIG_USB_CONFIGFS_F_MIDI=y
|   CONFIG_USB_CONFIGFS_F_HID=y
|   CONFIG_USB_CONFIGFS_F_UVC=y
|   CONFIG_USB_CONFIGFS_F_PRINTER=y
|  -CONFIG_USB_ZERO=m
|  -CONFIG_USB_AUDIO=m
|  -CONFIG_USB_ETH=m
|  -CONFIG_USB_G_NCM=m
|  -CONFIG_USB_GADGETFS=m
|  -CONFIG_USB_FUNCTIONFS=m
|  -CONFIG_USB_MASS_STORAGE=m
|  -CONFIG_USB_G_SERIAL=m
|  +CONFIG_USB_FUNCTIONFS=y
|   CONFIG_MMC=y
|   CONFIG_MMC_SDHCI=y
|   CONFIG_MMC_SDHCI_PLTFM=y

And then, run:

$ make ARCH=arm mrproper imx_v6_v7_defconfig

You will see CONFIG_USB_FUNCTIONFS=y is correctly contained in the
.config, but not in the auto.conf.

Please note drivers/usb/gadget/legacy/Kconfig is included from a choice
block in drivers/usb/gadget/Kconfig. So USB_FUNCTIONFS is a choice value.

This is probably a similar situation described in commit beaaddb62540
("kconfig: tests: test defconfig when two choices interact").

When sym_calc_choice() is called, the choice symbol forgets the
SYMBOL_DEF_USER unless all of its choice values are explicitly set by
the user.

The choice symbol is given just one chance to recall it because
set_all_choice_values() is called if SYMBOL_NEED_SET_CHOICE_VALUES
is set.

When sym_calc_choice() is called again, the choice symbol forgets it
forever, since SYMBOL_NEED_SET_CHOICE_VALUES is a one-time aid.
Hence, we cannot call sym_clear_all_valid() again and again.

It is crazy to repeat set and unset of internal flags. However, we
cannot simply get rid of "sym->flags &= flags | ~SYMBOL_DEF_USER;"
Doing so would re-introduce the problem solved by commit 5d09598d488f
("kconfig: fix new choices being skipped upon config update").

To work around the issue, conf_write_autoconf() stopped calling
sym_clear_all_valid().

conf_write() must be changed accordingly. Currently, it clears
SYMBOL_WRITE after the symbol is written into the .config file. This
is needed to prevent it from writing the same symbol multiple times in
case the symbol is declared in two or more locations. I added the new
flag SYMBOL_WRITTEN, to track the symbols that have been written.

Anyway, this is a cheesy workaround in order to suppress the issue
as far as defconfig is concerned.

Handling of choices is totally broken. sym_clear_all_valid() is called
every time a user touches a symbol from the GUI interface. To reproduce
it, just add a new symbol drivers/usb/gadget/legacy/Kconfig, then touch
around unrelated symbols from menuconfig. USB_FUNCTIONFS will disappear
from the .config file.

I added the Fixes tag since it is more fatal than before. But, this
has been broken since long long time before, and still it is.
We should take a closer look to fix this correctly somehow.

Fixes: 00c864f8903d ("kconfig: allow all config targets to write auto.conf if 
missing")
Cc: linux-stable  # 4.19+
Reported-by: Joonas Kylmälä 
Signed-off-by: Masahiro Yamada 
Tested-by: Joonas Kylmälä 
Signed-off-by: Greg Kroah-Hartman 

---
 scripts/kconfig/confdata.c |7 +++
 scripts/kconfig/expr.h |1 +
 2 files changed, 4 insertions(+), 4 deletions(-)

--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -834,11 +834,12 @@ int conf_write(const char *name)
 "#\n"
 "# %s\n"
 "#\n", str);
-   } else if (!(sym->flags & SYMBOL_CHOICE)) {
+   } else if (!(sym->flags & SYMBOL_CHOICE) &&
+  !(sym->flags & SYMBOL_WRITTEN)) {
sym_calc_value(sym);
if (!(sym->flags & SYMBOL_WRITE))
goto next;
-   sym->flags &= ~SYMBOL_WRITE;
+   sym->flags |= SYMBOL_WRITTEN;
 
conf_write_symbol(out, sym, _printer_cb, NULL);
}
@@ -1024,8 +1025,6 @@ int conf_write_autoconf(int overwrite)
if (!overwrite && is_present(autoconf_name))
return 0;
 
-   sym_clear_all_valid();
-
conf_write_dep("include/config/auto.conf.cmd");
 
if (conf_split_config())
--- a/scripts/kconfig/expr.h
+++ b/scripts/kconfig/expr.h
@@ -141,6 +141,7 @@ struct symbol {
 #define SYMBOL_OPTIONAL   0x0100  /* choice is optional - values can be 'n' */
 #define SYMBOL_WRITE  0x0200  /* write symbol to file (KCONFIG_CONFIG) */
 #define SYMBOL_CHANGED0x0400  /* ? */
+#define SYMBOL_WRITTEN0x0800  /* track info to avoid double-write to 
.config */
 #define SYMBOL_NO_WRITE   0x1000  

[PATCH 4.19 240/271] coda: pass the host file in vma->vm_file on mmap

2019-07-24 Thread Greg Kroah-Hartman
From: Jan Harkes 

commit 7fa0a1da3dadfd9216df7745a1331fdaa0940d1c upstream.

Patch series "Coda updates".

The following patch series is a collection of various fixes for Coda,
most of which were collected from linux-fsdevel or linux-kernel but
which have as yet not found their way upstream.

This patch (of 22):

Various file systems expect that vma->vm_file points at their own file
handle, several use file_inode(vma->vm_file) to get at their inode or
use vma->vm_file->private_data.  However the way Coda wrapped mmap on a
host file broke this assumption, vm_file was still pointing at the Coda
file and the host file systems would scribble over Coda's inode and
private file data.

This patch fixes the incorrect expectation and wraps vm_ops->open and
vm_ops->close to allow Coda to track when the vm_area_struct is
destroyed so we still release the reference on the Coda file handle at
the right time.

Link: 
http://lkml.kernel.org/r/0e850c6e59c0b147dc2dcd51a3af004c948c3697.1558117389.git.jahar...@cs.cmu.edu
Signed-off-by: Jan Harkes 
Cc: Arnd Bergmann 
Cc: Colin Ian King 
Cc: Dan Carpenter 
Cc: David Howells 
Cc: Fabian Frederick 
Cc: Mikko Rapeli 
Cc: Sam Protsenko 
Cc: Yann Droneaud 
Cc: Zhouyang Jia 
Cc: 
Signed-off-by: Andrew Morton 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 fs/coda/file.c |   70 +++--
 1 file changed, 68 insertions(+), 2 deletions(-)

--- a/fs/coda/file.c
+++ b/fs/coda/file.c
@@ -27,6 +27,13 @@
 #include "coda_linux.h"
 #include "coda_int.h"
 
+struct coda_vm_ops {
+   atomic_t refcnt;
+   struct file *coda_file;
+   const struct vm_operations_struct *host_vm_ops;
+   struct vm_operations_struct vm_ops;
+};
+
 static ssize_t
 coda_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
 {
@@ -61,6 +68,34 @@ coda_file_write_iter(struct kiocb *iocb,
return ret;
 }
 
+static void
+coda_vm_open(struct vm_area_struct *vma)
+{
+   struct coda_vm_ops *cvm_ops =
+   container_of(vma->vm_ops, struct coda_vm_ops, vm_ops);
+
+   atomic_inc(_ops->refcnt);
+
+   if (cvm_ops->host_vm_ops && cvm_ops->host_vm_ops->open)
+   cvm_ops->host_vm_ops->open(vma);
+}
+
+static void
+coda_vm_close(struct vm_area_struct *vma)
+{
+   struct coda_vm_ops *cvm_ops =
+   container_of(vma->vm_ops, struct coda_vm_ops, vm_ops);
+
+   if (cvm_ops->host_vm_ops && cvm_ops->host_vm_ops->close)
+   cvm_ops->host_vm_ops->close(vma);
+
+   if (atomic_dec_and_test(_ops->refcnt)) {
+   vma->vm_ops = cvm_ops->host_vm_ops;
+   fput(cvm_ops->coda_file);
+   kfree(cvm_ops);
+   }
+}
+
 static int
 coda_file_mmap(struct file *coda_file, struct vm_area_struct *vma)
 {
@@ -68,6 +103,8 @@ coda_file_mmap(struct file *coda_file, s
struct coda_inode_info *cii;
struct file *host_file;
struct inode *coda_inode, *host_inode;
+   struct coda_vm_ops *cvm_ops;
+   int ret;
 
cfi = CODA_FTOC(coda_file);
BUG_ON(!cfi || cfi->cfi_magic != CODA_MAGIC);
@@ -76,6 +113,13 @@ coda_file_mmap(struct file *coda_file, s
if (!host_file->f_op->mmap)
return -ENODEV;
 
+   if (WARN_ON(coda_file != vma->vm_file))
+   return -EIO;
+
+   cvm_ops = kmalloc(sizeof(struct coda_vm_ops), GFP_KERNEL);
+   if (!cvm_ops)
+   return -ENOMEM;
+
coda_inode = file_inode(coda_file);
host_inode = file_inode(host_file);
 
@@ -89,6 +133,7 @@ coda_file_mmap(struct file *coda_file, s
 * the container file on us! */
else if (coda_inode->i_mapping != host_inode->i_mapping) {
spin_unlock(>c_lock);
+   kfree(cvm_ops);
return -EBUSY;
}
 
@@ -97,7 +142,29 @@ coda_file_mmap(struct file *coda_file, s
cfi->cfi_mapcount++;
spin_unlock(>c_lock);
 
-   return call_mmap(host_file, vma);
+   vma->vm_file = get_file(host_file);
+   ret = call_mmap(vma->vm_file, vma);
+
+   if (ret) {
+   /* if call_mmap fails, our caller will put coda_file so we
+* should drop the reference to the host_file that we got.
+*/
+   fput(host_file);
+   kfree(cvm_ops);
+   } else {
+   /* here we add redirects for the open/close vm_operations */
+   cvm_ops->host_vm_ops = vma->vm_ops;
+   if (vma->vm_ops)
+   cvm_ops->vm_ops = *vma->vm_ops;
+
+   cvm_ops->vm_ops.open = coda_vm_open;
+   cvm_ops->vm_ops.close = coda_vm_close;
+   cvm_ops->coda_file = coda_file;
+   atomic_set(_ops->refcnt, 1);
+
+   vma->vm_ops = _ops->vm_ops;
+   }
+   return ret;
 }
 
 int coda_open(struct inode *coda_inode, struct file *coda_file)
@@ -207,4 +274,3 @@ const struct file_operations coda_file_o
.fsync 

[PATCH 4.19 246/271] xfs: dont ever put nlink > 0 inodes on the unlinked list

2019-07-24 Thread Greg Kroah-Hartman
commit c4a6bf7f6cc7eb4cce120fb7eb1e1fb8b2d65e09 upstream.

When XFS creates an O_TMPFILE file, the inode is created with nlink = 1,
put on the unlinked list, and then the VFS sets nlink = 0 in d_tmpfile.
If we crash before anything logs the inode (it's dirty incore but the
vfs doesn't tell us it's dirty so we never log that change), the iunlink
processing part of recovery will then explode with a pile of:

XFS: Assertion failed: VFS_I(ip)->i_nlink == 0, file:
fs/xfs/xfs_log_recover.c, line: 5072

Worse yet, since nlink is nonzero, the inodes also don't get cleaned up
and they just leak until the next xfs_repair run.

Therefore, change xfs_iunlink to require that inodes being put on the
unlinked list have nlink == 0, change the tmpfile callers to instantiate
nodes that way, and set the nlink to 1 just prior to calling d_tmpfile.
Fix the comment for xfs_iunlink while we're at it.

Signed-off-by: Darrick J. Wong 
Reviewed-by: Christoph Hellwig 
Suggested-by: Amir Goldstein 
Reviewed-by: Amir Goldstein 
Signed-off-by: Luis Chamberlain 
Signed-off-by: Sasha Levin 
---
 fs/xfs/xfs_inode.c | 16 ++--
 fs/xfs/xfs_iops.c  | 13 +++--
 2 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index ae07baa7bdbf..5ed84d6c7059 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1332,7 +1332,7 @@ xfs_create_tmpfile(
if (error)
goto out_trans_cancel;
 
-   error = xfs_dir_ialloc(, dp, mode, 1, 0, prid, );
+   error = xfs_dir_ialloc(, dp, mode, 0, 0, prid, );
if (error)
goto out_trans_cancel;
 
@@ -1907,11 +1907,8 @@ xfs_inactive(
 }
 
 /*
- * This is called when the inode's link count goes to 0 or we are creating a
- * tmpfile via O_TMPFILE. In the case of a tmpfile, @ignore_linkcount will be
- * set to true as the link count is dropped to zero by the VFS after we've
- * created the file successfully, so we have to add it to the unlinked list
- * while the link count is non-zero.
+ * This is called when the inode's link count has gone to 0 or we are creating
+ * a tmpfile via O_TMPFILE.  The inode @ip must have nlink == 0.
  *
  * We place the on-disk inode on a list in the AGI.  It will be pulled from 
this
  * list when the inode is freed.
@@ -1931,6 +1928,7 @@ xfs_iunlink(
int offset;
int error;
 
+   ASSERT(VFS_I(ip)->i_nlink == 0);
ASSERT(VFS_I(ip)->i_mode != 0);
 
/*
@@ -2837,11 +2835,9 @@ xfs_rename_alloc_whiteout(
 
/*
 * Prepare the tmpfile inode as if it were created through the VFS.
-* Otherwise, the link increment paths will complain about nlink 0->1.
-* Drop the link count as done by d_tmpfile(), complete the inode setup
-* and flag it as linkable.
+* Complete the inode setup and flag it as linkable.  nlink is already
+* zero, so we can skip the drop_nlink.
 */
-   drop_nlink(VFS_I(tmpfile));
xfs_setup_iops(tmpfile);
xfs_finish_inode_setup(tmpfile);
VFS_I(tmpfile)->i_state |= I_LINKABLE;
diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
index f48ffd7a8d3e..1efef69a7f1c 100644
--- a/fs/xfs/xfs_iops.c
+++ b/fs/xfs/xfs_iops.c
@@ -191,9 +191,18 @@ xfs_generic_create(
 
xfs_setup_iops(ip);
 
-   if (tmpfile)
+   if (tmpfile) {
+   /*
+* The VFS requires that any inode fed to d_tmpfile must have
+* nlink == 1 so that it can decrement the nlink in d_tmpfile.
+* However, we created the temp file with nlink == 0 because
+* we're not allowed to put an inode with nlink > 0 on the
+* unlinked list.  Therefore we have to set nlink to 1 so that
+* d_tmpfile can immediately set it back to zero.
+*/
+   set_nlink(inode, 1);
d_tmpfile(dentry, inode);
-   else
+   } else
d_instantiate(dentry, inode);
 
xfs_finish_inode_setup(ip);
-- 
2.20.1





[PATCH 4.19 212/271] media: videobuf2-dma-sg: Prevent size from overflowing

2019-07-24 Thread Greg Kroah-Hartman
From: Sakari Ailus 

commit 14f28f5cea9e3998442de87846d1907a531b6748 upstream.

buf->size is an unsigned long; casting that to int will lead to an
overflow if buf->size exceeds INT_MAX.

Fix this by changing the type to unsigned long instead. This is possible
as the buf->size is always aligned to PAGE_SIZE, and therefore the size
will never have values lesser than 0.

Note on backporting to stable: the file used to be under
drivers/media/v4l2-core, it was moved to the current location after 4.14.

Signed-off-by: Sakari Ailus 
Cc: sta...@vger.kernel.org
Reviewed-by: Hans Verkuil 
Signed-off-by: Mauro Carvalho Chehab 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/media/common/videobuf2/videobuf2-dma-sg.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/drivers/media/common/videobuf2/videobuf2-dma-sg.c
+++ b/drivers/media/common/videobuf2/videobuf2-dma-sg.c
@@ -59,7 +59,7 @@ static int vb2_dma_sg_alloc_compacted(st
gfp_t gfp_flags)
 {
unsigned int last_page = 0;
-   int size = buf->size;
+   unsigned long size = buf->size;
 
while (size > 0) {
struct page *pages;




Re: [PATCH v10 3/5] overlayfs: add __get xattr method

2019-07-24 Thread Amir Goldstein
On Wed, Jul 24, 2019 at 10:57 PM Mark Salyzyn  wrote:
>
> Because of the overlayfs getxattr recursion, the incoming inode fails
> to update the selinux sid resulting in avc denials being reported
> against a target context of u:object_r:unlabeled:s0.

This description is too brief for me to understand the root problem.
What's wring with the overlayfs getxattr recursion w.r.t the selinux
security model?

Please give an example of your unprivileged mounter use case
to explain.

CC Vivek because I could really never understand all this.

>
> Solution is to add a _get xattr method that calls the __vfs_getxattr
> handler so that the context can be read in, rather than being denied
> with an -EACCES when vfs_getxattr handler is called.
>
> Signed-off-by: Mark Salyzyn 
> Cc: Miklos Szeredi 
> Cc: Jonathan Corbet 
> Cc: Vivek Goyal 
> Cc: Eric W. Biederman 
> Cc: Amir Goldstein 
> Cc: Randy Dunlap 
> Cc: Stephen Smalley 
> Cc: linux-unio...@vger.kernel.org
> Cc: linux-...@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> Cc: kernel-t...@android.com
> ---
> v10 - added to patch series
> ---
>  fs/overlayfs/inode.c | 15 +++
>  fs/overlayfs/overlayfs.h |  2 ++
>  fs/overlayfs/super.c | 18 ++
>  3 files changed, 35 insertions(+)
>
> diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
> index 7663aeb85fa3..d3b53849615c 100644
> --- a/fs/overlayfs/inode.c
> +++ b/fs/overlayfs/inode.c
> @@ -362,6 +362,21 @@ int ovl_xattr_set(struct dentry *dentry, struct inode 
> *inode, const char *name,
> return err;
>  }
>
> +int __ovl_xattr_get(struct dentry *dentry, struct inode *inode,
> +   const char *name, void *value, size_t size)
> +{
> +   ssize_t res;
> +   const struct cred *old_cred;
> +   struct dentry *realdentry =
> +   ovl_i_dentry_upper(inode) ?: ovl_dentry_lower(dentry);
> +
> +   old_cred = ovl_override_creds(dentry->d_sb);
> +   res = __vfs_getxattr(realdentry, d_inode(realdentry), name, value,
> +size);
> +   ovl_revert_creds(old_cred);
> +   return res;
> +}
> +
>  int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char 
> *name,
>   void *value, size_t size)
>  {
> diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h
> index 6934bcf030f0..73a02a263fbc 100644
> --- a/fs/overlayfs/overlayfs.h
> +++ b/fs/overlayfs/overlayfs.h
> @@ -357,6 +357,8 @@ int ovl_xattr_set(struct dentry *dentry, struct inode 
> *inode, const char *name,
>   const void *value, size_t size, int flags);
>  int ovl_xattr_get(struct dentry *dentry, struct inode *inode, const char 
> *name,
>   void *value, size_t size);
> +int __ovl_xattr_get(struct dentry *dentry, struct inode *inode,
> +   const char *name, void *value, size_t size);
>  ssize_t ovl_listxattr(struct dentry *dentry, char *list, size_t size);
>  struct posix_acl *ovl_get_acl(struct inode *inode, int type);
>  int ovl_update_time(struct inode *inode, struct timespec64 *ts, int flags);
> diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
> index b368e2e102fa..82e1130de206 100644
> --- a/fs/overlayfs/super.c
> +++ b/fs/overlayfs/super.c
> @@ -859,6 +859,14 @@ ovl_posix_acl_xattr_get(const struct xattr_handler 
> *handler,
> return ovl_xattr_get(dentry, inode, handler->name, buffer, size);
>  }
>
> +static int __maybe_unused
> +__ovl_posix_acl_xattr_get(const struct xattr_handler *handler,
> + struct dentry *dentry, struct inode *inode,
> + const char *name, void *buffer, size_t size)
> +{
> +   return __ovl_xattr_get(dentry, inode, handler->name, buffer, size);
> +}
> +
>  static int __maybe_unused
>  ovl_posix_acl_xattr_set(const struct xattr_handler *handler,
> struct dentry *dentry, struct inode *inode,
> @@ -939,6 +947,13 @@ static int ovl_other_xattr_get(const struct 
> xattr_handler *handler,
> return ovl_xattr_get(dentry, inode, name, buffer, size);
>  }
>
> +static int __ovl_other_xattr_get(const struct xattr_handler *handler,
> +struct dentry *dentry, struct inode *inode,
> +const char *name, void *buffer, size_t size)
> +{
> +   return __ovl_xattr_get(dentry, inode, name, buffer, size);
> +}
> +
>  static int ovl_other_xattr_set(const struct xattr_handler *handler,
>struct dentry *dentry, struct inode *inode,
>const char *name, const void *value,
> @@ -952,6 +967,7 @@ ovl_posix_acl_access_xattr_handler = {
> .name = XATTR_NAME_POSIX_ACL_ACCESS,
> .flags = ACL_TYPE_ACCESS,
> .get = ovl_posix_acl_xattr_get,
> +   .__get = __ovl_posix_acl_xattr_get,
> .set = ovl_posix_acl_xattr_set,
>  };
>
> @@ -960,6 +976,7 @@ ovl_posix_acl_default_xattr_handler = {
> .name = 

[PATCH 4.19 241/271] include/asm-generic/bug.h: fix "cut here" for WARN_ON for __WARN_TAINT architectures

2019-07-24 Thread Greg Kroah-Hartman
From: Drew Davenport 

commit 6b15f678fb7d5ef54e089e6ace72f007fe6e9895 upstream.

For architectures using __WARN_TAINT, the WARN_ON macro did not print
out the "cut here" string.  The other WARN_XXX macros would print "cut
here" inside __warn_printk, which is not called for WARN_ON since it
doesn't have a message to print.

Link: http://lkml.kernel.org/r/20190624154831.163888-1-ddavenp...@chromium.org
Fixes: a7bed27af194 ("bug: fix "cut here" location for __WARN_TAINT 
architectures")
Signed-off-by: Drew Davenport 
Acked-by: Kees Cook 
Tested-by: Kees Cook 
Cc: 
Signed-off-by: Andrew Morton 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 include/asm-generic/bug.h |6 --
 1 file changed, 4 insertions(+), 2 deletions(-)

--- a/include/asm-generic/bug.h
+++ b/include/asm-generic/bug.h
@@ -104,8 +104,10 @@ extern void warn_slowpath_null(const cha
warn_slowpath_fmt_taint(__FILE__, __LINE__, taint, arg)
 #else
 extern __printf(1, 2) void __warn_printk(const char *fmt, ...);
-#define __WARN()   __WARN_TAINT(TAINT_WARN)
-#define __WARN_printf(arg...)  do { __warn_printk(arg); __WARN(); } while (0)
+#define __WARN() do { \
+   printk(KERN_WARNING CUT_HERE); __WARN_TAINT(TAINT_WARN); \
+} while (0)
+#define __WARN_printf(arg...)  __WARN_printf_taint(TAINT_WARN, arg)
 #define __WARN_printf_taint(taint, arg...) \
do { __warn_printk(arg); __WARN_TAINT(taint); } while (0)
 #endif




[PATCH 4.19 242/271] xfs: fix pagecache truncation prior to reflink

2019-07-24 Thread Greg Kroah-Hartman
commit 4918ef4ea008cd2ff47eb852894e3f9b9047f4f3 upstream.

Prior to remapping blocks, it is necessary to remove pages from the
destination file's page cache.  Unfortunately, the truncation is not
aggressive enough -- if page size > block size, we'll end up zeroing
subpage blocks instead of removing them.  So, round the start offset
down and the end offset up to page boundaries.  We already wrote all
the dirty data so the larger range shouldn't be a problem.

Signed-off-by: Darrick J. Wong 
Reviewed-by: Dave Chinner 
Reviewed-by: Christoph Hellwig 
Signed-off-by: Dave Chinner 
Signed-off-by: Luis Chamberlain 
Signed-off-by: Sasha Levin 
---
 fs/xfs/xfs_reflink.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c
index 7088f44c0c59..38ea08a3dd1d 100644
--- a/fs/xfs/xfs_reflink.c
+++ b/fs/xfs/xfs_reflink.c
@@ -1369,8 +1369,9 @@ xfs_reflink_remap_prep(
goto out_unlock;
 
/* Zap any page cache for the destination file's range. */
-   truncate_inode_pages_range(_out->i_data, pos_out,
-  PAGE_ALIGN(pos_out + *len) - 1);
+   truncate_inode_pages_range(_out->i_data,
+   round_down(pos_out, PAGE_SIZE),
+   round_up(pos_out + *len, PAGE_SIZE) - 1);
 
/* If we're altering the file contents... */
if (!is_dedupe) {
-- 
2.20.1





[PATCH 4.19 269/271] net: mvmdio: allow up to four clocks to be specified for orion-mdio

2019-07-24 Thread Greg Kroah-Hartman
From: Josua Mayer 

commit 4aabed699c400810981d3dda170f05fa4d782905 upstream.

Allow up to four clocks to be specified and enabled for the orion-mdio
interface, which are required by the Armada 8k and defined in
armada-cp110.dtsi.

Fixes a hang in probing the mvmdio driver that was encountered on the
Clearfog GT 8K with all drivers built as modules, but also affects other
boards such as the MacchiatoBIN.

Cc: sta...@vger.kernel.org
Fixes: 96cb43423822 ("net: mvmdio: allow up to three clocks to be specified for 
orion-mdio")
Reviewed-by: Andrew Lunn 
Signed-off-by: Josua Mayer 
Signed-off-by: David S. Miller 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/net/ethernet/marvell/mvmdio.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/drivers/net/ethernet/marvell/mvmdio.c
+++ b/drivers/net/ethernet/marvell/mvmdio.c
@@ -64,7 +64,7 @@
 
 struct orion_mdio_dev {
void __iomem *regs;
-   struct clk *clk[3];
+   struct clk *clk[4];
/*
 * If we have access to the error interrupt pin (which is
 * somewhat misnamed as it not only reflects internal errors




Re: [PATCH v2 1/1] mm/memory-failure: Poison read receives SIGKILL instead of SIGBUS if mmaped more than once

2019-07-24 Thread Jane Chu




On 7/24/2019 4:43 PM, Naoya Horiguchi wrote:

On Wed, Jul 24, 2019 at 04:33:23PM -0600, Jane Chu wrote:

Mmap /dev/dax more than once, then read the poison location using address
from one of the mappings. The other mappings due to not having the page
mapped in will cause SIGKILLs delivered to the process. SIGKILL succeeds
over SIGBUS, so user process looses the opportunity to handle the UE.

Although one may add MAP_POPULATE to mmap(2) to work around the issue,
MAP_POPULATE makes mapping 128GB of pmem several magnitudes slower, so
isn't always an option.

Details -

ndctl inject-error --block=10 --count=1 namespace6.0

./read_poison -x dax6.0 -o 5120 -m 2
mmaped address 0x7f5bb660
mmaped address 0x7f3cf360
doing local read at address 0x7f3cf3601400
Killed

Console messages in instrumented kernel -

mce: Uncorrected hardware memory error in user-access at edbe201400
Memory failure: tk->addr = 7f5bb6601000
Memory failure: address edbe201: call dev_pagemap_mapping_shift
dev_pagemap_mapping_shift: page edbe201: no PUD
Memory failure: tk->size_shift == 0
Memory failure: Unable to find user space address edbe201 in read_poison
Memory failure: tk->addr = 7f3cf3601000
Memory failure: address edbe201: call dev_pagemap_mapping_shift
Memory failure: tk->size_shift = 21
Memory failure: 0xedbe201: forcibly killing read_poison:22434 because of 
failure to unmap corrupted page
   => to deliver SIGKILL
Memory failure: 0xedbe201: Killing read_poison:22434 due to hardware memory 
corruption
   => to deliver SIGBUS

Signed-off-by: Jane Chu 
Suggested-by: Naoya Horiguchi 
---
  mm/memory-failure.c | 62 ++---
  1 file changed, 26 insertions(+), 36 deletions(-)

diff --git a/mm/memory-failure.c b/mm/memory-failure.c
index d9cc660..bd4db33 100644
--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -199,7 +199,6 @@ struct to_kill {
struct task_struct *tsk;
unsigned long addr;
short size_shift;
-   char addr_valid;
  };
  
  /*

@@ -304,43 +303,43 @@ static unsigned long dev_pagemap_mapping_shift(struct 
page *page,
  /*
   * Schedule a process for later kill.
   * Uses GFP_ATOMIC allocations to avoid potential recursions in the VM.
- * TBD would GFP_NOIO be enough?
   */
  static void add_to_kill(struct task_struct *tsk, struct page *p,
   struct vm_area_struct *vma,
-  struct list_head *to_kill,
-  struct to_kill **tkc)
+  struct list_head *to_kill)
  {
struct to_kill *tk;
  
-	if (*tkc) {

-   tk = *tkc;
-   *tkc = NULL;
-   } else {
-   tk = kmalloc(sizeof(struct to_kill), GFP_ATOMIC);
-   if (!tk) {
-   pr_err("Memory failure: Out of memory while machine check 
handling\n");
-   return;
-   }
+   tk = kmalloc(sizeof(struct to_kill), GFP_ATOMIC);
+   if (!tk) {
+   pr_err("Memory failure: Out of memory while machine check 
handling\n");
+   return;


As Dan pointed out, the cleanup part can be delivered as a separate patch.


My bad, will take care splitting up the patch.




}
+
tk->addr = page_address_in_vma(p, vma);
-   tk->addr_valid = 1;
if (is_zone_device_page(p))
tk->size_shift = dev_pagemap_mapping_shift(p, vma);
else
tk->size_shift = compound_order(compound_head(p)) + PAGE_SHIFT;
  
  	/*

-* In theory we don't have to kill when the page was
-* munmaped. But it could be also a mremap. Since that's
-* likely very rare kill anyways just out of paranoia, but use
-* a SIGKILL because the error is not contained anymore.
+* Send SIGKILL if "tk->addr == -EFAULT". Also, as
+* "tk->size_shift" is always non-zero for !is_zone_device_page(),
+* so "tk->size_shift == 0" effectively checks no mapping on
+* ZONE_DEVICE. Indeed, when a devdax page is mmapped N times
+* to a process' address space, it's possible not all N VMAs
+* contain mappings for the page, but at least one VMA does.
+* Only deliver SIGBUS with payload derived from the VMA that
+* has a mapping for the page.


OK, so SIGBUSs are sent M times (where M is the number of mappings
for the page). Then I'm convinced that we need "else if" block below.


Yes. I run read_poison that mmaps /dev/dax 4 times with MAPS_POPULATE flag
set, so the kernel attempted sending SIGBUS 4 times.
One time, while the poison was consumed at uaddr[1] (2nd mmap), but the
SIGBUS payload indicated the si_addr was uaddr[3] (4th mmap).

thanks!
-jane




Thanks,
Naoya Horiguchi


 */
-   if (tk->addr == -EFAULT || tk->size_shift == 0) {
+   if (tk->addr == -EFAULT) {
pr_info("Memory failure: Unable to find user space address %lx in 
%s\n",
page_to_pfn(p), tsk->comm);
-   

[PATCH 4.19 253/271] parisc: Ensure userspace privilege for ptraced processes in regset functions

2019-07-24 Thread Greg Kroah-Hartman
From: Helge Deller 

commit 34c32fc603311a72cb558e5e337555434f64c27b upstream.

On parisc the privilege level of a process is stored in the lowest two bits of
the instruction pointers (IAOQ0 and IAOQ1). On Linux we use privilege level 0
for the kernel and privilege level 3 for user-space. So userspace should not be
allowed to modify IAOQ0 or IAOQ1 of a ptraced process to change it's privilege
level to e.g. 0 to try to gain kernel privileges.

This patch prevents such modifications in the regset support functions by
always setting the two lowest bits to one (which relates to privilege level 3
for user-space) if IAOQ0 or IAOQ1 are modified via ptrace regset calls.

Link: https://bugs.gentoo.org/481768
Cc:  # v4.7+
Tested-by: Rolf Eike Beer 
Signed-off-by: Helge Deller 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/parisc/kernel/ptrace.c |3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

--- a/arch/parisc/kernel/ptrace.c
+++ b/arch/parisc/kernel/ptrace.c
@@ -496,7 +496,8 @@ static void set_reg(struct pt_regs *regs
return;
case RI(iaoq[0]):
case RI(iaoq[1]):
-   regs->iaoq[num - RI(iaoq[0])] = val;
+   /* set 2 lowest bits to ensure userspace privilege: */
+   regs->iaoq[num - RI(iaoq[0])] = val | 3;
return;
case RI(sar):   regs->sar = val;
return;




[PATCH 4.19 255/271] powerpc/32s: fix suspend/resume when IBATs 4-7 are used

2019-07-24 Thread Greg Kroah-Hartman
From: Christophe Leroy 

commit 6ecb78ef56e08d2119d337ae23cb951a640dc52d upstream.

Previously, only IBAT1 and IBAT2 were used to map kernel linear mem.
Since commit 63b2bc619565 ("powerpc/mm/32s: Use BATs for
STRICT_KERNEL_RWX"), we may have all 8 BATs used for mapping
kernel text. But the suspend/restore functions only save/restore
BATs 0 to 3, and clears BATs 4 to 7.

Make suspend and restore functions respectively save and reload
the 8 BATs on CPUs having MMU_FTR_USE_HIGH_BATS feature.

Reported-by: Andreas Schwab 
Cc: sta...@vger.kernel.org
Signed-off-by: Christophe Leroy 
Signed-off-by: Michael Ellerman 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/powerpc/kernel/swsusp_32.S |   73 
 arch/powerpc/platforms/powermac/sleep.S |   68 +++--
 2 files changed, 128 insertions(+), 13 deletions(-)

--- a/arch/powerpc/kernel/swsusp_32.S
+++ b/arch/powerpc/kernel/swsusp_32.S
@@ -25,11 +25,19 @@
 #define SL_IBAT2   0x48
 #define SL_DBAT3   0x50
 #define SL_IBAT3   0x58
-#define SL_TB  0x60
-#define SL_R2  0x68
-#define SL_CR  0x6c
-#define SL_LR  0x70
-#define SL_R12 0x74/* r12 to r31 */
+#define SL_DBAT4   0x60
+#define SL_IBAT4   0x68
+#define SL_DBAT5   0x70
+#define SL_IBAT5   0x78
+#define SL_DBAT6   0x80
+#define SL_IBAT6   0x88
+#define SL_DBAT7   0x90
+#define SL_IBAT7   0x98
+#define SL_TB  0xa0
+#define SL_R2  0xa8
+#define SL_CR  0xac
+#define SL_LR  0xb0
+#define SL_R12 0xb4/* r12 to r31 */
 #define SL_SIZE(SL_R12 + 80)
 
.section .data
@@ -114,6 +122,41 @@ _GLOBAL(swsusp_arch_suspend)
mfibatl r4,3
stw r4,SL_IBAT3+4(r11)
 
+BEGIN_MMU_FTR_SECTION
+   mfspr   r4,SPRN_DBAT4U
+   stw r4,SL_DBAT4(r11)
+   mfspr   r4,SPRN_DBAT4L
+   stw r4,SL_DBAT4+4(r11)
+   mfspr   r4,SPRN_DBAT5U
+   stw r4,SL_DBAT5(r11)
+   mfspr   r4,SPRN_DBAT5L
+   stw r4,SL_DBAT5+4(r11)
+   mfspr   r4,SPRN_DBAT6U
+   stw r4,SL_DBAT6(r11)
+   mfspr   r4,SPRN_DBAT6L
+   stw r4,SL_DBAT6+4(r11)
+   mfspr   r4,SPRN_DBAT7U
+   stw r4,SL_DBAT7(r11)
+   mfspr   r4,SPRN_DBAT7L
+   stw r4,SL_DBAT7+4(r11)
+   mfspr   r4,SPRN_IBAT4U
+   stw r4,SL_IBAT4(r11)
+   mfspr   r4,SPRN_IBAT4L
+   stw r4,SL_IBAT4+4(r11)
+   mfspr   r4,SPRN_IBAT5U
+   stw r4,SL_IBAT5(r11)
+   mfspr   r4,SPRN_IBAT5L
+   stw r4,SL_IBAT5+4(r11)
+   mfspr   r4,SPRN_IBAT6U
+   stw r4,SL_IBAT6(r11)
+   mfspr   r4,SPRN_IBAT6L
+   stw r4,SL_IBAT6+4(r11)
+   mfspr   r4,SPRN_IBAT7U
+   stw r4,SL_IBAT7(r11)
+   mfspr   r4,SPRN_IBAT7L
+   stw r4,SL_IBAT7+4(r11)
+END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS)
+
 #if  0
/* Backup various CPU config stuffs */
bl  __save_cpu_setup
@@ -279,27 +322,41 @@ END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
mtibatu 3,r4
lwz r4,SL_IBAT3+4(r11)
mtibatl 3,r4
-#endif
-
 BEGIN_MMU_FTR_SECTION
-   li  r4,0
+   lwz r4,SL_DBAT4(r11)
mtspr   SPRN_DBAT4U,r4
+   lwz r4,SL_DBAT4+4(r11)
mtspr   SPRN_DBAT4L,r4
+   lwz r4,SL_DBAT5(r11)
mtspr   SPRN_DBAT5U,r4
+   lwz r4,SL_DBAT5+4(r11)
mtspr   SPRN_DBAT5L,r4
+   lwz r4,SL_DBAT6(r11)
mtspr   SPRN_DBAT6U,r4
+   lwz r4,SL_DBAT6+4(r11)
mtspr   SPRN_DBAT6L,r4
+   lwz r4,SL_DBAT7(r11)
mtspr   SPRN_DBAT7U,r4
+   lwz r4,SL_DBAT7+4(r11)
mtspr   SPRN_DBAT7L,r4
+   lwz r4,SL_IBAT4(r11)
mtspr   SPRN_IBAT4U,r4
+   lwz r4,SL_IBAT4+4(r11)
mtspr   SPRN_IBAT4L,r4
+   lwz r4,SL_IBAT5(r11)
mtspr   SPRN_IBAT5U,r4
+   lwz r4,SL_IBAT5+4(r11)
mtspr   SPRN_IBAT5L,r4
+   lwz r4,SL_IBAT6(r11)
mtspr   SPRN_IBAT6U,r4
+   lwz r4,SL_IBAT6+4(r11)
mtspr   SPRN_IBAT6L,r4
+   lwz r4,SL_IBAT7(r11)
mtspr   SPRN_IBAT7U,r4
+   lwz r4,SL_IBAT7+4(r11)
mtspr   SPRN_IBAT7L,r4
 END_MMU_FTR_SECTION_IFSET(MMU_FTR_USE_HIGH_BATS)
+#endif
 
/* Flush all TLBs */
lis r4,0x1000
--- a/arch/powerpc/platforms/powermac/sleep.S
+++ b/arch/powerpc/platforms/powermac/sleep.S
@@ -38,10 +38,18 @@
 #define SL_IBAT2   0x48
 #define SL_DBAT3   0x50
 #define SL_IBAT3   0x58
-#define SL_TB  0x60
-#define SL_R2  0x68
-#define SL_CR  0x6c
-#define SL_R12 0x70/* r12 to r31 */
+#define SL_DBAT4   0x60
+#define SL_IBAT4   0x68
+#define SL_DBAT5   0x70
+#define SL_IBAT5   0x78
+#define SL_DBAT6   0x80
+#define SL_IBAT6   0x88
+#define SL_DBAT7   0x90
+#define SL_IBAT7   0x98
+#define SL_TB  0xa0
+#define SL_R2  0xa8
+#define SL_CR  0xac

[PATCH 4.19 259/271] mmc: sdhci-msm: fix mutex while in spinlock

2019-07-24 Thread Greg Kroah-Hartman
From: Jorge Ramirez-Ortiz 

commit 5e6b6651d22de109ebf48ca00d0373bc2c0cc080 upstream.

mutexes can sleep and therefore should not be taken while holding a
spinlock. move clk_get_rate (can sleep) outside the spinlock protected
region.

Fixes: 83736352e0ca ("mmc: sdhci-msm: Update DLL reset sequence")
Cc: sta...@vger.kernel.org
Signed-off-by: Jorge Ramirez-Ortiz 
Reviewed-by: Bjorn Andersson 
Reviewed-by: Vinod Koul 
Acked-by: Adrian Hunter 
Signed-off-by: Ulf Hansson 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/mmc/host/sdhci-msm.c |9 ++---
 1 file changed, 6 insertions(+), 3 deletions(-)

--- a/drivers/mmc/host/sdhci-msm.c
+++ b/drivers/mmc/host/sdhci-msm.c
@@ -582,11 +582,14 @@ static int msm_init_cm_dll(struct sdhci_
struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host);
struct sdhci_msm_host *msm_host = sdhci_pltfm_priv(pltfm_host);
int wait_cnt = 50;
-   unsigned long flags;
+   unsigned long flags, xo_clk = 0;
u32 config;
const struct sdhci_msm_offset *msm_offset =
msm_host->offset;
 
+   if (msm_host->use_14lpp_dll_reset && !IS_ERR_OR_NULL(msm_host->xo_clk))
+   xo_clk = clk_get_rate(msm_host->xo_clk);
+
spin_lock_irqsave(>lock, flags);
 
/*
@@ -634,10 +637,10 @@ static int msm_init_cm_dll(struct sdhci_
config &= CORE_FLL_CYCLE_CNT;
if (config)
mclk_freq = DIV_ROUND_CLOSEST_ULL((host->clock * 8),
-   clk_get_rate(msm_host->xo_clk));
+   xo_clk);
else
mclk_freq = DIV_ROUND_CLOSEST_ULL((host->clock * 4),
-   clk_get_rate(msm_host->xo_clk));
+   xo_clk);
 
config = readl_relaxed(host->ioaddr +
msm_offset->core_dll_config_2);




[PATCH 4.19 258/271] powerpc/pseries: Fix oops in hotplug memory notifier

2019-07-24 Thread Greg Kroah-Hartman
From: Nathan Lynch 

commit 0aa82c482ab2ece530a6f44897b63b274bb43c8e upstream.

During post-migration device tree updates, we can oops in
pseries_update_drconf_memory() if the source device tree has an
ibm,dynamic-memory-v2 property and the destination has a
ibm,dynamic_memory (v1) property. The notifier processes an "update"
for the ibm,dynamic-memory property but it's really an add in this
scenario. So make sure the old property object is there before
dereferencing it.

Fixes: 2b31e3aec1db ("powerpc/drmem: Add support for ibm, dynamic-memory-v2 
property")
Cc: sta...@vger.kernel.org # v4.16+
Signed-off-by: Nathan Lynch 
Signed-off-by: Michael Ellerman 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/powerpc/platforms/pseries/hotplug-memory.c |3 +++
 1 file changed, 3 insertions(+)

--- a/arch/powerpc/platforms/pseries/hotplug-memory.c
+++ b/arch/powerpc/platforms/pseries/hotplug-memory.c
@@ -1012,6 +1012,9 @@ static int pseries_update_drconf_memory(
if (!memblock_size)
return -EINVAL;
 
+   if (!pr->old_prop)
+   return 0;
+
p = (__be32 *) pr->old_prop->value;
if (!p)
return -EINVAL;




[PATCH 4.19 271/271] dm bufio: fix deadlock with loop device

2019-07-24 Thread Greg Kroah-Hartman
From: Junxiao Bi 

commit bd293d071ffe65e645b4d8104f9d8fe15ea13862 upstream.

When thin-volume is built on loop device, if available memory is low,
the following deadlock can be triggered:

One process P1 allocates memory with GFP_FS flag, direct alloc fails,
memory reclaim invokes memory shrinker in dm_bufio, dm_bufio_shrink_scan()
runs, mutex dm_bufio_client->lock is acquired, then P1 waits for dm_buffer
IO to complete in __try_evict_buffer().

But this IO may never complete if issued to an underlying loop device
that forwards it using direct-IO, which allocates memory using
GFP_KERNEL (see: do_blockdev_direct_IO()).  If allocation fails, memory
reclaim will invoke memory shrinker in dm_bufio, dm_bufio_shrink_scan()
will be invoked, and since the mutex is already held by P1 the loop
thread will hang, and IO will never complete.  Resulting in ABBA
deadlock.

Cc: sta...@vger.kernel.org
Signed-off-by: Junxiao Bi 
Signed-off-by: Mike Snitzer 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/md/dm-bufio.c |4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

--- a/drivers/md/dm-bufio.c
+++ b/drivers/md/dm-bufio.c
@@ -1602,9 +1602,7 @@ dm_bufio_shrink_scan(struct shrinker *sh
unsigned long freed;
 
c = container_of(shrink, struct dm_bufio_client, shrinker);
-   if (sc->gfp_mask & __GFP_FS)
-   dm_bufio_lock(c);
-   else if (!dm_bufio_trylock(c))
+   if (!dm_bufio_trylock(c))
return SHRINK_STOP;
 
freed  = __scan(c, sc->nr_to_scan, sc->gfp_mask);




[PATCH 4.19 270/271] dt-bindings: allow up to four clocks for orion-mdio

2019-07-24 Thread Greg Kroah-Hartman
From: Josua Mayer 

commit 80785f5a22e9073e2ded5958feb7f220e066d17b upstream.

Armada 8040 needs four clocks to be enabled for MDIO accesses to work.
Update the binding to allow the extra clock to be specified.

Cc: sta...@vger.kernel.org
Fixes: 6d6a331f44a1 ("dt-bindings: allow up to three clocks for orion-mdio")
Reviewed-by: Andrew Lunn 
Signed-off-by: Josua Mayer 
Signed-off-by: David S. Miller 
Signed-off-by: Greg Kroah-Hartman 

---
 Documentation/devicetree/bindings/net/marvell-orion-mdio.txt |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/Documentation/devicetree/bindings/net/marvell-orion-mdio.txt
+++ b/Documentation/devicetree/bindings/net/marvell-orion-mdio.txt
@@ -16,7 +16,7 @@ Required properties:
 
 Optional properties:
 - interrupts: interrupt line number for the SMI error/done interrupt
-- clocks: phandle for up to three required clocks for the MDIO instance
+- clocks: phandle for up to four required clocks for the MDIO instance
 
 The child nodes of the MDIO driver are the individual PHY devices
 connected to this MDIO bus. They must have a "reg" property given the




[PATCH 4.19 257/271] powerpc/powernv/npu: Fix reference leak

2019-07-24 Thread Greg Kroah-Hartman
From: Greg Kurz 

commit 02c5f5394918b9b47ff4357b1b18335768cd867d upstream.

Since 902bdc57451c, get_pci_dev() calls pci_get_domain_bus_and_slot(). This
has the effect of incrementing the reference count of the PCI device, as
explained in drivers/pci/search.c:

 * Given a PCI domain, bus, and slot/function number, the desired PCI
 * device is located in the list of PCI devices. If the device is
 * found, its reference count is increased and this function returns a
 * pointer to its data structure.  The caller must decrement the
 * reference count by calling pci_dev_put().  If no device is found,
 * %NULL is returned.

Nothing was done to call pci_dev_put() and the reference count of GPU and
NPU PCI devices rockets up.

A natural way to fix this would be to teach the callers about the change,
so that they call pci_dev_put() when done with the pointer. This turns
out to be quite intrusive, as it affects many paths in npu-dma.c,
pci-ioda.c and vfio_pci_nvlink2.c. Also, the issue appeared in 4.16 and
some affected code got moved around since then: it would be problematic
to backport the fix to stable releases.

All that code never cared for reference counting anyway. Call pci_dev_put()
from get_pci_dev() to revert to the previous behavior.

Fixes: 902bdc57451c ("powerpc/powernv/idoa: Remove unnecessary pcidev from 
pci_dn")
Cc: sta...@vger.kernel.org # v4.16
Signed-off-by: Greg Kurz 
Reviewed-by: Alexey Kardashevskiy 
Signed-off-by: Michael Ellerman 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/powerpc/platforms/powernv/npu-dma.c |   15 ++-
 1 file changed, 14 insertions(+), 1 deletion(-)

--- a/arch/powerpc/platforms/powernv/npu-dma.c
+++ b/arch/powerpc/platforms/powernv/npu-dma.c
@@ -56,9 +56,22 @@ static struct dentry *atsd_threshold_den
 static struct pci_dev *get_pci_dev(struct device_node *dn)
 {
struct pci_dn *pdn = PCI_DN(dn);
+   struct pci_dev *pdev;
 
-   return pci_get_domain_bus_and_slot(pci_domain_nr(pdn->phb->bus),
+   pdev = pci_get_domain_bus_and_slot(pci_domain_nr(pdn->phb->bus),
   pdn->busno, pdn->devfn);
+
+   /*
+* pci_get_domain_bus_and_slot() increased the reference count of
+* the PCI device, but callers don't need that actually as the PE
+* already holds a reference to the device. Since callers aren't
+* aware of the reference count change, call pci_dev_put() now to
+* avoid leaks.
+*/
+   if (pdev)
+   pci_dev_put(pdev);
+
+   return pdev;
 }
 
 /* Given a NPU device get the associated PCI device. */




[PATCH 4.19 268/271] blkcg: update blkcg_print_stat() to handle larger outputs

2019-07-24 Thread Greg Kroah-Hartman
From: Tejun Heo 

commit f539da82f2158916e154d206054e0efd5df7ab61 upstream.

Depending on the number of devices, blkcg stats can go over the
default seqfile buf size.  seqfile normally retries with a larger
buffer but since the ->pd_stat() addition, blkcg_print_stat() doesn't
tell seqfile that overflow has happened and the output gets printed
truncated.  Fix it by calling seq_commit() w/ -1 on possible
overflows.

Signed-off-by: Tejun Heo 
Fixes: 903d23f0a354 ("blk-cgroup: allow controllers to output their own stats")
Cc: sta...@vger.kernel.org # v4.19+
Cc: Josef Bacik 
Signed-off-by: Jens Axboe 
Signed-off-by: Greg Kroah-Hartman 

---
 block/blk-cgroup.c |8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

--- a/block/blk-cgroup.c
+++ b/block/blk-cgroup.c
@@ -1016,8 +1016,12 @@ static int blkcg_print_stat(struct seq_f
}
 next:
if (has_stats) {
-   off += scnprintf(buf+off, size-off, "\n");
-   seq_commit(sf, off);
+   if (off < size - 1) {
+   off += scnprintf(buf+off, size-off, "\n");
+   seq_commit(sf, off);
+   } else {
+   seq_commit(sf, -1);
+   }
}
}
 




[PATCH 4.19 256/271] powerpc/watchpoint: Restore NV GPRs while returning from exception

2019-07-24 Thread Greg Kroah-Hartman
From: Ravi Bangoria 

commit f474c28fbcbe42faca4eb415172c07d76adcb819 upstream.

powerpc hardware triggers watchpoint before executing the instruction.
To make trigger-after-execute behavior, kernel emulates the
instruction. If the instruction is 'load something into non-volatile
register', exception handler should restore emulated register state
while returning back, otherwise there will be register state
corruption. eg, adding a watchpoint on a list can corrput the list:

  # cat /proc/kallsyms | grep kthread_create_list
  c121c8b8 d kthread_create_list

Add watchpoint on kthread_create_list->prev:

  # perf record -e mem:0xc121c8c0

Run some workload such that new kthread gets invoked. eg, I just
logged out from console:

  list_add corruption. next->prev should be prev (c1214e00), \
but was c121c8b8. (next=c121c8b8).
  WARNING: CPU: 59 PID: 309 at lib/list_debug.c:25 __list_add_valid+0xb4/0xc0
  CPU: 59 PID: 309 Comm: kworker/59:0 Kdump: loaded Not tainted 5.1.0-rc7+ #69
  ...
  NIP __list_add_valid+0xb4/0xc0
  LR __list_add_valid+0xb0/0xc0
  Call Trace:
  __list_add_valid+0xb0/0xc0 (unreliable)
  __kthread_create_on_node+0xe0/0x260
  kthread_create_on_node+0x34/0x50
  create_worker+0xe8/0x260
  worker_thread+0x444/0x560
  kthread+0x160/0x1a0
  ret_from_kernel_thread+0x5c/0x70

List corruption happened because it uses 'load into non-volatile
register' instruction:

Snippet from __kthread_create_on_node:

  c0136be8: addis   r29,r2,-19
  c0136bec: ld  r29,31424(r29)
if (!__list_add_valid(new, prev, next))
  c0136bf0: mr  r3,r30
  c0136bf4: mr  r5,r28
  c0136bf8: mr  r4,r29
  c0136bfc: bl  c059a2f8 <__list_add_valid+0x8>

Register state from WARN_ON():

  GPR00: c059a3a0 c07ff23afb50 c1344e00 0075
  GPR04:   001852af8bc1 
  GPR08: 0001 0007 0006 04aa
  GPR12:  c07eb080 c0137038 c05ff62aaa00
  GPR16:   c07fffbe7600 c07fffbe7370
  GPR20: c07fffbe7320 c07fffbe7300 c1373a00 
  GPR24: fef7 c012e320 c07ff23afcb0 c0cb8628
  GPR28: c121c8b8 c1214e00 c07fef5b17e8 c07fef5b17c0

Watchpoint hit at 0xc0136bec.

  addis   r29,r2,-19
   => r29 = 0xc1344e00 + (-19 << 16)
   => r29 = 0xc1214e00

  ld  r29,31424(r29)
   => r29 = *(0xc1214e00 + 31424)
   => r29 = *(0xc121c8c0)

0xc121c8c0 is where we placed a watchpoint and thus this
instruction was emulated by emulate_step. But because handle_dabr_fault
did not restore emulated register state, r29 still contains stale
value in above register state.

Fixes: 5aae8a5370802 ("powerpc, hw_breakpoints: Implement hw_breakpoints for 
64-bit server processors")
Signed-off-by: Ravi Bangoria 
Cc: sta...@vger.kernel.org # 2.6.36+
Signed-off-by: Michael Ellerman 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/powerpc/kernel/exceptions-64s.S |9 +++--
 1 file changed, 7 insertions(+), 2 deletions(-)

--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -1745,7 +1745,7 @@ handle_page_fault:
addir3,r1,STACK_FRAME_OVERHEAD
bl  do_page_fault
cmpdi   r3,0
-   beq+12f
+   beq+ret_from_except_lite
bl  save_nvgprs
mr  r5,r3
addir3,r1,STACK_FRAME_OVERHEAD
@@ -1760,7 +1760,12 @@ handle_dabr_fault:
ld  r5,_DSISR(r1)
addir3,r1,STACK_FRAME_OVERHEAD
bl  do_break
-12:b   ret_from_except_lite
+   /*
+* do_break() may have changed the NV GPRS while handling a breakpoint.
+* If so, we need to restore them with their updated values. Don't use
+* ret_from_except_lite here.
+*/
+   b   ret_from_except
 
 
 #ifdef CONFIG_PPC_BOOK3S_64




[PATCH 4.19 261/271] mtd: rawnand: mtk: Correct low level time calculation of r/w cycle

2019-07-24 Thread Greg Kroah-Hartman
From: Xiaolei Li 

commit e1884ffddacc0424d7e785e6f8087bd12f7196db upstream.

At present, the flow of calculating AC timing of read/write cycle in SDR
mode is that:
At first, calculate high hold time which is valid for both read and write
cycle using the max value between tREH_min and tWH_min.
Secondly, calculate WE# pulse width using tWP_min.
Thridly, calculate RE# pulse width using the bigger one between tREA_max
and tRP_min.

But NAND SPEC shows that Controller should also meet write/read cycle time.
That is write cycle time should be more than tWC_min and read cycle should
be more than tRC_min. Obviously, we do not achieve that now.

This patch corrects the low level time calculation to meet minimum
read/write cycle time required. After getting the high hold time, WE# low
level time will be promised to meet tWP_min and tWC_min requirement,
and RE# low level time will be promised to meet tREA_max, tRP_min and
tRC_min requirement.

Fixes: edfee3619c49 ("mtd: nand: mtk: add ->setup_data_interface() hook")
Cc: sta...@vger.kernel.org # v4.17+
Signed-off-by: Xiaolei Li 
Reviewed-by: Miquel Raynal 
Signed-off-by: Miquel Raynal 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/mtd/nand/raw/mtk_nand.c |   24 +---
 1 file changed, 21 insertions(+), 3 deletions(-)

--- a/drivers/mtd/nand/raw/mtk_nand.c
+++ b/drivers/mtd/nand/raw/mtk_nand.c
@@ -509,7 +509,8 @@ static int mtk_nfc_setup_data_interface(
 {
struct mtk_nfc *nfc = nand_get_controller_data(mtd_to_nand(mtd));
const struct nand_sdr_timings *timings;
-   u32 rate, tpoecs, tprecs, tc2r, tw2r, twh, twst, trlt;
+   u32 rate, tpoecs, tprecs, tc2r, tw2r, twh, twst = 0, trlt = 0;
+   u32 thold;
 
timings = nand_get_sdr_timings(conf);
if (IS_ERR(timings))
@@ -545,11 +546,28 @@ static int mtk_nfc_setup_data_interface(
twh = DIV_ROUND_UP(twh * rate, 100) - 1;
twh &= 0xf;
 
-   twst = timings->tWP_min / 1000;
+   /* Calculate real WE#/RE# hold time in nanosecond */
+   thold = (twh + 1) * 100 / rate;
+   /* nanosecond to picosecond */
+   thold *= 1000;
+
+   /*
+* WE# low level time should be expaned to meet WE# pulse time
+* and WE# cycle time at the same time.
+*/
+   if (thold < timings->tWC_min)
+   twst = timings->tWC_min - thold;
+   twst = max(timings->tWP_min, twst) / 1000;
twst = DIV_ROUND_UP(twst * rate, 100) - 1;
twst &= 0xf;
 
-   trlt = max(timings->tREA_max, timings->tRP_min) / 1000;
+   /*
+* RE# low level time should be expaned to meet RE# pulse time,
+* RE# access time and RE# cycle time at the same time.
+*/
+   if (thold < timings->tRC_min)
+   trlt = timings->tRC_min - thold;
+   trlt = max3(trlt, timings->tREA_max, timings->tRP_min) / 1000;
trlt = DIV_ROUND_UP(trlt * rate, 100) - 1;
trlt &= 0xf;
 




[PATCH 4.19 267/271] blk-iolatency: clear use_delay when io.latency is set to zero

2019-07-24 Thread Greg Kroah-Hartman
From: Tejun Heo 

commit 5de0073fcd50cc1f150895a7bb04d3cf8067b1d7 upstream.

If use_delay was non-zero when the latency target of a cgroup was set
to zero, it will stay stuck until io.latency is enabled on the cgroup
again.  This keeps readahead disabled for the cgroup impacting
performance negatively.

Signed-off-by: Tejun Heo 
Cc: Josef Bacik 
Fixes: d70675121546 ("block: introduce blk-iolatency io controller")
Cc: sta...@vger.kernel.org # v4.19+
Signed-off-by: Jens Axboe 
Signed-off-by: Greg Kroah-Hartman 

---
 block/blk-iolatency.c |4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

--- a/block/blk-iolatency.c
+++ b/block/blk-iolatency.c
@@ -746,8 +746,10 @@ static int iolatency_set_min_lat_nsec(st
 
if (!oldval && val)
return 1;
-   if (oldval && !val)
+   if (oldval && !val) {
+   blkcg_clear_delay(blkg);
return -1;
+   }
return 0;
 }
 




[PATCH 4.19 260/271] eCryptfs: fix a couple type promotion bugs

2019-07-24 Thread Greg Kroah-Hartman
From: Dan Carpenter 

commit 0bdf8a8245fdea6f075a5fede833a5fcf1b3466c upstream.

ECRYPTFS_SIZE_AND_MARKER_BYTES is type size_t, so if "rc" is negative
that gets type promoted to a high positive value and treated as success.

Fixes: 778aeb42a708 ("eCryptfs: Cleanup and optimize 
ecryptfs_lookup_interpose()")
Signed-off-by: Dan Carpenter 
[tyhicks: Use "if/else if" rather than "if/if"]
Cc: sta...@vger.kernel.org
Signed-off-by: Tyler Hicks 
Signed-off-by: Greg Kroah-Hartman 

---
 fs/ecryptfs/crypto.c |   12 
 1 file changed, 8 insertions(+), 4 deletions(-)

--- a/fs/ecryptfs/crypto.c
+++ b/fs/ecryptfs/crypto.c
@@ -1018,8 +1018,10 @@ int ecryptfs_read_and_validate_header_re
 
rc = ecryptfs_read_lower(file_size, 0, ECRYPTFS_SIZE_AND_MARKER_BYTES,
 inode);
-   if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES)
-   return rc >= 0 ? -EINVAL : rc;
+   if (rc < 0)
+   return rc;
+   else if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES)
+   return -EINVAL;
rc = ecryptfs_validate_marker(marker);
if (!rc)
ecryptfs_i_size_init(file_size, inode);
@@ -1381,8 +1383,10 @@ int ecryptfs_read_and_validate_xattr_reg
 ecryptfs_inode_to_lower(inode),
 ECRYPTFS_XATTR_NAME, file_size,
 ECRYPTFS_SIZE_AND_MARKER_BYTES);
-   if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES)
-   return rc >= 0 ? -EINVAL : rc;
+   if (rc < 0)
+   return rc;
+   else if (rc < ECRYPTFS_SIZE_AND_MARKER_BYTES)
+   return -EINVAL;
rc = ecryptfs_validate_marker(marker);
if (!rc)
ecryptfs_i_size_init(file_size, inode);




[PATCH 4.19 262/271] mtd: spinand: read returns badly if the last page has bitflips

2019-07-24 Thread Greg Kroah-Hartman
From: liaoweixiong 

commit b83408b580eccf8d2797cd6cb9ae42c2a28656a7 upstream.

In case of the last page containing bitflips (ret > 0),
spinand_mtd_read() will return that number of bitflips for the last
page while it should instead return max_bitflips like it does when the
last page read returns with 0.

Signed-off-by: Weixiong Liao 
Reviewed-by: Boris Brezillon 
Reviewed-by: Frieder Schrempf 
Cc: sta...@vger.kernel.org
Fixes: 7529df465248 ("mtd: nand: Add core infrastructure to support SPI NANDs")
Signed-off-by: Miquel Raynal 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/mtd/nand/spi/core.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/drivers/mtd/nand/spi/core.c
+++ b/drivers/mtd/nand/spi/core.c
@@ -572,12 +572,12 @@ static int spinand_mtd_read(struct mtd_i
if (ret == -EBADMSG) {
ecc_failed = true;
mtd->ecc_stats.failed++;
-   ret = 0;
} else {
mtd->ecc_stats.corrected += ret;
max_bitflips = max_t(unsigned int, max_bitflips, ret);
}
 
+   ret = 0;
ops->retlen += iter.req.datalen;
ops->oobretlen += iter.req.ooblen;
}




[PATCH 4.19 250/271] xfs: abort unaligned nowait directio early

2019-07-24 Thread Greg Kroah-Hartman
commit 1fdeaea4d92c69fb9f871a787af6ad00f32eeea7 upstream.

Dave Chinner noticed that xfs_file_dio_aio_write returns EAGAIN without
dropping the IOLOCK when its deciding not to wait, which means that we
leak the IOLOCK there.  Since we now make unaligned directio always
wait, we have the opportunity to bail out before trying to take the
lock, which should reduce the overhead of this never-gonna-work case
considerably while also solving the dropped lock problem.

Reported-by: Dave Chinner 
Signed-off-by: Darrick J. Wong 
Reviewed-by: Brian Foster 
Reviewed-by: Dave Chinner 
Reviewed-by: Christoph Hellwig 
Signed-off-by: Luis Chamberlain 
Signed-off-by: Sasha Levin 
---
 fs/xfs/xfs_file.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 10f75965243c..259549698ba7 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -517,6 +517,9 @@ xfs_file_dio_aio_write(
}
 
if (iocb->ki_flags & IOCB_NOWAIT) {
+   /* unaligned dio always waits, bail */
+   if (unaligned_io)
+   return -EAGAIN;
if (!xfs_ilock_nowait(ip, iolock))
return -EAGAIN;
} else {
@@ -536,9 +539,6 @@ xfs_file_dio_aio_write(
 * xfs_file_aio_write_checks() for other reasons.
 */
if (unaligned_io) {
-   /* unaligned dio always waits, bail */
-   if (iocb->ki_flags & IOCB_NOWAIT)
-   return -EAGAIN;
inode_dio_wait(inode);
} else if (iolock == XFS_IOLOCK_EXCL) {
xfs_ilock_demote(ip, XFS_IOLOCK_EXCL);
-- 
2.20.1





[PATCH 4.19 248/271] xfs: fix reporting supported extra file attributes for statx()

2019-07-24 Thread Greg Kroah-Hartman
commit 1b9598c8fb9965fff901c4caa21fed9644c34df3 upstream.

statx(2) notes that any attribute that is not indicated as supported by
stx_attributes_mask has no usable value. Commit 5f955f26f3d42d ("xfs: report
crtime and attribute flags to statx") added support for informing userspace
of extra file attributes but forgot to list these flags as supported
making reporting them rather useless for the pedantic userspace author.

$ git describe --contains 5f955f26f3d42d04aba65590a32eb70eedb7f37d
v4.11-rc6~5^2^2~2

Fixes: 5f955f26f3d42d ("xfs: report crtime and attribute flags to statx")
Signed-off-by: Luis R. Rodriguez 
Reviewed-by: Darrick J. Wong 
[darrick: add a comment reminding people to keep attributes_mask up to date]
Signed-off-by: Darrick J. Wong 
Signed-off-by: Luis Chamberlain 
Signed-off-by: Sasha Levin 
---
 fs/xfs/xfs_iops.c | 8 
 1 file changed, 8 insertions(+)

diff --git a/fs/xfs/xfs_iops.c b/fs/xfs/xfs_iops.c
index 1efef69a7f1c..74047bd0c1ae 100644
--- a/fs/xfs/xfs_iops.c
+++ b/fs/xfs/xfs_iops.c
@@ -531,6 +531,10 @@ xfs_vn_getattr(
}
}
 
+   /*
+* Note: If you add another clause to set an attribute flag, please
+* update attributes_mask below.
+*/
if (ip->i_d.di_flags & XFS_DIFLAG_IMMUTABLE)
stat->attributes |= STATX_ATTR_IMMUTABLE;
if (ip->i_d.di_flags & XFS_DIFLAG_APPEND)
@@ -538,6 +542,10 @@ xfs_vn_getattr(
if (ip->i_d.di_flags & XFS_DIFLAG_NODUMP)
stat->attributes |= STATX_ATTR_NODUMP;
 
+   stat->attributes_mask |= (STATX_ATTR_IMMUTABLE |
+ STATX_ATTR_APPEND |
+ STATX_ATTR_NODUMP);
+
switch (inode->i_mode & S_IFMT) {
case S_IFBLK:
case S_IFCHR:
-- 
2.20.1





[PATCH 4.19 251/271] gpu: ipu-v3: ipu-ic: Fix saturation bit offset in TPMEM

2019-07-24 Thread Greg Kroah-Hartman
From: Steve Longerbeam 

commit 3d1f62c686acdedf5ed9642b763f3808d6a47d1e upstream.

The saturation bit was being set at bit 9 in the second 32-bit word
of the TPMEM CSC. This isn't correct, the saturation bit is bit 42,
which is bit 10 of the second word.

Fixes: 1aa8ea0d2bd5d ("gpu: ipu-v3: Add Image Converter unit")

Signed-off-by: Steve Longerbeam 
Reviewed-by: Philipp Zabel 
Cc: sta...@vger.kernel.org
Signed-off-by: Philipp Zabel 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/gpu/ipu-v3/ipu-ic.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/drivers/gpu/ipu-v3/ipu-ic.c
+++ b/drivers/gpu/ipu-v3/ipu-ic.c
@@ -257,7 +257,7 @@ static int init_csc(struct ipu_ic *ic,
writel(param, base++);
 
param = ((a[0] & 0x1fe0) >> 5) | (params->scale << 8) |
-   (params->sat << 9);
+   (params->sat << 10);
writel(param, base++);
 
param = ((a[1] & 0x1f) << 27) | ((c[0][1] & 0x1ff) << 18) |




[PATCH 4.19 249/271] xfs: serialize unaligned dio writes against all other dio writes

2019-07-24 Thread Greg Kroah-Hartman
commit 2032a8a27b5cc0f578d37fa16fa2494b80a0d00a upstream.

XFS applies more strict serialization constraints to unaligned
direct writes to accommodate things like direct I/O layer zeroing,
unwritten extent conversion, etc. Unaligned submissions acquire the
exclusive iolock and wait for in-flight dio to complete to ensure
multiple submissions do not race on the same block and cause data
corruption.

This generally works in the case of an aligned dio followed by an
unaligned dio, but the serialization is lost if I/Os occur in the
opposite order. If an unaligned write is submitted first and
immediately followed by an overlapping, aligned write, the latter
submits without the typical unaligned serialization barriers because
there is no indication of an unaligned dio still in-flight. This can
lead to unpredictable results.

To provide proper unaligned dio serialization, require that such
direct writes are always the only dio allowed in-flight at one time
for a particular inode. We already acquire the exclusive iolock and
drain pending dio before submitting the unaligned dio. Wait once
more after the dio submission to hold the iolock across the I/O and
prevent further submissions until the unaligned I/O completes. This
is heavy handed, but consistent with the current pre-submission
serialization for unaligned direct writes.

Signed-off-by: Brian Foster 
Reviewed-by: Allison Henderson 
Reviewed-by: Dave Chinner 
Reviewed-by: Darrick J. Wong 
Signed-off-by: Darrick J. Wong 
Signed-off-by: Luis Chamberlain 
Signed-off-by: Sasha Levin 
---
 fs/xfs/xfs_file.c | 27 +--
 1 file changed, 17 insertions(+), 10 deletions(-)

diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 61a5ad2600e8..10f75965243c 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -529,18 +529,17 @@ xfs_file_dio_aio_write(
count = iov_iter_count(from);
 
/*
-* If we are doing unaligned IO, wait for all other IO to drain,
-* otherwise demote the lock if we had to take the exclusive lock
-* for other reasons in xfs_file_aio_write_checks.
+* If we are doing unaligned IO, we can't allow any other overlapping IO
+* in-flight at the same time or we risk data corruption. Wait for all
+* other IO to drain before we submit. If the IO is aligned, demote the
+* iolock if we had to take the exclusive lock in
+* xfs_file_aio_write_checks() for other reasons.
 */
if (unaligned_io) {
-   /* If we are going to wait for other DIO to finish, bail */
-   if (iocb->ki_flags & IOCB_NOWAIT) {
-   if (atomic_read(>i_dio_count))
-   return -EAGAIN;
-   } else {
-   inode_dio_wait(inode);
-   }
+   /* unaligned dio always waits, bail */
+   if (iocb->ki_flags & IOCB_NOWAIT)
+   return -EAGAIN;
+   inode_dio_wait(inode);
} else if (iolock == XFS_IOLOCK_EXCL) {
xfs_ilock_demote(ip, XFS_IOLOCK_EXCL);
iolock = XFS_IOLOCK_SHARED;
@@ -548,6 +547,14 @@ xfs_file_dio_aio_write(
 
trace_xfs_file_direct_write(ip, count, iocb->ki_pos);
ret = iomap_dio_rw(iocb, from, _iomap_ops, xfs_dio_write_end_io);
+
+   /*
+* If unaligned, this is the only IO in-flight. If it has not yet
+* completed, wait on it before we release the iolock to prevent
+* subsequent overlapping IO.
+*/
+   if (ret == -EIOCBQUEUED && unaligned_io)
+   inode_dio_wait(inode);
 out:
xfs_iunlock(ip, iolock);
 
-- 
2.20.1





[PATCH 4.19 213/271] KVM: x86/vPMU: refine kvm_pmu err msg when event creation failed

2019-07-24 Thread Greg Kroah-Hartman
From: Like Xu 

commit 6fc3977ccc5d3c22e851f2dce2d3ce2a0a843842 upstream.

If a perf_event creation fails due to any reason of the host perf
subsystem, it has no chance to log the corresponding event for guest
which may cause abnormal sampling data in guest result. In debug mode,
this message helps to understand the state of vPMC and we may not
limit the number of occurrences but not in a spamming style.

Suggested-by: Joe Perches 
Signed-off-by: Like Xu 
Cc: sta...@vger.kernel.org
Signed-off-by: Paolo Bonzini 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/x86/kvm/pmu.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/arch/x86/kvm/pmu.c
+++ b/arch/x86/kvm/pmu.c
@@ -131,8 +131,8 @@ static void pmc_reprogram_counter(struct
 intr ? kvm_perf_overflow_intr :
 kvm_perf_overflow, pmc);
if (IS_ERR(event)) {
-   printk_once("kvm_pmu: event creation failed %ld\n",
-   PTR_ERR(event));
+   pr_debug_ratelimited("kvm_pmu: event creation failed %ld for 
pmc->idx = %d\n",
+   PTR_ERR(event), pmc->idx);
return;
}
 




[PATCH 4.19 252/271] crypto: caam - limit output IV to CBC to work around CTR mode DMA issue

2019-07-24 Thread Greg Kroah-Hartman
From: Ard Biesheuvel 

commit ed527b13d800dd515a9e6c582f0a73eca65b2e1b upstream.

The CAAM driver currently violates an undocumented and slightly
controversial requirement imposed by the crypto stack that a buffer
referred to by the request structure via its virtual address may not
be modified while any scatterlists passed via the same request
structure are mapped for inbound DMA.

This may result in errors like

  alg: aead: decryption failed on test 1 for 
gcm_base(ctr-aes-caam,ghash-generic): ret=74
  alg: aead: Failed to load transform for gcm(aes): -2

on non-cache coherent systems, due to the fact that the GCM driver
passes an IV buffer by virtual address which shares a cacheline with
the auth_tag buffer passed via a scatterlist, resulting in corruption
of the auth_tag when the IV is updated while the DMA mapping is live.

Since the IV that is returned to the caller is only valid for CBC mode,
and given that the in-kernel users of CBC (such as CTS) don't trigger the
same issue as the GCM driver, let's just disable the output IV generation
for all modes except CBC for the time being.

Fixes: 854b06f76879 ("crypto: caam - properly set IV after {en,de}crypt")
Cc: Horia Geanta 
Cc: Iuliana Prodan 
Reported-by: Sascha Hauer 
Cc: 
Signed-off-by: Ard Biesheuvel 
Reviewed-by: Horia Geanta 
Signed-off-by: Herbert Xu 
[ Horia: backported to 4.14, 4.19 ]
Signed-off-by: Horia Geantă 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/crypto/caam/caamalg.c |   15 +--
 1 file changed, 9 insertions(+), 6 deletions(-)

--- a/drivers/crypto/caam/caamalg.c
+++ b/drivers/crypto/caam/caamalg.c
@@ -887,6 +887,7 @@ static void ablkcipher_encrypt_done(stru
struct ablkcipher_request *req = context;
struct ablkcipher_edesc *edesc;
struct crypto_ablkcipher *ablkcipher = crypto_ablkcipher_reqtfm(req);
+   struct caam_ctx *ctx = crypto_ablkcipher_ctx(ablkcipher);
int ivsize = crypto_ablkcipher_ivsize(ablkcipher);
 
 #ifdef DEBUG
@@ -911,10 +912,11 @@ static void ablkcipher_encrypt_done(stru
 
/*
 * The crypto API expects us to set the IV (req->info) to the last
-* ciphertext block. This is used e.g. by the CTS mode.
+* ciphertext block when running in CBC mode.
 */
-   scatterwalk_map_and_copy(req->info, req->dst, req->nbytes - ivsize,
-ivsize, 0);
+   if ((ctx->cdata.algtype & OP_ALG_AAI_MASK) == OP_ALG_AAI_CBC)
+   scatterwalk_map_and_copy(req->info, req->dst, req->nbytes -
+ivsize, ivsize, 0);
 
/* In case initial IV was generated, copy it in GIVCIPHER request */
if (edesc->iv_dir == DMA_FROM_DEVICE) {
@@ -1651,10 +1653,11 @@ static int ablkcipher_decrypt(struct abl
 
/*
 * The crypto API expects us to set the IV (req->info) to the last
-* ciphertext block.
+* ciphertext block when running in CBC mode.
 */
-   scatterwalk_map_and_copy(req->info, req->src, req->nbytes - ivsize,
-ivsize, 0);
+   if ((ctx->cdata.algtype & OP_ALG_AAI_MASK) == OP_ALG_AAI_CBC)
+   scatterwalk_map_and_copy(req->info, req->src, req->nbytes -
+ivsize, ivsize, 0);
 
/* Create and submit job descriptor*/
init_ablkcipher_job(ctx->sh_desc_dec, ctx->sh_desc_dec_dma, edesc, req);




[PATCH 4.19 214/271] arm64: tegra: Fix AGIC register range

2019-07-24 Thread Greg Kroah-Hartman
From: Jon Hunter 

commit ba24eee6686f6ed3738602b54d959253316a9541 upstream.

The Tegra AGIC interrupt controller is an ARM GIC400 interrupt
controller. Per the ARM GIC device-tree binding, the first address
region is for the GIC distributor registers and the second address
region is for the GIC CPU interface registers. The address space for
the distributor registers is 4kB, but currently this is incorrectly
defined as 8kB for the Tegra AGIC and overlaps with the CPU interface
registers. Correct the address space for the distributor to be 4kB.

Cc: sta...@vger.kernel.org
Signed-off-by: Jon Hunter 
Fixes: bcdbde433542 ("arm64: tegra: Add AGIC node for Tegra210")
Signed-off-by: Thierry Reding 
Signed-off-by: Greg Kroah-Hartman 

---
 arch/arm64/boot/dts/nvidia/tegra210.dtsi |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/arch/arm64/boot/dts/nvidia/tegra210.dtsi
+++ b/arch/arm64/boot/dts/nvidia/tegra210.dtsi
@@ -1119,7 +1119,7 @@
compatible = "nvidia,tegra210-agic";
#interrupt-cells = <3>;
interrupt-controller;
-   reg = <0x702f9000 0x2000>,
+   reg = <0x702f9000 0x1000>,
  <0x702fa000 0x2000>;
interrupts = ;
clocks = <_car TEGRA210_CLK_APE>;




[PATCH 4.19 209/271] media: v4l2: Test type instead of cfg->type in v4l2_ctrl_new_custom()

2019-07-24 Thread Greg Kroah-Hartman
From: Boris Brezillon 

commit 07d89227a983df957a6a7c56f7c040cde9ac571f upstream.

cfg->type can be overridden by v4l2_ctrl_fill() and the new value is
stored in the local type var. Fix the tests to use this local var.

Fixes: 0996517cf8ea ("V4L/DVB: v4l2: Add new control handling framework")
Cc: 
Signed-off-by: Boris Brezillon 
[hverkuil-ci...@xs4all.nl: change to !qmenu and !qmenu_int (checkpatch)]
Signed-off-by: Hans Verkuil 
Signed-off-by: Mauro Carvalho Chehab 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/media/v4l2-core/v4l2-ctrls.c |9 -
 1 file changed, 4 insertions(+), 5 deletions(-)

--- a/drivers/media/v4l2-core/v4l2-ctrls.c
+++ b/drivers/media/v4l2-core/v4l2-ctrls.c
@@ -2249,16 +2249,15 @@ struct v4l2_ctrl *v4l2_ctrl_new_custom(s
v4l2_ctrl_fill(cfg->id, , , , , ,
, );
 
-   is_menu = (cfg->type == V4L2_CTRL_TYPE_MENU ||
-  cfg->type == V4L2_CTRL_TYPE_INTEGER_MENU);
+   is_menu = (type == V4L2_CTRL_TYPE_MENU ||
+  type == V4L2_CTRL_TYPE_INTEGER_MENU);
if (is_menu)
WARN_ON(step);
else
WARN_ON(cfg->menu_skip_mask);
-   if (cfg->type == V4L2_CTRL_TYPE_MENU && qmenu == NULL)
+   if (type == V4L2_CTRL_TYPE_MENU && !qmenu) {
qmenu = v4l2_ctrl_get_menu(cfg->id);
-   else if (cfg->type == V4L2_CTRL_TYPE_INTEGER_MENU &&
-qmenu_int == NULL) {
+   } else if (type == V4L2_CTRL_TYPE_INTEGER_MENU && !qmenu_int) {
handler_set_err(hdl, -EINVAL);
return NULL;
}




[PATCH 4.19 215/271] fs/proc/proc_sysctl.c: fix the default values of i_uid/i_gid on /proc/sys inodes.

2019-07-24 Thread Greg Kroah-Hartman
From: Radoslaw Burny 

commit 5ec27ec735ba0477d48c80561cc5e856f0c5dfaf upstream.

Normally, the inode's i_uid/i_gid are translated relative to s_user_ns,
but this is not a correct behavior for proc.  Since sysctl permission
check in test_perm is done against GLOBAL_ROOT_[UG]ID, it makes more
sense to use these values in u_[ug]id of proc inodes.  In other words:
although uid/gid in the inode is not read during test_perm, the inode
logically belongs to the root of the namespace.  I have confirmed this
with Eric Biederman at LPC and in this thread:
  https://lore.kernel.org/lkml/87k1kzjdff@xmission.com

Consequences


Since the i_[ug]id values of proc nodes are not used for permissions
checks, this change usually makes no functional difference.  However, it
causes an issue in a setup where:

 * a namespace container is created without root user in container -
   hence the i_[ug]id of proc nodes are set to INVALID_[UG]ID

 * container creator tries to configure it by writing /proc/sys files,
   e.g. writing /proc/sys/kernel/shmmax to configure shared memory limit

Kernel does not allow to open an inode for writing if its i_[ug]id are
invalid, making it impossible to write shmmax and thus - configure the
container.

Using a container with no root mapping is apparently rare, but we do use
this configuration at Google.  Also, we use a generic tool to configure
the container limits, and the inability to write any of them causes a
failure.

History
===

The invalid uids/gids in inodes first appeared due to 81754357770e (fs:
Update i_[ug]id_(read|write) to translate relative to s_user_ns).
However, AFAIK, this did not immediately cause any issues.  The
inability to write to these "invalid" inodes was only caused by a later
commit 0bd23d09b874 (vfs: Don't modify inodes with a uid or gid unknown
to the vfs).

Tested: Used a repro program that creates a user namespace without any
mapping and stat'ed /proc/$PID/root/proc/sys/kernel/shmmax from outside.
Before the change, it shows the overflow uid, with the change it's 0.
The overflow uid indicates that the uid in the inode is not correct and
thus it is not possible to open the file for writing.

Link: http://lkml.kernel.org/r/20190708115130.250149-1-rbu...@google.com
Fixes: 0bd23d09b874 ("vfs: Don't modify inodes with a uid or gid unknown to the 
vfs")
Signed-off-by: Radoslaw Burny 
Acked-by: Luis Chamberlain 
Cc: Kees Cook 
Cc: "Eric W . Biederman" 
Cc: Seth Forshee 
Cc: John Sperbeck 
Cc: Alexey Dobriyan 
Cc: [4.8+]
Signed-off-by: Andrew Morton 
Signed-off-by: Linus Torvalds 
Signed-off-by: Greg Kroah-Hartman 

---
 fs/proc/proc_sysctl.c |4 
 1 file changed, 4 insertions(+)

--- a/fs/proc/proc_sysctl.c
+++ b/fs/proc/proc_sysctl.c
@@ -498,6 +498,10 @@ static struct inode *proc_sys_make_inode
 
if (root->set_ownership)
root->set_ownership(head, table, >i_uid, >i_gid);
+   else {
+   inode->i_uid = GLOBAL_ROOT_UID;
+   inode->i_gid = GLOBAL_ROOT_GID;
+   }
 
return inode;
 }




[PATCH 4.19 265/271] usb: Handle USB3 remote wakeup for LPM enabled devices correctly

2019-07-24 Thread Greg Kroah-Hartman
From: Lee, Chiasheng 

commit e244c4699f859cf7149b0781b1894c7996a8a1df upstream.

With Link Power Management (LPM) enabled USB3 links transition to low
power U1/U2 link states from U0 state automatically.

Current hub code detects USB3 remote wakeups by checking if the software
state still shows suspended, but the link has transitioned from suspended
U3 to enabled U0 state.

As it takes some time before the hub thread reads the port link state
after a USB3 wake notification, the link may have transitioned from U0
to U1/U2, and wake is not detected by hub code.

Fix this by handling U1/U2 states in the same way as U0 in USB3 wakeup
handling

This patch should be added to stable kernels since 4.13 where LPM was
kept enabled during suspend/resume

Cc:  # v4.13+
Signed-off-by: Lee, Chiasheng 
Signed-off-by: Mathias Nyman 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/usb/core/hub.c |7 +--
 1 file changed, 5 insertions(+), 2 deletions(-)

--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -3575,6 +3575,7 @@ static int hub_handle_remote_wakeup(stru
struct usb_device *hdev;
struct usb_device *udev;
int connect_change = 0;
+   u16 link_state;
int ret;
 
hdev = hub->hdev;
@@ -3584,9 +3585,11 @@ static int hub_handle_remote_wakeup(stru
return 0;
usb_clear_port_feature(hdev, port, USB_PORT_FEAT_C_SUSPEND);
} else {
+   link_state = portstatus & USB_PORT_STAT_LINK_STATE;
if (!udev || udev->state != USB_STATE_SUSPENDED ||
-(portstatus & USB_PORT_STAT_LINK_STATE) !=
-USB_SS_PORT_LS_U0)
+   (link_state != USB_SS_PORT_LS_U0 &&
+link_state != USB_SS_PORT_LS_U1 &&
+link_state != USB_SS_PORT_LS_U2))
return 0;
}
 




[PATCH 4.19 244/271] xfs: dont overflow xattr listent buffer

2019-07-24 Thread Greg Kroah-Hartman
commit 3b50086f0c0d78c144d9483fa292c1509c931b70 upstream.

For VFS listxattr calls, xfs_xattr_put_listent calls
__xfs_xattr_put_listent twice if it sees an attribute
"trusted.SGI_ACL_FILE": once for that name, and again for
"system.posix_acl_access".  Unfortunately, if we happen to run out of
buffer space while emitting the first name, we set count to -1 (so that
we can feed ERANGE to the caller).  The second invocation doesn't check that
the context parameters make sense and overwrites the byte before the
buffer, triggering a KASAN report:

==
BUG: KASAN: slab-out-of-bounds in strncpy+0xb3/0xd0
Write of size 1 at addr 88807fbd317f by task syz/1113

CPU: 3 PID: 1113 Comm: syz Not tainted 5.0.0-rc6-xfsx #rc6
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.10.2-1ubuntu1 
04/01/2014
Call Trace:
 dump_stack+0xcc/0x180
 print_address_description+0x6c/0x23c
 kasan_report.cold.3+0x1c/0x35
 strncpy+0xb3/0xd0
 __xfs_xattr_put_listent+0x1a9/0x2c0 [xfs]
 xfs_attr_list_int_ilocked+0x11af/0x1800 [xfs]
 xfs_attr_list_int+0x20c/0x2e0 [xfs]
 xfs_vn_listxattr+0x225/0x320 [xfs]
 listxattr+0x11f/0x1b0
 path_listxattr+0xbd/0x130
 do_syscall_64+0x139/0x560

While we're at it we add an assert to the other put_listent to avoid
this sort of thing ever happening to the attrlist_by_handle code.

Signed-off-by: Darrick J. Wong 
Reviewed-by: Christoph Hellwig 
Suggested-by: Amir Goldstein 
Reviewed-by: Amir Goldstein 
Signed-off-by: Luis Chamberlain 
Signed-off-by: Sasha Levin 
---
 fs/xfs/xfs_attr_list.c | 1 +
 fs/xfs/xfs_xattr.c | 3 +++
 2 files changed, 4 insertions(+)

diff --git a/fs/xfs/xfs_attr_list.c b/fs/xfs/xfs_attr_list.c
index a58034049995..3d213a7394c5 100644
--- a/fs/xfs/xfs_attr_list.c
+++ b/fs/xfs/xfs_attr_list.c
@@ -555,6 +555,7 @@ xfs_attr_put_listent(
attrlist_ent_t *aep;
int arraytop;
 
+   ASSERT(!context->seen_enough);
ASSERT(!(context->flags & ATTR_KERNOVAL));
ASSERT(context->count >= 0);
ASSERT(context->count < (ATTR_MAX_VALUELEN/8));
diff --git a/fs/xfs/xfs_xattr.c b/fs/xfs/xfs_xattr.c
index 63ee1d5bf1d7..9a63016009a1 100644
--- a/fs/xfs/xfs_xattr.c
+++ b/fs/xfs/xfs_xattr.c
@@ -129,6 +129,9 @@ __xfs_xattr_put_listent(
char *offset;
int arraytop;
 
+   if (context->count < 0 || context->seen_enough)
+   return;
+
if (!context->alist)
goto compute_size;
 
-- 
2.20.1





[PATCH 4.19 247/271] xfs: reserve blocks for ifree transaction during log recovery

2019-07-24 Thread Greg Kroah-Hartman
commit 15a268d9f263ed3a0601a1296568241a5a3da7aa upstream.

Log recovery frees all the inodes stored in the unlinked list, which can
cause expansion of the free inode btree.  The ifree code skips block
reservations if it thinks there's a per-AG space reservation, but we
don't set up the reservation until after log recovery, which means that
a finobt expansion blows up in xfs_trans_mod_sb when we exceed the
transaction's block reservation.

To fix this, we set the "no finobt reservation" flag to true when we
create the xfs_mount and only set it to false if we confirm that every
AG had enough free space to put aside for the finobt.

Signed-off-by: Darrick J. Wong 
Reviewed-by: Christoph Hellwig 
Reviewed-by: Dave Chinner 
Suggested-by: Amir Goldstein 
Reviewed-by: Amir Goldstein 
Signed-off-by: Luis Chamberlain 
Signed-off-by: Sasha Levin 
---
 fs/xfs/xfs_fsops.c | 1 +
 fs/xfs/xfs_super.c | 7 +++
 2 files changed, 8 insertions(+)

diff --git a/fs/xfs/xfs_fsops.c b/fs/xfs/xfs_fsops.c
index 7c00b8bedfe3..09fd602507ef 100644
--- a/fs/xfs/xfs_fsops.c
+++ b/fs/xfs/xfs_fsops.c
@@ -534,6 +534,7 @@ xfs_fs_reserve_ag_blocks(
int error = 0;
int err2;
 
+   mp->m_finobt_nores = false;
for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
pag = xfs_perag_get(mp, agno);
err2 = xfs_ag_resv_init(pag, NULL);
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index 207ee302b1bb..dce8114e3198 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -1561,6 +1561,13 @@ xfs_mount_alloc(
INIT_DELAYED_WORK(>m_eofblocks_work, xfs_eofblocks_worker);
INIT_DELAYED_WORK(>m_cowblocks_work, xfs_cowblocks_worker);
mp->m_kobj.kobject.kset = xfs_kset;
+   /*
+* We don't create the finobt per-ag space reservation until after log
+* recovery, so we must set this to true so that an ifree transaction
+* started during log recovery will not depend on space reservations
+* for finobt expansion.
+*/
+   mp->m_finobt_nores = true;
return mp;
 }
 
-- 
2.20.1





[PATCH 4.19 245/271] xfs: rename m_inotbt_nores to m_finobt_nores

2019-07-24 Thread Greg Kroah-Hartman
commit e1f6ca11381588e3ef138c10de60eeb34cb8466a upstream.

Rename this flag variable to imply more strongly that it's related to
the free inode btree (finobt) operation.  No functional changes.

Signed-off-by: Darrick J. Wong 
Reviewed-by: Christoph Hellwig 
Reviewed-by: Dave Chinner 
Suggested-by: Amir Goldstein 
Reviewed-by: Amir Goldstein 
Signed-off-by: Luis Chamberlain 
Signed-off-by: Sasha Levin 
---
 fs/xfs/libxfs/xfs_ag_resv.c  | 2 +-
 fs/xfs/libxfs/xfs_ialloc_btree.c | 4 ++--
 fs/xfs/xfs_inode.c   | 2 +-
 fs/xfs/xfs_mount.h   | 2 +-
 4 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/fs/xfs/libxfs/xfs_ag_resv.c b/fs/xfs/libxfs/xfs_ag_resv.c
index e701ebc36c06..e2ba2a3b63b2 100644
--- a/fs/xfs/libxfs/xfs_ag_resv.c
+++ b/fs/xfs/libxfs/xfs_ag_resv.c
@@ -281,7 +281,7 @@ xfs_ag_resv_init(
 */
ask = used = 0;
 
-   mp->m_inotbt_nores = true;
+   mp->m_finobt_nores = true;
 
error = xfs_refcountbt_calc_reserves(mp, tp, agno, ,
);
diff --git a/fs/xfs/libxfs/xfs_ialloc_btree.c b/fs/xfs/libxfs/xfs_ialloc_btree.c
index 86c50208a143..adb2f6df5a11 100644
--- a/fs/xfs/libxfs/xfs_ialloc_btree.c
+++ b/fs/xfs/libxfs/xfs_ialloc_btree.c
@@ -124,7 +124,7 @@ xfs_finobt_alloc_block(
union xfs_btree_ptr *new,
int *stat)
 {
-   if (cur->bc_mp->m_inotbt_nores)
+   if (cur->bc_mp->m_finobt_nores)
return xfs_inobt_alloc_block(cur, start, new, stat);
return __xfs_inobt_alloc_block(cur, start, new, stat,
XFS_AG_RESV_METADATA);
@@ -157,7 +157,7 @@ xfs_finobt_free_block(
struct xfs_btree_cur*cur,
struct xfs_buf  *bp)
 {
-   if (cur->bc_mp->m_inotbt_nores)
+   if (cur->bc_mp->m_finobt_nores)
return xfs_inobt_free_block(cur, bp);
return __xfs_inobt_free_block(cur, bp, XFS_AG_RESV_METADATA);
 }
diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
index 05db9540e459..ae07baa7bdbf 100644
--- a/fs/xfs/xfs_inode.c
+++ b/fs/xfs/xfs_inode.c
@@ -1754,7 +1754,7 @@ xfs_inactive_ifree(
 * now remains allocated and sits on the unlinked list until the fs is
 * repaired.
 */
-   if (unlikely(mp->m_inotbt_nores)) {
+   if (unlikely(mp->m_finobt_nores)) {
error = xfs_trans_alloc(mp, _RES(mp)->tr_ifree,
XFS_IFREE_SPACE_RES(mp), 0, XFS_TRANS_RESERVE,
);
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h
index 7964513c3128..7e0bf952e087 100644
--- a/fs/xfs/xfs_mount.h
+++ b/fs/xfs/xfs_mount.h
@@ -127,7 +127,7 @@ typedef struct xfs_mount {
struct mutexm_growlock; /* growfs mutex */
int m_fixedfsid[2]; /* unchanged for life of FS */
uint64_tm_flags;/* global mount flags */
-   boolm_inotbt_nores; /* no per-AG finobt resv. */
+   boolm_finobt_nores; /* no per-AG finobt resv. */
int m_ialloc_inos;  /* inodes in inode allocation */
int m_ialloc_blks;  /* blocks in inode allocation */
int m_ialloc_min_blks;/* min blocks in sparse inode
-- 
2.20.1





[PATCH 4.19 243/271] xfs: flush removing page cache in xfs_reflink_remap_prep

2019-07-24 Thread Greg Kroah-Hartman
commit 2c307174ab77e34645e75e12827646e044d273c3 upstream.

On a sub-page block size filesystem, fsx is failing with a data
corruption after a series of operations involving copying a file
with the destination offset beyond EOF of the destination of the file:

8093(157 mod 256): TRUNCATE DOWNfrom 0x7a120 to 0x5 **
8094(158 mod 256): INSERT 0x25000 thru 0x25fff  (0x1000 bytes)
8095(159 mod 256): COPY 0x18000 thru 0x1afff(0x3000 bytes) to 0x2f400
8096(160 mod 256): WRITE0x5da00 thru 0x651ff(0x7800 bytes) HOLE
8097(161 mod 256): COPY 0x2000 thru 0x5fff  (0x4000 bytes) to 0x6fc00

The second copy here is beyond EOF, and it is to sub-page (4k) but
block aligned (1k) offset. The clone runs the EOF zeroing, landing
in a pre-existing post-eof delalloc extent. This zeroes the post-eof
extents in the page cache just fine, dirtying the pages correctly.

The problem is that xfs_reflink_remap_prep() now truncates the page
cache over the range that it is copying it to, and rounds that down
to cover the entire start page. This removes the dirty page over the
delalloc extent from the page cache without having written it back.
Hence later, when the page cache is flushed, the page at offset
0x6f000 has not been written back and hence exposes stale data,
which fsx trips over less than 10 operations later.

Fix this by changing xfs_reflink_remap_prep() to use
xfs_flush_unmap_range().

Signed-off-by: Dave Chinner 
Reviewed-by: Christoph Hellwig 
Reviewed-by: Darrick J. Wong 
Signed-off-by: Darrick J. Wong 
Signed-off-by: Luis Chamberlain 
Signed-off-by: Sasha Levin 
---
 fs/xfs/xfs_bmap_util.c |  2 +-
 fs/xfs/xfs_bmap_util.h |  2 ++
 fs/xfs/xfs_reflink.c   | 17 +
 3 files changed, 16 insertions(+), 5 deletions(-)

diff --git a/fs/xfs/xfs_bmap_util.c b/fs/xfs/xfs_bmap_util.c
index 211b06e4702e..41ad9eaab6ce 100644
--- a/fs/xfs/xfs_bmap_util.c
+++ b/fs/xfs/xfs_bmap_util.c
@@ -1080,7 +1080,7 @@ xfs_adjust_extent_unmap_boundaries(
return 0;
 }
 
-static int
+int
 xfs_flush_unmap_range(
struct xfs_inode*ip,
xfs_off_t   offset,
diff --git a/fs/xfs/xfs_bmap_util.h b/fs/xfs/xfs_bmap_util.h
index 87363d136bb6..9c73d012f56a 100644
--- a/fs/xfs/xfs_bmap_util.h
+++ b/fs/xfs/xfs_bmap_util.h
@@ -76,6 +76,8 @@ int   xfs_swap_extents(struct xfs_inode *ip, struct xfs_inode 
*tip,
 xfs_daddr_t xfs_fsb_to_db(struct xfs_inode *ip, xfs_fsblock_t fsb);
 
 xfs_extnum_t xfs_bmap_count_leaves(struct xfs_ifork *ifp, xfs_filblks_t 
*count);
+int   xfs_flush_unmap_range(struct xfs_inode *ip, xfs_off_t offset,
+   xfs_off_t len);
 int xfs_bmap_count_blocks(struct xfs_trans *tp, struct xfs_inode *ip,
  int whichfork, xfs_extnum_t *nextents,
  xfs_filblks_t *count);
diff --git a/fs/xfs/xfs_reflink.c b/fs/xfs/xfs_reflink.c
index 38ea08a3dd1d..f3c393f309e1 100644
--- a/fs/xfs/xfs_reflink.c
+++ b/fs/xfs/xfs_reflink.c
@@ -1368,10 +1368,19 @@ xfs_reflink_remap_prep(
if (ret)
goto out_unlock;
 
-   /* Zap any page cache for the destination file's range. */
-   truncate_inode_pages_range(_out->i_data,
-   round_down(pos_out, PAGE_SIZE),
-   round_up(pos_out + *len, PAGE_SIZE) - 1);
+   /*
+* If pos_out > EOF, we may have dirtied blocks between EOF and
+* pos_out. In that case, we need to extend the flush and unmap to cover
+* from EOF to the end of the copy length.
+*/
+   if (pos_out > XFS_ISIZE(dest)) {
+   loff_t  flen = *len + (pos_out - XFS_ISIZE(dest));
+   ret = xfs_flush_unmap_range(dest, XFS_ISIZE(dest), flen);
+   } else {
+   ret = xfs_flush_unmap_range(dest, pos_out, *len);
+   }
+   if (ret)
+   goto out_unlock;
 
/* If we're altering the file contents... */
if (!is_dedupe) {
-- 
2.20.1





[PATCH 4.19 234/271] Btrfs: add missing inode version, ctime and mtime updates when punching hole

2019-07-24 Thread Greg Kroah-Hartman
From: Filipe Manana 

commit 179006688a7e888cbff39577189f2e034786d06a upstream.

If the range for which we are punching a hole covers only part of a page,
we end up updating the inode item but we skip the update of the inode's
iversion, mtime and ctime. Fix that by ensuring we update those properties
of the inode.

A patch for fstests test case generic/059 that tests this as been sent
along with this fix.

Fixes: 2aaa66558172b0 ("Btrfs: add hole punching")
Fixes: e8c1c76e804b18 ("Btrfs: add missing inode update when punching hole")
CC: sta...@vger.kernel.org # 4.4+
Signed-off-by: Filipe Manana 
Signed-off-by: David Sterba 
Signed-off-by: Greg Kroah-Hartman 

---
 fs/btrfs/file.c |5 +
 1 file changed, 5 insertions(+)

--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -2732,6 +2732,11 @@ out_only_mutex:
 * for detecting, at fsync time, if the inode isn't yet in the
 * log tree or it's there but not up to date.
 */
+   struct timespec64 now = current_time(inode);
+
+   inode_inc_iversion(inode);
+   inode->i_mtime = now;
+   inode->i_ctime = now;
trans = btrfs_start_transaction(root, 1);
if (IS_ERR(trans)) {
err = PTR_ERR(trans);




[PATCH 4.19 228/271] intel_th: pci: Add Ice Lake NNPI support

2019-07-24 Thread Greg Kroah-Hartman
From: Alexander Shishkin 

commit 4aa5aed2b6f267592705a526f57518a5d715b769 upstream.

This adds Ice Lake NNPI support to the Intel(R) Trace Hub.

Signed-off-by: Alexander Shishkin 
Reviewed-by: Andy Shevchenko 
Cc: stable 
Link: 
https://lore.kernel.org/r/20190621161930.60785-5-alexander.shish...@linux.intel.com
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/hwtracing/intel_th/pci.c |5 +
 1 file changed, 5 insertions(+)

--- a/drivers/hwtracing/intel_th/pci.c
+++ b/drivers/hwtracing/intel_th/pci.c
@@ -170,6 +170,11 @@ static const struct pci_device_id intel_
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x02a6),
.driver_data = (kernel_ulong_t)_th_2x,
},
+   {
+   /* Ice Lake NNPI */
+   PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x45c5),
+   .driver_data = (kernel_ulong_t)_th_2x,
+   },
{ 0 },
 };
 




[PATCH 4.19 236/271] HID: wacom: generic: only switch the mode on devices with LEDs

2019-07-24 Thread Greg Kroah-Hartman
From: Aaron Armstrong Skomra 

commit d8e9806005f28bbb49899dab2068e3359e22ba35 upstream.

Currently, the driver will attempt to set the mode on all
devices with a center button, but some devices with a center
button lack LEDs, and attempting to set the LEDs on devices
without LEDs results in the kernel error message of the form:

"leds input8::wacom-0.1: Setting an LED's brightness failed (-32)"

This is because the generic codepath erroneously assumes that the
BUTTON_CENTER usage indicates that the device has LEDs, the
previously ignored TOUCH_RING_SETTING usage is a more accurate
indication of the existence of LEDs on the device.

Fixes: 10c55cacb8b2 ("HID: wacom: generic: support LEDs")
Cc:  # v4.11+
Signed-off-by: Aaron Armstrong Skomra 
Reviewed-by: Jason Gerecke 
Signed-off-by: Jiri Kosina 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/hid/wacom_sys.c |3 +++
 drivers/hid/wacom_wac.c |2 --
 drivers/hid/wacom_wac.h |1 +
 3 files changed, 4 insertions(+), 2 deletions(-)

--- a/drivers/hid/wacom_sys.c
+++ b/drivers/hid/wacom_sys.c
@@ -275,6 +275,9 @@ static void wacom_feature_mapping(struct
wacom_hid_usage_quirk(hdev, field, usage);
 
switch (equivalent_usage) {
+   case WACOM_HID_WD_TOUCH_RING_SETTING:
+   wacom->generic_has_leds = true;
+   break;
case HID_DG_CONTACTMAX:
/* leave touch_max as is if predefined */
if (!features->touch_max) {
--- a/drivers/hid/wacom_wac.c
+++ b/drivers/hid/wacom_wac.c
@@ -1928,8 +1928,6 @@ static void wacom_wac_pad_usage_mapping(
features->device_type |= WACOM_DEVICETYPE_PAD;
break;
case WACOM_HID_WD_BUTTONCENTER:
-   wacom->generic_has_leds = true;
-   /* fall through */
case WACOM_HID_WD_BUTTONHOME:
case WACOM_HID_WD_BUTTONUP:
case WACOM_HID_WD_BUTTONDOWN:
--- a/drivers/hid/wacom_wac.h
+++ b/drivers/hid/wacom_wac.h
@@ -145,6 +145,7 @@
 #define WACOM_HID_WD_OFFSETBOTTOM   (WACOM_HID_UP_WACOMDIGITIZER | 0x0d33)
 #define WACOM_HID_WD_DATAMODE   (WACOM_HID_UP_WACOMDIGITIZER | 0x1002)
 #define WACOM_HID_WD_DIGITIZERINFO  (WACOM_HID_UP_WACOMDIGITIZER | 0x1013)
+#define WACOM_HID_WD_TOUCH_RING_SETTING (WACOM_HID_UP_WACOMDIGITIZER | 0x1032)
 #define WACOM_HID_UP_G9 0xff09
 #define WACOM_HID_G9_PEN(WACOM_HID_UP_G9 | 0x02)
 #define WACOM_HID_G9_TOUCHSCREEN(WACOM_HID_UP_G9 | 0x11)




  1   2   3   4   5   6   7   8   9   10   >