]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.4-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 15 Jun 2020 15:15:57 +0000 (17:15 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 15 Jun 2020 15:15:57 +0000 (17:15 +0200)
added patches:
acpi-pm-avoid-using-power-resources-if-there-are-none-for-d0.patch
acpi-sysfs-fix-reference-count-leak-in-acpi_sysfs_add_hotplug_profile.patch
alsa-es1688-add-the-missed-snd_card_free.patch
alsa-usb-audio-fix-inconsistent-card-pm-state-after-resume.patch

queue-4.4/acpi-pm-avoid-using-power-resources-if-there-are-none-for-d0.patch [new file with mode: 0644]
queue-4.4/acpi-sysfs-fix-reference-count-leak-in-acpi_sysfs_add_hotplug_profile.patch [new file with mode: 0644]
queue-4.4/alsa-es1688-add-the-missed-snd_card_free.patch [new file with mode: 0644]
queue-4.4/alsa-usb-audio-fix-inconsistent-card-pm-state-after-resume.patch [new file with mode: 0644]
queue-4.4/series

diff --git a/queue-4.4/acpi-pm-avoid-using-power-resources-if-there-are-none-for-d0.patch b/queue-4.4/acpi-pm-avoid-using-power-resources-if-there-are-none-for-d0.patch
new file mode 100644 (file)
index 0000000..0ab7dfb
--- /dev/null
@@ -0,0 +1,121 @@
+From 956ad9d98b73f59e442cc119c98ba1e04e94fe6d Mon Sep 17 00:00:00 2001
+From: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
+Date: Thu, 4 Jun 2020 19:22:26 +0200
+Subject: ACPI: PM: Avoid using power resources if there are none for D0
+
+From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+
+commit 956ad9d98b73f59e442cc119c98ba1e04e94fe6d upstream.
+
+As recently reported, some platforms provide a list of power
+resources for device power state D3hot, through the _PR3 object,
+but they do not provide a list of power resources for device power
+state D0.
+
+Among other things, this causes acpi_device_get_power() to return
+D3hot as the current state of the device in question if all of the
+D3hot power resources are "on", because it sees the power_resources
+flag set and calls acpi_power_get_inferred_state() which finds that
+D3hot is the shallowest power state with all of the associated power
+resources turned "on", so that's what it returns.  Moreover, that
+value takes precedence over the acpi_dev_pm_explicit_get() return
+value, because it means a deeper power state.  The device may very
+well be in D0 physically at that point, however.
+
+Moreover, the presence of _PR3 without _PR0 for a given device
+means that only one D3-level power state can be supported by it.
+Namely, because there are no power resources to turn "off" when
+transitioning the device from D0 into D3cold (which should be
+supported since _PR3 is present), the evaluation of _PS3 should
+be sufficient to put it straight into D3cold, but this means that
+the effect of turning "on" the _PR3 power resources is unclear,
+so it is better to avoid doing that altogether.  Consequently,
+there is no practical way do distinguish D3cold from D3hot for
+the device in question and the power states of it can be labeled
+so that D3hot is the deepest supported one (and Linux assumes
+that putting a device into D3hot via ACPI may cause power to be
+removed from it anyway, for legacy reasons).
+
+To work around the problem described above modify the ACPI
+enumeration of devices so that power resources are only used
+for device power management if the list of D0 power resources
+is not empty and make it mart D3cold as supported only if that
+is the case and the D3hot list of power resources is not empty
+too.
+
+Fixes: ef85bdbec444 ("ACPI / scan: Consolidate extraction of power resources lists")
+Link: https://bugzilla.kernel.org/show_bug.cgi?id=205057
+Link: https://lore.kernel.org/linux-acpi/20200603194659.185757-1-hdegoede@redhat.com/
+Reported-by: Hans de Goede <hdegoede@redhat.com>
+Tested-by: Hans de Goede <hdegoede@redhat.com>
+Tested-by: youling257@gmail.com
+Cc: 3.10+ <stable@vger.kernel.org> # 3.10+
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Reviewed-by: Hans de Goede <hdegoede@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/acpi/device_pm.c |    2 +-
+ drivers/acpi/scan.c      |   28 +++++++++++++++++++---------
+ 2 files changed, 20 insertions(+), 10 deletions(-)
+
+--- a/drivers/acpi/device_pm.c
++++ b/drivers/acpi/device_pm.c
+@@ -170,7 +170,7 @@ int acpi_device_set_power(struct acpi_de
+                * possibly drop references to the power resources in use.
+                */
+               state = ACPI_STATE_D3_HOT;
+-              /* If _PR3 is not available, use D3hot as the target state. */
++              /* If D3cold is not supported, use D3hot as the target state. */
+               if (!device->power.states[ACPI_STATE_D3_COLD].flags.valid)
+                       target_state = state;
+       } else if (!device->power.states[state].flags.valid) {
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -907,12 +907,9 @@ static void acpi_bus_init_power_state(st
+               if (buffer.length && package
+                   && package->type == ACPI_TYPE_PACKAGE
+-                  && package->package.count) {
+-                      int err = acpi_extract_power_resources(package, 0,
+-                                                             &ps->resources);
+-                      if (!err)
+-                              device->power.flags.power_resources = 1;
+-              }
++                  && package->package.count)
++                      acpi_extract_power_resources(package, 0, &ps->resources);
++
+               ACPI_FREE(buffer.pointer);
+       }
+@@ -959,14 +956,27 @@ static void acpi_bus_get_power_flags(str
+               acpi_bus_init_power_state(device, i);
+       INIT_LIST_HEAD(&device->power.states[ACPI_STATE_D3_COLD].resources);
+-      if (!list_empty(&device->power.states[ACPI_STATE_D3_HOT].resources))
+-              device->power.states[ACPI_STATE_D3_COLD].flags.valid = 1;
+-      /* Set defaults for D0 and D3hot states (always valid) */
++      /* Set the defaults for D0 and D3hot (always supported). */
+       device->power.states[ACPI_STATE_D0].flags.valid = 1;
+       device->power.states[ACPI_STATE_D0].power = 100;
+       device->power.states[ACPI_STATE_D3_HOT].flags.valid = 1;
++      /*
++       * Use power resources only if the D0 list of them is populated, because
++       * some platforms may provide _PR3 only to indicate D3cold support and
++       * in those cases the power resources list returned by it may be bogus.
++       */
++      if (!list_empty(&device->power.states[ACPI_STATE_D0].resources)) {
++              device->power.flags.power_resources = 1;
++              /*
++               * D3cold is supported if the D3hot list of power resources is
++               * not empty.
++               */
++              if (!list_empty(&device->power.states[ACPI_STATE_D3_HOT].resources))
++                      device->power.states[ACPI_STATE_D3_COLD].flags.valid = 1;
++      }
++
+       if (acpi_bus_init_power(device))
+               device->flags.power_manageable = 0;
+ }
diff --git a/queue-4.4/acpi-sysfs-fix-reference-count-leak-in-acpi_sysfs_add_hotplug_profile.patch b/queue-4.4/acpi-sysfs-fix-reference-count-leak-in-acpi_sysfs_add_hotplug_profile.patch
new file mode 100644 (file)
index 0000000..bdb21f1
--- /dev/null
@@ -0,0 +1,37 @@
+From 6e6c25283dff866308c87b49434c7dbad4774cc0 Mon Sep 17 00:00:00 2001
+From: Qiushi Wu <wu000273@umn.edu>
+Date: Wed, 27 May 2020 16:17:17 -0500
+Subject: ACPI: sysfs: Fix reference count leak in acpi_sysfs_add_hotplug_profile()
+
+From: Qiushi Wu <wu000273@umn.edu>
+
+commit 6e6c25283dff866308c87b49434c7dbad4774cc0 upstream.
+
+kobject_init_and_add() takes reference even when it fails.
+Thus, when kobject_init_and_add() returns an error,
+kobject_put() must be called to properly clean up the kobject.
+
+Fixes: 3f8055c35836 ("ACPI / hotplug: Introduce user space interface for hotplug profiles")
+Signed-off-by: Qiushi Wu <wu000273@umn.edu>
+Cc: 3.10+ <stable@vger.kernel.org> # 3.10+
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ drivers/acpi/sysfs.c |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/drivers/acpi/sysfs.c
++++ b/drivers/acpi/sysfs.c
+@@ -831,8 +831,10 @@ void acpi_sysfs_add_hotplug_profile(stru
+       error = kobject_init_and_add(&hotplug->kobj,
+               &acpi_hotplug_profile_ktype, hotplug_kobj, "%s", name);
+-      if (error)
++      if (error) {
++              kobject_put(&hotplug->kobj);
+               goto err_out;
++      }
+       kobject_uevent(&hotplug->kobj, KOBJ_ADD);
+       return;
diff --git a/queue-4.4/alsa-es1688-add-the-missed-snd_card_free.patch b/queue-4.4/alsa-es1688-add-the-missed-snd_card_free.patch
new file mode 100644 (file)
index 0000000..98219f3
--- /dev/null
@@ -0,0 +1,37 @@
+From d9b8fbf15d05350b36081eddafcf7b15aa1add50 Mon Sep 17 00:00:00 2001
+From: Chuhong Yuan <hslester96@gmail.com>
+Date: Wed, 3 Jun 2020 17:24:59 +0800
+Subject: ALSA: es1688: Add the missed snd_card_free()
+
+From: Chuhong Yuan <hslester96@gmail.com>
+
+commit d9b8fbf15d05350b36081eddafcf7b15aa1add50 upstream.
+
+snd_es968_pnp_detect() misses a snd_card_free() in a failed path.
+Add the missed function call to fix it.
+
+Fixes: a20971b201ac ("ALSA: Merge es1688 and es968 drivers")
+Signed-off-by: Chuhong Yuan <hslester96@gmail.com>
+Cc: <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/20200603092459.1424093-1-hslester96@gmail.com
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/isa/es1688/es1688.c |    4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/sound/isa/es1688/es1688.c
++++ b/sound/isa/es1688/es1688.c
+@@ -284,8 +284,10 @@ static int snd_es968_pnp_detect(struct p
+               return error;
+       }
+       error = snd_es1688_probe(card, dev);
+-      if (error < 0)
++      if (error < 0) {
++              snd_card_free(card);
+               return error;
++      }
+       pnp_set_card_drvdata(pcard, card);
+       snd_es968_pnp_is_probed = 1;
+       return 0;
diff --git a/queue-4.4/alsa-usb-audio-fix-inconsistent-card-pm-state-after-resume.patch b/queue-4.4/alsa-usb-audio-fix-inconsistent-card-pm-state-after-resume.patch
new file mode 100644 (file)
index 0000000..e977856
--- /dev/null
@@ -0,0 +1,127 @@
+From 862b2509d157c629dd26d7ac6c6cdbf043d332eb Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Wed, 3 Jun 2020 17:37:08 +0200
+Subject: ALSA: usb-audio: Fix inconsistent card PM state after resume
+
+From: Takashi Iwai <tiwai@suse.de>
+
+commit 862b2509d157c629dd26d7ac6c6cdbf043d332eb upstream.
+
+When a USB-audio interface gets runtime-suspended via auto-pm feature,
+the driver suspends all functionality and increment
+chip->num_suspended_intf.  Later on, when the system gets suspended to
+S3, the driver increments chip->num_suspended_intf again, skips the
+device changes, and sets the card power state to
+SNDRV_CTL_POWER_D3hot.  In return, when the system gets resumed from
+S3, the resume callback decrements chip->num_suspended_intf.  Since
+this refcount is still not zero (it's been runtime-suspended), the
+whole resume is skipped.  But there is a small pitfall here.
+
+The problem is that the driver doesn't restore the card power state
+after this resume call, leaving it as SNDRV_CTL_POWER_D3hot.  So,
+even after the system resume finishes, the card instance still appears
+as if it were system-suspended, and this confuses many ioctl accesses
+that are blocked unexpectedly.
+
+In details, we have two issues behind the scene: one is that the card
+power state is changed only when the refcount becomes zero, and
+another is that the prior auto-suspend check is kept in a boolean
+flag.  Although the latter problem is almost negligible since the
+auto-pm feature is imposed only on the primary interface, but this can
+be a potential problem on the devices with multiple interfaces.
+
+This patch addresses those issues by the following:
+
+- Replace chip->autosuspended boolean flag with chip->system_suspend
+  counter
+
+- At the first system-suspend, chip->num_suspended_intf is recorded to
+  chip->system_suspend
+
+- At system-resume, the card power state is restored when the
+  chip->num_suspended_intf refcount reaches to chip->system_suspend,
+  i.e. the state returns to the auto-suspended
+
+Also, the patch fixes yet another hidden problem by the code
+refactoring along with the fixes above: namely, when some resume
+procedure failed, the driver left chip->num_suspended_intf that was
+already decreased, and it might lead to the refcount unbalance.
+In the new code, the refcount decrement is done after the whole resume
+procedure, and the problem is avoided as well.
+
+Fixes: 0662292aec05 ("ALSA: usb-audio: Handle normal and auto-suspend equally")
+Reported-and-tested-by: Macpaul Lin <macpaul.lin@mediatek.com>
+Cc: <stable@vger.kernel.org>
+Link: https://lore.kernel.org/r/20200603153709.6293-1-tiwai@suse.de
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ sound/usb/card.c     |   20 +++++++++++++-------
+ sound/usb/usbaudio.h |    2 +-
+ 2 files changed, 14 insertions(+), 8 deletions(-)
+
+--- a/sound/usb/card.c
++++ b/sound/usb/card.c
+@@ -713,9 +713,6 @@ static int usb_audio_suspend(struct usb_
+       if (chip == (void *)-1L)
+               return 0;
+-      chip->autosuspended = !!PMSG_IS_AUTO(message);
+-      if (!chip->autosuspended)
+-              snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot);
+       if (!chip->num_suspended_intf++) {
+               list_for_each_entry(as, &chip->pcm_list, list) {
+                       snd_pcm_suspend_all(as->pcm);
+@@ -728,6 +725,11 @@ static int usb_audio_suspend(struct usb_
+                       snd_usb_mixer_suspend(mixer);
+       }
++      if (!PMSG_IS_AUTO(message) && !chip->system_suspend) {
++              snd_power_change_state(chip->card, SNDRV_CTL_POWER_D3hot);
++              chip->system_suspend = chip->num_suspended_intf;
++      }
++
+       return 0;
+ }
+@@ -740,10 +742,11 @@ static int __usb_audio_resume(struct usb
+       if (chip == (void *)-1L)
+               return 0;
+-      if (--chip->num_suspended_intf)
+-              return 0;
+       atomic_inc(&chip->active); /* avoid autopm */
++      if (chip->num_suspended_intf > 1)
++              goto out;
++
+       /*
+        * ALSA leaves material resumption to user space
+        * we just notify and restart the mixers
+@@ -758,9 +761,12 @@ static int __usb_audio_resume(struct usb
+               snd_usbmidi_resume(p);
+       }
+-      if (!chip->autosuspended)
++ out:
++      if (chip->num_suspended_intf == chip->system_suspend) {
+               snd_power_change_state(chip->card, SNDRV_CTL_POWER_D0);
+-      chip->autosuspended = 0;
++              chip->system_suspend = 0;
++      }
++      chip->num_suspended_intf--;
+ err_out:
+       atomic_dec(&chip->active); /* allow autopm after this point */
+--- a/sound/usb/usbaudio.h
++++ b/sound/usb/usbaudio.h
+@@ -37,7 +37,7 @@ struct snd_usb_audio {
+       struct usb_interface *pm_intf;
+       u32 usb_id;
+       struct mutex mutex;
+-      unsigned int autosuspended:1;   
++      unsigned int system_suspend;
+       atomic_t active;
+       atomic_t shutdown;
+       atomic_t usage_count;
index 6b3c87bf74b1195812d0949d99067c0085f1c017..ccbaed70f525832fe0db7e06a80d4c7c2d38b4c3 100644 (file)
@@ -11,3 +11,7 @@ x86_64-fix-jiffies-odr-violation.patch
 x86-speculation-prevent-rogue-cross-process-ssbd-shutdown.patch
 x86-reboot-quirks-add-macbook6-1-reboot-quirk.patch
 efi-efivars-add-missing-kobject_put-in-sysfs-entry-creation-error-path.patch
+alsa-es1688-add-the-missed-snd_card_free.patch
+alsa-usb-audio-fix-inconsistent-card-pm-state-after-resume.patch
+acpi-sysfs-fix-reference-count-leak-in-acpi_sysfs_add_hotplug_profile.patch
+acpi-pm-avoid-using-power-resources-if-there-are-none-for-d0.patch