Re: ERROR: "vmf_insert_mixed" [drivers/gpu/drm/exynos/exynosdrm.ko] undefined!

2019-08-02 Thread Sam Ravnborg
Hi Inki

On Fri, Aug 02, 2019 at 05:15:06PM +0900, Inki Dae wrote:
> Hi,
> 
> 19. 7. 25. 오전 7:35에 kbuild test robot 이(가) 쓴 글:
> > tree:   
> > https://kernel.googlesource.com/pub/scm/linux/kernel/git/torvalds/linux.git 
> > master
> > head:   bed38c3e2dca01b358a62b5e73b46e875742fd75
> > commit: 156bdac99061b4013c8e47799c6e574f7f84e9f4 drm/exynos: trigger build 
> > of all modules
> > date:   4 weeks ago
> > config: h8300-allmodconfig (attached as .config)
> > compiler: h8300-linux-gcc (GCC) 7.4.0
> > reproduce:
> > wget 
> > https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
> > ~/bin/make.cross
> > chmod +x ~/bin/make.cross
> > git checkout 156bdac99061b4013c8e47799c6e574f7f84e9f4
> > # save the attached .config to linux build tree
> > GCC_VERSION=7.4.0 make.cross ARCH=h8300 
> > 
> > If you fix the issue, kindly add following tag
> > Reported-by: kbuild test robot 
> > 
> > All errors (new ones prefixed by >>):
> > 
> >>> ERROR: "vmf_insert_mixed" [drivers/gpu/drm/exynos/exynosdrm.ko] undefined!
> 
> With below patch I think the build error reported already will be fixed,
> https://patchwork.kernel.org/patch/11035147/

I have the exact same patch locally - that I forgot to send out.
So:
Acked-by: Sam Ravnborg 

Sam


[PATCH] cpufreq: schedutil: fix equation in comment

2019-08-02 Thread Qais Yousef
scale_irq_capacity() call in schedutil_cpu_util() does

util *= (max - irq)
util /= max

But the comment says

util *= (1 - irq)
util /= max

Fix the comment to match what the scaling function does.

Signed-off-by: Qais Yousef 
---
 kernel/sched/cpufreq_schedutil.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/kernel/sched/cpufreq_schedutil.c b/kernel/sched/cpufreq_schedutil.c
index 636ca6f88c8e..e127d89d5974 100644
--- a/kernel/sched/cpufreq_schedutil.c
+++ b/kernel/sched/cpufreq_schedutil.c
@@ -259,9 +259,9 @@ unsigned long schedutil_cpu_util(int cpu, unsigned long 
util_cfs,
 * irq metric. Because IRQ/steal time is hidden from the task clock we
 * need to scale the task numbers:
 *
-*  1 - irq
-*   U' = irq + --- * U
-*max
+*  max - irq
+*   U' = irq + - * U
+* max
 */
util = scale_irq_capacity(util, irq, max);
util += irq;
-- 
2.17.1



Re: [PATCH v2 00/10] drivers, provide a way to add sysfs groups easily

2019-08-02 Thread Greg Kroah-Hartman
On Wed, Jul 31, 2019 at 06:10:45AM -0700, Dmitry Torokhov wrote:
> On Wed, Jul 31, 2019 at 02:43:39PM +0200, Greg Kroah-Hartman wrote:
> > This patch originally started out just as a way for platform drivers to
> > easily add a sysfs group in a race-free way, but thanks to Dmitry's
> > patch, this series now is for all drivers in the kernel (hey, a unified
> > driver model works!!!)
> > 
> > I've only converted a few platform drivers here in this series to show
> > how it works, but other busses can be converted after the first patch
> > goes into the tree.
> > 
> > Here's the original 00 message, for people to get an idea of what is
> > going on here:
> > 
> > If a platform driver wants to add a sysfs group, it has to do so in a
> > racy way, adding it after the driver is bound.  To resolve this issue,
> > have the platform driver core do this for the driver, making the
> > individual drivers logic smaller and simpler, and solving the race at
> > the same time.
> > 
> > All of these patches depend on the first patch.  I'll take the first one
> > through my driver-core tree, and any subsystem maintainer can either ack
> > their individul patch and I will be glad to also merge it, or they can
> > wait until after 5.4-rc1 when the core patch hits Linus's tree and then
> > take it, it's up to them.
> 
> Maybe make an immutable branch off 5.2 with just patch 1/10 so that
> subsystems (and the driver core tree itself) could pull it in at their
> leisure into their "*-next" branches and did not have to wait till 5.4
> or risk merge clashes?

I have now done this with patch 1/10.  Here's the pull info if any
subsystem maintainer wants to suck this into their tree to provide the
ability for drivers to add/remove attribute groups easily.

This is part of my driver-core tree now, and will go to Linus for
5.4-rc1, along with a few platform drivers that have been acked by their
various subsystem maintainers that convert them to use this new
functionality.

If anyone has any questions about this, please let me know.

thanks,

greg k-h

---

The following changes since commit 5f9e832c137075045d15cd6899ab0505cfb2ca4b:

  Linus 5.3-rc1 (2019-07-21 14:05:38 -0700)

are available in the Git repository at:

  git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git 
tags/dev_groups_all_drivers

for you to fetch changes up to 23b6904442d08b7dbed7622ed33b236d41a3aa8b:

  driver core: add dev_groups to all drivers (2019-08-02 12:37:53 +0200)


dev_groups added to struct driver

Persistent tag for others to pull this branch from

This is the first patch in a longer series that adds the ability for the
driver core to create and remove a list of attribute groups
automatically when the device is bound/unbound from a specific driver.

See:

https://lore.kernel.org/r/20190731124349.4474-2-gre...@linuxfoundation.org
for details on this patch, and examples of how to use it in other
drivers.

Signed-off-by: Greg Kroah-Hartman 


Dmitry Torokhov (1):
  driver core: add dev_groups to all drivers

 drivers/base/dd.c  | 14 ++
 include/linux/device.h |  3 +++
 2 files changed, 17 insertions(+)


[PATCH v3 4/8] ACPI: PM: s2idle: Switch EC over to polling during "noirq" suspend

2019-08-02 Thread Rafael J. Wysocki
From: Rafael J. Wysocki 

Since the ACPI SCI is set up for system wakeup before the "noirq"
suspend of devices, it is better to make suspend-to-idle follow
suspend-to-RAM (S3) and switch over the EC to polling during "noirq"
suspend (and back to interrupt-based flow during "noirq" resume).

The frequency of spurious wakeup interrupts from the EC may be
reduced this way.

Signed-off-by: Rafael J. Wysocki 
---

In v2 this was patch 5.

---
 drivers/acpi/ec.c |6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

Index: linux-pm/drivers/acpi/ec.c
===
--- linux-pm.orig/drivers/acpi/ec.c
+++ linux-pm/drivers/acpi/ec.c
@@ -1958,8 +1958,7 @@ static int acpi_ec_suspend_noirq(struct
ec->reference_count >= 1)
acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE);
 
-   if (acpi_sleep_no_ec_events())
-   acpi_ec_enter_noirq(ec);
+   acpi_ec_enter_noirq(ec);
 
return 0;
 }
@@ -1968,8 +1967,7 @@ static int acpi_ec_resume_noirq(struct d
 {
struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev));
 
-   if (acpi_sleep_no_ec_events())
-   acpi_ec_leave_noirq(ec);
+   acpi_ec_leave_noirq(ec);
 
if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) &&
ec->reference_count >= 1)





[PATCH v3 3/8] ACPI: PM: s2idle: Add acpi.sleep_no_lps0 module parameter

2019-08-02 Thread Rafael J. Wysocki
From: Rafael J. Wysocki 

Add a module parameter to prevent the ACPI LPS0 _DSM functions
from being invoked (if need be) and rework the suspend-to-idle
blacklist entries in acpisleep_dmi_table[] to make them simply
prevent suspend-to-idle from being used by default on the systems
in question (which really is the original purpose of those entries).

Signed-off-by: Rafael J. Wysocki 
---

In v2 this was patch 4.

---
 drivers/acpi/sleep.c |   31 +++
 1 file changed, 15 insertions(+), 16 deletions(-)

Index: linux-pm/drivers/acpi/sleep.c
===
--- linux-pm.orig/drivers/acpi/sleep.c
+++ linux-pm/drivers/acpi/sleep.c
@@ -89,6 +89,10 @@ bool acpi_sleep_state_supported(u8 sleep
 }
 
 #ifdef CONFIG_ACPI_SLEEP
+static bool sleep_no_lps0 __read_mostly;
+module_param(sleep_no_lps0, bool, 0644);
+MODULE_PARM_DESC(sleep_no_lps0, "Do not use the special LPS0 device 
interface");
+
 static u32 acpi_target_sleep_state = ACPI_STATE_S0;
 
 u32 acpi_target_system_state(void)
@@ -158,11 +162,11 @@ static int __init init_nvs_nosave(const
return 0;
 }
 
-static bool acpi_sleep_no_lps0;
+static bool acpi_sleep_default_s3;
 
-static int __init init_no_lps0(const struct dmi_system_id *d)
+static int __init init_default_s3(const struct dmi_system_id *d)
 {
-   acpi_sleep_no_lps0 = true;
+   acpi_sleep_default_s3 = true;
return 0;
 }
 
@@ -363,7 +367,7 @@ static const struct dmi_system_id acpisl
 * S0 Idle firmware interface.
 */
{
-   .callback = init_no_lps0,
+   .callback = init_default_s3,
.ident = "Dell XPS13 9360",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
@@ -376,7 +380,7 @@ static const struct dmi_system_id acpisl
 * https://bugzilla.kernel.org/show_bug.cgi?id=199057).
 */
{
-   .callback = init_no_lps0,
+   .callback = init_default_s3,
.ident = "ThinkPad X1 Tablet(2016)",
.matches = {
DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
@@ -524,8 +528,9 @@ static void acpi_pm_end(void)
acpi_sleep_tts_switch(acpi_target_sleep_state);
 }
 #else /* !CONFIG_ACPI_SLEEP */
+#define sleep_no_lps0  (1)
 #define acpi_target_sleep_stateACPI_STATE_S0
-#define acpi_sleep_no_lps0 (false)
+#define acpi_sleep_default_s3  (1)
 static inline void acpi_sleep_dmi_check(void) {}
 #endif /* CONFIG_ACPI_SLEEP */
 
@@ -904,12 +909,6 @@ static int lps0_device_attach(struct acp
if (lps0_device_handle)
return 0;
 
-   if (acpi_sleep_no_lps0) {
-   acpi_handle_info(adev->handle,
-"Low Power S0 Idle interface disabled\n");
-   return 0;
-   }
-
if (!(acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0))
return 0;
 
@@ -937,7 +936,7 @@ static int lps0_device_attach(struct acp
 * Use suspend-to-idle by default if the default suspend mode was not
 * set from the command line.
 */
-   if (mem_sleep_default > PM_SUSPEND_MEM)
+   if (mem_sleep_default > PM_SUSPEND_MEM && !acpi_sleep_default_s3)
mem_sleep_current = PM_SUSPEND_TO_IDLE;
 
return 0;
@@ -957,7 +956,7 @@ static int acpi_s2idle_begin(void)
 
 static int acpi_s2idle_prepare(void)
 {
-   if (lps0_device_handle) {
+   if (lps0_device_handle && !sleep_no_lps0) {
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF);
acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY);
}
@@ -977,7 +976,7 @@ static int acpi_s2idle_prepare(void)
 
 static void acpi_s2idle_wake(void)
 {
-   if (lps0_device_handle && pm_debug_messages_on)
+   if (lps0_device_handle && !sleep_no_lps0 && pm_debug_messages_on)
lpi_check_constraints();
 
/*
@@ -1025,7 +1024,7 @@ static void acpi_s2idle_restore(void)
if (acpi_sci_irq_valid())
disable_irq_wake(acpi_sci_irq);
 
-   if (lps0_device_handle) {
+   if (lps0_device_handle && !sleep_no_lps0) {
acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT);
acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON);
}





[PATCH v3 1/8] ACPI: PM: Set up EC GPE for system wakeup from drivers that need it

2019-08-02 Thread Rafael J. Wysocki
From: Rafael J. Wysocki 

The EC GPE needs to be set up for system wakeup only if there is a
driver depending on it, either intel-hid or intel-vbtn, bound to a
button device that is expected to wake up the system from sleep (such
as the power button on some Dell systems, like the XPS13 9360).  It
doesn't need to be set up for waking up the system from sleep in any
other cases and whether or not it is expected to wake up the system
from sleep doesn't depend on whether or not the LPS0 device is
present in the ACPI namespace.

For this reason, rearrange the ACPI suspend-to-idle code to make the
drivers depending on the EC GPE wakeup take care of setting it up and
decouple that from the LPS0 device handling.

While at it, make intel-hid and intel-vbtn prepare for system wakeup
only if they are allowed to wake up the system from sleep by user
space (via sysfs).

[Note that acpi_ec_mark_gpe_for_wake() and acpi_ec_set_gpe_wake_mask()
 are there to prevent the EC GPE from being disabled by the
 acpi_enable_all_wakeup_gpes() call in acpi_s2idle_prepare(), so on
 systems with either intel-hid or intel-vbtn this change doesn't
 affect any interactions with the hardware or platform firmware.]

Signed-off-by: Rafael J. Wysocki 
Reviewed-by: Andy Shevchenko 
---

No changes in v3.

---
 drivers/acpi/ec.c |7 ++-
 drivers/acpi/internal.h   |2 --
 drivers/acpi/sleep.c  |   13 ++---
 drivers/platform/x86/intel-hid.c  |   20 
 drivers/platform/x86/intel-vbtn.c |   20 
 include/linux/acpi.h  |4 
 include/linux/suspend.h   |1 +
 7 files changed, 45 insertions(+), 22 deletions(-)

Index: linux-pm/drivers/acpi/internal.h
===
--- linux-pm.orig/drivers/acpi/internal.h
+++ linux-pm/drivers/acpi/internal.h
@@ -194,8 +194,6 @@ void acpi_ec_ecdt_probe(void);
 void acpi_ec_dsdt_probe(void);
 void acpi_ec_block_transactions(void);
 void acpi_ec_unblock_transactions(void);
-void acpi_ec_mark_gpe_for_wake(void);
-void acpi_ec_set_gpe_wake_mask(u8 action);
 bool acpi_ec_dispatch_gpe(void);
 int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
  acpi_handle handle, acpi_ec_query_func func,
Index: linux-pm/drivers/platform/x86/intel-hid.c
===
--- linux-pm.orig/drivers/platform/x86/intel-hid.c
+++ linux-pm/drivers/platform/x86/intel-hid.c
@@ -253,9 +253,12 @@ static void intel_button_array_enable(st
 
 static int intel_hid_pm_prepare(struct device *device)
 {
-   struct intel_hid_priv *priv = dev_get_drvdata(device);
+   if (device_may_wakeup(device)) {
+   struct intel_hid_priv *priv = dev_get_drvdata(device);
 
-   priv->wakeup_mode = true;
+   priv->wakeup_mode = true;
+   acpi_ec_set_gpe_wake_mask(ACPI_GPE_ENABLE);
+   }
return 0;
 }
 
@@ -270,9 +273,12 @@ static int intel_hid_pl_suspend_handler(
 
 static int intel_hid_pl_resume_handler(struct device *device)
 {
-   struct intel_hid_priv *priv = dev_get_drvdata(device);
+   if (device_may_wakeup(device)) {
+   struct intel_hid_priv *priv = dev_get_drvdata(device);
 
-   priv->wakeup_mode = false;
+   acpi_ec_set_gpe_wake_mask(ACPI_GPE_DISABLE);
+   priv->wakeup_mode = false;
+   }
if (pm_resume_via_firmware()) {
intel_hid_set_enable(device, true);
intel_button_array_enable(device, true);
@@ -491,6 +497,12 @@ static int intel_hid_probe(struct platfo
}
 
device_init_wakeup(&device->dev, true);
+   /*
+* In order for system wakeup to work, the EC GPE has to be marked as
+* a wakeup one, so do that here (this setting will persist, but it has
+* no effect until the wakeup mask is set for the EC GPE).
+*/
+   acpi_ec_mark_gpe_for_wake();
return 0;
 
 err_remove_notify:
Index: linux-pm/drivers/platform/x86/intel-vbtn.c
===
--- linux-pm.orig/drivers/platform/x86/intel-vbtn.c
+++ linux-pm/drivers/platform/x86/intel-vbtn.c
@@ -176,6 +176,12 @@ static int intel_vbtn_probe(struct platf
return -EBUSY;
 
device_init_wakeup(&device->dev, true);
+   /*
+* In order for system wakeup to work, the EC GPE has to be marked as
+* a wakeup one, so do that here (this setting will persist, but it has
+* no effect until the wakeup mask is set for the EC GPE).
+*/
+   acpi_ec_mark_gpe_for_wake();
return 0;
 }
 
@@ -195,17 +201,23 @@ static int intel_vbtn_remove(struct plat
 
 static int intel_vbtn_pm_prepare(struct device *dev)
 {
-   struct intel_vbtn_priv *priv = dev_get_drvdata(dev);
+   if (device_may_wakeup(dev)) {
+   struct intel_vbtn_priv *priv = dev_g

[PATCH v3 2/8] ACPI: PM: s2idle: Rearrange lps0_device_attach()

2019-08-02 Thread Rafael J. Wysocki
From: Rafael J. Wysocki 

To allow a subsequent change to be simpler, rearrange the code in
lps0_device_attach() to reduce the indentation level and (while
at it) make it avoid calling lpi_device_get_constraints() when
lps0_device_handle is not going to be set.

Signed-off-by: Rafael J. Wysocki 
---

In v2 this was patch 3.

---
 drivers/acpi/sleep.c |   32 +---
 1 file changed, 17 insertions(+), 15 deletions(-)

Index: linux-pm/drivers/acpi/sleep.c
===
--- linux-pm.orig/drivers/acpi/sleep.c
+++ linux-pm/drivers/acpi/sleep.c
@@ -916,28 +916,30 @@ static int lps0_device_attach(struct acp
guid_parse(ACPI_LPS0_DSM_UUID, &lps0_dsm_guid);
/* Check if the _DSM is present and as expected. */
out_obj = acpi_evaluate_dsm(adev->handle, &lps0_dsm_guid, 1, 0, NULL);
-   if (out_obj && out_obj->type == ACPI_TYPE_BUFFER) {
-   char bitmask = *(char *)out_obj->buffer.pointer;
-
-   lps0_dsm_func_mask = bitmask;
-   lps0_device_handle = adev->handle;
-   /*
-* Use suspend-to-idle by default if the default
-* suspend mode was not set from the command line.
-*/
-   if (mem_sleep_default > PM_SUSPEND_MEM)
-   mem_sleep_current = PM_SUSPEND_TO_IDLE;
-
-   acpi_handle_debug(adev->handle, "_DSM function mask: 0x%x\n",
- bitmask);
-   } else {
+   if (!out_obj || out_obj->type != ACPI_TYPE_BUFFER) {
acpi_handle_debug(adev->handle,
  "_DSM function 0 evaluation failed\n");
+   return 0;
}
+
+   lps0_dsm_func_mask = *(char *)out_obj->buffer.pointer;
+
ACPI_FREE(out_obj);
 
+   acpi_handle_debug(adev->handle, "_DSM function mask: 0x%x\n",
+ lps0_dsm_func_mask);
+
+   lps0_device_handle = adev->handle;
+
lpi_device_get_constraints();
 
+   /*
+* Use suspend-to-idle by default if the default suspend mode was not
+* set from the command line.
+*/
+   if (mem_sleep_default > PM_SUSPEND_MEM)
+   mem_sleep_current = PM_SUSPEND_TO_IDLE;
+
return 0;
 }
 





[PATCH v3 7/8] ACPI: EC: PM: Make acpi_ec_dispatch_gpe() print debug message

2019-08-02 Thread Rafael J. Wysocki
From: Rafael J. Wysocki 

Add a pm_pr_dbg() debug statement to acpi_ec_dispatch_gpe() to print
a message when the EC GPE has been dispatched (because its status
was set).

Signed-off-by: Rafael J. Wysocki 
---

In v2 this was patch 8.

---
 drivers/acpi/ec.c |6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

Index: linux-pm/drivers/acpi/ec.c
===
--- linux-pm.orig/drivers/acpi/ec.c
+++ linux-pm/drivers/acpi/ec.c
@@ -1980,7 +1980,11 @@ bool acpi_ec_dispatch_gpe(void)
return false;
 
ret = acpi_dispatch_gpe(NULL, first_ec->gpe);
-   return ret == ACPI_INTERRUPT_HANDLED;
+   if (ret == ACPI_INTERRUPT_HANDLED) {
+   pm_pr_dbg("EC GPE dispatched\n");
+   return true;
+   }
+   return false;
 }
 #endif /* CONFIG_PM_SLEEP */
 





[PATCH v3 6/8] ACPI: EC: PM: Consolidate some code depending on PM_SLEEP

2019-08-02 Thread Rafael J. Wysocki
From: Rafael J. Wysocki 

Move some routines, including acpi_ec_dispatch_gpe(), that are only
used if CONFIG_PM_SLEEP is set to the #ifdef block containing the EC
suspend and resume callbacks, to make the "full EC PM picture" easier
to follow.

While at it, move the header of acpi_ec_dispatch_gpe() in the
header file to a CONFIG_PM_SLEEP #ifdef block.

Signed-off-by: Rafael J. Wysocki 
---

In v2 this was patch 7.

---
 drivers/acpi/ec.c   |   54 +++-
 drivers/acpi/internal.h |2 -
 2 files changed, 27 insertions(+), 29 deletions(-)

Index: linux-pm/drivers/acpi/internal.h
===
--- linux-pm.orig/drivers/acpi/internal.h
+++ linux-pm/drivers/acpi/internal.h
@@ -194,7 +194,6 @@ void acpi_ec_ecdt_probe(void);
 void acpi_ec_dsdt_probe(void);
 void acpi_ec_block_transactions(void);
 void acpi_ec_unblock_transactions(void);
-bool acpi_ec_dispatch_gpe(void);
 int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
  acpi_handle handle, acpi_ec_query_func func,
  void *data);
@@ -202,6 +201,7 @@ void acpi_ec_remove_query_handler(struct
 
 #ifdef CONFIG_PM_SLEEP
 void acpi_ec_flush_work(void);
+bool acpi_ec_dispatch_gpe(void);
 #endif
 
 
Index: linux-pm/drivers/acpi/ec.c
===
--- linux-pm.orig/drivers/acpi/ec.c
+++ linux-pm/drivers/acpi/ec.c
@@ -1049,33 +1049,6 @@ void acpi_ec_unblock_transactions(void)
acpi_ec_start(first_ec, true);
 }
 
-#ifdef CONFIG_PM_SLEEP
-void acpi_ec_mark_gpe_for_wake(void)
-{
-   if (first_ec && !ec_no_wakeup)
-   acpi_mark_gpe_for_wake(NULL, first_ec->gpe);
-}
-EXPORT_SYMBOL_GPL(acpi_ec_mark_gpe_for_wake);
-
-void acpi_ec_set_gpe_wake_mask(u8 action)
-{
-   if (pm_suspend_no_platform() && first_ec && !ec_no_wakeup)
-   acpi_set_gpe_wake_mask(NULL, first_ec->gpe, action);
-}
-EXPORT_SYMBOL_GPL(acpi_ec_set_gpe_wake_mask);
-#endif
-
-bool acpi_ec_dispatch_gpe(void)
-{
-   u32 ret;
-
-   if (!first_ec)
-   return false;
-
-   ret = acpi_dispatch_gpe(NULL, first_ec->gpe);
-   return ret == ACPI_INTERRUPT_HANDLED;
-}
-
 /* --
 Event Management
-- 
*/
@@ -1984,7 +1957,32 @@ static int acpi_ec_resume(struct device
acpi_ec_enable_event(ec);
return 0;
 }
-#endif
+
+void acpi_ec_mark_gpe_for_wake(void)
+{
+   if (first_ec && !ec_no_wakeup)
+   acpi_mark_gpe_for_wake(NULL, first_ec->gpe);
+}
+EXPORT_SYMBOL_GPL(acpi_ec_mark_gpe_for_wake);
+
+void acpi_ec_set_gpe_wake_mask(u8 action)
+{
+   if (pm_suspend_no_platform() && first_ec && !ec_no_wakeup)
+   acpi_set_gpe_wake_mask(NULL, first_ec->gpe, action);
+}
+EXPORT_SYMBOL_GPL(acpi_ec_set_gpe_wake_mask);
+
+bool acpi_ec_dispatch_gpe(void)
+{
+   u32 ret;
+
+   if (!first_ec)
+   return false;
+
+   ret = acpi_dispatch_gpe(NULL, first_ec->gpe);
+   return ret == ACPI_INTERRUPT_HANDLED;
+}
+#endif /* CONFIG_PM_SLEEP */
 
 static const struct dev_pm_ops acpi_ec_pm = {
SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(acpi_ec_suspend_noirq, 
acpi_ec_resume_noirq)





[PATCH v3 5/8] ACPI: PM: s2idle: Eliminate acpi_sleep_no_ec_events()

2019-08-02 Thread Rafael J. Wysocki
From: Rafael J. Wysocki 

Change acpi_ec_suspend() to use pm_suspend_no_platform() instead of
acpi_sleep_no_ec_events(), which allows the latter to be eliminated
along with the s2idle_in_progress variable which is only used by it.

Signed-off-by: Rafael J. Wysocki 
---

In v2 this was patch 6.

---
 drivers/acpi/ec.c   |2 +-
 drivers/acpi/internal.h |2 --
 drivers/acpi/sleep.c|9 -
 3 files changed, 1 insertion(+), 12 deletions(-)

Index: linux-pm/drivers/acpi/ec.c
===
--- linux-pm.orig/drivers/acpi/ec.c
+++ linux-pm/drivers/acpi/ec.c
@@ -1941,7 +1941,7 @@ static int acpi_ec_suspend(struct device
struct acpi_ec *ec =
acpi_driver_data(to_acpi_device(dev));
 
-   if (acpi_sleep_no_ec_events() && ec_freeze_events)
+   if (!pm_suspend_no_platform() && ec_freeze_events)
acpi_ec_disable_event(ec);
return 0;
 }
Index: linux-pm/drivers/acpi/sleep.c
===
--- linux-pm.orig/drivers/acpi/sleep.c
+++ linux-pm/drivers/acpi/sleep.c
@@ -696,7 +696,6 @@ static const struct platform_suspend_ops
.recover = acpi_pm_finish,
 };
 
-static bool s2idle_in_progress;
 static bool s2idle_wakeup;
 
 /*
@@ -950,7 +949,6 @@ static struct acpi_scan_handler lps0_han
 static int acpi_s2idle_begin(void)
 {
acpi_scan_lock_acquire();
-   s2idle_in_progress = true;
return 0;
 }
 
@@ -1032,7 +1030,6 @@ static void acpi_s2idle_restore(void)
 
 static void acpi_s2idle_end(void)
 {
-   s2idle_in_progress = false;
acpi_scan_lock_release();
 }
 
@@ -1060,7 +1057,6 @@ static void acpi_sleep_suspend_setup(voi
 }
 
 #else /* !CONFIG_SUSPEND */
-#define s2idle_in_progress (false)
 #define s2idle_wakeup  (false)
 #define lps0_device_handle (NULL)
 static inline void acpi_sleep_suspend_setup(void) {}
@@ -1071,11 +1067,6 @@ bool acpi_s2idle_wakeup(void)
return s2idle_wakeup;
 }
 
-bool acpi_sleep_no_ec_events(void)
-{
-   return !s2idle_in_progress;
-}
-
 #ifdef CONFIG_PM_SLEEP
 static u32 saved_bm_rld;
 
Index: linux-pm/drivers/acpi/internal.h
===
--- linux-pm.orig/drivers/acpi/internal.h
+++ linux-pm/drivers/acpi/internal.h
@@ -210,11 +210,9 @@ void acpi_ec_flush_work(void);
   -- */
 #ifdef CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT
 extern bool acpi_s2idle_wakeup(void);
-extern bool acpi_sleep_no_ec_events(void);
 extern int acpi_sleep_init(void);
 #else
 static inline bool acpi_s2idle_wakeup(void) { return false; }
-static inline bool acpi_sleep_no_ec_events(void) { return true; }
 static inline int acpi_sleep_init(void) { return -ENXIO; }
 #endif
 





[PATCH v3 0/8] PM / ACPI: sleep: Additional changes related to suspend-to-idle

2019-08-02 Thread Rafael J. Wysocki
Hi All,

> > On top of the "Simplify the suspend-to-idle control flow" patch series
> > posted previously:
> > 
> > https://lore.kernel.org/lkml/71085220.z6FKkvYQPX@kreacher/
> > 
> > sanitize the suspend-to-idle flow even further.
> > 
> > First off, decouple EC wakeup from the LPS0 _DSM processing (patch 1).
> > 
> > Next, reorder the code to invoke LPS0 _DSM Functions 5 and 6 in the
> > specification-compliant order with respect to suspending and resuming
> > devices (patch 2).
> > 
> > Finally, rearrange lps0_device_attach() (patch 3) and add a command line
> > switch to prevent the LPS0 _DSM from being used.
> 
> The v2 is because I found a (minor) bug in patch 1, decided to use a module
> parameter instead of a kernel command line option in patch 4.  Also, there
> are 4 new patches:
> 
> Patch 5: Switch the EC over to polling during "noirq" suspend and back
> during "noirq" resume.
> 
> Patch 6: Eliminate acpi_sleep_no_ec_events().
> 
> Patch 7: Consolidate some EC code depending on PM_SLEEP.
> 
> Patch 8: Add EC GPE dispatching debug message.

The v3 is just a rearranged v2 so as to move the post sensitive patch (previous 
patch 2)
to the end of the series.   [After applying the full series the code is the 
same as before.]

For easier testing, the series (along with some previous patches depended on by 
it)
is available in the pm-s2idle-testing branch of the linux-pm.git tree at 
kernel.org:

https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git/log/?h=pm-s2idle-testing

Please refer to the changelogs for details.

Thanks,
Rafael





[PATCH v3 8/8] ACPI: PM: s2idle: Execute LPS0 _DSM functions with suspended devices

2019-08-02 Thread Rafael J. Wysocki
From: Rafael J. Wysocki 

According to Section 3.5 of the "Intel Low Power S0 Idle" document [1],
Function 5 of the LPS0 _DSM is expected to be invoked when the system
configuration matches the criteria for entering the target low-power
state of the platform.  In particular, this means that all devices
should be suspended and in low-power states already when that function
is invoked.

This is not the case currently, however, because Function 5 of the
LPS0 _DSM is invoked by it before the "noirq" phase of device suspend,
which means that some devices may not have been put into low-power
states yet at that point.  That is a consequence of the previous
design of the suspend-to-idle flow that allowed the "noirq" phase of
device suspend and the "noirq" phase of device resume to be carried
out for multiple times while "suspended" (if any spurious wakeup
events were detected) and the point of the LPS0 _DSM Function 5
invocation was chosen so as to call it (and LPS0 _DSM Function 6
analogously) once per suspend-resume cycle (regardless of how many
times the "noirq" phases of device suspend and resume were carried
out while "suspended").

Now that the suspend-to-idle flow has been redesigned to carry out
the "noirq" phases of device suspend and resume once in each cycle,
the code can be reordered to follow the specification that it is
based on more closely.

For this purpose, add ->prepare_late and ->restore_early platform
callbacks for suspend-to-idle, to be executed, respectively, after
the "noirq" phase of suspending devices and before the "noirq"
phase of resuming them and make ACPI use them for the invocation
of LPS0 _DSM functions as appropriate.

While at it, move the LPS0 entry requirements check to be made
before invoking Functions 3 and 5 of the LPS0 _DSM (also once
per cycle) as follows from the specification [1].

Link: 
https://uefi.org/sites/default/files/resources/Intel_ACPI_Low_Power_S0_Idle.pdf 
# [1]
Signed-off-by: Rafael J. Wysocki 
---

In v2 this was patch 2.

---
 drivers/acpi/sleep.c|   36 
 include/linux/suspend.h |2 ++
 kernel/power/suspend.c  |   12 +---
 3 files changed, 35 insertions(+), 15 deletions(-)

Index: linux-pm/drivers/acpi/sleep.c
===
--- linux-pm.orig/drivers/acpi/sleep.c
+++ linux-pm/drivers/acpi/sleep.c
@@ -954,11 +954,6 @@ static int acpi_s2idle_begin(void)
 
 static int acpi_s2idle_prepare(void)
 {
-   if (lps0_device_handle && !sleep_no_lps0) {
-   acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF);
-   acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY);
-   }
-
if (acpi_sci_irq_valid())
enable_irq_wake(acpi_sci_irq);
 
@@ -972,11 +967,22 @@ static int acpi_s2idle_prepare(void)
return 0;
 }
 
-static void acpi_s2idle_wake(void)
+static int acpi_s2idle_prepare_late(void)
 {
-   if (lps0_device_handle && !sleep_no_lps0 && pm_debug_messages_on)
+   if (!lps0_device_handle || sleep_no_lps0)
+   return 0;
+
+   if (pm_debug_messages_on)
lpi_check_constraints();
 
+   acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_OFF);
+   acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY);
+
+   return 0;
+}
+
+static void acpi_s2idle_wake(void)
+{
/*
 * If IRQD_WAKEUP_ARMED is set for the SCI at this point, the SCI has
 * not triggered while suspended, so bail out.
@@ -1011,6 +1017,15 @@ static void acpi_s2idle_wake(void)
rearm_wake_irq(acpi_sci_irq);
 }
 
+static void acpi_s2idle_restore_early(void)
+{
+   if (!lps0_device_handle || sleep_no_lps0)
+   return;
+
+   acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT);
+   acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON);
+}
+
 static void acpi_s2idle_restore(void)
 {
s2idle_wakeup = false;
@@ -1021,11 +1036,6 @@ static void acpi_s2idle_restore(void)
 
if (acpi_sci_irq_valid())
disable_irq_wake(acpi_sci_irq);
-
-   if (lps0_device_handle && !sleep_no_lps0) {
-   acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT);
-   acpi_sleep_run_lps0_dsm(ACPI_LPS0_SCREEN_ON);
-   }
 }
 
 static void acpi_s2idle_end(void)
@@ -1036,7 +1046,9 @@ static void acpi_s2idle_end(void)
 static const struct platform_s2idle_ops acpi_s2idle_ops = {
.begin = acpi_s2idle_begin,
.prepare = acpi_s2idle_prepare,
+   .prepare_late = acpi_s2idle_prepare_late,
.wake = acpi_s2idle_wake,
+   .restore_early = acpi_s2idle_restore_early,
.restore = acpi_s2idle_restore,
.end = acpi_s2idle_end,
 };
Index: linux-pm/kernel/power/suspend.c
===
--- linux-pm.orig/kernel/power/suspend.c
+++ linux-pm/kernel/power/suspend.c
@@ -253,13 +253,19 @@ static int platform_suspend_prepare_late
 
 static int platform_suspend_prepare_noirq(suspend_state_t state)
 {
-   return state != PM_SUSPEND_TO_

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

2019-08-02 Thread Morten Borup Petersen


On 7/31/19 9:31 AM, Jassi Brar wrote:
> On Sun, Jul 28, 2019 at 4:28 PM Morten Borup Petersen  
> wrote:
>>
>>
>>
>> On 7/25/19 7:49 AM, Jassi Brar wrote:
>>> 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 = <&refclk100mhz>;
> +   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 = <&refclk100mhz>;
> +   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 = <&refclk100mhz>;
> +   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
> +

Re: [PATCH 09/20] ext4: Initialize timestamps limits

2019-08-02 Thread Arnd Bergmann
On Fri, Aug 2, 2019 at 12:43 AM Theodore Y. Ts'o  wrote:
>
> On Thu, Aug 01, 2019 at 12:18:28PM -0700, Deepa Dinamani wrote:
> > > Say you have a filesystem with s_inode_size > 128 where not all of the
> > > ondisk inodes have been upgraded to i_extra_isize > 0 and therefore
> > > don't support nanoseconds or times beyond 2038.  I think this happens on
> > > ext3 filesystems that reserved extra space for inode attrs that are
> > > subsequently converted to ext4?
> >
> > I'm confused about ext3 being converted to ext4. If the converted
> > inodes have extra space, then ext4_iget() will start using the extra
> > space when it modifies the on disk inode, won't it?i
>
> It is possible that you can have an ext3 file system with (for
> example) 256 byte inodes, and all of the extra space was used for
> extended attributes, then ext4 won't have the extra space available.
> This is going toh be on an inode-by-inode basis, and if an extended
> attribute is motdified or deleted, the space would become available,t
> and then inode would start getting a higher resolution timestamp.

Is it correct to assume that this kind of file would have to be
created using the ext3.ko file system implementation that was
removed in linux-4.3, but not using ext2.ko or ext4.ko (which
would always set the extended timestamps even in "-t ext2" or
"-t ext3" mode)?

I tried to reproduce this on a modern kernel and with and
moderately old debugfs (1.42.13) but failed.

> I really don't think it's worth worrying about that, though.  It's
> highly unlikely ext3 file systems will be still be in service by the
> time it's needed in 2038.  And if so, it's highly unlikely they would
> be converted to ext4.

As the difference is easily visible even before y2038 by using
utimensat(old_inode, future_date) on a file, we should at least
decide what the sanest behavior is that we can easily implement,
and then document what is expected to happen here.

If we check for s_min_extra_isize instead of s_inode_size
to determine s_time_gran/s_time_max, we would warn
at mount time as well as and consistently truncate all
timestamps to full 32-bit seconds, regardless of whether
there is actually space or not.

Alternatively, we could warn if s_min_extra_isize is
too small, but use i_inode_size to determine
s_time_gran/s_time_max anyway.

>From looking at e2fsprogs git history, I see that
s_min_extra_isize has always been set by mkfs since
2008, but I'm not sure if there would have been a
case in which it remains set but the ext3.ko would
ignore it and use that space anyway.

   Arnd


Re: Linux 4.9.180 build fails with gcc 9 and 'cleanup_module' specifies less restrictive attribute than its target …

2019-08-02 Thread Miguel Ojeda
On Fri, Aug 2, 2019 at 12:33 PM Greg KH  wrote:
>
> On Fri, Aug 02, 2019 at 12:19:33PM +0200, Miguel Ojeda wrote:
> > On Fri, Aug 2, 2019 at 10:17 AM Rolf Eike Beer  wrote:
> > >
> > > Am Samstag, 8. Juni 2019, 14:00:34 CEST schrieb Miguel Ojeda:
> > > > On Thu, Jun 6, 2019 at 8:59 PM Greg KH  wrote:
> > > > > "manually fixing it up" means "hacked it to pieces" to me, I have no
> > > > > idea what the end result really was :)
> > > > >
> > > > > If someone wants to send me some patches I can actually apply, that
> > > > > would be best...
> > > >
> > > > I will give it a go whenever I get some free time :)
> > >
> > > I fear this has never happened, did it?
> >
> > No. Between summer, holidays and a conference I didn't get to do it.
> >
> > Done the minimal approach here:
> >
> >   https://github.com/ojeda/linux/commits/compiler-attributes-backport
> >
> > Tested building a handful of drivers with gcc 4.6.4, 8.3.0 and 9.1.1.
> >
> > Greg, I could backport the entire compiler_attributes.h, but given
> > this is stable, we are supposed to minimize changes, right?
> >
> > I tried to imitate what you do in other stable patches, please check
> > the Cc:, Link: lines and the "commit ... upstream" just in case.
>
> If only those 2 patches are all that is needed, nice!  I'll gladly take
> them, can you send them to me (and cc: the stable list) in email so I
> can queue them up for the next round of releases after this one?

Done! Please double check, since I am not used to send to stable.

Cheers,
Miguel


Re: Linux 4.9.180 build fails with gcc 9 and 'cleanup_module' specifies less restrictive attribute than its target …

2019-08-02 Thread Greg KH
On Fri, Aug 02, 2019 at 12:19:33PM +0200, Miguel Ojeda wrote:
> On Fri, Aug 2, 2019 at 10:17 AM Rolf Eike Beer  wrote:
> >
> > Am Samstag, 8. Juni 2019, 14:00:34 CEST schrieb Miguel Ojeda:
> > > On Thu, Jun 6, 2019 at 8:59 PM Greg KH  wrote:
> > > > "manually fixing it up" means "hacked it to pieces" to me, I have no
> > > > idea what the end result really was :)
> > > >
> > > > If someone wants to send me some patches I can actually apply, that
> > > > would be best...
> > >
> > > I will give it a go whenever I get some free time :)
> >
> > I fear this has never happened, did it?
> 
> No. Between summer, holidays and a conference I didn't get to do it.
> 
> Done the minimal approach here:
> 
>   https://github.com/ojeda/linux/commits/compiler-attributes-backport
> 
> Tested building a handful of drivers with gcc 4.6.4, 8.3.0 and 9.1.1.
> 
> Greg, I could backport the entire compiler_attributes.h, but given
> this is stable, we are supposed to minimize changes, right?
> 
> I tried to imitate what you do in other stable patches, please check
> the Cc:, Link: lines and the "commit ... upstream" just in case.

If only those 2 patches are all that is needed, nice!  I'll gladly take
them, can you send them to me (and cc: the stable list) in email so I
can queue them up for the next round of releases after this one?

thanks,

greg k-h


[PATCH v2 5/6] ARM: dts: mmp2: specify reg-shift for the UARTs

2019-08-02 Thread Lubomir Rintel
This makes the 8250_of driver happy. There are two more drivers in the
tree that bind to mrvl,mmp-uart compatibles: pxa and 8250_pxa and
neither of them requires the reg-shift property, assuming it's always 2.

Signed-off-by: Lubomir Rintel 

---
Changes since v1:
- Updated the subject to fit the style of the DTS updates
---
 arch/arm/boot/dts/mmp2.dtsi | 4 
 1 file changed, 4 insertions(+)

diff --git a/arch/arm/boot/dts/mmp2.dtsi b/arch/arm/boot/dts/mmp2.dtsi
index 68b5470773232..6a2f072c1d0a8 100644
--- a/arch/arm/boot/dts/mmp2.dtsi
+++ b/arch/arm/boot/dts/mmp2.dtsi
@@ -214,6 +214,7 @@
interrupts = <27>;
clocks = <&soc_clocks MMP2_CLK_UART0>;
resets = <&soc_clocks MMP2_CLK_UART0>;
+   reg-shift = <2>;
status = "disabled";
};
 
@@ -223,6 +224,7 @@
interrupts = <28>;
clocks = <&soc_clocks MMP2_CLK_UART1>;
resets = <&soc_clocks MMP2_CLK_UART1>;
+   reg-shift = <2>;
status = "disabled";
};
 
@@ -232,6 +234,7 @@
interrupts = <24>;
clocks = <&soc_clocks MMP2_CLK_UART2>;
resets = <&soc_clocks MMP2_CLK_UART2>;
+   reg-shift = <2>;
status = "disabled";
};
 
@@ -241,6 +244,7 @@
interrupts = <46>;
clocks = <&soc_clocks MMP2_CLK_UART3>;
resets = <&soc_clocks MMP2_CLK_UART3>;
+   reg-shift = <2>;
status = "disabled";
};
 
-- 
2.21.0



[PATCH v2 0/6] ARM: dts: mmp2: devicetree updates

2019-08-02 Thread Lubomir Rintel
Hi,

Here's a couple of updates for the MMP2 SoC devicetree files.

The only change from the last submission is the addition of the
OLPC XO 1.75 dts file. Apart from that one, the patches are
independent of each other, can be applied in any order.

Hopefully I'm sending the patch set in the correct direction.

Lubo




[PATCH v2 3/6] ARM: dts: mmp2: rename the USB PHY node

2019-08-02 Thread Lubomir Rintel
This device is not an OTG phy, it's a regular USB HS phy. Follow the
generic node name recommendation, and rename it to "usb-phy".

Signed-off-by: Lubomir Rintel 
---
 arch/arm/boot/dts/mmp2.dtsi | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/arm/boot/dts/mmp2.dtsi b/arch/arm/boot/dts/mmp2.dtsi
index e64639ce57a91..21432cb9143f7 100644
--- a/arch/arm/boot/dts/mmp2.dtsi
+++ b/arch/arm/boot/dts/mmp2.dtsi
@@ -117,7 +117,7 @@
mrvl,intc-nr-irqs = <2>;
};
 
-   usb_otg_phy0: usb-otg-phy@d4207000 {
+   usb_phy0: usb-phy@d4207000 {
compatible = "marvell,mmp2-usb-phy";
reg = <0xd4207000 0x40>;
#phy-cells = <0>;
@@ -130,7 +130,7 @@
interrupts = <44>;
clocks = <&soc_clocks MMP2_CLK_USB>;
clock-names = "USBCLK";
-   phys = <&usb_otg_phy0>;
+   phys = <&usb_phy0>;
phy-names = "usb";
status = "disabled";
};
-- 
2.21.0



[PATCH v2 1/6] ARM: dts: mmp2: trivial whitespace fix

2019-08-02 Thread Lubomir Rintel
A missing space before a curly brace.

Signed-off-by: Lubomir Rintel 
---
 arch/arm/boot/dts/mmp2.dtsi | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/arm/boot/dts/mmp2.dtsi b/arch/arm/boot/dts/mmp2.dtsi
index b6f40743e07b0..50b6c38b39cc3 100644
--- a/arch/arm/boot/dts/mmp2.dtsi
+++ b/arch/arm/boot/dts/mmp2.dtsi
@@ -379,7 +379,7 @@
};
};
 
-   soc_clocks: clocks{
+   soc_clocks: clocks {
compatible = "marvell,mmp2-clock";
reg = <0xd405 0x1000>,
  <0xd4282800 0x400>,
-- 
2.21.0



[PATCH v2 2/6] ARM: dts: mmp2: fix the SPI nodes

2019-08-02 Thread Lubomir Rintel
The SPI bus has a single address cell and not size cells.

Also, dtc thinks the SPI nodes are preferrably called "spi" and it is
right to think so.

Signed-off-by: Lubomir Rintel 
---
 arch/arm/boot/dts/mmp2.dtsi | 16 
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/arch/arm/boot/dts/mmp2.dtsi b/arch/arm/boot/dts/mmp2.dtsi
index 50b6c38b39cc3..e64639ce57a91 100644
--- a/arch/arm/boot/dts/mmp2.dtsi
+++ b/arch/arm/boot/dts/mmp2.dtsi
@@ -346,35 +346,43 @@
status = "disabled";
};
 
-   ssp1: ssp@d4035000 {
+   ssp1: spi@d4035000 {
compatible = "marvell,mmp2-ssp";
reg = <0xd4035000 0x1000>;
clocks = <&soc_clocks MMP2_CLK_SSP0>;
interrupts = <0>;
+   #address-cells = <1>;
+   #size-cells = <0>;
status = "disabled";
};
 
-   ssp2: ssp@d4036000 {
+   ssp2: spi@d4036000 {
compatible = "marvell,mmp2-ssp";
reg = <0xd4036000 0x1000>;
clocks = <&soc_clocks MMP2_CLK_SSP1>;
interrupts = <1>;
+   #address-cells = <1>;
+   #size-cells = <0>;
status = "disabled";
};
 
-   ssp3: ssp@d4037000 {
+   ssp3: spi@d4037000 {
compatible = "marvell,mmp2-ssp";
reg = <0xd4037000 0x1000>;
clocks = <&soc_clocks MMP2_CLK_SSP2>;
interrupts = <20>;
+   #address-cells = <1>;
+   #size-cells = <0>;
status = "disabled";
};
 
-   ssp4: ssp@d4039000 {
+   ssp4: spi@d4039000 {
compatible = "marvell,mmp2-ssp";
reg = <0xd4039000 0x1000>;
clocks = <&soc_clocks MMP2_CLK_SSP3>;
interrupts = <21>;
+   #address-cells = <1>;
+   #size-cells = <0>;
status = "disabled";
};
};
-- 
2.21.0



[PATCH v2 4/6] ARM: dts: mmp2: add camera interfaces

2019-08-02 Thread Lubomir Rintel
Supported by the mmp-camera driver.

Signed-off-by: Lubomir Rintel 
---
 arch/arm/boot/dts/mmp2.dtsi | 22 ++
 1 file changed, 22 insertions(+)

diff --git a/arch/arm/boot/dts/mmp2.dtsi b/arch/arm/boot/dts/mmp2.dtsi
index 21432cb9143f7..68b5470773232 100644
--- a/arch/arm/boot/dts/mmp2.dtsi
+++ b/arch/arm/boot/dts/mmp2.dtsi
@@ -170,6 +170,28 @@
interrupts = <54>;
status = "disabled";
};
+
+   camera0: camera@d420a000 {
+   compatible = "marvell,mmp2-ccic";
+   reg = <0xd420a000 0x800>;
+   interrupts = <42>;
+   clocks = <&soc_clocks MMP2_CLK_CCIC0>;
+   clock-names = "axi";
+   #clock-cells = <0>;
+   clock-output-names = "mclk";
+   status = "disabled";
+   };
+
+   camera1: camera@d420a800 {
+   compatible = "marvell,mmp2-ccic";
+   reg = <0xd420a800 0x800>;
+   interrupts = <30>;
+   clocks = <&soc_clocks MMP2_CLK_CCIC1>;
+   clock-names = "axi";
+   #clock-cells = <0>;
+   clock-output-names = "mclk";
+   status = "disabled";
+   };
};
 
apb@d400 {  /* APB */
-- 
2.21.0



[PATCH v2 6/6] ARM: dts: mmp2: add OLPC XO 1.75 machine

2019-08-02 Thread Lubomir Rintel
This is a fairly complete description of an OLPC XO 1.75 laptop.
What's missing for now is the GPU, LCD controller, DCON, the panel and
audio.

The machine is booted with OpenFirmware and thus has a devicetree.
However, older versions are unable to create a valid FDT and don't
follow the Linux bindings. Having an device tree in the kernel tree
makes it easier to use mainline kernels on such machines, test changes
with CONFIG_ARM_APPENDED_DTB and give a good reference on what bindings
are used on the machine without an access to one.

Signed-off-by: Lubomir Rintel 
---
 arch/arm/boot/dts/Makefile  |   3 +-
 arch/arm/boot/dts/mmp2-olpc-xo-1-75.dts | 244 
 2 files changed, 246 insertions(+), 1 deletion(-)
 create mode 100644 arch/arm/boot/dts/mmp2-olpc-xo-1-75.dts

diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index 9159fa2cea90c..65213b5265187 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -336,7 +336,8 @@ dtb-$(CONFIG_MACH_MESON8) += \
 dtb-$(CONFIG_ARCH_MMP) += \
pxa168-aspenite.dtb \
pxa910-dkb.dtb \
-   mmp2-brownstone.dtb
+   mmp2-brownstone.dtb \
+   mmp2-olpc-xo-1-75.dtb
 dtb-$(CONFIG_ARCH_MPS2) += \
mps2-an385.dtb \
mps2-an399.dtb
diff --git a/arch/arm/boot/dts/mmp2-olpc-xo-1-75.dts 
b/arch/arm/boot/dts/mmp2-olpc-xo-1-75.dts
new file mode 100644
index 0..6cfa0d4a18845
--- /dev/null
+++ b/arch/arm/boot/dts/mmp2-olpc-xo-1-75.dts
@@ -0,0 +1,244 @@
+// SPDX-License-Identifier: GPL-2.0-or-later OR MIT
+/*
+ * OLPC XO 1.75 Laptop.
+ *
+ * Copyright (C) 2018,2019 Lubomir Rintel 
+ */
+
+/dts-v1/;
+#include "mmp2.dtsi"
+#include 
+#include 
+#include 
+
+/ {
+   model = "OLPC XO-1.75";
+   compatible = "olpc,xo-1.75", "mrvl,mmp2";
+
+   chosen {
+   #address-cells = <1>;
+   #size-cells = <1>;
+   ranges;
+
+   framebuffer@1fc0 {
+   compatible = "simple-framebuffer";
+   reg = <0x1fc0 (1200 * 900 * 2)>;
+   width = <1200>;
+   height = <900>;
+   stride = <(1200 * 2)>;
+   format = "r5g6b5";
+   clocks = <&soc_clocks MMP2_CLK_DISP0_LCDC>,
+<&soc_clocks MMP2_CLK_DISP0>;
+   };
+   };
+
+   memory {
+   linux,usable-memory = <0x0 0x1f80>;
+   available = <0xcf000 0x1ef31000 0x1000 0xbf000>;
+   reg = <0x0 0x2000>;
+   device_type = "memory";
+   };
+
+   gpio-keys {
+   compatible = "gpio-keys";
+
+   lid {
+   label = "Lid";
+   gpios = <&gpio 129 GPIO_ACTIVE_LOW>;
+   linux,input-type = ;
+   linux,code = ;
+   wakeup-source;
+   };
+
+   tablet_mode {
+   label = "E-Book Mode";
+   gpios = <&gpio 128 GPIO_ACTIVE_LOW>;
+   linux,input-type = ;
+   linux,code = ;
+   wakeup-source;
+   };
+
+   microphone_insert {
+   label = "Microphone Plug";
+   gpios = <&gpio 96 GPIO_ACTIVE_HIGH>;
+   linux,input-type = ;
+   linux,code = ;
+   debounce-interval = <100>;
+   wakeup-source;
+   };
+
+   headphone_insert {
+   label = "Headphone Plug";
+   gpios = <&gpio 97 GPIO_ACTIVE_HIGH>;
+   linux,input-type = ;
+   linux,code = ;
+   debounce-interval = <100>;
+   wakeup-source;
+   };
+   };
+
+   camera_i2c {
+   compatible = "i2c-gpio";
+   gpios = <&gpio 109 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>,
+   <&gpio 108 (GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN)>;
+   #address-cells = <1>;
+   #size-cells = <0>;
+   i2c-gpio,timeout-ms = <1000>;
+   status = "okay";
+
+   camera@21 {
+   compatible = "ovti,ov7670";
+   reg = <0x21>;
+   reset-gpios = <&gpio 102 GPIO_ACTIVE_LOW>;
+   powerdown-gpios = <&gpio 150 GPIO_ACTIVE_LOW>;
+   clocks = <&camera0>;
+   clock-names = "xclk";
+
+   port {
+   ov7670_0: endpoint {
+   hsync-active = <1>;
+   vsync-active = <1>;
+   remote-endpoint = <&camera0_0>;
+   };
+ 

Re: [PATCH v2 1/2] khugepaged: enable collapse pmd for pte-mapped THP

2019-08-02 Thread Oleg Nesterov
On 08/01, Song Liu wrote:
>
>
> > On Aug 1, 2019, at 7:50 AM, Oleg Nesterov  wrote:
> >
> > On 07/31, Song Liu wrote:
> >>
> >> +static int khugepaged_add_pte_mapped_thp(struct mm_struct *mm,
> >> +   unsigned long addr)
> >> +{
> >> +  struct mm_slot *mm_slot;
> >> +  int ret = 0;
> >> +
> >> +  /* hold mmap_sem for khugepaged_test_exit() */
> >> +  VM_BUG_ON_MM(!rwsem_is_locked(&mm->mmap_sem), mm);
> >> +  VM_BUG_ON(addr & ~HPAGE_PMD_MASK);
> >> +
> >> +  if (unlikely(khugepaged_test_exit(mm)))
> >> +  return 0;
> >> +
> >> +  if (!test_bit(MMF_VM_HUGEPAGE, &mm->flags) &&
> >> +  !test_bit(MMF_DISABLE_THP, &mm->flags)) {
> >> +  ret = __khugepaged_enter(mm);
> >> +  if (ret)
> >> +  return ret;
> >> +  }
> >
> > could you explain why do we need mm->mmap_sem, khugepaged_test_exit() check
> > and __khugepaged_enter() ?
>
> If the mm doesn't have a mm_slot, we would like to create one here (by
> calling __khugepaged_enter()).

I can be easily wrong, I never read this code before, but this doesn't
look correct.

Firstly, mm->mmap_sem cam ONLY help if a) the task already has mm_slot
and b) this mm_slot is khugepaged_scan.mm_slot. Otherwise khugepaged_exit()
won't take mmap_sem for writing and thus we can't rely on test_exit().

and this means that down_read(mmap_sem) before khugepaged_add_pte_mapped_thp()
is pointless and can't help; this mm was found by vma_interval_tree_foreach().

so __khugepaged_enter() can race with khugepaged_exit() and this is wrong
in any case.

> This happens when the THP is created by another mm, or by tmpfs with
> "huge=always"; and then page table of this mm got split by split_huge_pmd().
> With current kernel, this happens when we attach/detach uprobe to a file
> in tmpfs with huge=always.

Well. In this particular case khugepaged_enter() was likely already called
by shmem_mmap() or khugepaged_enter_vma_merge(), or madvise.

(in fact I think do_set_pmd() or shmem_fault() should call _enter() too,
 like do_huge_pmd_anonymous_page() does, but this is another story).


And I forgot to mention... I don't understand why
khugepaged_collapse_pte_mapped_thps() has to be called with khugepaged_mm_lock.

Oleg.



[PATCH] dpaa_eth: Use refcount_t for refcount

2019-08-02 Thread Chuhong Yuan
refcount_t is better for reference counters since its
implementation can prevent overflows.
So convert atomic_t ref counters to refcount_t.

Signed-off-by: Chuhong Yuan 
---
 drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 6 +++---
 drivers/net/ethernet/freescale/dpaa/dpaa_eth.h | 2 +-
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c 
b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
index f38c3fa7d705..2df6e745cb3f 100644
--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
+++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
@@ -485,7 +485,7 @@ static struct dpaa_bp *dpaa_bpid2pool(int bpid)
 static bool dpaa_bpid2pool_use(int bpid)
 {
if (dpaa_bpid2pool(bpid)) {
-   atomic_inc(&dpaa_bp_array[bpid]->refs);
+   refcount_inc(&dpaa_bp_array[bpid]->refs);
return true;
}
 
@@ -496,7 +496,7 @@ static bool dpaa_bpid2pool_use(int bpid)
 static void dpaa_bpid2pool_map(int bpid, struct dpaa_bp *dpaa_bp)
 {
dpaa_bp_array[bpid] = dpaa_bp;
-   atomic_set(&dpaa_bp->refs, 1);
+   refcount_set(&dpaa_bp->refs, 1);
 }
 
 static int dpaa_bp_alloc_pool(struct dpaa_bp *dpaa_bp)
@@ -584,7 +584,7 @@ static void dpaa_bp_free(struct dpaa_bp *dpaa_bp)
if (!bp)
return;
 
-   if (!atomic_dec_and_test(&bp->refs))
+   if (!refcount_dec_and_test(&bp->refs))
return;
 
if (bp->free_buf_cb)
diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h 
b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h
index af320f83c742..acc3fcdf730a 100644
--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h
+++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.h
@@ -99,7 +99,7 @@ struct dpaa_bp {
int (*seed_cb)(struct dpaa_bp *);
/* bpool can be emptied before freeing by this cb */
void (*free_buf_cb)(const struct dpaa_bp *, struct bm_buffer *);
-   atomic_t refs;
+   refcount_t refs;
 };
 
 struct dpaa_rx_errors {
-- 
2.20.1



Re: UDF filesystem image with Write-Once UDF Access Type

2019-08-02 Thread Jan Kara
On Thu 01-08-19 10:57:55, Pali Rohár wrote:
> On Thursday 01 August 2019 10:38:00 Jan Kara wrote:
> > Hum, looks like a problem with mkudffs. Relevant debug messages look like:
> > 
> > UDF-fs: fs/udf/super.c:671:udf_check_vsd: Starting at sector 16 (2048 byte 
> > sectors)
> > UDF-fs: fs/udf/super.c:824:udf_load_pvoldesc: recording time 2019/08/01 
> > 09:47 (1078)
> > UDF-fs: fs/udf/super.c:836:udf_load_pvoldesc: volIdent[] = 'LinuxUDF'
> > UDF-fs: fs/udf/super.c:844:udf_load_pvoldesc: volSetIdent[] = 
> > '1564645645200563LinuxUDF'
> > UDF-fs: fs/udf/super.c:1462:udf_load_logicalvol: Partition (0:0) type 1 on 
> > volume 1
> > UDF-fs: fs/udf/super.c:1462:udf_load_logicalvol: Partition (1:0) type 2 on 
> > volume 1
> > UDF-fs: fs/udf/super.c:1471:udf_load_logicalvol: FileSet found in 
> > LogicalVolDesc at block=0, partition=1
> > UDF-fs: fs/udf/super.c:1218:udf_load_partdesc: Searching map: (0 == 0)
> > UDF-fs: fs/udf/super.c:1060:udf_fill_partdesc_info: Partition (0 type 1511) 
> > starts at physical 288, block length 524000
> > UDF-fs: fs/udf/super.c:1060:udf_fill_partdesc_info: Partition (1 type 2012) 
> > starts at physical 288, block length 524000
> > UDF-fs: fs/udf/misc.c:223:udf_read_tagged: location mismatch block 524287, 
> > tag 0 != 523999
> > UDF-fs: error (device ubdb): udf_read_inode: (ino 524287) failed !bh
> > 
> > So the fact that location tag was 0 in block 524287 (which should contain
> > VAT inode) suggests there's something fishy with how / where mkudffs
> > creates the VAT inode. Can you have a look?
> > 
> > BTW, mkudffs messages look like:
> > filename=/tmp/image
> > label=LinuxUDF
> > uuid=1564645645200563
> > blocksize=2048
> > blocks=524288
> > udfrev=2.01
> > vatblock=319
> > start=0, blocks=16, type=RESERVED 
> > start=16, blocks=4, type=VRS 
> > start=20, blocks=76, type=USPACE 
> > start=96, blocks=16, type=MVDS 
> > start=112, blocks=16, type=USPACE 
> > start=128, blocks=1, type=LVID 
> > start=129, blocks=95, type=USPACE 
> > start=224, blocks=16, type=RVDS 
> > start=240, blocks=16, type=USPACE 
> > start=256, blocks=1, type=ANCHOR 
> > start=257, blocks=31, type=USPACE 
> > start=288, blocks=524000, type=PSPACE 
> > 
> > which suggests that VAT was indeed allocated somewhere in the beginning of
> > the partition.
> 
> For write-once media you are not able to modify size of UDF partition.
> So if you are creating image for CD-R disc, you need to specify size of
> UDF filesystem to match size of CD-R disc. VAT is always burned to the
> last block of current track on CD-R.
> 
> Therefore if you had pre-allocated big image file for CD-R and then you
> run mkudffs for cdr on it, you lost information what is the last used
> block on that cdr image. Normally for optical drivers kernel use mmc
> commands to retrieve last block of current session and based on it find
> VAT. But image files loaded via /dev/loop are not optical drivers and
> therefore do not have ability "hardware" ability to ask where is the
> last used block. IIRC in this case kernel just fallback to the last
> block of block device for VAT, which in this case is not correct.
> 
> What should help is to truncate image file to "correct" size after
> running mkudffs with --media-type=cdr. Maybe mkudffs itself should do it
> when was asked to create UDF filesystem for CD-R on existing image file.

Ah, right. Thanks for explanation. I somehow assumed that mkudffs will be
considering the last block of the "device file" the last block that it has
to record but you're right that on second though that doesn't really make
sense.
Honza
-- 
Jan Kara 
SUSE Labs, CR


Re: [BUILD REGRESSION] building single .ko not working in 5.3-rc1

2019-08-02 Thread Masahiro Yamada
On Fri, Aug 2, 2019 at 6:26 PM Arend Van Spriel
 wrote:
>
> In previous kernel versions I could do:
>
> make M=net/wireless cfg80211.ko
>
> However, in 5.3-rc1 I now get:
>
> $ make M=net/wireless cfg80211.ko
> make[1]: *** No rule to make target `cfg80211.ko'.  Stop.
> make: *** [sub-make] Error 2
>
> The 'modules' target is working, but sometimes there are multiple
> modules and I only want to build just one explicitly. Can this option be
> restored?

Please test this:
https://patchwork.kernel.org/patch/11073103/


BTW,
'make M=net/wireless cfg80211.ko' still works,
but if you  build a single module in the kernel tree,

make net/wireless/cfg80211.ko

is more correct.

M= is used for external modules.




> Regards,
> Arend



-- 
Best Regards
Masahiro Yamada


Re: [PATCH 0/5] Fix FIFO-99 abuse

2019-08-02 Thread Qais Yousef
On 08/02/19 11:32, Peter Zijlstra wrote:
> On Thu, Aug 01, 2019 at 02:17:07PM +0100, Qais Yousef wrote:
> > On 08/01/19 13:13, Peter Zijlstra wrote:
> > > I noticed a bunch of kthreads defaulted to FIFO-99, fix them.
> > > 
> > > The generic default is FIFO-50, the admin will have to configure the 
> > > system
> > > anyway.
> > > 
> > > For some the purpose is to be above OTHER and then FIFO-1 really is 
> > > sufficient.
> > 
> > I was looking in this area too and was thinking of a way to consolidate the
> > creation of RT/DL tasks in the kernel and the way we set the priority.
> > 
> > Does it make sense to create a new header for RT priorities for kthreads
> > created in the kernel so that we can easily track and rationale about the
> > relative priorities of in-kernel RT tasks?
> > 
> > When working in the FW world such a header helped a lot in understanding 
> > what
> > runs at each priority level and how to reason about what priority level 
> > makes
> > sense for a new item. It could be a nice single point of reference; even for
> > admins.
> 
> Well, SCHED_FIFO is a broken scheduler model; that is, it is
> fundamentally incapable of resource management, which is the one thing
> an OS really should be doing.
> 
> This is of course the reason it is limited to privileged users only.
> 
> Worse still; it is fundamentally impossible to compose static priority
> workloads. You cannot take two correctly working static prio workloads
> and smash them together and still expect them to work.
> 
> For this reason 'all' FIFO tasks the kernel creates are basically at:
> 
>   MAX_RT_PRIO / 2
> 
> The administrator _MUST_ configure the system, the kernel simply doesn't
> know enough information to make a sensible choice.
> 
> Now, Geert suggested so make make a define for that, but how about we do
> something like:
> 
> /*
>  * ${the above explanation}
>  */
> int kernel_setscheduler_fifo(struct task_struct *p)
> {
>   struct sched_param sp = { .sched_priority = MAX_RT_PRIO / 2 };
>   return sched_setscheduler_nocheck(p, SCHED_FIFO, &sp);
> }
> 
> And then take away sched_setscheduler*().

Yes a somewhat enforced default makes more sense to me. I assume you no longer
want to put the kthreads that just need to be above OTHER in FIFO-1?

While at it, since we will cram all kthreads on the same priority, isn't
a SCHED_RR a better choice now? I think the probability of a clash is pretty
low, but when it happens, shouldn't we try to guarantee some fairness?

--
Qais Yousef


[PATCH] ACPI: PM: Print debug messages on device power state changes

2019-08-02 Thread Rafael J. Wysocki
From: Rafael J. Wysocki 

Add an acpi_handle_debug() statement to acpi_device_set_power() to
allow ACPI device power state changes to be tracked.

Signed-off-by: Rafael J. Wysocki 
---
 drivers/acpi/device_pm.c |4 
 1 file changed, 4 insertions(+)

Index: linux-pm/drivers/acpi/device_pm.c
===
--- linux-pm.orig/drivers/acpi/device_pm.c
+++ linux-pm/drivers/acpi/device_pm.c
@@ -166,6 +166,10 @@ int acpi_device_set_power(struct acpi_de
|| (state < ACPI_STATE_D0) || (state > ACPI_STATE_D3_COLD))
return -EINVAL;
 
+   acpi_handle_debug(device->handle, "Power state change: %s -> %s\n",
+ acpi_power_state_string(device->power.state),
+ acpi_power_state_string(state));
+
/* Make sure this is a valid target state */
 
/* There is a special case for D0 addressed below. */





[PATCH] kbuild: revive single target %.ko

2019-08-02 Thread Masahiro Yamada
I removed the single target %.ko in commit ff9b45c55b26 ("kbuild:
modpost: read modules.order instead of $(MODVERDIR)/*.mod") because
the modpost stage does not work reliably. For instance, the module
dependency, modversion, etc. do not work if we lack symbol information
from the other modules.

Yet, some people still want to build only one module in their interest,
and it may be still useful if it is used within those limitations.

Fixes: ff9b45c55b26 ("kbuild: modpost: read modules.order instead of 
$(MODVERDIR)/*.mod")
Reported-by: Don Brace 
Reported-by: Arend Van Spriel 
Signed-off-by: Masahiro Yamada 
---

 Makefile | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/Makefile b/Makefile
index 571cf862d7a4..e4c7211f5a3b 100644
--- a/Makefile
+++ b/Makefile
@@ -997,6 +997,8 @@ endif
 
 PHONY += prepare0
 
+export MODORDER := $(if $(KBUILD_EXTMOD),$(KBUILD_EXTMOD)/)modules.order
+
 ifeq ($(KBUILD_EXTMOD),)
 core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/
 
@@ -1766,6 +1768,10 @@ build-dir = $(patsubst %/,%,$(dir $(build-target)))
$(Q)$(MAKE) $(build)=$(build-dir) $(build-target)
 %.symtypes: prepare FORCE
$(Q)$(MAKE) $(build)=$(build-dir) $(build-target)
+%.ko: prepare FORCE
+   $(Q)$(MAKE) $(build)=$(build-dir) $(build-target:.ko=.mod)
+   $(Q)echo $(build-target) > $(MODORDER)
+   $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost || { rm -f 
$(MODORDER); false; }
 
 # Modules
 PHONY += /
-- 
2.17.1



Re: Reminder: 1 open syzbot bug in rtc subsystem

2019-08-02 Thread Pavel Machek
On Tue 2019-07-30 19:27:07, Eric Biggers wrote:
> On Sun, Jul 28, 2019 at 03:23:33PM +0200, Pavel Machek wrote:
> > On Tue 2019-07-23 19:50:08, Eric Biggers wrote:
> > > [This email was generated by a script.  Let me know if you have any 
> > > suggestions
> > > to make it better, or if you want it re-generated with the latest status.]
> > > 
> > > Of the currently open syzbot reports against the upstream kernel, I've 
> > > manually
> > > marked 1 of them as possibly being a bug in the rtc subsystem.
> > > 
> > > If you believe this bug is no longer valid, please close the syzbot 
> > > report by
> > > sending a '#syz fix', '#syz dup', or '#syz invalid' command in reply to 
> > > the
> > > original thread, as explained at https://goo.gl/tpsmEJ#status
> > > 
> > > If you believe I misattributed this bug to the rtc subsystem, please let 
> > > me
> > > know, and if possible forward the report to the correct people or mailing 
> > > list.
> > > 
> > > Here is the bug:
> > 
> > 
> > Can you stop spamming lkml?
> > 
> > Sending 20 "reminders" in a row is not something human would do, and it is 
> > not
> > something your bot should be allowed to do, either.
> > 
> 
> Hi Pavel, just to clarify, though I used a script to generate these emails, I
> manually reviewed and sent each one; I also manually assigned the subsystems 
> and
> sanity checked the bisection results.  (I'm also not on the syzbot team.  I 
> just
> care about the security and reliability of the Linux kernel...)  The reason
> there are so many of these emails is that there are a lot of kernel subsystems
> with open bug reports, many clearly still valid -- even considering that I
> decided to skip some subsystems after deciding to just fix the bugs myself,
> update the bug statuses myself, send some other email, or just wait.
> 
> I suppose there's some argument to be made that it's too noisy to Cc
> linux-kernel when I've already assigned a subsystem, though, so I'll try
> dropping linux-kernel from Cc for next time and just using the subsystem list
> and maintainers, and see if that goes any better or worse.

That should do the trick. Thanks!

> Note that the syzbot reports themselves are still going to linux-kernel, 
> though.

Yes, I know. I'm not entirely sure that is good idea.

Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) 
http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html


signature.asc
Description: Digital signature


[PATCH][net-next] net/mlx5: remove self-assignment on esw->dev

2019-08-02 Thread Colin King
From: Colin Ian King 

There is a self assignment of esw->dev to itself, clean this up by
removing it.

Addresses-Coverity: ("Self assignment")
Fixes: 6cedde451399 ("net/mlx5: E-Switch, Verify support QoS element type")
Signed-off-by: Colin Ian King 
---
 drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c 
b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
index f4ace5f8e884..de0894b695e3 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
@@ -1413,7 +1413,7 @@ static int esw_vport_egress_config(struct mlx5_eswitch 
*esw,
 
 static bool element_type_supported(struct mlx5_eswitch *esw, int type)
 {
-   struct mlx5_core_dev *dev = esw->dev = esw->dev;
+   struct mlx5_core_dev *dev = esw->dev;
 
switch (type) {
case SCHEDULING_CONTEXT_ELEMENT_TYPE_TSAR:
-- 
2.20.1



Re: [RFC PATCH 2/3] mm, compaction: use MIN_COMPACT_COSTLY_PRIORITY everywhere for costly orders

2019-08-02 Thread Vlastimil Babka
On 8/1/19 10:33 PM, Mike Kravetz wrote:
> On 8/1/19 6:01 AM, Vlastimil Babka wrote:
>> Could you try testing the patch below instead? It should hopefully
>> eliminate the stalls. If it makes hugepage allocation give up too early,
>> we'll know we have to involve __GFP_RETRY_MAYFAIL in allowing the
>> MIN_COMPACT_PRIORITY priority. Thanks!
> 
> Thanks.  This patch does eliminate the stalls I was seeing.

Great, thanks! I'll send a proper patch then.

> In my testing, there is little difference in how many hugetlb pages are
> allocated.  It does not appear to be giving up/failing too early.  But,
> this is only with __GFP_RETRY_MAYFAIL.  The real concern would with THP
> requests.  Any suggestions on how to test that?

AFAICS the default THP defrag mode is unaffected, as GFP_TRANSHUGE_LIGHT doesn't
include __GFP_DIRECT_RECLAIM, so it never reaches this code. Madvised THP
allocations will be affected, which should best be tested the same way as Andrea
and Mel did in the __GFP_THISNODE debate.



Re: [PATCH v19 00/15] arm64: untag user pointers passed to the kernel

2019-08-02 Thread Catalin Marinas
On Thu, Aug 01, 2019 at 08:36:47AM -0700, Dave Hansen wrote:
> On 8/1/19 5:48 AM, Andrey Konovalov wrote:
> > On Thu, Aug 1, 2019 at 2:11 PM Kevin Brodsky  wrote:
> >> On 31/07/2019 17:50, Dave Hansen wrote:
> >>> On 7/23/19 10:58 AM, Andrey Konovalov wrote:
>  The mmap and mremap (only new_addr) syscalls do not currently accept
>  tagged addresses. Architectures may interpret the tag as a background
>  colour for the corresponding vma.
> >>>
> >>> What the heck is a "background colour"? :)
> >>
> >> Good point, this is some jargon that we started using for MTE, the idea 
> >> being that
> >> the kernel could set a tag value (specified during mmap()) as "background 
> >> colour" for
> >> anonymous pages allocated in that range.
> >>
> >> Anyway, this patch series is not about MTE. Andrey, for v20 (if any), I 
> >> think it's
> >> best to drop this last sentence to avoid any confusion.

Indeed, the part with the "background colour" and even the "currently"
adverb should be dropped.

Also, if we merge the patches via different trees anyway, I don't think
there is a need for Andrey to integrate them with his series. We can
pick them up directly in the arm64 tree (once the review finished).

> OK, but what does that mean for tagged addresses getting passed to
> mmap/mremap?  That sentence read to me like "architectures might allow
> tags for ...something...".  So do we accept tagged addresses into those
> syscalls?

If mmap() does not return a tagged address, the reasoning is that it
should not accept one as an address hint (with or without MAP_FIXED).
Note that these docs should only describe the top-byte-ignore ABI while
leaving the memory tagging for a future patchset.

In that future patchset, we may want to update the mmap() ABI to allow,
only in conjunction with PROT_MTE, a tagged pointer as an address
argument. In such case mmap() will return a tagged address and the pages
pre-coloured (on fault) with the tag requested by the user. As I said,
that's to be discussed later in the year.

-- 
Catalin


Re: Linux 4.9.180 build fails with gcc 9 and 'cleanup_module' specifies less restrictive attribute than its target …

2019-08-02 Thread Miguel Ojeda
On Fri, Aug 2, 2019 at 10:17 AM Rolf Eike Beer  wrote:
>
> Am Samstag, 8. Juni 2019, 14:00:34 CEST schrieb Miguel Ojeda:
> > On Thu, Jun 6, 2019 at 8:59 PM Greg KH  wrote:
> > > "manually fixing it up" means "hacked it to pieces" to me, I have no
> > > idea what the end result really was :)
> > >
> > > If someone wants to send me some patches I can actually apply, that
> > > would be best...
> >
> > I will give it a go whenever I get some free time :)
>
> I fear this has never happened, did it?

No. Between summer, holidays and a conference I didn't get to do it.

Done the minimal approach here:

  https://github.com/ojeda/linux/commits/compiler-attributes-backport

Tested building a handful of drivers with gcc 4.6.4, 8.3.0 and 9.1.1.

Greg, I could backport the entire compiler_attributes.h, but given
this is stable, we are supposed to minimize changes, right?

I tried to imitate what you do in other stable patches, please check
the Cc:, Link: lines and the "commit ... upstream" just in case.

HTH,

Cheers,
Miguel


man-pages-5.02 is released

2019-08-02 Thread Michael Kerrisk (man-pages)
Gidday,

The Linux man-pages maintainer proudly announces:

man-pages-5.02 - man pages for Linux

This release resulted from patches, bug reports, reviews, and
comments from 28 people, with around 120 commits making changes 
to over 50 pages.

Tarball download:
http://www.kernel.org/doc/man-pages/download.html
Git repository:
https://git.kernel.org/cgit/docs/man-pages/man-pages.git/
Online changelog:
http://man7.org/linux/man-pages/changelog.html#release_5.02

A short summary of the release is blogged at:
https://linux-man-pages.blogspot.com/2019/08/man-pages-502-is-released.html

The current version of the pages is browsable at:
http://man7.org/linux/man-pages/

A selection of changes in this release that may be of interest
to readers of LKML is shown below.

Cheers,

Michael

 Changes in man-pages-5.02 

Released: 2019-08-02, Munich


Newly documented interfaces in existing pages
-

fanotify.7
fanotify_init.2
fanotify_mark.2
Matthew Bobrowski  [Amir Goldstein, Jan Kara]
Document FAN_REPORT_FID and directory modification events

vdso.7
Tobias Klauser  [Palmer Dabbelt]
Document vDSO for RISCV

Changes to individual pages
---

pldd.1
G. Branden Robinson  [Michael Kerrisk]
Document glibc's unbreakage of tool
After a longstanding breakage, pldd now works again (glibc 2.30).

execve.2
Michael Kerrisk  [Eugene Syromyatnikov]
Since Linux 5.1, the limit on the #! line is 255 chars (rather than 127)

mprotect.2
Mark Wielaard
pkey_mprotect() acts like mprotect() if pkey is set to -1, not 0

pivot_root.2
Michael Kerrisk
ERRORS: EINVAL occurs if 'new_root' or its parent has shared propagation
Michael Kerrisk
'new_root' must be a mount point
It appears that 'new_root' may not have needed to be a mount
point on ancient kernels, but already in Linux 2.4.5 this changed.
Michael Kerrisk
'put_old' can't be a mount point with MS_SHARED propagation

tkill.2
Michael Kerrisk
glibc 2.30 provides a wrapper for tgkill()

dlopen.3
Michael Kerrisk
Clarify the rules for symbol resolution in a dlopen'ed object
The existing text wrongly implied that symbol look up first
occurred in the object and then in main, and did not mention
whether dependencies of main where used for symbol resolution.
Michael Kerrisk
Clarify when an executable's symbols can be used for symbol resolution
The --export-dynamic linker option is not the only way that main's
global symbols may end up in the dynamic symbol table and thus be
used to satisfy symbol reference in a shared object. A symbol
may also be placed into the dynamic symbol table if ld(1)
notices a dependency in another object during the static link.
Michael Kerrisk
An object opened with RTLD_LOCAL can be promoted to RTLD_GLOBAL
Michael Kerrisk
Note that symbol use might keep a dlclose'd object in memory
Michael Kerrisk
On dlclose(), destructors are called when reference count falls to 0
Michael Kerrisk
Make it clear that RTLD_NODELETE also affects global variables
Michael Kerrisk
Clarify that constructors are called only when library is first loaded

on_exit.3
Michael Kerrisk  [Sami Kerola]
Stack variables may be out of scope when exit handler is invoked

capabilities.7
Michael Kerrisk
Add a note about using strace on binaries that have capabilities
Michael Kerrisk
Add pivot_root(2) to CAP_SYS_ADMIN list
Michael Kerrisk
CAP_FOWNER also allows modifying user xattrs on sticky directories

mount_namespaces.7
Michael Kerrisk
Clarify implications for other NS if mount point is removed in one NS
If a mount point is deleted or renamed or removed in one mount
namespace, this will cause an object that is mounted at that
location in another mount namespace to be unmounted (as verified
by experiment). This was implied by the existing text, but it is
better to make this detail explicit.
namespaces.7
Michael Kerrisk
Note initial values of hostname and domainname in a new UTS namespace

signal.7
Michal Sekletar  [Oleg Nesterov, Michael Kerrisk]
Clarify that siginfo_t isn't changed on coalescing

unix.7
Michael Kerrisk
Note SCM_RIGHTS interaction with RLIMIT_NOFILE
If the file descriptors received in SCM_RIGHTS would cause
the process to its exceed RLIMIT_NOFILE limit, the excess
FDs are discarded.

user_namespaces.7
Michael Kerrisk
Describe the effect of file-related capabilities inside user namespaces
Michael Kerrisk
Describe how kernel treats UIDs/GIDs when 

[PATCH 3/6] lib/refcount: Remove unused refcount_*_checked() variants

2019-08-02 Thread Will Deacon
The full-fat refcount implementation is exposed via a set of functions
suffixed with "_checked()", the idea being that code can choose to use
the more expensive, yet more secure implementation on a case-by-case
basis.

In reality, this hasn't happened, so with a grand total of zero users,
let's remove the checked variants for now by simply dropping the suffix.

Cc: Kees Cook 
Cc: Ingo Molnar 
Cc: Elena Reshetova 
Cc: Peter Zijlstra 
Cc: Ard Biesheuvel 
Signed-off-by: Will Deacon 
---
 include/linux/refcount.h | 25 +++-
 lib/refcount.c   | 50 
 2 files changed, 32 insertions(+), 43 deletions(-)

diff --git a/include/linux/refcount.h b/include/linux/refcount.h
index 89066a1471dd..edd505d1a23b 100644
--- a/include/linux/refcount.h
+++ b/include/linux/refcount.h
@@ -44,32 +44,21 @@ static inline unsigned int refcount_read(const refcount_t 
*r)
return atomic_read(&r->refs);
 }
 
-extern __must_check bool refcount_add_not_zero_checked(int i, refcount_t *r);
-extern void refcount_add_checked(int i, refcount_t *r);
-
-extern __must_check bool refcount_inc_not_zero_checked(refcount_t *r);
-extern void refcount_inc_checked(refcount_t *r);
-
-extern __must_check bool refcount_sub_and_test_checked(int i, refcount_t *r);
-
-extern __must_check bool refcount_dec_and_test_checked(refcount_t *r);
-extern void refcount_dec_checked(refcount_t *r);
-
 #ifdef CONFIG_REFCOUNT_FULL
 
 #define REFCOUNT_MAX   (UINT_MAX - 1)
 #define REFCOUNT_SATURATED UINT_MAX
 
-#define refcount_add_not_zero  refcount_add_not_zero_checked
-#define refcount_add   refcount_add_checked
+extern __must_check bool refcount_add_not_zero(int i, refcount_t *r);
+extern void refcount_add(int i, refcount_t *r);
 
-#define refcount_inc_not_zero  refcount_inc_not_zero_checked
-#define refcount_inc   refcount_inc_checked
+extern __must_check bool refcount_inc_not_zero(refcount_t *r);
+extern void refcount_inc(refcount_t *r);
 
-#define refcount_sub_and_test  refcount_sub_and_test_checked
+extern __must_check bool refcount_sub_and_test(int i, refcount_t *r);
 
-#define refcount_dec_and_test  refcount_dec_and_test_checked
-#define refcount_dec   refcount_dec_checked
+extern __must_check bool refcount_dec_and_test(refcount_t *r);
+extern void refcount_dec(refcount_t *r);
 
 #else
 
diff --git a/lib/refcount.c b/lib/refcount.c
index 719b0bc42ab1..75d024ae309f 100644
--- a/lib/refcount.c
+++ b/lib/refcount.c
@@ -44,7 +44,7 @@
 #include 
 
 /**
- * refcount_add_not_zero_checked - add a value to a refcount unless it is 0
+ * refcount_add_not_zero - add a value to a refcount unless it is 0
  * @i: the value to add to the refcount
  * @r: the refcount
  *
@@ -61,7 +61,7 @@
  *
  * Return: false if the passed refcount is 0, true otherwise
  */
-bool refcount_add_not_zero_checked(int i, refcount_t *r)
+bool refcount_add_not_zero(int i, refcount_t *r)
 {
unsigned int new, val = atomic_read(&r->refs);
 
@@ -83,10 +83,10 @@ bool refcount_add_not_zero_checked(int i, refcount_t *r)
 
return true;
 }
-EXPORT_SYMBOL(refcount_add_not_zero_checked);
+EXPORT_SYMBOL(refcount_add_not_zero);
 
 /**
- * refcount_add_checked - add a value to a refcount
+ * refcount_add - add a value to a refcount
  * @i: the value to add to the refcount
  * @r: the refcount
  *
@@ -101,14 +101,14 @@ EXPORT_SYMBOL(refcount_add_not_zero_checked);
  * cases, refcount_inc(), or one of its variants, should instead be used to
  * increment a reference count.
  */
-void refcount_add_checked(int i, refcount_t *r)
+void refcount_add(int i, refcount_t *r)
 {
-   WARN_ONCE(!refcount_add_not_zero_checked(i, r), "refcount_t: addition 
on 0; use-after-free.\n");
+   WARN_ONCE(!refcount_add_not_zero(i, r), "refcount_t: addition on 0; 
use-after-free.\n");
 }
-EXPORT_SYMBOL(refcount_add_checked);
+EXPORT_SYMBOL(refcount_add);
 
 /**
- * refcount_inc_not_zero_checked - increment a refcount unless it is 0
+ * refcount_inc_not_zero - increment a refcount unless it is 0
  * @r: the refcount to increment
  *
  * Similar to atomic_inc_not_zero(), but will saturate at REFCOUNT_SATURATED
@@ -120,7 +120,7 @@ EXPORT_SYMBOL(refcount_add_checked);
  *
  * Return: true if the increment was successful, false otherwise
  */
-bool refcount_inc_not_zero_checked(refcount_t *r)
+bool refcount_inc_not_zero(refcount_t *r)
 {
unsigned int new, val = atomic_read(&r->refs);
 
@@ -140,10 +140,10 @@ bool refcount_inc_not_zero_checked(refcount_t *r)
 
return true;
 }
-EXPORT_SYMBOL(refcount_inc_not_zero_checked);
+EXPORT_SYMBOL(refcount_inc_not_zero);
 
 /**
- * refcount_inc_checked - increment a refcount
+ * refcount_inc - increment a refcount
  * @r: the refcount to increment
  *
  * Similar to atomic_inc(), but will saturate at REFCOUNT_SATURATED and WARN.
@@ -154,14 +154,14 @@ EXPORT_SYMBOL(refcount_inc_not_zero_checked);
  * Will WARN if the refcount is 0, as this represents a poss

[PATCH 5/6] lib/refcount: Improve performance of generic REFCOUNT_FULL code

2019-08-02 Thread Will Deacon
Rewrite the generic REFCOUNT_FULL implementation so that the saturation
point is moved to INT_MIN / 2. This allows us to defer the sanity checks
until after the atomic operation, which removes many uses of cmpxchg()
in favour of atomic_fetch_{add,sub}().

Cc: Kees Cook 
Cc: Ingo Molnar 
Cc: Elena Reshetova 
Cc: Peter Zijlstra 
Cc: Ard Biesheuvel 
Tested-by: Hanjun Guo 
Tested-by: Jan Glauber 
Signed-off-by: Will Deacon 
---
 include/linux/refcount.h | 87 +++-
 1 file changed, 34 insertions(+), 53 deletions(-)

diff --git a/include/linux/refcount.h b/include/linux/refcount.h
index e719b5b1220e..eea17f39c4df 100644
--- a/include/linux/refcount.h
+++ b/include/linux/refcount.h
@@ -47,8 +47,8 @@ static inline unsigned int refcount_read(const refcount_t *r)
 #ifdef CONFIG_REFCOUNT_FULL
 #include 
 
-#define REFCOUNT_MAX   (UINT_MAX - 1)
-#define REFCOUNT_SATURATED UINT_MAX
+#define REFCOUNT_MAX   INT_MAX
+#define REFCOUNT_SATURATED (INT_MIN / 2)
 
 /*
  * Variant of atomic_t specialized for reference counts.
@@ -109,25 +109,19 @@ static inline unsigned int refcount_read(const refcount_t 
*r)
  */
 static inline __must_check bool refcount_add_not_zero(int i, refcount_t *r)
 {
-   unsigned int new, val = atomic_read(&r->refs);
+   int old = refcount_read(r);
 
do {
-   if (!val)
-   return false;
-
-   if (unlikely(val == REFCOUNT_SATURATED))
-   return true;
-
-   new = val + i;
-   if (new < val)
-   new = REFCOUNT_SATURATED;
+   if (!old)
+   break;
+   } while (!atomic_try_cmpxchg_relaxed(&r->refs, &old, old + i));
 
-   } while (!atomic_try_cmpxchg_relaxed(&r->refs, &val, new));
-
-   WARN_ONCE(new == REFCOUNT_SATURATED,
- "refcount_t: saturated; leaking memory.\n");
+   if (unlikely(old < 0 || old + i < 0)) {
+   refcount_set(r, REFCOUNT_SATURATED);
+   WARN_ONCE(1, "refcount_t: saturated; leaking memory.\n");
+   }
 
-   return true;
+   return old;
 }
 
 /**
@@ -148,7 +142,13 @@ static inline __must_check bool refcount_add_not_zero(int 
i, refcount_t *r)
  */
 static inline void refcount_add(int i, refcount_t *r)
 {
-   WARN_ONCE(!refcount_add_not_zero(i, r), "refcount_t: addition on 0; 
use-after-free.\n");
+   int old = atomic_fetch_add_relaxed(i, &r->refs);
+
+   WARN_ONCE(!old, "refcount_t: addition on 0; use-after-free.\n");
+   if (unlikely(old <= 0 || old + i <= 0)) {
+   refcount_set(r, REFCOUNT_SATURATED);
+   WARN_ONCE(1, "refcount_t: saturated; leaking memory.\n");
+   }
 }
 
 /**
@@ -166,23 +166,7 @@ static inline void refcount_add(int i, refcount_t *r)
  */
 static inline __must_check bool refcount_inc_not_zero(refcount_t *r)
 {
-   unsigned int new, val = atomic_read(&r->refs);
-
-   do {
-   new = val + 1;
-
-   if (!val)
-   return false;
-
-   if (unlikely(!new))
-   return true;
-
-   } while (!atomic_try_cmpxchg_relaxed(&r->refs, &val, new));
-
-   WARN_ONCE(new == REFCOUNT_SATURATED,
- "refcount_t: saturated; leaking memory.\n");
-
-   return true;
+   return refcount_add_not_zero(1, r);
 }
 
 /**
@@ -199,7 +183,7 @@ static inline __must_check bool 
refcount_inc_not_zero(refcount_t *r)
  */
 static inline void refcount_inc(refcount_t *r)
 {
-   WARN_ONCE(!refcount_inc_not_zero(r), "refcount_t: increment on 0; 
use-after-free.\n");
+   refcount_add(1, r);
 }
 
 /**
@@ -224,26 +208,19 @@ static inline void refcount_inc(refcount_t *r)
  */
 static inline __must_check bool refcount_sub_and_test(int i, refcount_t *r)
 {
-   unsigned int new, val = atomic_read(&r->refs);
-
-   do {
-   if (unlikely(val == REFCOUNT_SATURATED))
-   return false;
+   int old = atomic_fetch_sub_release(i, &r->refs);
 
-   new = val - i;
-   if (new > val) {
-   WARN_ONCE(new > val, "refcount_t: underflow; 
use-after-free.\n");
-   return false;
-   }
-
-   } while (!atomic_try_cmpxchg_release(&r->refs, &val, new));
-
-   if (!new) {
+   if (old == i) {
smp_acquire__after_ctrl_dep();
return true;
}
-   return false;
 
+   if (unlikely(old - i < 0)) {
+   refcount_set(r, REFCOUNT_SATURATED);
+   WARN_ONCE(1, "refcount_t: underflow; use-after-free.\n");
+   }
+
+   return false;
 }
 
 /**
@@ -276,9 +253,13 @@ static inline __must_check bool 
refcount_dec_and_test(refcount_t *r)
  */
 static inline void refcount_dec(refcount_t *r)
 {
-   WARN_ONCE(refcount_dec_and_test(r), "refcount_t: decrement hit 0; 
leaking memory.\n");
-}
+   int old = atomic_f

[PATCH 4/6] lib/refcount: Move bulk of REFCOUNT_FULL implementation into header

2019-08-02 Thread Will Deacon
In an effort to improve performance of the REFCOUNT_FULL implementation,
move the bulk of its functions into linux/refcount.h. This allows them
to be inlined in the same way as if they had been provided via
CONFIG_ARCH_HAS_REFCOUNT.

Cc: Kees Cook 
Cc: Ingo Molnar 
Cc: Elena Reshetova 
Cc: Peter Zijlstra 
Cc: Ard Biesheuvel 
Signed-off-by: Will Deacon 
---
 include/linux/refcount.h | 237 +--
 lib/refcount.c   | 235 +-
 2 files changed, 230 insertions(+), 242 deletions(-)

diff --git a/include/linux/refcount.h b/include/linux/refcount.h
index edd505d1a23b..e719b5b1220e 100644
--- a/include/linux/refcount.h
+++ b/include/linux/refcount.h
@@ -45,22 +45,241 @@ static inline unsigned int refcount_read(const refcount_t 
*r)
 }
 
 #ifdef CONFIG_REFCOUNT_FULL
+#include 
 
 #define REFCOUNT_MAX   (UINT_MAX - 1)
 #define REFCOUNT_SATURATED UINT_MAX
 
-extern __must_check bool refcount_add_not_zero(int i, refcount_t *r);
-extern void refcount_add(int i, refcount_t *r);
+/*
+ * Variant of atomic_t specialized for reference counts.
+ *
+ * The interface matches the atomic_t interface (to aid in porting) but only
+ * provides the few functions one should use for reference counting.
+ *
+ * It differs in that the counter saturates at REFCOUNT_SATURATED and will not
+ * move once there. This avoids wrapping the counter and causing 'spurious'
+ * use-after-free issues.
+ *
+ * Memory ordering rules are slightly relaxed wrt regular atomic_t functions
+ * and provide only what is strictly required for refcounts.
+ *
+ * The increments are fully relaxed; these will not provide ordering. The
+ * rationale is that whatever is used to obtain the object we're increasing the
+ * reference count on will provide the ordering. For locked data structures,
+ * its the lock acquire, for RCU/lockless data structures its the dependent
+ * load.
+ *
+ * Do note that inc_not_zero() provides a control dependency which will order
+ * future stores against the inc, this ensures we'll never modify the object
+ * if we did not in fact acquire a reference.
+ *
+ * The decrements will provide release order, such that all the prior loads and
+ * stores will be issued before, it also provides a control dependency, which
+ * will order us against the subsequent free().
+ *
+ * The control dependency is against the load of the cmpxchg (ll/sc) that
+ * succeeded. This means the stores aren't fully ordered, but this is fine
+ * because the 1->0 transition indicates no concurrency.
+ *
+ * Note that the allocator is responsible for ordering things between free()
+ * and alloc().
+ *
+ * The decrements dec_and_test() and sub_and_test() also provide acquire
+ * ordering on success.
+ *
+ */
+
+/**
+ * refcount_add_not_zero - add a value to a refcount unless it is 0
+ * @i: the value to add to the refcount
+ * @r: the refcount
+ *
+ * Will saturate at REFCOUNT_SATURATED and WARN.
+ *
+ * Provides no memory ordering, it is assumed the caller has guaranteed the
+ * object memory to be stable (RCU, etc.). It does provide a control dependency
+ * and thereby orders future stores. See the comment on top.
+ *
+ * Use of this function is not recommended for the normal reference counting
+ * use case in which references are taken and released one at a time.  In these
+ * cases, refcount_inc(), or one of its variants, should instead be used to
+ * increment a reference count.
+ *
+ * Return: false if the passed refcount is 0, true otherwise
+ */
+static inline __must_check bool refcount_add_not_zero(int i, refcount_t *r)
+{
+   unsigned int new, val = atomic_read(&r->refs);
+
+   do {
+   if (!val)
+   return false;
+
+   if (unlikely(val == REFCOUNT_SATURATED))
+   return true;
+
+   new = val + i;
+   if (new < val)
+   new = REFCOUNT_SATURATED;
+
+   } while (!atomic_try_cmpxchg_relaxed(&r->refs, &val, new));
+
+   WARN_ONCE(new == REFCOUNT_SATURATED,
+ "refcount_t: saturated; leaking memory.\n");
+
+   return true;
+}
+
+/**
+ * refcount_add - add a value to a refcount
+ * @i: the value to add to the refcount
+ * @r: the refcount
+ *
+ * Similar to atomic_add(), but will saturate at REFCOUNT_SATURATED and WARN.
+ *
+ * Provides no memory ordering, it is assumed the caller has guaranteed the
+ * object memory to be stable (RCU, etc.). It does provide a control dependency
+ * and thereby orders future stores. See the comment on top.
+ *
+ * Use of this function is not recommended for the normal reference counting
+ * use case in which references are taken and released one at a time.  In these
+ * cases, refcount_inc(), or one of its variants, should instead be used to
+ * increment a reference count.
+ */
+static inline void refcount_add(int i, refcount_t *r)
+{
+   WARN_ONCE(!refcount_add_not_zero(i, r), "refcou

[PATCH 6/6] lib/refcount: Consolidate REFCOUNT_{MAX,SATURATED} definitions

2019-08-02 Thread Will Deacon
The definitions of REFCOUNT_MAX and REFCOUNT_SATURATED are the same,
regardless of CONFIG_REFCOUNT_FULL, so consolidate them into a single
pair of definitions.

Cc: Kees Cook 
Cc: Ingo Molnar 
Cc: Elena Reshetova 
Cc: Peter Zijlstra 
Cc: Ard Biesheuvel 
Signed-off-by: Will Deacon 
---
 include/linux/refcount.h | 9 ++---
 1 file changed, 2 insertions(+), 7 deletions(-)

diff --git a/include/linux/refcount.h b/include/linux/refcount.h
index eea17f39c4df..814131d492e9 100644
--- a/include/linux/refcount.h
+++ b/include/linux/refcount.h
@@ -22,6 +22,8 @@ typedef struct refcount_struct {
 } refcount_t;
 
 #define REFCOUNT_INIT(n)   { .refs = ATOMIC_INIT(n), }
+#define REFCOUNT_MAX   INT_MAX
+#define REFCOUNT_SATURATED (INT_MIN / 2)
 
 /**
  * refcount_set - set a refcount's value
@@ -47,9 +49,6 @@ static inline unsigned int refcount_read(const refcount_t *r)
 #ifdef CONFIG_REFCOUNT_FULL
 #include 
 
-#define REFCOUNT_MAX   INT_MAX
-#define REFCOUNT_SATURATED (INT_MIN / 2)
-
 /*
  * Variant of atomic_t specialized for reference counts.
  *
@@ -261,10 +260,6 @@ static inline void refcount_dec(refcount_t *r)
}
 }
 #else /* CONFIG_REFCOUNT_FULL */
-
-#define REFCOUNT_MAX   INT_MAX
-#define REFCOUNT_SATURATED (INT_MIN / 2)
-
 # ifdef CONFIG_ARCH_HAS_REFCOUNT
 #  include 
 # else
-- 
2.11.0



[PATCH 2/6] lib/refcount: Ensure integer operands are treated as signed

2019-08-02 Thread Will Deacon
In preparation for changing the saturation point of REFCOUNT_FULL to
INT_MIN / 2, change the type of integer operands passed into the API
from 'unsigned int' to 'int' so that we can avoid casting during
comparisons when we don't want to fall foul of C integral conversion
rules for signed and unsigned types.

Since the kernel is compiled with '-fno-strict-overflow', we don't need
to worry about the UB introduced by signed overflow here. Furthermore,
we're already making heavy use of the atomic_t API, which operates
exclusively on signed types.

Cc: Kees Cook 
Cc: Ingo Molnar 
Cc: Elena Reshetova 
Cc: Peter Zijlstra 
Cc: Ard Biesheuvel 
Signed-off-by: Will Deacon 
---
 include/linux/refcount.h | 14 +++---
 lib/refcount.c   |  6 +++---
 2 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/include/linux/refcount.h b/include/linux/refcount.h
index 79f62e8d2256..89066a1471dd 100644
--- a/include/linux/refcount.h
+++ b/include/linux/refcount.h
@@ -28,7 +28,7 @@ typedef struct refcount_struct {
  * @r: the refcount
  * @n: value to which the refcount will be set
  */
-static inline void refcount_set(refcount_t *r, unsigned int n)
+static inline void refcount_set(refcount_t *r, int n)
 {
atomic_set(&r->refs, n);
 }
@@ -44,13 +44,13 @@ static inline unsigned int refcount_read(const refcount_t 
*r)
return atomic_read(&r->refs);
 }
 
-extern __must_check bool refcount_add_not_zero_checked(unsigned int i, 
refcount_t *r);
-extern void refcount_add_checked(unsigned int i, refcount_t *r);
+extern __must_check bool refcount_add_not_zero_checked(int i, refcount_t *r);
+extern void refcount_add_checked(int i, refcount_t *r);
 
 extern __must_check bool refcount_inc_not_zero_checked(refcount_t *r);
 extern void refcount_inc_checked(refcount_t *r);
 
-extern __must_check bool refcount_sub_and_test_checked(unsigned int i, 
refcount_t *r);
+extern __must_check bool refcount_sub_and_test_checked(int i, refcount_t *r);
 
 extern __must_check bool refcount_dec_and_test_checked(refcount_t *r);
 extern void refcount_dec_checked(refcount_t *r);
@@ -79,12 +79,12 @@ extern void refcount_dec_checked(refcount_t *r);
 # ifdef CONFIG_ARCH_HAS_REFCOUNT
 #  include 
 # else
-static inline __must_check bool refcount_add_not_zero(unsigned int i, 
refcount_t *r)
+static inline __must_check bool refcount_add_not_zero(int i, refcount_t *r)
 {
return atomic_add_unless(&r->refs, i, 0);
 }
 
-static inline void refcount_add(unsigned int i, refcount_t *r)
+static inline void refcount_add(int i, refcount_t *r)
 {
atomic_add(i, &r->refs);
 }
@@ -99,7 +99,7 @@ static inline void refcount_inc(refcount_t *r)
atomic_inc(&r->refs);
 }
 
-static inline __must_check bool refcount_sub_and_test(unsigned int i, 
refcount_t *r)
+static inline __must_check bool refcount_sub_and_test(int i, refcount_t *r)
 {
return atomic_sub_and_test(i, &r->refs);
 }
diff --git a/lib/refcount.c b/lib/refcount.c
index 48b78a423d7d..719b0bc42ab1 100644
--- a/lib/refcount.c
+++ b/lib/refcount.c
@@ -61,7 +61,7 @@
  *
  * Return: false if the passed refcount is 0, true otherwise
  */
-bool refcount_add_not_zero_checked(unsigned int i, refcount_t *r)
+bool refcount_add_not_zero_checked(int i, refcount_t *r)
 {
unsigned int new, val = atomic_read(&r->refs);
 
@@ -101,7 +101,7 @@ EXPORT_SYMBOL(refcount_add_not_zero_checked);
  * cases, refcount_inc(), or one of its variants, should instead be used to
  * increment a reference count.
  */
-void refcount_add_checked(unsigned int i, refcount_t *r)
+void refcount_add_checked(int i, refcount_t *r)
 {
WARN_ONCE(!refcount_add_not_zero_checked(i, r), "refcount_t: addition 
on 0; use-after-free.\n");
 }
@@ -180,7 +180,7 @@ EXPORT_SYMBOL(refcount_inc_checked);
  *
  * Return: true if the resulting refcount is 0, false otherwise
  */
-bool refcount_sub_and_test_checked(unsigned int i, refcount_t *r)
+bool refcount_sub_and_test_checked(int i, refcount_t *r)
 {
unsigned int new, val = atomic_read(&r->refs);
 
-- 
2.11.0



[PATCH 0/6] Rework REFCOUNT_FULL using atomic_fetch_* operations

2019-08-02 Thread Will Deacon
Hi all,

This patch series reworks the generic REFCOUNT_FULL implementation using
atomic_fetch_* operations so that the performance impact of the cmpxchg()
loops is mitigated for common refcount operations. The algorithm was
heavily inspired by Ard's assembly implementation for arm64:

  http://lkml.kernel.org/r/20190619105431.2630-1-ard.biesheu...@linaro.org

but I figured we could achieve something similar using atomics in generic
code.

Although the revised implementation passes all of the lkdtm REFCOUNT
tests, there is a race condition introduced by the deferred saturation
whereby if INT_MIN + 2 tasks take a reference on a refcount at
REFCOUNT_MAX and are each preempted between detecting overflow and
writing the saturated value without being rescheduled, then another task
may end up erroneously freeing the object when it drops the refcount and
sees zero. It doesn't feel like a particularly realistic case to me, but
I thought I should mention it in case somebody else knows better.

Will

Cc: Kees Cook 
Cc: Ingo Molnar 
Cc: Elena Reshetova 
Cc: Peter Zijlstra 
Cc: Ard Biesheuvel 
Cc: Hanjun Guo 
Cc: Jan Glauber 

--->8

Will Deacon (6):
  lib/refcount: Define constants for saturation and max refcount values
  lib/refcount: Ensure integer operands are treated as signed
  lib/refcount: Remove unused refcount_*_checked() variants
  lib/refcount: Move bulk of REFCOUNT_FULL implementation into header
  lib/refcount: Improve performance of generic REFCOUNT_FULL code
  lib/refcount: Consolidate REFCOUNT_{MAX,SATURATED} definitions

 drivers/misc/lkdtm/refcount.c |   8 --
 include/linux/refcount.h  | 236 +
 lib/refcount.c| 238 +-
 3 files changed, 219 insertions(+), 263 deletions(-)

-- 
2.11.0



[PATCH 1/6] lib/refcount: Define constants for saturation and max refcount values

2019-08-02 Thread Will Deacon
The REFCOUNT_FULL implementation uses a different saturation point than
the x86 implementation, which means that the shared refcount code in
lib/refcount.c (e.g. refcount_dec_not_one()) needs to be aware of the
difference.

Rather than duplicate the definitions from the lkdtm driver, instead
move them into linux/refcount.h and update all references accordingly.

Cc: Kees Cook 
Cc: Ingo Molnar 
Cc: Elena Reshetova 
Cc: Peter Zijlstra 
Cc: Ard Biesheuvel 
Signed-off-by: Will Deacon 
---
 drivers/misc/lkdtm/refcount.c |  8 
 include/linux/refcount.h  | 10 +-
 lib/refcount.c| 37 -
 3 files changed, 29 insertions(+), 26 deletions(-)

diff --git a/drivers/misc/lkdtm/refcount.c b/drivers/misc/lkdtm/refcount.c
index 0a146b32da13..abf3b7c1f686 100644
--- a/drivers/misc/lkdtm/refcount.c
+++ b/drivers/misc/lkdtm/refcount.c
@@ -6,14 +6,6 @@
 #include "lkdtm.h"
 #include 
 
-#ifdef CONFIG_REFCOUNT_FULL
-#define REFCOUNT_MAX   (UINT_MAX - 1)
-#define REFCOUNT_SATURATED UINT_MAX
-#else
-#define REFCOUNT_MAX   INT_MAX
-#define REFCOUNT_SATURATED (INT_MIN / 2)
-#endif
-
 static void overflow_check(refcount_t *ref)
 {
switch (refcount_read(ref)) {
diff --git a/include/linux/refcount.h b/include/linux/refcount.h
index e28cce21bad6..79f62e8d2256 100644
--- a/include/linux/refcount.h
+++ b/include/linux/refcount.h
@@ -4,6 +4,7 @@
 
 #include 
 #include 
+#include 
 #include 
 
 struct mutex;
@@ -12,7 +13,7 @@ struct mutex;
  * struct refcount_t - variant of atomic_t specialized for reference counts
  * @refs: atomic_t counter field
  *
- * The counter saturates at UINT_MAX and will not move once
+ * The counter saturates at REFCOUNT_SATURATED and will not move once
  * there. This avoids wrapping the counter and causing 'spurious'
  * use-after-free bugs.
  */
@@ -56,6 +57,9 @@ extern void refcount_dec_checked(refcount_t *r);
 
 #ifdef CONFIG_REFCOUNT_FULL
 
+#define REFCOUNT_MAX   (UINT_MAX - 1)
+#define REFCOUNT_SATURATED UINT_MAX
+
 #define refcount_add_not_zero  refcount_add_not_zero_checked
 #define refcount_add   refcount_add_checked
 
@@ -68,6 +72,10 @@ extern void refcount_dec_checked(refcount_t *r);
 #define refcount_dec   refcount_dec_checked
 
 #else
+
+#define REFCOUNT_MAX   INT_MAX
+#define REFCOUNT_SATURATED (INT_MIN / 2)
+
 # ifdef CONFIG_ARCH_HAS_REFCOUNT
 #  include 
 # else
diff --git a/lib/refcount.c b/lib/refcount.c
index 6e904af0fb3e..48b78a423d7d 100644
--- a/lib/refcount.c
+++ b/lib/refcount.c
@@ -5,8 +5,8 @@
  * The interface matches the atomic_t interface (to aid in porting) but only
  * provides the few functions one should use for reference counting.
  *
- * It differs in that the counter saturates at UINT_MAX and will not move once
- * there. This avoids wrapping the counter and causing 'spurious'
+ * It differs in that the counter saturates at REFCOUNT_SATURATED and will not
+ * move once there. This avoids wrapping the counter and causing 'spurious'
  * use-after-free issues.
  *
  * Memory ordering rules are slightly relaxed wrt regular atomic_t functions
@@ -48,7 +48,7 @@
  * @i: the value to add to the refcount
  * @r: the refcount
  *
- * Will saturate at UINT_MAX and WARN.
+ * Will saturate at REFCOUNT_SATURATED and WARN.
  *
  * Provides no memory ordering, it is assumed the caller has guaranteed the
  * object memory to be stable (RCU, etc.). It does provide a control dependency
@@ -69,16 +69,17 @@ bool refcount_add_not_zero_checked(unsigned int i, 
refcount_t *r)
if (!val)
return false;
 
-   if (unlikely(val == UINT_MAX))
+   if (unlikely(val == REFCOUNT_SATURATED))
return true;
 
new = val + i;
if (new < val)
-   new = UINT_MAX;
+   new = REFCOUNT_SATURATED;
 
} while (!atomic_try_cmpxchg_relaxed(&r->refs, &val, new));
 
-   WARN_ONCE(new == UINT_MAX, "refcount_t: saturated; leaking memory.\n");
+   WARN_ONCE(new == REFCOUNT_SATURATED,
+ "refcount_t: saturated; leaking memory.\n");
 
return true;
 }
@@ -89,7 +90,7 @@ EXPORT_SYMBOL(refcount_add_not_zero_checked);
  * @i: the value to add to the refcount
  * @r: the refcount
  *
- * Similar to atomic_add(), but will saturate at UINT_MAX and WARN.
+ * Similar to atomic_add(), but will saturate at REFCOUNT_SATURATED and WARN.
  *
  * Provides no memory ordering, it is assumed the caller has guaranteed the
  * object memory to be stable (RCU, etc.). It does provide a control dependency
@@ -110,7 +111,8 @@ EXPORT_SYMBOL(refcount_add_checked);
  * refcount_inc_not_zero_checked - increment a refcount unless it is 0
  * @r: the refcount to increment
  *
- * Similar to atomic_inc_not_zero(), but will saturate at UINT_MAX and WARN.
+ * Similar to atomic_inc_not_zero(), but will saturate at REFCOUNT_SATURATED
+ 

[PATCH 4.4 005/158] ath9k: Check for errors when reading SREV register

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 2f90c7e5d09437a4d8d5546feaae9f1cf48cfbe1 ]

Right now, if an error is encountered during the SREV register
read (i.e. an EIO in ath9k_regread()), that error code gets
passed all the way to __ath9k_hw_init(), where it is visible
during the "Chip rev not supported" message.

ath9k_htc 1-1.4:1.0: ath9k_htc: HTC initialized with 33 credits
ath: phy2: Mac Chip Rev 0x0f.3 is not supported by this driver
ath: phy2: Unable to initialize hardware; initialization status: -95
ath: phy2: Unable to initialize hardware; initialization status: -95
ath9k_htc: Failed to initialize the device

Check for -EIO explicitly in ath9k_hw_read_revisions() and return
a boolean based on the success of the operation. Check for that in
__ath9k_hw_init() and abort with a more debugging-friendly message
if reading the revisions wasn't successful.

ath9k_htc 1-1.4:1.0: ath9k_htc: HTC initialized with 33 credits
ath: phy2: Failed to read SREV register
ath: phy2: Could not read hardware revision
ath: phy2: Unable to initialize hardware; initialization status: -95
ath: phy2: Unable to initialize hardware; initialization status: -95
ath9k_htc: Failed to initialize the device

This helps when debugging by directly showing the first point of
failure and it could prevent possible errors if a 0x0f.3 revision
is ever supported.

Signed-off-by: Tim Schumacher 
Signed-off-by: Kalle Valo 
Signed-off-by: Sasha Levin 
---
 drivers/net/wireless/ath/ath9k/hw.c | 32 +
 1 file changed, 23 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/ath/ath9k/hw.c 
b/drivers/net/wireless/ath/ath9k/hw.c
index 4435c7bbb625..d50e2e8bd998 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -250,8 +250,9 @@ void ath9k_hw_get_channel_centers(struct ath_hw *ah,
 /* Chip Revisions */
 /**/
 
-static void ath9k_hw_read_revisions(struct ath_hw *ah)
+static bool ath9k_hw_read_revisions(struct ath_hw *ah)
 {
+   u32 srev;
u32 val;
 
if (ah->get_mac_revision)
@@ -267,25 +268,33 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah)
val = REG_READ(ah, AR_SREV);
ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
}
-   return;
+   return true;
case AR9300_DEVID_AR9340:
ah->hw_version.macVersion = AR_SREV_VERSION_9340;
-   return;
+   return true;
case AR9300_DEVID_QCA955X:
ah->hw_version.macVersion = AR_SREV_VERSION_9550;
-   return;
+   return true;
case AR9300_DEVID_AR953X:
ah->hw_version.macVersion = AR_SREV_VERSION_9531;
-   return;
+   return true;
case AR9300_DEVID_QCA956X:
ah->hw_version.macVersion = AR_SREV_VERSION_9561;
-   return;
+   return true;
}
 
-   val = REG_READ(ah, AR_SREV) & AR_SREV_ID;
+   srev = REG_READ(ah, AR_SREV);
+
+   if (srev == -EIO) {
+   ath_err(ath9k_hw_common(ah),
+   "Failed to read SREV register");
+   return false;
+   }
+
+   val = srev & AR_SREV_ID;
 
if (val == 0xFF) {
-   val = REG_READ(ah, AR_SREV);
+   val = srev;
ah->hw_version.macVersion =
(val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S;
ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
@@ -304,6 +313,8 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah)
if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE)
ah->is_pciexpress = true;
}
+
+   return true;
 }
 
 //
@@ -556,7 +567,10 @@ static int __ath9k_hw_init(struct ath_hw *ah)
struct ath_common *common = ath9k_hw_common(ah);
int r = 0;
 
-   ath9k_hw_read_revisions(ah);
+   if (!ath9k_hw_read_revisions(ah)) {
+   ath_err(common, "Could not read hardware revisions");
+   return -EOPNOTSUPP;
+   }
 
switch (ah->hw_version.macVersion) {
case AR_SREV_VERSION_5416_PCI:
-- 
2.20.1





[PATCH 4.4 021/158] media: wl128x: Fix some error handling in fm_v4l2_init_video_device()

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 69fbb3f47327d959830c94bf31893972b8c8f700 ]

X-Originating-IP: [10.175.113.25]
X-CFilter-Loop: Reflected
The fm_v4l2_init_video_device() forget to unregister v4l2/video device
in the error path, it could lead to UAF issue, eg,

  BUG: KASAN: use-after-free in atomic64_read 
include/asm-generic/atomic-instrumented.h:836 [inline]
  BUG: KASAN: use-after-free in atomic_long_read 
include/asm-generic/atomic-long.h:28 [inline]
  BUG: KASAN: use-after-free in __mutex_unlock_slowpath+0x92/0x690 
kernel/locking/mutex.c:1206
  Read of size 8 at addr 8881e84a7c70 by task v4l_id/3659

  CPU: 1 PID: 3659 Comm: v4l_id Not tainted 5.1.0 #8
  Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1ubuntu1 
04/01/2014
  Call Trace:
   __dump_stack lib/dump_stack.c:77 [inline]
   dump_stack+0xa9/0x10e lib/dump_stack.c:113
   print_address_description+0x65/0x270 mm/kasan/report.c:187
   kasan_report+0x149/0x18d mm/kasan/report.c:317
   atomic64_read include/asm-generic/atomic-instrumented.h:836 [inline]
   atomic_long_read include/asm-generic/atomic-long.h:28 [inline]
   __mutex_unlock_slowpath+0x92/0x690 kernel/locking/mutex.c:1206
   fm_v4l2_fops_open+0xac/0x120 [fm_drv]
   v4l2_open+0x191/0x390 [videodev]
   chrdev_open+0x20d/0x570 fs/char_dev.c:417
   do_dentry_open+0x700/0xf30 fs/open.c:777
   do_last fs/namei.c:3416 [inline]
   path_openat+0x7c4/0x2a90 fs/namei.c:3532
   do_filp_open+0x1a5/0x2b0 fs/namei.c:3563
   do_sys_open+0x302/0x490 fs/open.c:1069
   do_syscall_64+0x9f/0x450 arch/x86/entry/common.c:290
   entry_SYSCALL_64_after_hwframe+0x49/0xbe
  RIP: 0033:0x7f8180c17c8e
  ...
  Allocated by task 3642:
   set_track mm/kasan/common.c:87 [inline]
   __kasan_kmalloc.constprop.3+0xa0/0xd0 mm/kasan/common.c:497
   fm_drv_init+0x13/0x1000 [fm_drv]
   do_one_initcall+0xbc/0x47d init/main.c:901
   do_init_module+0x1b5/0x547 kernel/module.c:3456
   load_module+0x6405/0x8c10 kernel/module.c:3804
   __do_sys_finit_module+0x162/0x190 kernel/module.c:3898
   do_syscall_64+0x9f/0x450 arch/x86/entry/common.c:290
   entry_SYSCALL_64_after_hwframe+0x49/0xbe

  Freed by task 3642:
   set_track mm/kasan/common.c:87 [inline]
   __kasan_slab_free+0x130/0x180 mm/kasan/common.c:459
   slab_free_hook mm/slub.c:1429 [inline]
   slab_free_freelist_hook mm/slub.c:1456 [inline]
   slab_free mm/slub.c:3003 [inline]
   kfree+0xe1/0x270 mm/slub.c:3958
   fm_drv_init+0x1e6/0x1000 [fm_drv]
   do_one_initcall+0xbc/0x47d init/main.c:901
   do_init_module+0x1b5/0x547 kernel/module.c:3456
   load_module+0x6405/0x8c10 kernel/module.c:3804
   __do_sys_finit_module+0x162/0x190 kernel/module.c:3898
   do_syscall_64+0x9f/0x450 arch/x86/entry/common.c:290
   entry_SYSCALL_64_after_hwframe+0x49/0xbe

Add relevant unregister functions to fix it.

Cc: Hans Verkuil 
Reported-by: Hulk Robot 
Signed-off-by: Kefeng Wang 
Signed-off-by: Mauro Carvalho Chehab 
Signed-off-by: Sasha Levin 
---
 drivers/media/radio/wl128x/fmdrv_v4l2.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/media/radio/wl128x/fmdrv_v4l2.c 
b/drivers/media/radio/wl128x/fmdrv_v4l2.c
index fb42f0fd0c1f..add26eac1677 100644
--- a/drivers/media/radio/wl128x/fmdrv_v4l2.c
+++ b/drivers/media/radio/wl128x/fmdrv_v4l2.c
@@ -553,6 +553,7 @@ int fm_v4l2_init_video_device(struct fmdev *fmdev, int 
radio_nr)
 
/* Register with V4L2 subsystem as RADIO device */
if (video_register_device(&gradio_dev, VFL_TYPE_RADIO, radio_nr)) {
+   v4l2_device_unregister(&fmdev->v4l2_dev);
fmerr("Could not register video device\n");
return -ENOMEM;
}
@@ -566,6 +567,8 @@ int fm_v4l2_init_video_device(struct fmdev *fmdev, int 
radio_nr)
if (ret < 0) {
fmerr("(fmdev): Can't init ctrl handler\n");
v4l2_ctrl_handler_free(&fmdev->ctrl_handler);
+   video_unregister_device(fmdev->radio_dev);
+   v4l2_device_unregister(&fmdev->v4l2_dev);
return -EBUSY;
}
 
-- 
2.20.1





[PATCH 4.4 015/158] af_key: fix leaks in key_pol_get_resp and dump_sp.

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 7c80eb1c7e2b8420477fbc998971d62a648035d9 ]

In both functions, if pfkey_xfrm_policy2msg failed we leaked the newly
allocated sk_buff.  Free it on error.

Fixes: 55569ce256ce ("Fix conversion between IPSEC_MODE_xxx and XFRM_MODE_xxx.")
Reported-by: syzbot+4f0529365f7f2208d...@syzkaller.appspotmail.com
Signed-off-by: Jeremy Sowden 
Signed-off-by: Steffen Klassert 
Signed-off-by: Sasha Levin 
---
 net/key/af_key.c | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/net/key/af_key.c b/net/key/af_key.c
index 3ba903ff2bb0..36db179d848e 100644
--- a/net/key/af_key.c
+++ b/net/key/af_key.c
@@ -2463,8 +2463,10 @@ static int key_pol_get_resp(struct sock *sk, struct 
xfrm_policy *xp, const struc
goto out;
}
err = pfkey_xfrm_policy2msg(out_skb, xp, dir);
-   if (err < 0)
+   if (err < 0) {
+   kfree_skb(out_skb);
goto out;
+   }
 
out_hdr = (struct sadb_msg *) out_skb->data;
out_hdr->sadb_msg_version = hdr->sadb_msg_version;
@@ -2717,8 +2719,10 @@ static int dump_sp(struct xfrm_policy *xp, int dir, int 
count, void *ptr)
return PTR_ERR(out_skb);
 
err = pfkey_xfrm_policy2msg(out_skb, xp, dir);
-   if (err < 0)
+   if (err < 0) {
+   kfree_skb(out_skb);
return err;
+   }
 
out_hdr = (struct sadb_msg *) out_skb->data;
out_hdr->sadb_msg_version = pfk->dump.msg_version;
-- 
2.20.1





[PATCH 4.4 003/158] dmaengine: imx-sdma: fix use-after-free on probe error path

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 2b8066c3deb9140fdf258417a51479b2aeaa7622 ]

If probe() fails anywhere beyond the point where
sdma_get_firmware() is called, then a kernel oops may occur.

Problematic sequence of events:
1. probe() calls sdma_get_firmware(), which schedules the
   firmware callback to run when firmware becomes available,
   using the sdma instance structure as the context
2. probe() encounters an error, which deallocates the
   sdma instance structure
3. firmware becomes available, firmware callback is
   called with deallocated sdma instance structure
4. use after free - kernel oops !

Solution: only attempt to load firmware when we're certain
that probe() will succeed. This guarantees that the firmware
callback's context will remain valid.

Note that the remove() path is unaffected by this issue: the
firmware loader will increment the driver module's use count,
ensuring that the module cannot be unloaded while the
firmware callback is pending or running.

Signed-off-by: Sven Van Asbroeck 
Reviewed-by: Robin Gong 
[vkoul: fixed braces for if condition]
Signed-off-by: Vinod Koul 
Signed-off-by: Sasha Levin 
---
 drivers/dma/imx-sdma.c | 48 --
 1 file changed, 27 insertions(+), 21 deletions(-)

diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
index 4054747af0cb..dd97dbf6618c 100644
--- a/drivers/dma/imx-sdma.c
+++ b/drivers/dma/imx-sdma.c
@@ -1786,27 +1786,6 @@ static int sdma_probe(struct platform_device *pdev)
if (pdata && pdata->script_addrs)
sdma_add_scripts(sdma, pdata->script_addrs);
 
-   if (pdata) {
-   ret = sdma_get_firmware(sdma, pdata->fw_name);
-   if (ret)
-   dev_warn(&pdev->dev, "failed to get firmware from 
platform data\n");
-   } else {
-   /*
-* Because that device tree does not encode ROM script address,
-* the RAM script in firmware is mandatory for device tree
-* probe, otherwise it fails.
-*/
-   ret = of_property_read_string(np, "fsl,sdma-ram-script-name",
- &fw_name);
-   if (ret)
-   dev_warn(&pdev->dev, "failed to get firmware name\n");
-   else {
-   ret = sdma_get_firmware(sdma, fw_name);
-   if (ret)
-   dev_warn(&pdev->dev, "failed to get firmware 
from device tree\n");
-   }
-   }
-
sdma->dma_device.dev = &pdev->dev;
 
sdma->dma_device.device_alloc_chan_resources = 
sdma_alloc_chan_resources;
@@ -1848,6 +1827,33 @@ static int sdma_probe(struct platform_device *pdev)
of_node_put(spba_bus);
}
 
+   /*
+* Kick off firmware loading as the very last step:
+* attempt to load firmware only if we're not on the error path, because
+* the firmware callback requires a fully functional and allocated sdma
+* instance.
+*/
+   if (pdata) {
+   ret = sdma_get_firmware(sdma, pdata->fw_name);
+   if (ret)
+   dev_warn(&pdev->dev, "failed to get firmware from 
platform data\n");
+   } else {
+   /*
+* Because that device tree does not encode ROM script address,
+* the RAM script in firmware is mandatory for device tree
+* probe, otherwise it fails.
+*/
+   ret = of_property_read_string(np, "fsl,sdma-ram-script-name",
+ &fw_name);
+   if (ret) {
+   dev_warn(&pdev->dev, "failed to get firmware name\n");
+   } else {
+   ret = sdma_get_firmware(sdma, fw_name);
+   if (ret)
+   dev_warn(&pdev->dev, "failed to get firmware 
from device tree\n");
+   }
+   }
+
return 0;
 
 err_register:
-- 
2.20.1





[PATCH 4.4 017/158] media: staging: media: davinci_vpfe: - Fix for memory leak if decoder initialization fails.

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 6995a659101bd4effa41cebb067f9dc18d77520d ]

Fix to avoid possible memory leak if the decoder initialization
got failed.Free the allocated memory for file handle object
before return in case decoder initialization fails.

Signed-off-by: Shailendra Verma 
Signed-off-by: Mauro Carvalho Chehab 
Signed-off-by: Sasha Levin 
---
 drivers/staging/media/davinci_vpfe/vpfe_video.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/staging/media/davinci_vpfe/vpfe_video.c 
b/drivers/staging/media/davinci_vpfe/vpfe_video.c
index 0fdff91624fd..43474f562b43 100644
--- a/drivers/staging/media/davinci_vpfe/vpfe_video.c
+++ b/drivers/staging/media/davinci_vpfe/vpfe_video.c
@@ -406,6 +406,9 @@ static int vpfe_open(struct file *file)
/* If decoder is not initialized. initialize it */
if (!video->initialized && vpfe_update_pipe_state(video)) {
mutex_unlock(&video->lock);
+   v4l2_fh_del(&handle->vfh);
+   v4l2_fh_exit(&handle->vfh);
+   kfree(handle);
return -ENODEV;
}
/* Increment device users counter */
-- 
2.20.1





[PATCH 4.4 011/158] media: marvell-ccic: fix DMA s/g desc number calculation

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 0c7aa32966dab0b8a7424e1b34c7f206817953ec ]

The commit d790b7eda953 ("[media] vb2-dma-sg: move dma_(un)map_sg here")
left dma_desc_nent unset. It previously contained the number of DMA
descriptors as returned from dma_map_sg().

We can now (since the commit referred to above) obtain the same value from
the sg_table and drop dma_desc_nent altogether.

Tested on OLPC XO-1.75 machine. Doesn't affect the OLPC XO-1's Cafe
driver, since that one doesn't do DMA.

[mchehab+sams...@kernel.org: fix a checkpatch warning]

Fixes: d790b7eda953 ("[media] vb2-dma-sg: move dma_(un)map_sg here")
Signed-off-by: Lubomir Rintel 
Signed-off-by: Sakari Ailus 
Signed-off-by: Mauro Carvalho Chehab 
Signed-off-by: Sasha Levin 
---
 drivers/media/platform/marvell-ccic/mcam-core.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/media/platform/marvell-ccic/mcam-core.c 
b/drivers/media/platform/marvell-ccic/mcam-core.c
index aa2b44041d3f..22fe771d4dd2 100644
--- a/drivers/media/platform/marvell-ccic/mcam-core.c
+++ b/drivers/media/platform/marvell-ccic/mcam-core.c
@@ -209,7 +209,6 @@ struct mcam_vb_buffer {
struct list_head queue;
struct mcam_dma_desc *dma_desc; /* Descriptor virtual address */
dma_addr_t dma_desc_pa; /* Descriptor physical address */
-   int dma_desc_nent;  /* Number of mapped descriptors */
 };
 
 static inline struct mcam_vb_buffer *vb_to_mvb(struct vb2_v4l2_buffer *vb)
@@ -616,9 +615,11 @@ static void mcam_dma_contig_done(struct mcam_camera *cam, 
int frame)
 static void mcam_sg_next_buffer(struct mcam_camera *cam)
 {
struct mcam_vb_buffer *buf;
+   struct sg_table *sg_table;
 
buf = list_first_entry(&cam->buffers, struct mcam_vb_buffer, queue);
list_del_init(&buf->queue);
+   sg_table = vb2_dma_sg_plane_desc(&buf->vb_buf.vb2_buf, 0);
/*
 * Very Bad Not Good Things happen if you don't clear
 * C1_DESC_ENA before making any descriptor changes.
@@ -626,7 +627,7 @@ static void mcam_sg_next_buffer(struct mcam_camera *cam)
mcam_reg_clear_bit(cam, REG_CTRL1, C1_DESC_ENA);
mcam_reg_write(cam, REG_DMA_DESC_Y, buf->dma_desc_pa);
mcam_reg_write(cam, REG_DESC_LEN_Y,
-   buf->dma_desc_nent*sizeof(struct mcam_dma_desc));
+   sg_table->nents * sizeof(struct mcam_dma_desc));
mcam_reg_write(cam, REG_DESC_LEN_U, 0);
mcam_reg_write(cam, REG_DESC_LEN_V, 0);
mcam_reg_set_bit(cam, REG_CTRL1, C1_DESC_ENA);
-- 
2.20.1





[PATCH 4.4 024/158] net: axienet: Fix race condition causing TX hang

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 7de44285c1f69ccfbe8be1d6a16fcd956681fee6 ]

It is possible that the interrupt handler fires and frees up space in
the TX ring in between checking for sufficient TX ring space and
stopping the TX queue in axienet_start_xmit. If this happens, the
queue wake from the interrupt handler will occur before the queue is
stopped, causing a lost wakeup and the adapter's transmit hanging.

To avoid this, after stopping the queue, check again whether there is
sufficient space in the TX ring. If so, wake up the queue again.

Signed-off-by: Robert Hancock 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 .../net/ethernet/xilinx/xilinx_axienet_main.c | 20 ---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c 
b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
index 58ba579793f8..f1e969128a4e 100644
--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
@@ -613,6 +613,10 @@ static void axienet_start_xmit_done(struct net_device 
*ndev)
 
ndev->stats.tx_packets += packets;
ndev->stats.tx_bytes += size;
+
+   /* Matches barrier in axienet_start_xmit */
+   smp_mb();
+
netif_wake_queue(ndev);
 }
 
@@ -667,9 +671,19 @@ static int axienet_start_xmit(struct sk_buff *skb, struct 
net_device *ndev)
cur_p = &lp->tx_bd_v[lp->tx_bd_tail];
 
if (axienet_check_tx_bd_space(lp, num_frag)) {
-   if (!netif_queue_stopped(ndev))
-   netif_stop_queue(ndev);
-   return NETDEV_TX_BUSY;
+   if (netif_queue_stopped(ndev))
+   return NETDEV_TX_BUSY;
+
+   netif_stop_queue(ndev);
+
+   /* Matches barrier in axienet_start_xmit_done */
+   smp_mb();
+
+   /* Space might have just been freed - check again */
+   if (axienet_check_tx_bd_space(lp, num_frag))
+   return NETDEV_TX_BUSY;
+
+   netif_wake_queue(ndev);
}
 
if (skb->ip_summed == CHECKSUM_PARTIAL) {
-- 
2.20.1





[PATCH 4.4 009/158] media: dvb: usb: fix use after free in dvb_usb_device_exit

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 6cf97230cd5f36b7665099083272595c55d72be7 ]

dvb_usb_device_exit() frees and uses the device name in that order.
Fix by storing the name in a buffer before freeing it.

Signed-off-by: Oliver Neukum 
Reported-by: syzbot+26ec41e9f788b3eba...@syzkaller.appspotmail.com
Signed-off-by: Sean Young 
Signed-off-by: Mauro Carvalho Chehab 
Signed-off-by: Sasha Levin 
---
 drivers/media/usb/dvb-usb/dvb-usb-init.c | 7 +--
 1 file changed, 5 insertions(+), 2 deletions(-)

diff --git a/drivers/media/usb/dvb-usb/dvb-usb-init.c 
b/drivers/media/usb/dvb-usb/dvb-usb-init.c
index 1adf325012f7..97a89ef7e4c1 100644
--- a/drivers/media/usb/dvb-usb/dvb-usb-init.c
+++ b/drivers/media/usb/dvb-usb/dvb-usb-init.c
@@ -286,12 +286,15 @@ EXPORT_SYMBOL(dvb_usb_device_init);
 void dvb_usb_device_exit(struct usb_interface *intf)
 {
struct dvb_usb_device *d = usb_get_intfdata(intf);
-   const char *name = "generic DVB-USB module";
+   const char *default_name = "generic DVB-USB module";
+   char name[40];
 
usb_set_intfdata(intf, NULL);
if (d != NULL && d->desc != NULL) {
-   name = d->desc->name;
+   strscpy(name, d->desc->name, sizeof(name));
dvb_usb_exit(d);
+   } else {
+   strscpy(name, default_name, sizeof(name));
}
info("%s successfully deinitialized and disconnected.", name);
 
-- 
2.20.1





[PATCH 4.4 016/158] xfrm: Fix xfrm sel prefix length validation

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit b38ff4075a80b4da5cb2202d7965332ca0efb213 ]

Family of src/dst can be different from family of selector src/dst.
Use xfrm selector family to validate address prefix length,
while verifying new sa from userspace.

Validated patch with this command:
ip xfrm state add src 1.1.6.1 dst 1.1.6.2 proto esp spi 4260196 \
reqid 20004 mode tunnel aead "rfc4106(gcm(aes))" \
0x01640001 128 \
sel src 1011:1:4::2/128 sel dst 1021:1:4::2/128 dev Port5

Fixes: 07bf7908950a ("xfrm: Validate address prefix lengths in the xfrm 
selector.")
Signed-off-by: Anirudh Gupta 
Acked-by: Herbert Xu 
Signed-off-by: Steffen Klassert 
Signed-off-by: Sasha Levin 
---
 net/xfrm/xfrm_user.c | 16 
 1 file changed, 16 insertions(+)

diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
index b04c03043976..10fda9a39cc2 100644
--- a/net/xfrm/xfrm_user.c
+++ b/net/xfrm/xfrm_user.c
@@ -150,6 +150,22 @@ static int verify_newsa_info(struct xfrm_usersa_info *p,
 
err = -EINVAL;
switch (p->family) {
+   case AF_INET:
+   break;
+
+   case AF_INET6:
+#if IS_ENABLED(CONFIG_IPV6)
+   break;
+#else
+   err = -EAFNOSUPPORT;
+   goto out;
+#endif
+
+   default:
+   goto out;
+   }
+
+   switch (p->sel.family) {
case AF_INET:
if (p->sel.prefixlen_d > 32 || p->sel.prefixlen_s > 32)
goto out;
-- 
2.20.1





[PATCH 4.4 026/158] perf test 6: Fix missing kvm module load for s390

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 53fe307dfd309e425b171f6272d64296a54f4dff ]

Command

   # perf test -Fv 6

fails with error

   running test 100 'kvm-s390:kvm_s390_create_vm' failed to parse
event 'kvm-s390:kvm_s390_create_vm', err -1, str 'unknown tracepoint'
event syntax error: 'kvm-s390:kvm_s390_create_vm'
 \___ unknown tracepoint

when the kvm module is not loaded or not built in.

Fix this by adding a valid function which tests if the module
is loaded. Loaded modules (or builtin KVM support) have a
directory named
  /sys/kernel/debug/tracing/events/kvm-s390
for this tracepoint.

Check for existence of this directory.

Signed-off-by: Thomas Richter 
Reviewed-by: Christian Borntraeger 
Cc: Heiko Carstens 
Cc: Hendrik Brueckner 
Link: http://lkml.kernel.org/r/20190604053504.43073-1-tmri...@linux.ibm.com
Signed-off-by: Arnaldo Carvalho de Melo 
Signed-off-by: Sasha Levin 
---
 tools/perf/tests/parse-events.c | 27 +++
 1 file changed, 27 insertions(+)

diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
index 54af2f2e2ee4..1a35ab044c11 100644
--- a/tools/perf/tests/parse-events.c
+++ b/tools/perf/tests/parse-events.c
@@ -12,6 +12,32 @@
 #define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \
 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
 
+#if defined(__s390x__)
+/* Return true if kvm module is available and loaded. Test this
+ * and retun success when trace point kvm_s390_create_vm
+ * exists. Otherwise this test always fails.
+ */
+static bool kvm_s390_create_vm_valid(void)
+{
+   char *eventfile;
+   bool rc = false;
+
+   eventfile = get_events_file("kvm-s390");
+
+   if (eventfile) {
+   DIR *mydir = opendir(eventfile);
+
+   if (mydir) {
+   rc = true;
+   closedir(mydir);
+   }
+   put_events_file(eventfile);
+   }
+
+   return rc;
+}
+#endif
+
 static int test__checkevent_tracepoint(struct perf_evlist *evlist)
 {
struct perf_evsel *evsel = perf_evlist__first(evlist);
@@ -1561,6 +1587,7 @@ static struct evlist_test test__events[] = {
{
.name  = "kvm-s390:kvm_s390_create_vm",
.check = test__checkevent_tracepoint,
+   .valid = kvm_s390_create_vm_valid,
.id= 100,
},
 #endif
-- 
2.20.1





[PATCH 4.4 018/158] net: phy: Check against net_device being NULL

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 82c76aca81187b3d28a6fb3062f6916450ce955e ]

In general, we don't want MAC drivers calling phy_attach_direct with the
net_device being NULL. Add checks against this in all the functions
calling it: phy_attach() and phy_connect_direct().

Signed-off-by: Ioana Ciornei 
Suggested-by: Andrew Lunn 
Reviewed-by: Andrew Lunn 
Reviewed-by: Florian Fainelli 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/phy/phy_device.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 70f26b30729c..c6a87834723d 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -472,6 +472,9 @@ int phy_connect_direct(struct net_device *dev, struct 
phy_device *phydev,
 {
int rc;
 
+   if (!dev)
+   return -EINVAL;
+
rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
if (rc)
return rc;
@@ -704,6 +707,9 @@ struct phy_device *phy_attach(struct net_device *dev, const 
char *bus_id,
struct device *d;
int rc;
 
+   if (!dev)
+   return ERR_PTR(-EINVAL);
+
/* Search the list of PHY devices on the mdio bus for the
 * PHY with the requested name
 */
-- 
2.20.1





[PATCH 4.4 041/158] media: coda: increment sequence offset for the last returned frame

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit b3b7d96817cdb8b6fc353867705275dce8f41ccc ]

If no more frames are decoded in bitstream end mode, and a previously
decoded frame has been returned, the firmware still increments the frame
number. To avoid a sequence number mismatch after decoder restart,
increment the sequence_offset correction parameter.

Signed-off-by: Philipp Zabel 
Signed-off-by: Hans Verkuil 
Signed-off-by: Mauro Carvalho Chehab 
Signed-off-by: Sasha Levin 
---
 drivers/media/platform/coda/coda-bit.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/media/platform/coda/coda-bit.c 
b/drivers/media/platform/coda/coda-bit.c
index a7ed2dba7a0e..b19e70b83f4a 100644
--- a/drivers/media/platform/coda/coda-bit.c
+++ b/drivers/media/platform/coda/coda-bit.c
@@ -1967,6 +1967,9 @@ static void coda_finish_decode(struct coda_ctx *ctx)
else if (ctx->display_idx < 0)
ctx->hold = true;
} else if (decoded_idx == -2) {
+   if (ctx->display_idx >= 0 &&
+   ctx->display_idx < ctx->num_internal_frames)
+   ctx->sequence_offset++;
/* no frame was decoded, we still return remaining buffers */
} else if (decoded_idx < 0 || decoded_idx >= ctx->num_internal_frames) {
v4l2_err(&dev->v4l2_dev,
-- 
2.20.1





[PATCH 4.4 025/158] s390/qdio: handle PENDING state for QEBSM devices

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 04310324c6f482921c071444833e70fe861b73d9 ]

When a CQ-enabled device uses QEBSM for SBAL state inspection,
get_buf_states() can return the PENDING state for an Output Queue.
get_outbound_buffer_frontier() isn't prepared for this, and any PENDING
buffer will permanently stall all further completion processing on this
Queue.

This isn't a concern for non-QEBSM devices, as get_buf_states() for such
devices will manually turn PENDING buffers into EMPTY ones.

Fixes: 104ea556ee7f ("qdio: support asynchronous delivery of storage blocks")
Signed-off-by: Julian Wiedmann 
Signed-off-by: Heiko Carstens 
Signed-off-by: Sasha Levin 
---
 drivers/s390/cio/qdio_main.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/s390/cio/qdio_main.c b/drivers/s390/cio/qdio_main.c
index d64b401f3d05..8d7fc3b6ca63 100644
--- a/drivers/s390/cio/qdio_main.c
+++ b/drivers/s390/cio/qdio_main.c
@@ -752,6 +752,7 @@ static int get_outbound_buffer_frontier(struct qdio_q *q)
 
switch (state) {
case SLSB_P_OUTPUT_EMPTY:
+   case SLSB_P_OUTPUT_PENDING:
/* the adapter got it */
DBF_DEV_EVENT(DBF_INFO, q->irq_ptr,
"out empty:%1d %02x", q->nr, count);
-- 
2.20.1





[PATCH 4.4 027/158] gpio: omap: fix lack of irqstatus_raw0 for OMAP4

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 64ea3e9094a1f13b96c33244a3fb3a0f45690bd2 ]

Commit 384ebe1c2849 ("gpio/omap: Add DT support to GPIO driver") added
the register definition tables to the gpio-omap driver. Subsequently to
that commit, commit 4e962e8998cc ("gpio/omap: remove cpu_is_omap()
checks from *_runtime_resume()") added definitions for irqstatus_raw*
registers to the legacy OMAP4 definitions, but missed the DT
definitions.

This causes an unintentional change of behaviour for the 1.101 errata
workaround on OMAP4 platforms. Fix this oversight.

Fixes: 4e962e8998cc ("gpio/omap: remove cpu_is_omap() checks from 
*_runtime_resume()")
Signed-off-by: Russell King 
Signed-off-by: Grygorii Strashko 
Tested-by: Tony Lindgren 
Signed-off-by: Linus Walleij 
Signed-off-by: Sasha Levin 
---
 drivers/gpio/gpio-omap.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index c8c49b1d5f9f..f23136825a6e 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -1611,6 +1611,8 @@ static struct omap_gpio_reg_offs omap4_gpio_regs = {
.clr_dataout =  OMAP4_GPIO_CLEARDATAOUT,
.irqstatus =OMAP4_GPIO_IRQSTATUS0,
.irqstatus2 =   OMAP4_GPIO_IRQSTATUS1,
+   .irqstatus_raw0 =   OMAP4_GPIO_IRQSTATUSRAW0,
+   .irqstatus_raw1 =   OMAP4_GPIO_IRQSTATUSRAW1,
.irqenable =OMAP4_GPIO_IRQSTATUSSET0,
.irqenable2 =   OMAP4_GPIO_IRQSTATUSSET1,
.set_irqenable =OMAP4_GPIO_IRQSTATUSSET0,
-- 
2.20.1





[PATCH 4.4 061/158] NFSv4: Handle the special Linux file open access mode

2019-08-02 Thread Greg Kroah-Hartman
From: Trond Myklebust 

commit 44942b4e457beda00981f616402a1a791e8c616e upstream.

According to the open() manpage, Linux reserves the access mode 3
to mean "check for read and write permission on the file and return
a file descriptor that can't be used for reading or writing."

Currently, the NFSv4 code will ask the server to open the file,
and will use an incorrect share access mode of 0. Since it has
an incorrect share access mode, the client later forgets to send
a corresponding close, meaning it can leak stateids on the server.

Fixes: ce4ef7c0a8a05 ("NFS: Split out NFS v4 file operations")
Cc: sta...@vger.kernel.org # 3.6+
Signed-off-by: Trond Myklebust 
Signed-off-by: Greg Kroah-Hartman 

---
 fs/nfs/inode.c|1 +
 fs/nfs/nfs4file.c |2 +-
 2 files changed, 2 insertions(+), 1 deletion(-)

--- a/fs/nfs/inode.c
+++ b/fs/nfs/inode.c
@@ -935,6 +935,7 @@ int nfs_open(struct inode *inode, struct
nfs_fscache_open_file(inode, filp);
return 0;
 }
+EXPORT_SYMBOL_GPL(nfs_open);
 
 /*
  * This function is called whenever some part of NFS notices that
--- a/fs/nfs/nfs4file.c
+++ b/fs/nfs/nfs4file.c
@@ -49,7 +49,7 @@ nfs4_file_open(struct inode *inode, stru
return err;
 
if ((openflags & O_ACCMODE) == 3)
-   openflags--;
+   return nfs_open(inode, filp);
 
/* We can't create new files here */
openflags &= ~(O_CREAT|O_EXCL);




[PATCH 4.4 030/158] bpf: silence warning messages in core

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit aee450cbe482a8c2f6fa5b05b178ef8b8ff107ca ]

Compiling kernel/bpf/core.c with W=1 causes a flood of warnings:

kernel/bpf/core.c:1198:65: warning: initialized field overwritten 
[-Woverride-init]
 1198 | #define BPF_INSN_3_TBL(x, y, z) [BPF_##x | BPF_##y | BPF_##z] = true
  | ^~~~
kernel/bpf/core.c:1087:2: note: in expansion of macro 'BPF_INSN_3_TBL'
 1087 |  INSN_3(ALU, ADD,  X),   \
  |  ^~
kernel/bpf/core.c:1202:3: note: in expansion of macro 'BPF_INSN_MAP'
 1202 |   BPF_INSN_MAP(BPF_INSN_2_TBL, BPF_INSN_3_TBL),
  |   ^~~~
kernel/bpf/core.c:1198:65: note: (near initialization for 
'public_insntable[12]')
 1198 | #define BPF_INSN_3_TBL(x, y, z) [BPF_##x | BPF_##y | BPF_##z] = true
  | ^~~~
kernel/bpf/core.c:1087:2: note: in expansion of macro 'BPF_INSN_3_TBL'
 1087 |  INSN_3(ALU, ADD,  X),   \
  |  ^~
kernel/bpf/core.c:1202:3: note: in expansion of macro 'BPF_INSN_MAP'
 1202 |   BPF_INSN_MAP(BPF_INSN_2_TBL, BPF_INSN_3_TBL),
  |   ^~~~

98 copies of the above.

The attached patch silences the warnings, because we *know* we're overwriting
the default initializer. That leaves bpf/core.c with only 6 other warnings,
which become more visible in comparison.

Signed-off-by: Valdis Kletnieks 
Acked-by: Andrii Nakryiko 
Signed-off-by: Daniel Borkmann 
Signed-off-by: Sasha Levin 
---
 kernel/bpf/Makefile | 1 +
 1 file changed, 1 insertion(+)

diff --git a/kernel/bpf/Makefile b/kernel/bpf/Makefile
index 13272582eee0..677991f29d66 100644
--- a/kernel/bpf/Makefile
+++ b/kernel/bpf/Makefile
@@ -1,4 +1,5 @@
 obj-y := core.o
+CFLAGS_core.o += $(call cc-disable-warning, override-init)
 
 obj-$(CONFIG_BPF_SYSCALL) += syscall.o verifier.o inode.o helpers.o
 obj-$(CONFIG_BPF_SYSCALL) += hashtab.o arraymap.o
-- 
2.20.1





[PATCH 4.4 045/158] ath10k: fix PCIE device wake up failed

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 011d4111c8c602ea829fa4917af1818eb0500a90 ]

Observed PCIE device wake up failed after ~120 iterations of
soft-reboot test. The error message is
"ath10k_pci :01:00.0: failed to wake up device : -110"

The call trace as below:
ath10k_pci_probe -> ath10k_pci_force_wake -> ath10k_pci_wake_wait ->
ath10k_pci_is_awake

Once trigger the device to wake up, we will continuously check the RTC
state until it returns RTC_STATE_V_ON or timeout.

But for QCA99x0 chips, we use wrong value for RTC_STATE_V_ON.
Occasionally, we get 0x7 on the fist read, we thought as a failure
case, but actually is the right value, also verified with the spec.
So fix the issue by changing RTC_STATE_V_ON from 0x5 to 0x7, passed
~2000 iterations.

Tested HW: QCA9984

Signed-off-by: Miaoqing Pan 
Signed-off-by: Kalle Valo 
Signed-off-by: Sasha Levin 
---
 drivers/net/wireless/ath/ath10k/hw.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath10k/hw.c 
b/drivers/net/wireless/ath/ath10k/hw.c
index 7b84d08a5154..12d6549e45a1 100644
--- a/drivers/net/wireless/ath/ath10k/hw.c
+++ b/drivers/net/wireless/ath/ath10k/hw.c
@@ -128,7 +128,7 @@ const struct ath10k_hw_values qca6174_values = {
 };
 
 const struct ath10k_hw_values qca99x0_values = {
-   .rtc_state_val_on   = 5,
+   .rtc_state_val_on   = 7,
.ce_count   = 12,
.msi_assign_ce_max  = 12,
.num_target_ce_config_wlan  = 10,
-- 
2.20.1





[PATCH 4.4 050/158] bcache: check c->gc_thread by IS_ERR_OR_NULL in cache_set_flush()

2019-08-02 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 e

[PATCH 4.4 033/158] perf evsel: Make perf_evsel__name() accept a NULL argument

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit fdbdd7e8580eac9bdafa532746c865644d125e34 ]

In which case it simply returns "unknown", like when it can't figure out
the evsel->name value.

This makes this code more robust and fixes a problem in 'perf trace'
where a NULL evsel was being passed to a routine that only used the
evsel for printing its name when a invalid syscall id was passed.

Reported-by: Leo Yan 
Cc: Adrian Hunter 
Cc: Jiri Olsa 
Cc: Namhyung Kim 
Link: https://lkml.kernel.org/n/tip-f30ztaasku3z935cn3ak3...@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo 
Signed-off-by: Sasha Levin 
---
 tools/perf/util/evsel.c | 8 +++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index 97fde9275f42..a8507fee654b 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -491,6 +491,9 @@ const char *perf_evsel__name(struct perf_evsel *evsel)
 {
char bf[128];
 
+   if (!evsel)
+   goto out_unknown;
+
if (evsel->name)
return evsel->name;
 
@@ -527,7 +530,10 @@ const char *perf_evsel__name(struct perf_evsel *evsel)
 
evsel->name = strdup(bf);
 
-   return evsel->name ?: "unknown";
+   if (evsel->name)
+   return evsel->name;
+out_unknown:
+   return "unknown";
 }
 
 const char *perf_evsel__group_name(struct perf_evsel *evsel)
-- 
2.20.1





[PATCH 4.4 059/158] regulator: s2mps11: Fix buck7 and buck8 wrong voltages

2019-08-02 Thread Greg Kroah-Hartman
From: Krzysztof Kozlowski 

commit 16da0eb5ab6ef2dd1d33431199126e63db9997cc upstream.

On S2MPS11 device, the buck7 and buck8 regulator voltages start at 750
mV, not 600 mV.  Using wrong minimal value caused shifting of these
regulator values by 150 mV (e.g. buck7 usually configured to v1.35 V was
reported as 1.2 V).

On most of the boards these regulators are left in default state so this
was only affecting reported voltage.  However if any driver wanted to
change them, then effectively it would set voltage 150 mV higher than
intended.

Cc: 
Fixes: cb74685ecb39 ("regulator: s2mps11: Add samsung s2mps11 regulator driver")
Signed-off-by: Krzysztof Kozlowski 
Signed-off-by: Mark Brown 
Signed-off-by: Greg Kroah-Hartman 

---
 drivers/regulator/s2mps11.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

--- a/drivers/regulator/s2mps11.c
+++ b/drivers/regulator/s2mps11.c
@@ -382,8 +382,8 @@ static const struct regulator_desc s2mps
regulator_desc_s2mps11_buck1_4(4),
regulator_desc_s2mps11_buck5,
regulator_desc_s2mps11_buck67810(6, MIN_600_MV, STEP_6_25_MV),
-   regulator_desc_s2mps11_buck67810(7, MIN_600_MV, STEP_12_5_MV),
-   regulator_desc_s2mps11_buck67810(8, MIN_600_MV, STEP_12_5_MV),
+   regulator_desc_s2mps11_buck67810(7, MIN_750_MV, STEP_12_5_MV),
+   regulator_desc_s2mps11_buck67810(8, MIN_750_MV, STEP_12_5_MV),
regulator_desc_s2mps11_buck9,
regulator_desc_s2mps11_buck67810(10, MIN_750_MV, STEP_12_5_MV),
 };




[PATCH 4.4 043/158] x86/build: Add set -e to mkcapflags.sh to delete broken capflags.c

2019-08-02 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 6988c74409a8..711b74e0e623 100644
--- a/arch/x86/kernel/cpu/mkcapflags.sh
+++ b/arch/x86/kernel/cpu/mkcapflags.sh
@@ -3,6 +3,8 @@
 # Generate the x86_cap/bug_flags[] arrays from include/asm/cpufeatures.h
 #
 
+set -e
+
 IN=$1
 OUT=$2
 
-- 
2.20.1





[PATCH 4.4 036/158] media: i2c: fix warning same module names

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit b2ce5617dad254230551feda3599f2cc68e53ad8 ]

When building with CONFIG_VIDEO_ADV7511 and CONFIG_DRM_I2C_ADV7511
enabled as loadable modules, we see the following warning:

  drivers/gpu/drm/bridge/adv7511/adv7511.ko
  drivers/media/i2c/adv7511.ko

Rework so that the file is named adv7511-v4l2.c.

Signed-off-by: Anders Roxell 
Signed-off-by: Hans Verkuil 
Signed-off-by: Mauro Carvalho Chehab 
Signed-off-by: Sasha Levin 
---
 drivers/media/i2c/Makefile  | 2 +-
 drivers/media/i2c/{adv7511.c => adv7511-v4l2.c} | 5 +
 2 files changed, 6 insertions(+), 1 deletion(-)
 rename drivers/media/i2c/{adv7511.c => adv7511-v4l2.c} (99%)

diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile
index 07db257abfc1..d5711def1fff 100644
--- a/drivers/media/i2c/Makefile
+++ b/drivers/media/i2c/Makefile
@@ -28,7 +28,7 @@ obj-$(CONFIG_VIDEO_ADV7393) += adv7393.o
 obj-$(CONFIG_VIDEO_ADV7604) += adv7604.o
 obj-$(CONFIG_VIDEO_ADV7842) += adv7842.o
 obj-$(CONFIG_VIDEO_AD9389B) += ad9389b.o
-obj-$(CONFIG_VIDEO_ADV7511) += adv7511.o
+obj-$(CONFIG_VIDEO_ADV7511) += adv7511-v4l2.o
 obj-$(CONFIG_VIDEO_VPX3220) += vpx3220.o
 obj-$(CONFIG_VIDEO_VS6624)  += vs6624.o
 obj-$(CONFIG_VIDEO_BT819) += bt819.o
diff --git a/drivers/media/i2c/adv7511.c b/drivers/media/i2c/adv7511-v4l2.c
similarity index 99%
rename from drivers/media/i2c/adv7511.c
rename to drivers/media/i2c/adv7511-v4l2.c
index c24839cfcc35..b35400e4e9af 100644
--- a/drivers/media/i2c/adv7511.c
+++ b/drivers/media/i2c/adv7511-v4l2.c
@@ -17,6 +17,11 @@
  * SOFTWARE.
  */
 
+/*
+ * This file is named adv7511-v4l2.c so it doesn't conflict with the Analog
+ * Device ADV7511 (config fragment CONFIG_DRM_I2C_ADV7511).
+ */
+
 
 #include 
 #include 
-- 
2.20.1





[PATCH 4.4 047/158] rslib: Fix handling of of caller provided syndrome

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit ef4d6a8556b637ad27c8c2a2cff1dda3da38e9a9 ]

Check if the syndrome provided by the caller is zero, and act
accordingly.

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

diff --git a/lib/reed_solomon/decode_rs.c b/lib/reed_solomon/decode_rs.c
index 8eed0f9ac495..a5d313381539 100644
--- a/lib/reed_solomon/decode_rs.c
+++ b/lib/reed_solomon/decode_rs.c
@@ -42,8 +42,18 @@
BUG_ON(pad < 0 || pad >= nn);
 
/* Does the caller provide the syndrome ? */
-   if (s != NULL)
-   goto decode;
+   if (s != NULL) {
+   for (i = 0; i < nroots; i++) {
+   /* The syndrome is in index form,
+* so nn represents zero
+*/
+   if (s[i] != nn)
+   goto decode;
+   }
+
+   /* syndrome is zero, no errors to correct  */
+   return 0;
+   }
 
/* form the syndromes; i.e., evaluate data(x) at roots of
 * g(x) */
-- 
2.20.1





[PATCH 4.4 054/158] Bluetooth: validate BLE connection interval updates

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit c49a8682fc5d298d44e8d911f4fa14690ea9485e ]

Problem: The Linux Bluetooth stack yields complete control over the BLE
connection interval to the remote device.

The Linux Bluetooth stack provides access to the BLE connection interval
min and max values through /sys/kernel/debug/bluetooth/hci0/
conn_min_interval and /sys/kernel/debug/bluetooth/hci0/conn_max_interval.
These values are used for initial BLE connections, but the remote device
has the ability to request a connection parameter update. In the event
that the remote side requests to change the connection interval, the Linux
kernel currently only validates that the desired value is within the
acceptable range in the Bluetooth specification (6 - 3200, corresponding to
7.5ms - 4000ms). There is currently no validation that the desired value
requested by the remote device is within the min/max limits specified in
the conn_min_interval/conn_max_interval configurations. This essentially
leads to Linux yielding complete control over the connection interval to
the remote device.

The proposed patch adds a verification step to the connection parameter
update mechanism, ensuring that the desired value is within the min/max
bounds of the current connection. If the desired value is outside of the
current connection min/max values, then the connection parameter update
request is rejected and the negative response is returned to the remote
device. Recall that the initial connection is established using the local
conn_min_interval/conn_max_interval values, so this allows the Linux
administrator to retain control over the BLE connection interval.

The one downside that I see is that the current default Linux values for
conn_min_interval and conn_max_interval typically correspond to 30ms and
50ms respectively. If this change were accepted, then it is feasible that
some devices would no longer be able to negotiate to their desired
connection interval values. This might be remedied by setting the default
Linux conn_min_interval and conn_max_interval values to the widest
supported range (6 - 3200 / 7.5ms - 4000ms). This could lead to the same
behavior as the current implementation, where the remote device could
request to change the connection interval value to any value that is
permitted by the Bluetooth specification, and Linux would accept the
desired value.

Signed-off-by: Carey Sonsino 
Signed-off-by: Marcel Holtmann 
Signed-off-by: Sasha Levin 
---
 net/bluetooth/hci_event.c  | 5 +
 net/bluetooth/l2cap_core.c | 9 -
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
index 37fe2b158c2a..c4e94f34d048 100644
--- a/net/bluetooth/hci_event.c
+++ b/net/bluetooth/hci_event.c
@@ -5062,6 +5062,11 @@ static void hci_le_remote_conn_param_req_evt(struct 
hci_dev *hdev,
return send_conn_param_neg_reply(hdev, handle,
 HCI_ERROR_UNKNOWN_CONN_ID);
 
+   if (min < hcon->le_conn_min_interval ||
+   max > hcon->le_conn_max_interval)
+   return send_conn_param_neg_reply(hdev, handle,
+HCI_ERROR_INVALID_LL_PARAMS);
+
if (hci_check_conn_params(min, max, latency, timeout))
return send_conn_param_neg_reply(hdev, handle,
 HCI_ERROR_INVALID_LL_PARAMS);
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index c25f1e4846cd..8cfba78d26f6 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -5266,7 +5266,14 @@ static inline int l2cap_conn_param_update_req(struct 
l2cap_conn *conn,
 
memset(&rsp, 0, sizeof(rsp));
 
-   err = hci_check_conn_params(min, max, latency, to_multiplier);
+   if (min < hcon->le_conn_min_interval ||
+   max > hcon->le_conn_max_interval) {
+   BT_DBG("requested connection interval exceeds current bounds.");
+   err = -EINVAL;
+   } else {
+   err = hci_check_conn_params(min, max, latency, to_multiplier);
+   }
+
if (err)
rsp.result = cpu_to_le16(L2CAP_CONN_PARAM_REJECTED);
else
-- 
2.20.1





Re: [PATCH] drm/komeda: Adds error event print functionality

2019-08-02 Thread Mihail Atanassov
On Friday, 2 August 2019 10:43:10 BST Lowry Li (Arm Technology China) wrote:
> From: "Lowry Li (Arm Technology China)" 
> 
> Adds to print the event message when error happens and the same event
> will not be printed until next vsync.
> 
> Changes since v2:
> 1. Refine komeda_sprintf();
> 2. Not using STR_SZ macro for the string size in komeda_print_events().
> 
> Changes since v1:
> 1. Handling the event print by CONFIG_KOMEDA_ERROR_PRINT;
> 2. Changing the max string size to 256.
> 
> Signed-off-by: Lowry Li (Arm Technology China) 

Reviewed-by: Mihail Atanassov 

BR,
Mihail

> ---
>  drivers/gpu/drm/arm/display/Kconfig   |   6 +
>  drivers/gpu/drm/arm/display/komeda/Makefile   |   2 +
>  drivers/gpu/drm/arm/display/komeda/komeda_dev.h   |  15 +++
>  drivers/gpu/drm/arm/display/komeda/komeda_event.c | 140
> ++ drivers/gpu/drm/arm/display/komeda/komeda_kms.c   | 
>  4 +
>  5 files changed, 167 insertions(+)
>  create mode 100644 drivers/gpu/drm/arm/display/komeda/komeda_event.c
> 
> diff --git a/drivers/gpu/drm/arm/display/Kconfig
> b/drivers/gpu/drm/arm/display/Kconfig index cec0639..e87ff86 100644
> --- a/drivers/gpu/drm/arm/display/Kconfig
> +++ b/drivers/gpu/drm/arm/display/Kconfig
> @@ -12,3 +12,9 @@ config DRM_KOMEDA
> Processor driver. It supports the D71 variants of the hardware.
> 
> If compiled as a module it will be called komeda.
> +
> +config DRM_KOMEDA_ERROR_PRINT
> + bool "Enable komeda error print"
> + depends on DRM_KOMEDA
> + help
> +   Choose this option to enable error printing.
> diff --git a/drivers/gpu/drm/arm/display/komeda/Makefile
> b/drivers/gpu/drm/arm/display/komeda/Makefile index 5c3900c..f095a1c 100644
> --- a/drivers/gpu/drm/arm/display/komeda/Makefile
> +++ b/drivers/gpu/drm/arm/display/komeda/Makefile
> @@ -22,4 +22,6 @@ komeda-y += \
>   d71/d71_dev.o \
>   d71/d71_component.o
> 
> +komeda-$(CONFIG_DRM_KOMEDA_ERROR_PRINT) += komeda_event.o
> +
>  obj-$(CONFIG_DRM_KOMEDA) += komeda.o
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
> b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h index d1c86b6..e28e7e6
> 100644
> --- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h
> @@ -40,6 +40,17 @@
>  #define KOMEDA_ERR_TTNG  BIT_ULL(30)
>  #define KOMEDA_ERR_TTF   BIT_ULL(31)
> 
> +#define KOMEDA_ERR_EVENTS\
> + (KOMEDA_EVENT_URUN  | KOMEDA_EVENT_IBSY | KOMEDA_EVENT_OVR |
\
> + KOMEDA_ERR_TETO | KOMEDA_ERR_TEMR   | 
KOMEDA_ERR_TITR |\
> + KOMEDA_ERR_CPE  | KOMEDA_ERR_CFGE   | 
KOMEDA_ERR_AXIE |\
> + KOMEDA_ERR_ACE0 | KOMEDA_ERR_ACE1   | 
KOMEDA_ERR_ACE2 |\
> + KOMEDA_ERR_ACE3 | KOMEDA_ERR_DRIFTTO| 
KOMEDA_ERR_FRAMETO |\
> + KOMEDA_ERR_ZME  | KOMEDA_ERR_MERR   | 
KOMEDA_ERR_TCF |\
> + KOMEDA_ERR_TTNG | KOMEDA_ERR_TTF)
> +
> +#define KOMEDA_WARN_EVENTS   KOMEDA_ERR_CSCE
> +
>  /* malidp device id */
>  enum {
>   MALI_D71 = 0,
> @@ -207,4 +218,8 @@ struct komeda_dev {
> 
>  struct komeda_dev *dev_to_mdev(struct device *dev);
> 
> +#ifdef CONFIG_DRM_KOMEDA_ERROR_PRINT
> +void komeda_print_events(struct komeda_events *evts);
> +#endif
> +
>  #endif /*_KOMEDA_DEV_H_*/
> diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_event.c
> b/drivers/gpu/drm/arm/display/komeda/komeda_event.c new file mode 100644
> index 000..a36fb86
> --- /dev/null
> +++ b/drivers/gpu/drm/arm/display/komeda/komeda_event.c
> @@ -0,0 +1,140 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * (C) COPYRIGHT 2019 ARM Limited. All rights reserved.
> + * Author: James.Qian.Wang 
> + *
> + */
> +#include 
> +
> +#include "komeda_dev.h"
> +
> +struct komeda_str {
> + char *str;
> + u32 sz;
> + u32 len;
> +};
> +
> +/* return 0 on success,  < 0 on no space.
> + */
> +static int komeda_sprintf(struct komeda_str *str, const char *fmt, ...)
> +{
> + va_list args;
> + int num, free_sz;
> + int err;
> +
> + free_sz = str->sz - str->len - 1;
> + if (free_sz <= 0)
> + return -ENOSPC;
> +
> + va_start(args, fmt);
> +
> + num = vsnprintf(str->str + str->len, free_sz, fmt, args);
> +
> + va_end(args);
> +
> + if (num < free_sz) {
> + str->len += num;
> + err = 0;
> + } else {
> + str->len = str->sz - 1;
> + err = -ENOSPC;
> + }
> +
> + return err;
> +}
> +
> +static void evt_sprintf(struct komeda_str *str, u64 evt, const char *msg)
> +{
> + if (evt)
> + komeda_sprintf(str, msg);
> +}
> +
> +static void evt_str(struct komeda_str *str, u64 events)
> +{
> + if (events == 0ULL) {
> + komeda_sprintf(str, "None");
> + return;
> + }
> +
> + evt_sprintf(str, events & KOMEDA_EVENT_VSYNC, "VSYNC|");
> + evt_sprintf(str, events & KOMEDA_EVENT_FLIP, "FLIP|");
> + e

Re: [PATCH 5.2 10/20] media: radio-raremono: change devm_k*alloc to k*alloc

2019-08-02 Thread Joe Perches
On Fri, 2019-08-02 at 11:40 +0200, Greg Kroah-Hartman wrote:
> From: Luke Nowakowski-Krijger 
> 
> commit c666355e60ddb4748ead3bdd983e3f7f2224aaf0 upstream.
> 
> Change devm_k*alloc to k*alloc to manually allocate memory
> 
> The manual allocation and freeing of memory is necessary because when
> the USB radio is disconnected, the memory associated with devm_k*alloc
> is freed. Meaning if we still have unresolved references to the radio
> device, then we get use-after-free errors.
> 
> This patch fixes this by manually allocating memory, and freeing it in
> the v4l2.release callback that gets called when the last radio device
> exits.

This really should be commented in the code
and not just in the commit changelog as some
unsuspecting person will likely undo this in
the future without one.

> Reported-and-tested-by: syzbot+a4387f5b6b799f6be...@syzkaller.appspotmail.com
> 
> Signed-off-by: Luke Nowakowski-Krijger 
> Signed-off-by: Hans Verkuil 
> [hverkuil-ci...@xs4all.nl: cleaned up two small checkpatch.pl warnings]
> [hverkuil-ci...@xs4all.nl: prefix subject with driver name]
> Signed-off-by: Mauro Carvalho Chehab 
> Signed-off-by: Greg Kroah-Hartman 
> 
> ---
>  drivers/media/radio/radio-raremono.c |   30 +++---
>  1 file changed, 23 insertions(+), 7 deletions(-)
> 
> --- a/drivers/media/radio/radio-raremono.c
> +++ b/drivers/media/radio/radio-raremono.c
> @@ -271,6 +271,14 @@ static int vidioc_g_frequency(struct fil
>   return 0;
>  }
>  
> +static void raremono_device_release(struct v4l2_device *v4l2_dev)
> +{
> + struct raremono_device *radio = to_raremono_dev(v4l2_dev);
> +
> + kfree(radio->buffer);
> + kfree(radio);
> +}
> +
>  /* File system interface */
>  static const struct v4l2_file_operations usb_raremono_fops = {
>   .owner  = THIS_MODULE,
> @@ -295,12 +303,14 @@ static int usb_raremono_probe(struct usb
>   struct raremono_device *radio;
>   int retval = 0;
>  
> - radio = devm_kzalloc(&intf->dev, sizeof(struct raremono_device), 
> GFP_KERNEL);
> - if (radio)
> - radio->buffer = devm_kmalloc(&intf->dev, BUFFER_LENGTH, 
> GFP_KERNEL);
> -
> - if (!radio || !radio->buffer)
> + radio = kzalloc(sizeof(*radio), GFP_KERNEL);
> + if (!radio)
> + return -ENOMEM;
> + radio->buffer = kmalloc(BUFFER_LENGTH, GFP_KERNEL);
> + if (!radio->buffer) {
> + kfree(radio);
>   return -ENOMEM;
> + }
>  
>   radio->usbdev = interface_to_usbdev(intf);
>   radio->intf = intf;
> @@ -324,7 +334,8 @@ static int usb_raremono_probe(struct usb
>   if (retval != 3 ||
>   (get_unaligned_be16(&radio->buffer[1]) & 0xfff) == 0x0242) {
>   dev_info(&intf->dev, "this is not Thanko's Raremono.\n");
> - return -ENODEV;
> + retval = -ENODEV;
> + goto free_mem;
>   }
>  
>   dev_info(&intf->dev, "Thanko's Raremono connected: (%04X:%04X)\n",
> @@ -333,7 +344,7 @@ static int usb_raremono_probe(struct usb
>   retval = v4l2_device_register(&intf->dev, &radio->v4l2_dev);
>   if (retval < 0) {
>   dev_err(&intf->dev, "couldn't register v4l2_device\n");
> - return retval;
> + goto free_mem;
>   }
>  
>   mutex_init(&radio->lock);
> @@ -345,6 +356,7 @@ static int usb_raremono_probe(struct usb
>   radio->vdev.ioctl_ops = &usb_raremono_ioctl_ops;
>   radio->vdev.lock = &radio->lock;
>   radio->vdev.release = video_device_release_empty;
> + radio->v4l2_dev.release = raremono_device_release;
>  
>   usb_set_intfdata(intf, &radio->v4l2_dev);
>  
> @@ -360,6 +372,10 @@ static int usb_raremono_probe(struct usb
>   }
>   dev_err(&intf->dev, "could not register video device\n");
>   v4l2_device_unregister(&radio->v4l2_dev);
> +
> +free_mem:
> + kfree(radio->buffer);
> + kfree(radio);
>   return retval;
>  }
>  
> 
> 



[PATCH v3 2/4] serial: mctrl_gpio: Add a NULL check to mctrl_gpio_to_gpiod()

2019-08-02 Thread Schrempf Frieder
From: Frieder Schrempf 

As it is allowed to use the mctrl_gpio_* functions before
initialization (as the 8250 driver does according to 434be0ae7aa7),
it seems appropriate to have a NULL check in all of the functions.
Otherwise the mctrl_gpio_to_gpiod() function is prone to be used
in a context that can lead to a NULL pointer dereference.

Signed-off-by: Frieder Schrempf 
---
Changes in v3
=
* Move the changes in mctrl_gpio_to_gpiod() to a separate patch
---
 drivers/tty/serial/serial_mctrl_gpio.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/tty/serial/serial_mctrl_gpio.c 
b/drivers/tty/serial/serial_mctrl_gpio.c
index 2b400189be91..54c43e02e375 100644
--- a/drivers/tty/serial/serial_mctrl_gpio.c
+++ b/drivers/tty/serial/serial_mctrl_gpio.c
@@ -61,6 +61,9 @@ EXPORT_SYMBOL_GPL(mctrl_gpio_set);
 struct gpio_desc *mctrl_gpio_to_gpiod(struct mctrl_gpios *gpios,
  enum mctrl_gpio_idx gidx)
 {
+   if (gpios == NULL)
+   return NULL;
+
return gpios->gpio[gidx];
 }
 EXPORT_SYMBOL_GPL(mctrl_gpio_to_gpiod);
-- 
2.17.1


[PATCH 1/4] iio: adc: ad7606: Add support for AD7606B ADC

2019-08-02 Thread Beniamin Bia
From: Stefan Popa 

The AD7606B is a 16-bit ADC that supports simultaneous sampling of 8
channels. It is pin compatible to AD7606, but adds extra modes by
writing to the register map.

The AD7606B can be configured to work in software mode by setting all
oversampling pins to high. This mode is selected by default.
The oversampling ratio is configured from the OS_MODE register (address
0x08) with the addition of OS=128 and OS=256 that were not available in
hardware mode.

The device is configured to output data on a single spi channel, but this
configuration must be done right after restart. That is why the delay was
removed for devices which doesn't require it.

Moreover, in software mode, the range gpio has no longer its function.
Instead, the scale can be configured individually for each channel from
the RANGE_CH registers (address 0x03 to 0x06). Besides the already
supported ±10 V and ±5 V ranges, software mode can also accommodate the
±2.5 V range.

Signed-off-by: Stefan Popa 
Co-developed-by: Beniamin Bia 
Signed-off-by: Beniamin Bia 
---
 drivers/iio/adc/ad7606.c |  13 -
 drivers/iio/adc/ad7606.h |   4 ++
 drivers/iio/adc/ad7606_spi.c | 107 +++
 3 files changed, 122 insertions(+), 2 deletions(-)

diff --git a/drivers/iio/adc/ad7606.c b/drivers/iio/adc/ad7606.c
index ed2d08437e5d..f5ba94c03a8d 100644
--- a/drivers/iio/adc/ad7606.c
+++ b/drivers/iio/adc/ad7606.c
@@ -410,12 +410,19 @@ static const struct ad7606_chip_info 
ad7606_chip_info_tbl[] = {
.oversampling_avail = ad7606_oversampling_avail,
.oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),
},
+   [ID_AD7606B] = {
+   .channels = ad7606_channels,
+   .num_channels = 9,
+   .oversampling_avail = ad7606_oversampling_avail,
+   .oversampling_num = ARRAY_SIZE(ad7606_oversampling_avail),
+   },
[ID_AD7616] = {
.channels = ad7616_channels,
.num_channels = 17,
.oversampling_avail = ad7616_oversampling_avail,
.oversampling_num = ARRAY_SIZE(ad7616_oversampling_avail),
.os_req_reset = true,
+   .init_delay_ms = 15,
},
 };
 
@@ -631,8 +638,10 @@ int ad7606_probe(struct device *dev, int irq, void __iomem 
*base_address,
dev_warn(st->dev, "failed to RESET: no RESET GPIO specified\n");
 
/* AD7616 requires al least 15ms to reconfigure after a reset */
-   if (msleep_interruptible(15))
-   return -ERESTARTSYS;
+   if (st->chip_info->init_delay_ms) {
+   if (msleep_interruptible(st->chip_info->init_delay_ms))
+   return -ERESTARTSYS;
+   }
 
st->write_scale = ad7606_write_scale_hw;
st->write_os = ad7606_write_os_hw;
diff --git a/drivers/iio/adc/ad7606.h b/drivers/iio/adc/ad7606.h
index eeaaa8b905db..9350ef1f63b5 100644
--- a/drivers/iio/adc/ad7606.h
+++ b/drivers/iio/adc/ad7606.h
@@ -46,6 +46,8 @@
  * oversampling ratios.
  * @oversampling_num   number of elements stored in oversampling_avail array
  * @os_req_reset   some devices require a reset to update oversampling
+ * @init_delay_ms  required delay in miliseconds for initialization
+ * after a restart
  */
 struct ad7606_chip_info {
const struct iio_chan_spec  *channels;
@@ -53,6 +55,7 @@ struct ad7606_chip_info {
const unsigned int  *oversampling_avail;
unsigned intoversampling_num;
boolos_req_reset;
+   unsigned long   init_delay_ms;
 };
 
 /**
@@ -155,6 +158,7 @@ enum ad7606_supported_device_ids {
ID_AD7606_8,
ID_AD7606_6,
ID_AD7606_4,
+   ID_AD7606B,
ID_AD7616,
 };
 
diff --git a/drivers/iio/adc/ad7606_spi.c b/drivers/iio/adc/ad7606_spi.c
index 98ed52b74507..070ee7e31e2c 100644
--- a/drivers/iio/adc/ad7606_spi.c
+++ b/drivers/iio/adc/ad7606_spi.c
@@ -31,6 +31,20 @@
 /* The range of the channel is stored on 2 bits*/
 #define AD7616_RANGE_CH_MSK(ch)(0b11 << (((ch) & 0b11) * 2))
 #define AD7616_RANGE_CH_MODE(ch, mode) ((mode) << ch) & 0b11)) * 2))
+
+#define AD7606_CONFIGURATION_REGISTER  0x02
+#define AD7606_SINGLE_DOUT 0x0
+
+/*
+ * Range for AD7606B channels are stored in registers starting with address 
0x3.
+ * Each register stores range for 2 channels(4 bits per channel).
+ */
+#define AD7606_RANGE_CH_MSK(ch)(GENMASK(3, 0) << (4 * ((ch) & 
0x1)))
+#define AD7606_RANGE_CH_MODE(ch, mode) \
+   ((GENMASK(3, 0) & mode) << (4 * ((ch) & 0x1)))
+#define AD7606_RANGE_CH_ADDR(ch)   (0x03 + ((ch) >> 1))
+#define AD7606_OS_MODE 0x08
+
 static const struct iio_chan_spec ad7616_sw_channels[] = {
IIO_CHAN_SOFT_TIMESTAMP(16),
AD7616_CHANNEL(0),
@@ -51,6 +65,22 @@ static const struct iio_c

[PATCH 3/4] dt-bindings: iio: adc: Migrate AD7606 documentation to yaml

2019-08-02 Thread Beniamin Bia
The documentation for ad7606 was migrated to yaml, the new Linux Kernel
standard.

Signed-off-by: Beniamin Bia 
---
 .../bindings/iio/adc/adi,ad7606.yaml  | 134 ++
 MAINTAINERS   |   2 +-
 2 files changed, 135 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml

diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml 
b/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml
new file mode 100644
index ..509dbe9c84d2
--- /dev/null
+++ b/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml
@@ -0,0 +1,134 @@
+# SPDX-License-Identifier: GPL-2.0
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/iio/adc/adi,ad7606.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Analog Devices AD7606 Simultaneous Sampling ADC
+
+maintainers:
+  - Beniamin Bia 
+  - Stefan Popa 
+
+description: |
+  Analog Devices AD7606 Simultaneous Sampling ADC
+  
https://www.analog.com/media/en/technical-documentation/data-sheets/ad7606_7606-6_7606-4.pdf
+  
https://www.analog.com/media/en/technical-documentation/data-sheets/AD7616.pdf
+
+properties:
+  compatible:
+enum:
+  - adi,ad7605-4
+  - adi,ad7606-8
+  - adi,ad7606-6
+  - adi,ad7606-4
+  - adi,ad7616
+
+  reg:
+maxItems: 1
+
+  spi-cpha: true
+
+  avcc-supply:
+description:
+  Phandle to the Avcc power supply
+maxItems: 1
+
+  interrupts:
+maxItems: 1
+
+  adi,conversion-start-gpios:
+description:
+  Must be the device tree identifier of the CONVST pin.
+  This logic input is used to initiate conversions on the analog
+  input channels. As the line is active high, it should be marked
+  GPIO_ACTIVE_HIGH.
+maxItems: 1
+
+  reset-gpios:
+description:
+  Must be the device tree identifier of the RESET pin. If specified,
+  it will be asserted during driver probe. As the line is active high,
+  it should be marked GPIO_ACTIVE_HIGH.
+maxItems: 1
+
+  standby-gpios:
+description:
+   Must be the device tree identifier of the STBY pin. This pin is used
+   to place the AD7606 into one of two power-down modes, Standby mode or
+   Shutdown mode. As the line is active low, it should be marked
+   GPIO_ACTIVE_LOW.
+maxItems: 1
+
+  adi,first-data-gpios:
+description:
+  Must be the device tree identifier of the FRSTDATA pin.
+  The FRSTDATA output indicates when the first channel, V1, is
+  being read back on either the parallel, byte or serial interface.
+  As the line is active high, it should be marked GPIO_ACTIVE_HIGH.
+maxItems: 1
+
+  adi,range-gpios:
+description:
+  Must be the device tree identifier of the RANGE pin. The polarity on
+  this pin determines the input range of the analog input channels. If
+  this pin is tied to a logic high, the analog input range is ±10V for
+  all channels. If this pin is tied to a logic low, the analog input range
+  is ±5V for all channels. As the line is active high, it should be marked
+  GPIO_ACTIVE_HIGH.
+maxItems: 1
+
+  adi,oversampling-ratio-gpios:
+description:
+  Must be the device tree identifier of the over-sampling
+  mode pins. As the line is active high, it should be marked
+  GPIO_ACTIVE_HIGH.
+maxItems: 1
+
+  adi,sw-mode:
+description:
+  Software mode of operation, so far available only for ad7616.
+  It is enabled when all three oversampling mode pins are connected to
+  high level. The device is configured by the corresponding registers. If 
the
+  adi,oversampling-ratio-gpios property is defined, then the driver will 
set the
+  oversampling gpios to high. Otherwise, it is assumed that the pins are 
hardwired
+  to VDD.
+maxItems: 1
+type: boolean
+
+required:
+  - compatible
+  - reg
+  - spi-cpha
+  - avcc-supply
+  - interrupts
+  - adi,conversion-start-gpios
+
+examples:
+  - |
+spi0 {
+#address-cells = <1>;
+#size-cells = <0>;
+
+adc@0 {
+compatible = "adi,ad7606-8";
+reg = <0>;
+spi-max-frequency = <100>;
+spi-cpol;
+
+avcc-supply = <&adc_vref>;
+
+interrupts = <25 IRQ_TYPE_EDGE_FALLING>;
+interrupt-parent = <&gpio>;
+
+adi,conversion-start-gpios = <&gpio 17 GPIO_ACTIVE_HIGH>;
+reset-gpios = <&gpio 27 GPIO_ACTIVE_HIGH>;
+adi,first-data-gpios = <&gpio 22 GPIO_ACTIVE_HIGH>;
+adi,oversampling-ratio-gpios = <&gpio 18 GPIO_ACTIVE_HIGH
+&gpio 23 GPIO_ACTIVE_HIGH
+&gpio 26 GPIO_ACTIVE_HIGH>;
+standby-gpios = <&gpio 24 GPIO_ACTIVE_LOW>;
+adi,sw-mode;
+};
+};
+...
diff --git a/MAINTAINERS b/MAINTAINERS
ind

[PATCH 4.9 001/223] MIPS: ath79: fix ar933x uart parity mode

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit db13a5ba2732755cf13320f3987b77cf2a71e790 ]

While trying to get the uart with parity working I found setting even
parity enabled odd parity insted. Fix the register settings to match
the datasheet of AR9331.

A similar patch was created by 8devices, but not sent upstream.
https://github.com/8devices/openwrt-8devices/commit/77c5586ade3bb72cda010afad3f209ed0c98ea7c

Signed-off-by: Stefan Hellermann 
Signed-off-by: Paul Burton 
Cc: linux-m...@vger.kernel.org
Signed-off-by: Sasha Levin 
---
 arch/mips/include/asm/mach-ath79/ar933x_uart.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/mips/include/asm/mach-ath79/ar933x_uart.h 
b/arch/mips/include/asm/mach-ath79/ar933x_uart.h
index c2917b39966b..bba2c8837951 100644
--- a/arch/mips/include/asm/mach-ath79/ar933x_uart.h
+++ b/arch/mips/include/asm/mach-ath79/ar933x_uart.h
@@ -27,8 +27,8 @@
 #define AR933X_UART_CS_PARITY_S0
 #define AR933X_UART_CS_PARITY_M0x3
 #define  AR933X_UART_CS_PARITY_NONE0
-#define  AR933X_UART_CS_PARITY_ODD 1
-#define  AR933X_UART_CS_PARITY_EVEN2
+#define  AR933X_UART_CS_PARITY_ODD 2
+#define  AR933X_UART_CS_PARITY_EVEN3
 #define AR933X_UART_CS_IF_MODE_S   2
 #define AR933X_UART_CS_IF_MODE_M   0x3
 #define  AR933X_UART_CS_IF_MODE_NONE   0
-- 
2.20.1





[PATCH 4.4 056/158] crypto: arm64/sha1-ce - correct digest for empty data in finup

2019-08-02 Thread Greg Kroah-Hartman
From: Elena Petrova 

commit 1d4aaf16defa86d2665ae7db0259d6cb07e2091f upstream.

The sha1-ce finup implementation for ARM64 produces wrong digest
for empty input (len=0). Expected: da39a3ee..., result: 67452301...
(initial value of SHA internal state). The error is in sha1_ce_finup:
for empty data `finalize` will be 1, so the code is relying on
sha1_ce_transform to make the final round. However, in
sha1_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: 07eb54d306f4 ("crypto: arm64/sha1-ce - move SHA-1 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/sha1-ce-glue.c |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

--- a/arch/arm64/crypto/sha1-ce-glue.c
+++ b/arch/arm64/crypto/sha1-ce-glue.c
@@ -50,7 +50,7 @@ static int sha1_ce_finup(struct shash_de
 unsigned int len, u8 *out)
 {
struct sha1_ce_state *sctx = shash_desc_ctx(desc);
-   bool finalize = !sctx->sst.count && !(len % SHA1_BLOCK_SIZE);
+   bool finalize = !sctx->sst.count && !(len % SHA1_BLOCK_SIZE) && len;
 
/*
 * Allow the asm code to perform the finalization if there is no




[PATCH v3 1/4] serial: mctrl_gpio: Avoid probe failures in case of missing gpiolib

2019-08-02 Thread Schrempf Frieder
From: Frieder Schrempf 

If CONFIG_GPIOLIB is not enabled, mctrl_gpio_init() and
mctrl_gpio_init_noauto() will currently return an error pointer with
-ENOSYS. As the mctrl GPIOs are usually optional, drivers need to
check for this condition to allow continue probing.

To avoid the need for this check in each driver, we return NULL
instead, as all the mctrl_gpio_*() functions are skipped anyway.
We also adapt mctrl_gpio_to_gpiod() to be in line with this change.

Reviewed-by: Fabio Estevam 
Signed-off-by: Frieder Schrempf 
---
Changes in v3
=
* Move the changes in mctrl_gpio_to_gpiod() to a separate patch
* Reorder tags

Changes in v2
=
* Move the sh_sci changes to a separate patch
* Add Fabio's R-b tag
---
 drivers/tty/serial/serial_mctrl_gpio.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/tty/serial/serial_mctrl_gpio.h 
b/drivers/tty/serial/serial_mctrl_gpio.h
index b7d3cca48ede..1b2ff503b2c2 100644
--- a/drivers/tty/serial/serial_mctrl_gpio.h
+++ b/drivers/tty/serial/serial_mctrl_gpio.h
@@ -114,19 +114,19 @@ static inline
 struct gpio_desc *mctrl_gpio_to_gpiod(struct mctrl_gpios *gpios,
  enum mctrl_gpio_idx gidx)
 {
-   return ERR_PTR(-ENOSYS);
+   return NULL;
 }
 
 static inline
 struct mctrl_gpios *mctrl_gpio_init(struct uart_port *port, unsigned int idx)
 {
-   return ERR_PTR(-ENOSYS);
+   return NULL;
 }
 
 static inline
 struct mctrl_gpios *mctrl_gpio_init_noauto(struct device *dev, unsigned int 
idx)
 {
-   return ERR_PTR(-ENOSYS);
+   return NULL;
 }
 
 static inline
-- 
2.17.1


[PATCH v3 3/4] serial: sh-sci: Don't check for mctrl_gpio_init() returning -ENOSYS

2019-08-02 Thread Schrempf Frieder
From: Frieder Schrempf 

Now that the mctrl_gpio code returns NULL instead of ERR_PTR(-ENOSYS)
if CONFIG_GPIOLIB is disabled, we can safely remove this check.

Signed-off-by: Frieder Schrempf 
---
Changes in v3
=
* Adjust the commit message and subject line

Changes in v2
=
* Move the sh_sci changes to a separate patch
---
 drivers/tty/serial/sh-sci.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c
index d18c680aa64b..249325b65ee0 100644
--- a/drivers/tty/serial/sh-sci.c
+++ b/drivers/tty/serial/sh-sci.c
@@ -3287,7 +3287,7 @@ static int sci_probe_single(struct platform_device *dev,
return ret;
 
sciport->gpios = mctrl_gpio_init(&sciport->port, 0);
-   if (IS_ERR(sciport->gpios) && PTR_ERR(sciport->gpios) != -ENOSYS)
+   if (IS_ERR(sciport->gpios))
return PTR_ERR(sciport->gpios);
 
if (sciport->has_rtscts) {
-- 
2.17.1


[PATCH 4.4 069/158] 9p/virtio: Add cleanup path in p9_virtio_init

2019-08-02 Thread Greg Kroah-Hartman
From: YueHaibing 

commit d4548543fc4ece56c6f04b8586f435fb4fd84c20 upstream.

KASAN report this:

BUG: unable to handle kernel paging request at a0097000
PGD 3870067 P4D 3870067 PUD 3871063 PMD 2326e2067 PTE 0
Oops:  [#1
CPU: 0 PID: 5340 Comm: modprobe Not tainted 5.1.0-rc7+ #25
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 
rel-1.9.3-0-ge2fc41e-prebuilt.qemu-project.org 04/01/2014
RIP: 0010:__list_add_valid+0x10/0x70
Code: c3 48 8b 06 55 48 89 e5 5d 48 39 07 0f 94 c0 0f b6 c0 c3 90 90 90 90 90 
90 90 55 48 89 d0 48 8b 52 08 48 89 e5 48 39 f2 75 19 <48> 8b 32 48 39 f0 75 3a

RSP: 0018:c9e23c68 EFLAGS: 00010246
RAX: a00ad000 RBX: a009d000 RCX: 
RDX: a0097000 RSI: a0097000 RDI: a009d000
RBP: c9e23c68 R08: 0001 R09: 
R10:  R11:  R12: a0097000
R13: 888231797180 R14:  R15: c9e23e78
FS:  7fb215285540() GS:888237a0() knlGS:
CS:  0010 DS:  ES:  CR0: 80050033
CR2: a0097000 CR3: 00022f144000 CR4: 06f0
Call Trace:
 v9fs_register_trans+0x2f/0x60 [9pnet
 ? 0xa0087000
 p9_virtio_init+0x25/0x1000 [9pnet_virtio
 do_one_initcall+0x6c/0x3cc
 ? kmem_cache_alloc_trace+0x248/0x3b0
 do_init_module+0x5b/0x1f1
 load_module+0x1db1/0x2690
 ? m_show+0x1d0/0x1d0
 __do_sys_finit_module+0xc5/0xd0
 __x64_sys_finit_module+0x15/0x20
 do_syscall_64+0x6b/0x1d0
 entry_SYSCALL_64_after_hwframe+0x49/0xbe
RIP: 0033:0x7fb214d8e839
Code: 00 f3 c3 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 48 89 f8 48 89 f7 48 
89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01

RSP: 002b:7ffc96554278 EFLAGS: 0246 ORIG_RAX: 0139
RAX: ffda RBX: 55e67eed2aa0 RCX: 7fb214d8e839
RDX:  RSI: 55e67ce95c2e RDI: 0003
RBP: 55e67ce95c2e R08:  R09: 55e67eed2aa0
R10: 0003 R11: 0246 R12: 
R13: 55e67eeda500 R14: 0004 R15: 55e67eed2aa0
Modules linked in: 9pnet_virtio(+) 9pnet gre rfkill 
vmw_vsock_virtio_transport_common vsock [last unloaded: 9pnet_virtio
CR2: a0097000
---[ end trace 4a52bb13ff07b761

If register_virtio_driver() fails in p9_virtio_init,
we should call v9fs_unregister_trans() to do cleanup.

Link: http://lkml.kernel.org/r/20190430115942.41840-1-yuehaib...@huawei.com
Cc: sta...@vger.kernel.org
Reported-by: Hulk Robot 
Fixes: b530cc794024 ("9p: add virtio transport")
Signed-off-by: YueHaibing 
Signed-off-by: Dominique Martinet 
Signed-off-by: Greg Kroah-Hartman 

---
 net/9p/trans_virtio.c |8 +++-
 1 file changed, 7 insertions(+), 1 deletion(-)

--- a/net/9p/trans_virtio.c
+++ b/net/9p/trans_virtio.c
@@ -767,10 +767,16 @@ static struct p9_trans_module p9_virtio_
 /* The standard init function */
 static int __init p9_virtio_init(void)
 {
+   int rc;
+
INIT_LIST_HEAD(&virtio_chan_list);
 
v9fs_register_trans(&p9_virtio_trans);
-   return register_virtio_driver(&p9_virtio_drv);
+   rc = register_virtio_driver(&p9_virtio_drv);
+   if (rc)
+   v9fs_unregister_trans(&p9_virtio_trans);
+
+   return rc;
 }
 
 static void __exit p9_virtio_cleanup(void)




[PATCH 4/4] dt-bindings: iio: adc: Add AD7606B ADC documentation

2019-08-02 Thread Beniamin Bia
Documentation for AD7606B Analog to Digital Converter and software
mode was added.

Signed-off-by: Beniamin Bia 
---
 Documentation/devicetree/bindings/iio/adc/adi,ad7606.txt  | 8 
 Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml | 4 +++-
 2 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.txt 
b/Documentation/devicetree/bindings/iio/adc/adi,ad7606.txt
index d8652460198e..9cc7ea19eca6 100644
--- a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.txt
+++ b/Documentation/devicetree/bindings/iio/adc/adi,ad7606.txt
@@ -7,6 +7,7 @@ Required properties for the AD7606:
* "adi,ad7606-8"
* "adi,ad7606-6"
* "adi,ad7606-4"
+   * "adi,ad7606b"
* "adi,ad7616"
 - reg: SPI chip select number for the device
 - spi-max-frequency: Max SPI frequency to use
@@ -42,6 +43,12 @@ Optional properties:
 - adi,oversampling-ratio-gpios: must be the device tree identifier of the 
over-sampling
mode pins. As the line is active high, it 
should be marked
GPIO_ACTIVE_HIGH.
+- adi,sw-mode: Boolean, software mode of operation, so far available only for 
ad7606b.
+   Software mode is enabled when all three oversampling mode pins are 
connected to
+   high level. The AD7606B is configured by the corresponding registers. 
If the
+   adi,oversampling-ratio-gpios property is defined, then the driver will 
set the
+   oversampling gpios to high. Otherwise, it is assumed that the pins are 
hardwired
+   to VDD.
 
 Example:
 
@@ -63,4 +70,5 @@ Example:
&gpio 23 GPIO_ACTIVE_HIGH
&gpio 26 GPIO_ACTIVE_HIGH>;
standby-gpios = <&gpio 24 GPIO_ACTIVE_LOW>;
+   adi,sw-mode;
};
diff --git a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml 
b/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml
index 509dbe9c84d2..2afe31747a70 100644
--- a/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml
+++ b/Documentation/devicetree/bindings/iio/adc/adi,ad7606.yaml
@@ -13,6 +13,7 @@ maintainers:
 description: |
   Analog Devices AD7606 Simultaneous Sampling ADC
   
https://www.analog.com/media/en/technical-documentation/data-sheets/ad7606_7606-6_7606-4.pdf
+  
https://www.analog.com/media/en/technical-documentation/data-sheets/AD7606B.pdf
   
https://www.analog.com/media/en/technical-documentation/data-sheets/AD7616.pdf
 
 properties:
@@ -22,6 +23,7 @@ properties:
   - adi,ad7606-8
   - adi,ad7606-6
   - adi,ad7606-4
+  - adi,ad7606b
   - adi,ad7616
 
   reg:
@@ -87,7 +89,7 @@ properties:
 
   adi,sw-mode:
 description:
-  Software mode of operation, so far available only for ad7616.
+  Software mode of operation, so far available only for ad7616 and ad7606B.
   It is enabled when all three oversampling mode pins are connected to
   high level. The device is configured by the corresponding registers. If 
the
   adi,oversampling-ratio-gpios property is defined, then the driver will 
set the
-- 
2.17.1



[PATCH 2/4] MAINTAINERS: Add Beniamin Bia for AD7606 driver

2019-08-02 Thread Beniamin Bia
Add Beniamin Bia as maintainer for AD7606 driver.

Signed-off-by: Beniamin Bia 
---
 MAINTAINERS | 1 +
 1 file changed, 1 insertion(+)

diff --git a/MAINTAINERS b/MAINTAINERS
index ad498428b38c..052d7a8591fb 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -895,6 +895,7 @@ F:  Documentation/devicetree/bindings/iio/adc/adi,ad7124.txt
 
 ANALOG DEVICES INC AD7606 DRIVER
 M: Stefan Popa 
+M: Beniamin Bia 
 L: linux-...@vger.kernel.org
 W: http://ez.analog.com/community/linux-device-drivers
 S: Supported
-- 
2.17.1



[PATCH v3 4/4] serial: 8250: Don't check for mctrl_gpio_init() returning -ENOSYS

2019-08-02 Thread Schrempf Frieder
From: Frieder Schrempf 

Now that the mctrl_gpio code returns NULL instead of ERR_PTR(-ENOSYS)
if CONFIG_GPIOLIB is disabled, we can safely remove this check.

Signed-off-by: Frieder Schrempf 
---
Changes in v3
=
* Adjust the commit message and subject line

Changes in v2
=
* Add a patch for the 8250 driver
---
 drivers/tty/serial/8250/8250_core.c | 6 ++
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/tty/serial/8250/8250_core.c 
b/drivers/tty/serial/8250/8250_core.c
index df3bcc0b2d74..e682390ce0de 100644
--- a/drivers/tty/serial/8250/8250_core.c
+++ b/drivers/tty/serial/8250/8250_core.c
@@ -1026,10 +1026,8 @@ int serial8250_register_8250_port(struct uart_8250_port 
*up)
if (!has_acpi_companion(uart->port.dev)) {
gpios = mctrl_gpio_init(&uart->port, 0);
if (IS_ERR(gpios)) {
-   if (PTR_ERR(gpios) != -ENOSYS) {
-   ret = PTR_ERR(gpios);
-   goto out_unlock;
-   }
+   ret = PTR_ERR(gpios);
+   goto out_unlock;
} else {
uart->gpios = gpios;
}
-- 
2.17.1


[PATCH 4.9 023/223] crypto: talitos - properly handle split ICV.

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit eae55a586c3c8b50982bad3c3426e9c9dd7a0075 ]

The driver assumes that the ICV is as a single piece in the last
element of the scatterlist. This assumption is wrong.

This patch ensures that the ICV is properly handled regardless of
the scatterlist layout.

Fixes: 9c4a79653b35 ("crypto: talitos - Freescale integrated security engine 
(SEC) driver")
Signed-off-by: Christophe Leroy 
Signed-off-by: Herbert Xu 
Signed-off-by: Sasha Levin 
---
 drivers/crypto/talitos.c | 26 +++---
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c
index 0b12772c7919..e7864aa494a1 100644
--- a/drivers/crypto/talitos.c
+++ b/drivers/crypto/talitos.c
@@ -984,7 +984,6 @@ static void ipsec_esp_encrypt_done(struct device *dev,
struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
unsigned int authsize = crypto_aead_authsize(authenc);
struct talitos_edesc *edesc;
-   struct scatterlist *sg;
void *icvdata;
 
edesc = container_of(desc, struct talitos_edesc, desc);
@@ -998,9 +997,8 @@ static void ipsec_esp_encrypt_done(struct device *dev,
else
icvdata = &edesc->link_tbl[edesc->src_nents +
   edesc->dst_nents + 2];
-   sg = sg_last(areq->dst, edesc->dst_nents);
-   memcpy((char *)sg_virt(sg) + sg->length - authsize,
-  icvdata, authsize);
+   sg_pcopy_from_buffer(areq->dst, edesc->dst_nents ? : 1, icvdata,
+authsize, areq->assoclen + areq->cryptlen);
}
 
kfree(edesc);
@@ -1016,7 +1014,6 @@ static void ipsec_esp_decrypt_swauth_done(struct device 
*dev,
struct crypto_aead *authenc = crypto_aead_reqtfm(req);
unsigned int authsize = crypto_aead_authsize(authenc);
struct talitos_edesc *edesc;
-   struct scatterlist *sg;
char *oicv, *icv;
struct talitos_private *priv = dev_get_drvdata(dev);
bool is_sec1 = has_ftr_sec1(priv);
@@ -1026,9 +1023,18 @@ static void ipsec_esp_decrypt_swauth_done(struct device 
*dev,
ipsec_esp_unmap(dev, edesc, req);
 
if (!err) {
+   char icvdata[SHA512_DIGEST_SIZE];
+   int nents = edesc->dst_nents ? : 1;
+   unsigned int len = req->assoclen + req->cryptlen;
+
/* auth check */
-   sg = sg_last(req->dst, edesc->dst_nents ? : 1);
-   icv = (char *)sg_virt(sg) + sg->length - authsize;
+   if (nents > 1) {
+   sg_pcopy_to_buffer(req->dst, nents, icvdata, authsize,
+  len - authsize);
+   icv = icvdata;
+   } else {
+   icv = (char *)sg_virt(req->dst) + len - authsize;
+   }
 
if (edesc->dma_len) {
if (is_sec1)
@@ -1458,7 +1464,6 @@ static int aead_decrypt(struct aead_request *req)
struct talitos_ctx *ctx = crypto_aead_ctx(authenc);
struct talitos_private *priv = dev_get_drvdata(ctx->dev);
struct talitos_edesc *edesc;
-   struct scatterlist *sg;
void *icvdata;
 
req->cryptlen -= authsize;
@@ -1493,9 +1498,8 @@ static int aead_decrypt(struct aead_request *req)
else
icvdata = &edesc->link_tbl[0];
 
-   sg = sg_last(req->src, edesc->src_nents ? : 1);
-
-   memcpy(icvdata, (char *)sg_virt(sg) + sg->length - authsize, authsize);
+   sg_pcopy_to_buffer(req->src, edesc->src_nents ? : 1, icvdata, authsize,
+  req->assoclen + req->cryptlen - authsize);
 
return ipsec_esp(edesc, req, ipsec_esp_decrypt_swauth_done);
 }
-- 
2.20.1





[PATCH 4.9 003/223] arm64/efi: Mark __efistub_stext_offset as an absolute symbol explicitly

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit aa69fb62bea15126e744af2e02acc0d6cf3ed4da ]

After r363059 and r363928 in LLVM, a build using ld.lld as the linker
with CONFIG_RANDOMIZE_BASE enabled fails like so:

ld.lld: error: relocation R_AARCH64_ABS32 cannot be used against symbol
__efistub_stext_offset; recompile with -fPIC

Fangrui and Peter figured out that ld.lld is incorrectly considering
__efistub_stext_offset as a relative symbol because of the order in
which symbols are evaluated. _text is treated as an absolute symbol
and stext is a relative symbol, making __efistub_stext_offset a
relative symbol.

Adding ABSOLUTE will force ld.lld to evalute this expression in the
right context and does not change ld.bfd's behavior. ld.lld will
need to be fixed but the developers do not see a quick or simple fix
without some research (see the linked issue for further explanation).
Add this simple workaround so that ld.lld can continue to link kernels.

Link: https://github.com/ClangBuiltLinux/linux/issues/561
Link: 
https://github.com/llvm/llvm-project/commit/025a815d75d2356f2944136269aa5874721ec236
Link: 
https://github.com/llvm/llvm-project/commit/249fde85832c33f8b06c6b4ac65d1c4b96d23b83
Acked-by: Ard Biesheuvel 
Debugged-by: Fangrui Song 
Debugged-by: Peter Smith 
Suggested-by: Fangrui Song 
Signed-off-by: Nathan Chancellor 
[will: add comment]
Signed-off-by: Will Deacon 
Signed-off-by: Sasha Levin 
---
 arch/arm64/kernel/image.h | 6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/arch/arm64/kernel/image.h b/arch/arm64/kernel/image.h
index c7fcb232fe47..d3e8c901274d 100644
--- a/arch/arm64/kernel/image.h
+++ b/arch/arm64/kernel/image.h
@@ -73,7 +73,11 @@
 
 #ifdef CONFIG_EFI
 
-__efistub_stext_offset = stext - _text;
+/*
+ * Use ABSOLUTE() to avoid ld.lld treating this as a relative symbol:
+ * https://github.com/ClangBuiltLinux/linux/issues/561
+ */
+__efistub_stext_offset = ABSOLUTE(stext - _text);
 
 /*
  * Prevent the symbol aliases below from being emitted into the kallsyms
-- 
2.20.1





[PATCH 4.9 004/223] dmaengine: imx-sdma: fix use-after-free on probe error path

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 2b8066c3deb9140fdf258417a51479b2aeaa7622 ]

If probe() fails anywhere beyond the point where
sdma_get_firmware() is called, then a kernel oops may occur.

Problematic sequence of events:
1. probe() calls sdma_get_firmware(), which schedules the
   firmware callback to run when firmware becomes available,
   using the sdma instance structure as the context
2. probe() encounters an error, which deallocates the
   sdma instance structure
3. firmware becomes available, firmware callback is
   called with deallocated sdma instance structure
4. use after free - kernel oops !

Solution: only attempt to load firmware when we're certain
that probe() will succeed. This guarantees that the firmware
callback's context will remain valid.

Note that the remove() path is unaffected by this issue: the
firmware loader will increment the driver module's use count,
ensuring that the module cannot be unloaded while the
firmware callback is pending or running.

Signed-off-by: Sven Van Asbroeck 
Reviewed-by: Robin Gong 
[vkoul: fixed braces for if condition]
Signed-off-by: Vinod Koul 
Signed-off-by: Sasha Levin 
---
 drivers/dma/imx-sdma.c | 48 --
 1 file changed, 27 insertions(+), 21 deletions(-)

diff --git a/drivers/dma/imx-sdma.c b/drivers/dma/imx-sdma.c
index 84856ac75a09..9f240b2d85a5 100644
--- a/drivers/dma/imx-sdma.c
+++ b/drivers/dma/imx-sdma.c
@@ -1821,27 +1821,6 @@ static int sdma_probe(struct platform_device *pdev)
if (pdata && pdata->script_addrs)
sdma_add_scripts(sdma, pdata->script_addrs);
 
-   if (pdata) {
-   ret = sdma_get_firmware(sdma, pdata->fw_name);
-   if (ret)
-   dev_warn(&pdev->dev, "failed to get firmware from 
platform data\n");
-   } else {
-   /*
-* Because that device tree does not encode ROM script address,
-* the RAM script in firmware is mandatory for device tree
-* probe, otherwise it fails.
-*/
-   ret = of_property_read_string(np, "fsl,sdma-ram-script-name",
- &fw_name);
-   if (ret)
-   dev_warn(&pdev->dev, "failed to get firmware name\n");
-   else {
-   ret = sdma_get_firmware(sdma, fw_name);
-   if (ret)
-   dev_warn(&pdev->dev, "failed to get firmware 
from device tree\n");
-   }
-   }
-
sdma->dma_device.dev = &pdev->dev;
 
sdma->dma_device.device_alloc_chan_resources = 
sdma_alloc_chan_resources;
@@ -1883,6 +1862,33 @@ static int sdma_probe(struct platform_device *pdev)
of_node_put(spba_bus);
}
 
+   /*
+* Kick off firmware loading as the very last step:
+* attempt to load firmware only if we're not on the error path, because
+* the firmware callback requires a fully functional and allocated sdma
+* instance.
+*/
+   if (pdata) {
+   ret = sdma_get_firmware(sdma, pdata->fw_name);
+   if (ret)
+   dev_warn(&pdev->dev, "failed to get firmware from 
platform data\n");
+   } else {
+   /*
+* Because that device tree does not encode ROM script address,
+* the RAM script in firmware is mandatory for device tree
+* probe, otherwise it fails.
+*/
+   ret = of_property_read_string(np, "fsl,sdma-ram-script-name",
+ &fw_name);
+   if (ret) {
+   dev_warn(&pdev->dev, "failed to get firmware name\n");
+   } else {
+   ret = sdma_get_firmware(sdma, fw_name);
+   if (ret)
+   dev_warn(&pdev->dev, "failed to get firmware 
from device tree\n");
+   }
+   }
+
return 0;
 
 err_register:
-- 
2.20.1





[PATCH 4.9 030/223] net: axienet: Fix race condition causing TX hang

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 7de44285c1f69ccfbe8be1d6a16fcd956681fee6 ]

It is possible that the interrupt handler fires and frees up space in
the TX ring in between checking for sufficient TX ring space and
stopping the TX queue in axienet_start_xmit. If this happens, the
queue wake from the interrupt handler will occur before the queue is
stopped, causing a lost wakeup and the adapter's transmit hanging.

To avoid this, after stopping the queue, check again whether there is
sufficient space in the TX ring. If so, wake up the queue again.

Signed-off-by: Robert Hancock 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 .../net/ethernet/xilinx/xilinx_axienet_main.c | 20 ---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c 
b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
index a8afc92cbfca..5f21ddff9e0f 100644
--- a/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
+++ b/drivers/net/ethernet/xilinx/xilinx_axienet_main.c
@@ -612,6 +612,10 @@ static void axienet_start_xmit_done(struct net_device 
*ndev)
 
ndev->stats.tx_packets += packets;
ndev->stats.tx_bytes += size;
+
+   /* Matches barrier in axienet_start_xmit */
+   smp_mb();
+
netif_wake_queue(ndev);
 }
 
@@ -666,9 +670,19 @@ static int axienet_start_xmit(struct sk_buff *skb, struct 
net_device *ndev)
cur_p = &lp->tx_bd_v[lp->tx_bd_tail];
 
if (axienet_check_tx_bd_space(lp, num_frag)) {
-   if (!netif_queue_stopped(ndev))
-   netif_stop_queue(ndev);
-   return NETDEV_TX_BUSY;
+   if (netif_queue_stopped(ndev))
+   return NETDEV_TX_BUSY;
+
+   netif_stop_queue(ndev);
+
+   /* Matches barrier in axienet_start_xmit_done */
+   smp_mb();
+
+   /* Space might have just been freed - check again */
+   if (axienet_check_tx_bd_space(lp, num_frag))
+   return NETDEV_TX_BUSY;
+
+   netif_wake_queue(ndev);
}
 
if (skb->ip_summed == CHECKSUM_PARTIAL) {
-- 
2.20.1





[PATCH 4.9 008/223] ath: DFS JP domain W56 fixed pulse type 3 RADAR detection

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit d8792393a783158cbb2c39939cb897dc5e5299b6 ]

Increase pulse width range from 1-2usec to 0-4usec.
During data traffic HW occasionally fails detecting radar pulses,
so that SW cannot get enough radar reports to achieve the success rate.

Tested ath10k hw and fw:
* QCA9888(10.4-3.5.1-00052)
* QCA4019(10.4-3.2.1.1-00017)
* QCA9984(10.4-3.6-00104)
* QCA988X(10.2.4-1.0-00041)

Tested ath9k hw: AR9300

Tested-by: Tamizh chelvam 
Signed-off-by: Tamizh chelvam 
Signed-off-by: Anilkumar Kolli 
Signed-off-by: Kalle Valo 
Signed-off-by: Sasha Levin 
---
 drivers/net/wireless/ath/dfs_pattern_detector.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/dfs_pattern_detector.c 
b/drivers/net/wireless/ath/dfs_pattern_detector.c
index 4100ffd42a43..78146607f16e 100644
--- a/drivers/net/wireless/ath/dfs_pattern_detector.c
+++ b/drivers/net/wireless/ath/dfs_pattern_detector.c
@@ -111,7 +111,7 @@ static const struct radar_detector_specs 
jp_radar_ref_types[] = {
JP_PATTERN(0, 0, 1, 1428, 1428, 1, 18, 29, false),
JP_PATTERN(1, 2, 3, 3846, 3846, 1, 18, 29, false),
JP_PATTERN(2, 0, 1, 1388, 1388, 1, 18, 50, false),
-   JP_PATTERN(3, 1, 2, 4000, 4000, 1, 18, 50, false),
+   JP_PATTERN(3, 0, 4, 4000, 4000, 1, 18, 50, false),
JP_PATTERN(4, 0, 5, 150, 230, 1, 23, 50, false),
JP_PATTERN(5, 6, 10, 200, 500, 1, 16, 50, false),
JP_PATTERN(6, 11, 20, 200, 500, 1, 12, 50, false),
-- 
2.20.1





Re: [PATCH RFC] mm/memcontrol: reclaim severe usage over high limit in get_user_pages loop

2019-08-02 Thread Michal Hocko
On Mon 29-07-19 20:55:09, Michal Hocko wrote:
> On Mon 29-07-19 11:49:52, Johannes Weiner wrote:
> > On Sun, Jul 28, 2019 at 03:29:38PM +0300, Konstantin Khlebnikov wrote:
> > > --- a/mm/gup.c
> > > +++ b/mm/gup.c
> > > @@ -847,8 +847,11 @@ static long __get_user_pages(struct task_struct 
> > > *tsk, struct mm_struct *mm,
> > >   ret = -ERESTARTSYS;
> > >   goto out;
> > >   }
> > > - cond_resched();
> > >  
> > > + /* Reclaim memory over high limit before stocking too much */
> > > + mem_cgroup_handle_over_high(true);
> > 
> > I'd rather this remained part of the try_charge() call. The code
> > comment in try_charge says this:
> > 
> >  * We can perform reclaim here if __GFP_RECLAIM but let's
> >  * always punt for simplicity and so that GFP_KERNEL can
> >  * consistently be used during reclaim.
> > 
> > The simplicity argument doesn't hold true anymore once we have to add
> > manual calls into allocation sites. We should instead fix try_charge()
> > to do synchronous reclaim for __GFP_RECLAIM and only punt to userspace
> > return when actually needed.
> 
> Agreed. If we want to do direct reclaim on the high limit breach then it
> should go into try_charge same way we do hard limit reclaim there. I am
> not yet sure about how/whether to scale the excess. The only reason to
> move reclaim to return-to-userspace path was GFP_NOWAIT charges. As you
> say, maybe we should start by always performing the reclaim for
> sleepable contexts first and only defer for non-sleeping requests.

In other words. Something like patch below (completely untested). Could
you give it a try Konstantin?

diff --git a/mm/memcontrol.c b/mm/memcontrol.c
index ba9138a4a1de..53a35c526e43 100644
--- a/mm/memcontrol.c
+++ b/mm/memcontrol.c
@@ -2429,8 +2429,12 @@ static int try_charge(struct mem_cgroup *memcg, gfp_t 
gfp_mask,
schedule_work(&memcg->high_work);
break;
}
-   current->memcg_nr_pages_over_high += batch;
-   set_notify_resume(current);
+   if (gfpflags_allow_blocking(gfp_mask)) {
+   reclaim_high(memcg, nr_pages, GFP_KERNEL);
+   } else {
+   current->memcg_nr_pages_over_high += batch;
+   set_notify_resume(current);
+   }
break;
}
} while ((memcg = parent_mem_cgroup(memcg)));
-- 
Michal Hocko
SUSE Labs


[PATCH 4.9 015/223] net: stmmac: dwmac1000: Clear unused address entries

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 9463c445590091202659cdfdd44b236acadfbd84 ]

In case we don't use a given address entry we need to clear it because
it could contain previous values that are no longer valid.

Found out while running stmmac selftests.

Signed-off-by: Jose Abreu 
Cc: Joao Pinto 
Cc: David S. Miller 
Cc: Giuseppe Cavallaro 
Cc: Alexandre Torgue 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c 
b/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c
index 7d19029e2564..093e58e94075 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac1000_core.c
@@ -213,6 +213,12 @@ static void dwmac1000_set_filter(struct mac_device_info 
*hw,
GMAC_ADDR_LOW(reg));
reg++;
}
+
+   while (reg <= perfect_addr_number) {
+   writel(0, ioaddr + GMAC_ADDR_HIGH(reg));
+   writel(0, ioaddr + GMAC_ADDR_LOW(reg));
+   reg++;
+   }
}
 
 #ifdef FRAME_FILTER_DEBUG
-- 
2.20.1





[PATCH 4.9 021/223] media: staging: media: davinci_vpfe: - Fix for memory leak if decoder initialization fails.

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 6995a659101bd4effa41cebb067f9dc18d77520d ]

Fix to avoid possible memory leak if the decoder initialization
got failed.Free the allocated memory for file handle object
before return in case decoder initialization fails.

Signed-off-by: Shailendra Verma 
Signed-off-by: Mauro Carvalho Chehab 
Signed-off-by: Sasha Levin 
---
 drivers/staging/media/davinci_vpfe/vpfe_video.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/staging/media/davinci_vpfe/vpfe_video.c 
b/drivers/staging/media/davinci_vpfe/vpfe_video.c
index 89dd6b989254..e0440807b4ed 100644
--- a/drivers/staging/media/davinci_vpfe/vpfe_video.c
+++ b/drivers/staging/media/davinci_vpfe/vpfe_video.c
@@ -423,6 +423,9 @@ static int vpfe_open(struct file *file)
/* If decoder is not initialized. initialize it */
if (!video->initialized && vpfe_update_pipe_state(video)) {
mutex_unlock(&video->lock);
+   v4l2_fh_del(&handle->vfh);
+   v4l2_fh_exit(&handle->vfh);
+   kfree(handle);
return -ENODEV;
}
/* Increment device users counter */
-- 
2.20.1





[PATCH 4.9 017/223] signal/pid_namespace: Fix reboot_pid_ns to use send_sig not force_sig

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit f9070dc94542093fd516ae4ccea17ef46a4362c5 ]

The locking in force_sig_info is not prepared to deal with a task that
exits or execs (as sighand may change).  The is not a locking problem
in force_sig as force_sig is only built to handle synchronous
exceptions.

Further the function force_sig_info changes the signal state if the
signal is ignored, or blocked or if SIGNAL_UNKILLABLE will prevent the
delivery of the signal.  The signal SIGKILL can not be ignored and can
not be blocked and SIGNAL_UNKILLABLE won't prevent it from being
delivered.

So using force_sig rather than send_sig for SIGKILL is confusing
and pointless.

Because it won't impact the sending of the signal and and because
using force_sig is wrong, replace force_sig with send_sig.

Cc: Daniel Lezcano 
Cc: Serge Hallyn 
Cc: Oleg Nesterov 
Fixes: cf3f89214ef6 ("pidns: add reboot_pid_ns() to handle the reboot syscall")
Signed-off-by: "Eric W. Biederman" 
Signed-off-by: Sasha Levin 
---
 kernel/pid_namespace.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c
index 3976dd57db78..0eab538841fd 100644
--- a/kernel/pid_namespace.c
+++ b/kernel/pid_namespace.c
@@ -344,7 +344,7 @@ int reboot_pid_ns(struct pid_namespace *pid_ns, int cmd)
}
 
read_lock(&tasklist_lock);
-   force_sig(SIGKILL, pid_ns->child_reaper);
+   send_sig(SIGKILL, pid_ns->child_reaper, 1);
read_unlock(&tasklist_lock);
 
do_exit(0);
-- 
2.20.1





[PATCH 4.9 028/223] cpupower : frequency-set -r option misses the last cpu in related cpu list

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 04507c0a9385cc8280f794a36bfff567c8cc1042 ]

To set frequency on specific cpus using cpupower, following syntax can
be used :
cpupower -c #i frequency-set -f #f -r

While setting frequency using cpupower frequency-set command, if we use
'-r' option, it is expected to set frequency for all cpus related to
cpu #i. But it is observed to be missing the last cpu in related cpu
list. This patch fixes the problem.

Signed-off-by: Abhishek Goel 
Reviewed-by: Thomas Renninger 
Signed-off-by: Shuah Khan 
Signed-off-by: Sasha Levin 
---
 tools/power/cpupower/utils/cpufreq-set.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/tools/power/cpupower/utils/cpufreq-set.c 
b/tools/power/cpupower/utils/cpufreq-set.c
index 1eef0aed6423..08a405593a79 100644
--- a/tools/power/cpupower/utils/cpufreq-set.c
+++ b/tools/power/cpupower/utils/cpufreq-set.c
@@ -306,6 +306,8 @@ int cmd_freq_set(int argc, char **argv)
bitmask_setbit(cpus_chosen, cpus->cpu);
cpus = cpus->next;
}
+   /* Set the last cpu in related cpus list */
+   bitmask_setbit(cpus_chosen, cpus->cpu);
cpufreq_put_related_cpus(cpus);
}
}
-- 
2.20.1





[PATCH 4.9 041/223] perf evsel: Make perf_evsel__name() accept a NULL argument

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit fdbdd7e8580eac9bdafa532746c865644d125e34 ]

In which case it simply returns "unknown", like when it can't figure out
the evsel->name value.

This makes this code more robust and fixes a problem in 'perf trace'
where a NULL evsel was being passed to a routine that only used the
evsel for printing its name when a invalid syscall id was passed.

Reported-by: Leo Yan 
Cc: Adrian Hunter 
Cc: Jiri Olsa 
Cc: Namhyung Kim 
Link: https://lkml.kernel.org/n/tip-f30ztaasku3z935cn3ak3...@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo 
Signed-off-by: Sasha Levin 
---
 tools/perf/util/evsel.c | 8 +++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c
index a62f79558146..758d0108c5a5 100644
--- a/tools/perf/util/evsel.c
+++ b/tools/perf/util/evsel.c
@@ -558,6 +558,9 @@ const char *perf_evsel__name(struct perf_evsel *evsel)
 {
char bf[128];
 
+   if (!evsel)
+   goto out_unknown;
+
if (evsel->name)
return evsel->name;
 
@@ -594,7 +597,10 @@ const char *perf_evsel__name(struct perf_evsel *evsel)
 
evsel->name = strdup(bf);
 
-   return evsel->name ?: "unknown";
+   if (evsel->name)
+   return evsel->name;
+out_unknown:
+   return "unknown";
 }
 
 const char *perf_evsel__group_name(struct perf_evsel *evsel)
-- 
2.20.1





[PATCH 4.9 040/223] xfrm: fix sa selector validation

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit b8d6d0079757cbd1b69724cfd1c08e2171c68cee ]

After commit b38ff4075a80, the following command does not work anymore:
$ ip xfrm state add src 10.125.0.2 dst 10.125.0.1 proto esp spi 34 reqid 1 \
  mode tunnel enc 'cbc(aes)' 0xb0abdba8b782ad9d364ec81e3a7d82a1 auth-trunc \
  'hmac(sha1)' 0xe26609ebd00acb6a4d51fca13e49ea78a72c73e6 96 flag align4

In fact, the selector is not mandatory, allow the user to provide an empty
selector.

Fixes: b38ff4075a80 ("xfrm: Fix xfrm sel prefix length validation")
CC: Anirudh Gupta 
Signed-off-by: Nicolas Dichtel 
Acked-by: Herbert Xu 
Signed-off-by: Steffen Klassert 
Signed-off-by: Sasha Levin 
---
 net/xfrm/xfrm_user.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
index df4b7fc721f6..f3e9d500fa5a 100644
--- a/net/xfrm/xfrm_user.c
+++ b/net/xfrm/xfrm_user.c
@@ -166,6 +166,9 @@ static int verify_newsa_info(struct xfrm_usersa_info *p,
}
 
switch (p->sel.family) {
+   case AF_UNSPEC:
+   break;
+
case AF_INET:
if (p->sel.prefixlen_d > 32 || p->sel.prefixlen_s > 32)
goto out;
-- 
2.20.1





[PATCH 4.9 043/223] ipoib: correcly show a VF hardware address

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 64d701c608fea362881e823b666327f5d28d7ffd ]

in the case of IPoIB with SRIOV enabled hardware
ip link show command incorrecly prints
0 instead of a VF hardware address.

Before:
11: ib1:  mtu 2044 qdisc pfifo_fast
state UP mode DEFAULT group default qlen 256
link/infiniband
80:00:00:66:fe:80:00:00:00:00:00:00:24:8a:07:03:00:a4:3e:7c brd
00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
vf 0 MAC 00:00:00:00:00:00, spoof checking off, link-state disable,
trust off, query_rss off
...
After:
11: ib1:  mtu 2044 qdisc pfifo_fast
state UP mode DEFAULT group default qlen 256
link/infiniband
80:00:00:66:fe:80:00:00:00:00:00:00:24:8a:07:03:00:a4:3e:7c brd
00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff
vf 0 link/infiniband
80:00:00:66:fe:80:00:00:00:00:00:00:24:8a:07:03:00:a4:3e:7c brd
00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff, spoof
checking off, link-state disable, trust off, query_rss off

v1->v2: just copy an address without modifing ifla_vf_mac
v2->v3: update the changelog

Signed-off-by: Denis Kirjanov 
Acked-by: Doug Ledford 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/infiniband/ulp/ipoib/ipoib_main.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c 
b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index 17c5bc7e8957..45504febbc2a 100644
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
@@ -1751,6 +1751,7 @@ static int ipoib_get_vf_config(struct net_device *dev, 
int vf,
return err;
 
ivf->vf = vf;
+   memcpy(ivf->mac, dev->dev_addr, dev->addr_len);
 
return 0;
 }
-- 
2.20.1





[PATCH 4.9 036/223] regmap: fix bulk writes on paged registers

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit db057679de3e9e6a03c1bcd5aee09b0d25fd9f5b ]

On buses like SlimBus and SoundWire which does not support
gather_writes yet in regmap, A bulk write on paged register
would be silently ignored after programming page.
This is because local variable 'ret' value in regmap_raw_write_impl()
gets reset to 0 once page register is written successfully and the
code below checks for 'ret' value to be -ENOTSUPP before linearising
the write buffer to send to bus->write().

Fix this by resetting the 'ret' value to -ENOTSUPP in cases where
gather_writes() is not supported or single register write is
not possible.

Signed-off-by: Srinivas Kandagatla 
Signed-off-by: Mark Brown 
Signed-off-by: Sasha Levin 
---
 drivers/base/regmap/regmap.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index 69c84fddfe8a..1799a1dfa46e 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -1506,6 +1506,8 @@ int _regmap_raw_write(struct regmap *map, unsigned int 
reg,
 map->format.reg_bytes +
 map->format.pad_bytes,
 val, val_len);
+   else
+   ret = -ENOTSUPP;
 
/* If that didn't work fall back on linearising by hand. */
if (ret == -ENOTSUPP) {
-- 
2.20.1





[PATCH 4.9 042/223] vhost_net: disable zerocopy by default

2019-08-02 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 681d0eade82f..75e1089dfb01 100644
--- a/drivers/vhost/net.c
+++ b/drivers/vhost/net.c
@@ -30,7 +30,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.9 033/223] perf test 6: Fix missing kvm module load for s390

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 53fe307dfd309e425b171f6272d64296a54f4dff ]

Command

   # perf test -Fv 6

fails with error

   running test 100 'kvm-s390:kvm_s390_create_vm' failed to parse
event 'kvm-s390:kvm_s390_create_vm', err -1, str 'unknown tracepoint'
event syntax error: 'kvm-s390:kvm_s390_create_vm'
 \___ unknown tracepoint

when the kvm module is not loaded or not built in.

Fix this by adding a valid function which tests if the module
is loaded. Loaded modules (or builtin KVM support) have a
directory named
  /sys/kernel/debug/tracing/events/kvm-s390
for this tracepoint.

Check for existence of this directory.

Signed-off-by: Thomas Richter 
Reviewed-by: Christian Borntraeger 
Cc: Heiko Carstens 
Cc: Hendrik Brueckner 
Link: http://lkml.kernel.org/r/20190604053504.43073-1-tmri...@linux.ibm.com
Signed-off-by: Arnaldo Carvalho de Melo 
Signed-off-by: Sasha Levin 
---
 tools/perf/tests/parse-events.c | 27 +++
 1 file changed, 27 insertions(+)

diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c
index aa9276bfe3e9..9134a0c3e99d 100644
--- a/tools/perf/tests/parse-events.c
+++ b/tools/perf/tests/parse-events.c
@@ -12,6 +12,32 @@
 #define PERF_TP_SAMPLE_TYPE (PERF_SAMPLE_RAW | PERF_SAMPLE_TIME | \
 PERF_SAMPLE_CPU | PERF_SAMPLE_PERIOD)
 
+#if defined(__s390x__)
+/* Return true if kvm module is available and loaded. Test this
+ * and retun success when trace point kvm_s390_create_vm
+ * exists. Otherwise this test always fails.
+ */
+static bool kvm_s390_create_vm_valid(void)
+{
+   char *eventfile;
+   bool rc = false;
+
+   eventfile = get_events_file("kvm-s390");
+
+   if (eventfile) {
+   DIR *mydir = opendir(eventfile);
+
+   if (mydir) {
+   rc = true;
+   closedir(mydir);
+   }
+   put_events_file(eventfile);
+   }
+
+   return rc;
+}
+#endif
+
 static int test__checkevent_tracepoint(struct perf_evlist *evlist)
 {
struct perf_evsel *evsel = perf_evlist__first(evlist);
@@ -1593,6 +1619,7 @@ static struct evlist_test test__events[] = {
{
.name  = "kvm-s390:kvm_s390_create_vm",
.check = test__checkevent_tracepoint,
+   .valid = kvm_s390_create_vm_valid,
.id= 100,
},
 #endif
-- 
2.20.1





[PATCH 4.9 034/223] gpio: omap: fix lack of irqstatus_raw0 for OMAP4

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit 64ea3e9094a1f13b96c33244a3fb3a0f45690bd2 ]

Commit 384ebe1c2849 ("gpio/omap: Add DT support to GPIO driver") added
the register definition tables to the gpio-omap driver. Subsequently to
that commit, commit 4e962e8998cc ("gpio/omap: remove cpu_is_omap()
checks from *_runtime_resume()") added definitions for irqstatus_raw*
registers to the legacy OMAP4 definitions, but missed the DT
definitions.

This causes an unintentional change of behaviour for the 1.101 errata
workaround on OMAP4 platforms. Fix this oversight.

Fixes: 4e962e8998cc ("gpio/omap: remove cpu_is_omap() checks from 
*_runtime_resume()")
Signed-off-by: Russell King 
Signed-off-by: Grygorii Strashko 
Tested-by: Tony Lindgren 
Signed-off-by: Linus Walleij 
Signed-off-by: Sasha Levin 
---
 drivers/gpio/gpio-omap.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/gpio/gpio-omap.c b/drivers/gpio/gpio-omap.c
index 038882183bdf..bd12b433f964 100644
--- a/drivers/gpio/gpio-omap.c
+++ b/drivers/gpio/gpio-omap.c
@@ -1585,6 +1585,8 @@ static struct omap_gpio_reg_offs omap4_gpio_regs = {
.clr_dataout =  OMAP4_GPIO_CLEARDATAOUT,
.irqstatus =OMAP4_GPIO_IRQSTATUS0,
.irqstatus2 =   OMAP4_GPIO_IRQSTATUS1,
+   .irqstatus_raw0 =   OMAP4_GPIO_IRQSTATUSRAW0,
+   .irqstatus_raw1 =   OMAP4_GPIO_IRQSTATUSRAW1,
.irqenable =OMAP4_GPIO_IRQSTATUSSET0,
.irqenable2 =   OMAP4_GPIO_IRQSTATUSSET1,
.set_irqenable =OMAP4_GPIO_IRQSTATUSSET0,
-- 
2.20.1





[PATCH 4.9 029/223] net: fec: Do not use netdev messages too early

2019-08-02 Thread Greg Kroah-Hartman
[ Upstream commit a19a0582363b9a5f8ba812f34f1b8df394898780 ]

When a valid MAC address is not found the current messages
are shown:

fec 2188000.ethernet (unnamed net_device) (uninitialized): Invalid MAC address: 
00:00:00:00:00:00
fec 2188000.ethernet (unnamed net_device) (uninitialized): Using random MAC 
address: aa:9f:25:eb:7e:aa

Since the network device has not been registered at this point, it is better
to use dev_err()/dev_info() instead, which will provide cleaner log
messages like these:

fec 2188000.ethernet: Invalid MAC address: 00:00:00:00:00:00
fec 2188000.ethernet: Using random MAC address: aa:9f:25:eb:7e:aa

Tested on a imx6dl-pico-pi board.

Signed-off-by: Fabio Estevam 
Signed-off-by: David S. Miller 
Signed-off-by: Sasha Levin 
---
 drivers/net/ethernet/freescale/fec_main.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/ethernet/freescale/fec_main.c 
b/drivers/net/ethernet/freescale/fec_main.c
index 1eb34109b207..92ea760c4822 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -1685,10 +1685,10 @@ static void fec_get_mac(struct net_device *ndev)
 */
if (!is_valid_ether_addr(iap)) {
/* Report it and use a random ethernet address instead */
-   netdev_err(ndev, "Invalid MAC address: %pM\n", iap);
+   dev_err(&fep->pdev->dev, "Invalid MAC address: %pM\n", iap);
eth_hw_addr_random(ndev);
-   netdev_info(ndev, "Using random MAC address: %pM\n",
-   ndev->dev_addr);
+   dev_info(&fep->pdev->dev, "Using random MAC address: %pM\n",
+ndev->dev_addr);
return;
}
 
-- 
2.20.1





[PATCH 4.9 061/223] ixgbe: Check DDM existence in transceiver before access

2019-08-02 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 a137e060c185..bbc23e88de89 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c
@@ -3192,7 +3192,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 cc735ec3e045..25090b4880b3 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h
@@ -70,6 +70,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.9 053/223] x86/build: Add set -e to mkcapflags.sh to delete broken capflags.c

2019-08-02 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 6988c74409a8..711b74e0e623 100644
--- a/arch/x86/kernel/cpu/mkcapflags.sh
+++ b/arch/x86/kernel/cpu/mkcapflags.sh
@@ -3,6 +3,8 @@
 # Generate the x86_cap/bug_flags[] arrays from include/asm/cpufeatures.h
 #
 
+set -e
+
 IN=$1
 OUT=$2
 
-- 
2.20.1





<    3   4   5   6   7   8   9   10   11   12   >