linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org
Cc: Hans de Goede <hdegoede@redhat.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Andy Shevchenko <andy.shevchenko@gmail.com>,
	Sasha Levin <sashal@kernel.org>
Subject: [PATCH AUTOSEL 5.2 083/185] x86/platform/intel/iosf_mbi Rewrite locking
Date: Sun, 22 Sep 2019 14:47:41 -0400	[thread overview]
Message-ID: <20190922184924.32534-83-sashal@kernel.org> (raw)
In-Reply-To: <20190922184924.32534-1-sashal@kernel.org>

From: Hans de Goede <hdegoede@redhat.com>

[ Upstream commit 00452ba9fdb5bf6fb5fea1dae5227b4bbed44fc4 ]

There are 2 problems with the old iosf PMIC I2C bus arbritration code which
need to be addressed:

1. The lockdep code complains about a possible deadlock in the
iosf_mbi_[un]block_punit_i2c_access code:

[    6.712662] ======================================================
[    6.712673] WARNING: possible circular locking dependency detected
[    6.712685] 5.3.0-rc2+ #79 Not tainted
[    6.712692] ------------------------------------------------------
[    6.712702] kworker/0:1/7 is trying to acquire lock:
[    6.712712] 00000000df1c5681 (iosf_mbi_block_punit_i2c_access_count_mutex){+.+.}, at: iosf_mbi_unblock_punit_i2c_access+0x13/0x90
[    6.712739]
               but task is already holding lock:
[    6.712749] 0000000067cb23e7 (iosf_mbi_punit_mutex){+.+.}, at: iosf_mbi_block_punit_i2c_access+0x97/0x186
[    6.712768]
               which lock already depends on the new lock.

[    6.712780]
               the existing dependency chain (in reverse order) is:
[    6.712792]
               -> #1 (iosf_mbi_punit_mutex){+.+.}:
[    6.712808]        __mutex_lock+0xa8/0x9a0
[    6.712818]        iosf_mbi_block_punit_i2c_access+0x97/0x186
[    6.712831]        i2c_dw_acquire_lock+0x20/0x30
[    6.712841]        i2c_dw_set_reg_access+0x15/0xb0
[    6.712851]        i2c_dw_probe+0x57/0x473
[    6.712861]        dw_i2c_plat_probe+0x33e/0x640
[    6.712874]        platform_drv_probe+0x38/0x80
[    6.712884]        really_probe+0xf3/0x380
[    6.712894]        driver_probe_device+0x59/0xd0
[    6.712905]        bus_for_each_drv+0x84/0xd0
[    6.712915]        __device_attach+0xe4/0x170
[    6.712925]        bus_probe_device+0x9f/0xb0
[    6.712935]        deferred_probe_work_func+0x79/0xd0
[    6.712946]        process_one_work+0x234/0x560
[    6.712957]        worker_thread+0x50/0x3b0
[    6.712967]        kthread+0x10a/0x140
[    6.712977]        ret_from_fork+0x3a/0x50
[    6.712986]
               -> #0 (iosf_mbi_block_punit_i2c_access_count_mutex){+.+.}:
[    6.713004]        __lock_acquire+0xe07/0x1930
[    6.713015]        lock_acquire+0x9d/0x1a0
[    6.713025]        __mutex_lock+0xa8/0x9a0
[    6.713035]        iosf_mbi_unblock_punit_i2c_access+0x13/0x90
[    6.713047]        i2c_dw_set_reg_access+0x4d/0xb0
[    6.713058]        i2c_dw_probe+0x57/0x473
[    6.713068]        dw_i2c_plat_probe+0x33e/0x640
[    6.713079]        platform_drv_probe+0x38/0x80
[    6.713089]        really_probe+0xf3/0x380
[    6.713099]        driver_probe_device+0x59/0xd0
[    6.713109]        bus_for_each_drv+0x84/0xd0
[    6.713119]        __device_attach+0xe4/0x170
[    6.713129]        bus_probe_device+0x9f/0xb0
[    6.713140]        deferred_probe_work_func+0x79/0xd0
[    6.713150]        process_one_work+0x234/0x560
[    6.713160]        worker_thread+0x50/0x3b0
[    6.713170]        kthread+0x10a/0x140
[    6.713180]        ret_from_fork+0x3a/0x50
[    6.713189]
               other info that might help us debug this:

[    6.713202]  Possible unsafe locking scenario:

[    6.713212]        CPU0                    CPU1
[    6.713221]        ----                    ----
[    6.713229]   lock(iosf_mbi_punit_mutex);
[    6.713239]                                lock(iosf_mbi_block_punit_i2c_access_count_mutex);
[    6.713253]                                lock(iosf_mbi_punit_mutex);
[    6.713265]   lock(iosf_mbi_block_punit_i2c_access_count_mutex);
[    6.713276]
                *** DEADLOCK ***

In practice can never happen because only the first caller which
increments iosf_mbi_block_punit_i2c_access_count will also take
iosf_mbi_punit_mutex, that is the whole purpose of the counter, which
itself is protected by iosf_mbi_block_punit_i2c_access_count_mutex.

But there is no way to tell the lockdep code about this and we really
want to be able to run a kernel with lockdep enabled without these
warnings being triggered.

2. The lockdep warning also points out another real problem, if 2 threads
both are in a block of code protected by iosf_mbi_block_punit_i2c_access
and the first thread to acquire the block exits before the second thread
then the second thread will call mutex_unlock on iosf_mbi_punit_mutex,
but it is not the thread which took the mutex and unlocking by another
thread is not allowed.

Fix this by getting rid of the notion of holding a mutex for the entire
duration of the PMIC accesses, be it either from the PUnit side, or from an
in kernel I2C driver. In general holding a mutex after exiting a function
is a bad idea and the above problems show this case is no different.

Instead 2 counters are now used, one for PMIC accesses from the PUnit
and one for accesses from in kernel I2C code. When access is requested
now the code will wait (using a waitqueue) for the counter of the other
type of access to reach 0 and on release, if the counter reaches 0 the
wakequeue is woken.

Note that the counter approach is necessary to allow nested calls.
The main reason for this is so that a series of i2c transfers can be done
with the punit blocked from accessing the bus the whole time. This is
necessary to be able to safely read/modify/write a PMIC register without
racing with the PUNIT doing the same thing.

Allowing nested iosf_mbi_block_punit_i2c_access() calls also is desirable
from a performance pov since the whole dance necessary to block the PUnit
from accessing the PMIC I2C bus is somewhat expensive.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lkml.kernel.org/r/20190812102113.95794-1-hdegoede@redhat.com
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 arch/x86/platform/intel/iosf_mbi.c | 100 ++++++++++++++++++-----------
 1 file changed, 62 insertions(+), 38 deletions(-)

diff --git a/arch/x86/platform/intel/iosf_mbi.c b/arch/x86/platform/intel/iosf_mbi.c
index b393eaa798efd..0099826c88a87 100644
--- a/arch/x86/platform/intel/iosf_mbi.c
+++ b/arch/x86/platform/intel/iosf_mbi.c
@@ -17,6 +17,7 @@
 #include <linux/debugfs.h>
 #include <linux/capability.h>
 #include <linux/pm_qos.h>
+#include <linux/wait.h>
 
 #include <asm/iosf_mbi.h>
 
@@ -201,23 +202,45 @@ EXPORT_SYMBOL(iosf_mbi_available);
 #define PUNIT_SEMAPHORE_BIT		BIT(0)
 #define PUNIT_SEMAPHORE_ACQUIRE		BIT(1)
 
-static DEFINE_MUTEX(iosf_mbi_punit_mutex);
-static DEFINE_MUTEX(iosf_mbi_block_punit_i2c_access_count_mutex);
+static DEFINE_MUTEX(iosf_mbi_pmic_access_mutex);
 static BLOCKING_NOTIFIER_HEAD(iosf_mbi_pmic_bus_access_notifier);
-static u32 iosf_mbi_block_punit_i2c_access_count;
+static DECLARE_WAIT_QUEUE_HEAD(iosf_mbi_pmic_access_waitq);
+static u32 iosf_mbi_pmic_punit_access_count;
+static u32 iosf_mbi_pmic_i2c_access_count;
 static u32 iosf_mbi_sem_address;
 static unsigned long iosf_mbi_sem_acquired;
 static struct pm_qos_request iosf_mbi_pm_qos;
 
 void iosf_mbi_punit_acquire(void)
 {
-	mutex_lock(&iosf_mbi_punit_mutex);
+	/* Wait for any I2C PMIC accesses from in kernel drivers to finish. */
+	mutex_lock(&iosf_mbi_pmic_access_mutex);
+	while (iosf_mbi_pmic_i2c_access_count != 0) {
+		mutex_unlock(&iosf_mbi_pmic_access_mutex);
+		wait_event(iosf_mbi_pmic_access_waitq,
+			   iosf_mbi_pmic_i2c_access_count == 0);
+		mutex_lock(&iosf_mbi_pmic_access_mutex);
+	}
+	/*
+	 * We do not need to do anything to allow the PUNIT to safely access
+	 * the PMIC, other then block in kernel accesses to the PMIC.
+	 */
+	iosf_mbi_pmic_punit_access_count++;
+	mutex_unlock(&iosf_mbi_pmic_access_mutex);
 }
 EXPORT_SYMBOL(iosf_mbi_punit_acquire);
 
 void iosf_mbi_punit_release(void)
 {
-	mutex_unlock(&iosf_mbi_punit_mutex);
+	bool do_wakeup;
+
+	mutex_lock(&iosf_mbi_pmic_access_mutex);
+	iosf_mbi_pmic_punit_access_count--;
+	do_wakeup = iosf_mbi_pmic_punit_access_count == 0;
+	mutex_unlock(&iosf_mbi_pmic_access_mutex);
+
+	if (do_wakeup)
+		wake_up(&iosf_mbi_pmic_access_waitq);
 }
 EXPORT_SYMBOL(iosf_mbi_punit_release);
 
@@ -256,34 +279,32 @@ static void iosf_mbi_reset_semaphore(void)
  * already blocked P-Unit accesses because it wants them blocked over multiple
  * i2c-transfers, for e.g. read-modify-write of an I2C client register.
  *
- * The P-Unit accesses already being blocked is tracked through the
- * iosf_mbi_block_punit_i2c_access_count variable which is protected by the
- * iosf_mbi_block_punit_i2c_access_count_mutex this mutex is hold for the
- * entire duration of the function.
- *
- * If access is not blocked yet, this function takes the following steps:
+ * To allow safe PMIC i2c bus accesses this function takes the following steps:
  *
  * 1) Some code sends request to the P-Unit which make it access the PMIC
  *    I2C bus. Testing has shown that the P-Unit does not check its internal
  *    PMIC bus semaphore for these requests. Callers of these requests call
  *    iosf_mbi_punit_acquire()/_release() around their P-Unit accesses, these
- *    functions lock/unlock the iosf_mbi_punit_mutex.
- *    As the first step we lock the iosf_mbi_punit_mutex, to wait for any in
- *    flight requests to finish and to block any new requests.
+ *    functions increase/decrease iosf_mbi_pmic_punit_access_count, so first
+ *    we wait for iosf_mbi_pmic_punit_access_count to become 0.
+ *
+ * 2) Check iosf_mbi_pmic_i2c_access_count, if access has already
+ *    been blocked by another caller, we only need to increment
+ *    iosf_mbi_pmic_i2c_access_count and we can skip the other steps.
  *
- * 2) Some code makes such P-Unit requests from atomic contexts where it
+ * 3) Some code makes such P-Unit requests from atomic contexts where it
  *    cannot call iosf_mbi_punit_acquire() as that may sleep.
  *    As the second step we call a notifier chain which allows any code
  *    needing P-Unit resources from atomic context to acquire them before
  *    we take control over the PMIC I2C bus.
  *
- * 3) When CPU cores enter C6 or C7 the P-Unit needs to talk to the PMIC
+ * 4) When CPU cores enter C6 or C7 the P-Unit needs to talk to the PMIC
  *    if this happens while the kernel itself is accessing the PMIC I2C bus
  *    the SoC hangs.
  *    As the third step we call pm_qos_update_request() to disallow the CPU
  *    to enter C6 or C7.
  *
- * 4) The P-Unit has a PMIC bus semaphore which we can request to stop
+ * 5) The P-Unit has a PMIC bus semaphore which we can request to stop
  *    autonomous P-Unit tasks from accessing the PMIC I2C bus while we hold it.
  *    As the fourth and final step we request this semaphore and wait for our
  *    request to be acknowledged.
@@ -297,12 +318,18 @@ int iosf_mbi_block_punit_i2c_access(void)
 	if (WARN_ON(!mbi_pdev || !iosf_mbi_sem_address))
 		return -ENXIO;
 
-	mutex_lock(&iosf_mbi_block_punit_i2c_access_count_mutex);
+	mutex_lock(&iosf_mbi_pmic_access_mutex);
 
-	if (iosf_mbi_block_punit_i2c_access_count > 0)
+	while (iosf_mbi_pmic_punit_access_count != 0) {
+		mutex_unlock(&iosf_mbi_pmic_access_mutex);
+		wait_event(iosf_mbi_pmic_access_waitq,
+			   iosf_mbi_pmic_punit_access_count == 0);
+		mutex_lock(&iosf_mbi_pmic_access_mutex);
+	}
+
+	if (iosf_mbi_pmic_i2c_access_count > 0)
 		goto success;
 
-	mutex_lock(&iosf_mbi_punit_mutex);
 	blocking_notifier_call_chain(&iosf_mbi_pmic_bus_access_notifier,
 				     MBI_PMIC_BUS_ACCESS_BEGIN, NULL);
 
@@ -330,10 +357,6 @@ int iosf_mbi_block_punit_i2c_access(void)
 			iosf_mbi_sem_acquired = jiffies;
 			dev_dbg(&mbi_pdev->dev, "P-Unit semaphore acquired after %ums\n",
 				jiffies_to_msecs(jiffies - start));
-			/*
-			 * Success, keep iosf_mbi_punit_mutex locked till
-			 * iosf_mbi_unblock_punit_i2c_access() gets called.
-			 */
 			goto success;
 		}
 
@@ -344,15 +367,13 @@ int iosf_mbi_block_punit_i2c_access(void)
 	dev_err(&mbi_pdev->dev, "Error P-Unit semaphore timed out, resetting\n");
 error:
 	iosf_mbi_reset_semaphore();
-	mutex_unlock(&iosf_mbi_punit_mutex);
-
 	if (!iosf_mbi_get_sem(&sem))
 		dev_err(&mbi_pdev->dev, "P-Unit semaphore: %d\n", sem);
 success:
 	if (!WARN_ON(ret))
-		iosf_mbi_block_punit_i2c_access_count++;
+		iosf_mbi_pmic_i2c_access_count++;
 
-	mutex_unlock(&iosf_mbi_block_punit_i2c_access_count_mutex);
+	mutex_unlock(&iosf_mbi_pmic_access_mutex);
 
 	return ret;
 }
@@ -360,17 +381,20 @@ EXPORT_SYMBOL(iosf_mbi_block_punit_i2c_access);
 
 void iosf_mbi_unblock_punit_i2c_access(void)
 {
-	mutex_lock(&iosf_mbi_block_punit_i2c_access_count_mutex);
+	bool do_wakeup = false;
 
-	iosf_mbi_block_punit_i2c_access_count--;
-	if (iosf_mbi_block_punit_i2c_access_count == 0) {
+	mutex_lock(&iosf_mbi_pmic_access_mutex);
+	iosf_mbi_pmic_i2c_access_count--;
+	if (iosf_mbi_pmic_i2c_access_count == 0) {
 		iosf_mbi_reset_semaphore();
-		mutex_unlock(&iosf_mbi_punit_mutex);
 		dev_dbg(&mbi_pdev->dev, "punit semaphore held for %ums\n",
 			jiffies_to_msecs(jiffies - iosf_mbi_sem_acquired));
+		do_wakeup = true;
 	}
+	mutex_unlock(&iosf_mbi_pmic_access_mutex);
 
-	mutex_unlock(&iosf_mbi_block_punit_i2c_access_count_mutex);
+	if (do_wakeup)
+		wake_up(&iosf_mbi_pmic_access_waitq);
 }
 EXPORT_SYMBOL(iosf_mbi_unblock_punit_i2c_access);
 
@@ -379,10 +403,10 @@ int iosf_mbi_register_pmic_bus_access_notifier(struct notifier_block *nb)
 	int ret;
 
 	/* Wait for the bus to go inactive before registering */
-	mutex_lock(&iosf_mbi_punit_mutex);
+	iosf_mbi_punit_acquire();
 	ret = blocking_notifier_chain_register(
 				&iosf_mbi_pmic_bus_access_notifier, nb);
-	mutex_unlock(&iosf_mbi_punit_mutex);
+	iosf_mbi_punit_release();
 
 	return ret;
 }
@@ -403,9 +427,9 @@ int iosf_mbi_unregister_pmic_bus_access_notifier(struct notifier_block *nb)
 	int ret;
 
 	/* Wait for the bus to go inactive before unregistering */
-	mutex_lock(&iosf_mbi_punit_mutex);
+	iosf_mbi_punit_acquire();
 	ret = iosf_mbi_unregister_pmic_bus_access_notifier_unlocked(nb);
-	mutex_unlock(&iosf_mbi_punit_mutex);
+	iosf_mbi_punit_release();
 
 	return ret;
 }
@@ -413,7 +437,7 @@ EXPORT_SYMBOL(iosf_mbi_unregister_pmic_bus_access_notifier);
 
 void iosf_mbi_assert_punit_acquired(void)
 {
-	WARN_ON(!mutex_is_locked(&iosf_mbi_punit_mutex));
+	WARN_ON(iosf_mbi_pmic_punit_access_count == 0);
 }
 EXPORT_SYMBOL(iosf_mbi_assert_punit_acquired);
 
-- 
2.20.1


  parent reply	other threads:[~2019-09-22 19:26 UTC|newest]

Thread overview: 191+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-09-22 18:46 [PATCH AUTOSEL 5.2 001/185] ALSA: hda: Flush interrupts on disabling Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 002/185] ASoC: SOF: Intel: hda: Make hdac_device device-managed Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 003/185] cpufreq: ap806: Add NULL check after kcalloc Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 004/185] regulator: lm363x: Fix off-by-one n_voltages for lm3632 ldo_vpos/ldo_vneg Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 005/185] spi: dw-mmio: Clock should be shut when error occurs Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 006/185] ASoC: tlv320aic31xx: suppress error message for EPROBE_DEFER Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 007/185] ASoC: sgtl5000: Fix of unmute outputs on probe Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 008/185] ASoC: sgtl5000: Fix charge pump source assignment Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 009/185] firmware: qcom_scm: Use proper types for dma mappings Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 010/185] dmaengine: bcm2835: Print error in case setting DMA mask fails Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 011/185] leds: leds-lp5562 allow firmware files up to the maximum length Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 012/185] media: dib0700: fix link error for dibx000_i2c_set_speed Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 013/185] media: mtk-cir: lower de-glitch counter for rc-mm protocol Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 014/185] ASoC: SOF: pci: mark last_busy value at runtime PM init Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 015/185] media: exynos4-is: fix leaked of_node references Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 016/185] media: vivid:add sanity check to avoid divide error and set value to 1 if 0 Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 017/185] media: vb2: reorder checks in vb2_poll() Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 018/185] media: vivid: work around high stack usage with clang Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 019/185] media: hdpvr: Add device num check and handling Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 020/185] media: i2c: ov5640: Check for devm_gpiod_get_optional() error Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 021/185] time/tick-broadcast: Fix tick_broadcast_offline() lockdep complaint Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 022/185] sched/fair: Fix imbalance due to CPU affinity Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 023/185] sched/core: Fix CPU controller for !RT_GROUP_SCHED Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 024/185] x86/apic: Make apic_pending_intr_clear() more robust Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 025/185] sched/deadline: Fix bandwidth accounting at all levels after offline migration Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 026/185] x86/reboot: Always use NMI fallback when shutdown via reboot vector IPI fails Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 027/185] rcu/tree: Call setschedule() gp ktread to SCHED_FIFO outside of atomic region Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 028/185] x86/apic: Soft disable APIC before initializing it Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 029/185] ALSA: hda - Show the fatal CORB/RIRB error more clearly Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 030/185] ALSA: i2c: ak4xxx-adda: Fix a possible null pointer dereference in build_adc_controls() Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 031/185] EDAC/mc: Fix grain_bits calculation Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 032/185] media: iguanair: add sanity checks Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 033/185] cpuidle: teo: Allow tick to be stopped if PM QoS is used Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 034/185] arm64: mm: free the initrd reserved memblock in a aligned manner Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 035/185] soc: amlogic: meson-clk-measure: protect measure with a mutex Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 036/185] base: soc: Export soc_device_register/unregister APIs Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 037/185] ALSA: usb-audio: Skip bSynchAddress endpoint check if it is invalid Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 038/185] ia64:unwind: fix double free for mod->arch.init_unw_table Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 039/185] EDAC/altera: Use the proper type for the IRQ status bits Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 040/185] ASoC: rsnd: don't call clk_get_rate() under atomic context Sasha Levin
2019-09-22 18:46 ` [PATCH AUTOSEL 5.2 041/185] arm64/prefetch: fix a -Wtype-limits warning Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 042/185] md/raid1: end bio when the device faulty Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 043/185] md: don't call spare_active in md_reap_sync_thread if all member devices can't work Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 044/185] md: don't set In_sync if array is frozen Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 045/185] media: media/platform: fsl-viu.c: fix build for MICROBLAZE Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 046/185] RAS: Fix prototype warnings Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 047/185] RAS: Build debugfs.o only when enabled in Kconfig Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 048/185] ASoC: hdac_hda: fix page fault issue by removing race Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 049/185] ACPI / processor: don't print errors for processorIDs == 0xff Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 050/185] loop: Add LOOP_SET_DIRECT_IO to compat ioctl Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 051/185] perf tools: Fix paths in include statements Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 052/185] EDAC, pnd2: Fix ioremap() size in dnv_rd_reg() Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 053/185] efi: cper: print AER info of PCIe fatal error Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 054/185] firmware: arm_scmi: Check if platform has released shmem before using Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 055/185] sched/fair: Use rq_lock/unlock in online_fair_sched_group Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 056/185] idle: Prevent late-arriving interrupts from disrupting offline Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 057/185] blk-mq: Fix memory leak in blk_mq_init_allocated_queue error handling Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 058/185] media: gspca: zero usb_buf on error Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 059/185] perf config: Honour $PERF_CONFIG env var to specify alternate .perfconfig Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 060/185] perf test vfs_getname: Disable ~/.perfconfig to get default output Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 061/185] media: mtk-mdp: fix reference count on old device tree Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 062/185] media: i2c: tda1997x: prevent potential NULL pointer access Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 063/185] media: fdp1: Reduce FCP not found message level to debug Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 064/185] media: em28xx: modules workqueue not inited for 2nd device Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 065/185] arm64/efi: Move variable assignments after SECTIONS Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 066/185] perf unwind: Fix libunwind when tid != pid Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 067/185] media: rc: imon: Allow iMON RC protocol for ffdc 7e device Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 068/185] dmaengine: iop-adma: use correct printk format strings Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 069/185] ARM: xscale: fix multi-cpu compilation Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 070/185] perf ftrace: Use CAP_SYS_ADMIN instead of euid==0 Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 071/185] perf record: Support aarch64 random socket_id assignment Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 072/185] ALSA: hda: Add codec on bus address table lately Sasha Levin
2019-09-22 19:06   ` Takashi Iwai
2019-09-23 13:30     ` Sasha Levin
2019-09-23 13:40       ` Takashi Iwai
2019-09-23 16:42         ` Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 073/185] media: vsp1: fix memory leak of dl on error return path Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 074/185] media: i2c: ov5645: Fix power sequence Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 075/185] media: omap3isp: Don't set streaming state on random subdevs Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 076/185] media: imx: mipi csi-2: Don't fail if initial state times-out Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 077/185] kasan/arm64: fix CONFIG_KASAN_SW_TAGS && KASAN_INLINE Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 078/185] ASoC: mediatek: mt6358: add delay after dmic clock on Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 079/185] net: lpc-enet: fix printk format strings Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 080/185] m68k: Prevent some compiler warnings in Coldfire builds Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 081/185] ARM: dts: imx7d: cl-som-imx7: make ethernet work again Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 082/185] ARM: dts: imx7-colibri: disable HS400 Sasha Levin
2019-09-22 18:47 ` Sasha Levin [this message]
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 084/185] media: radio/si470x: kill urb on error Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 085/185] media: hdpvr: add terminating 0 at end of string Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 086/185] ASoC: uniphier: Fix double reset assersion when transitioning to suspend state Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 087/185] powerpc/Makefile: Always pass --synthetic to nm if supported Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 088/185] tools headers: Fixup bitsperlong per arch includes Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 089/185] ASoC: sun4i-i2s: Don't use the oversample to calculate BCLK Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 090/185] ASoC: mchp-i2s-mcc: Wait for RX/TX RDY only if controller is running Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 091/185] led: triggers: Fix a memory leak bug Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 092/185] ASoC: mchp-i2s-mcc: Fix unprepare of GCLK Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 093/185] nbd: add missing config put Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 094/185] ACPI / APEI: Release resources if gen_pool_add() fails Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 095/185] arm64: entry: Move ct_user_exit before any other exception Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 096/185] s390/kasan: provide uninstrumented __strlen Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 097/185] media: mceusb: fix (eliminate) TX IR signal length limit Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 098/185] media: dvb-frontends: use ida for pll number Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 099/185] posix-cpu-timers: Sanitize bogus WARNONS Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 100/185] media: dvb-core: fix a memory leak bug Sasha Levin
2019-09-22 18:47 ` [PATCH AUTOSEL 5.2 101/185] EDAC/amd64: Support more than two controllers for chip selects handling Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 102/185] libperf: Fix alignment trap with xyarray contents in 'perf stat' Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 103/185] EDAC/amd64: Recognize DRAM device type ECC capability Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 104/185] EDAC/amd64: Decode syndrome before translating address Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 105/185] ARM: at91: move platform-specific asm-offset.h to arch/arm/mach-at91 Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 106/185] soc: renesas: rmobile-sysc: Set GENPD_FLAG_ALWAYS_ON for always-on domain Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 107/185] soc: renesas: Enable ARM_ERRATA_754322 for affected Cortex-A9 Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 108/185] PM / devfreq: Fix kernel oops on governor module load Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 109/185] ARM: OMAP2+: move platform-specific asm-offset.h to arch/arm/mach-omap2 Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 110/185] PM / devfreq: passive: Use non-devm notifiers Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 111/185] PM / devfreq: exynos-bus: Correct clock enable sequence Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 112/185] media: cec-notifier: clear cec_adap in cec_notifier_unregister Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 113/185] media: saa7146: add cleanup in hexium_attach() Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 114/185] media: cpia2_usb: fix memory leaks Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 115/185] media: saa7134: fix terminology around saa7134_i2c_eeprom_md7134_gate() Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 116/185] perf trace beauty ioctl: Fix off-by-one error in cmd->string table Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 117/185] perf report: Fix --ns time sort key output Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 118/185] perf script: Fix memory leaks in list_scripts() Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 119/185] media: aspeed-video: address a protential usage of an unitialized var Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 120/185] media: ov9650: add a sanity check Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 121/185] leds: lm3532: Fixes for the driver for stability Sasha Levin
2019-10-02 19:16   ` Pavel Machek
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 122/185] ASoC: es8316: fix headphone mixer volume table Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 123/185] ACPI / CPPC: do not require the _PSD method Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 124/185] sched/cpufreq: Align trace event behavior of fast switching Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 125/185] x86/apic/vector: Warn when vector space exhaustion breaks affinity Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 126/185] arm64: kpti: ensure patched kernel text is fetched from PoU Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 127/185] perf evlist: Use unshare(CLONE_FS) in sb threads to let setns(CLONE_NEWNS) work Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 128/185] x86/mm/pti: Do not invoke PTI functions when PTI is disabled Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 129/185] ASoC: fsl_ssi: Fix clock control issue in master mode Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 130/185] x86/mm/pti: Handle unaligned address gracefully in pti_clone_pagetable() Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 131/185] nvmet: fix data units read and written counters in SMART log Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 132/185] nvme-multipath: fix ana log nsid lookup when nsid is not found Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 133/185] ALSA: firewire-motu: add support for MOTU 4pre Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 134/185] arm64: lse: Make ARM64_LSE_ATOMICS depend on JUMP_LABEL Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 135/185] iommu/amd: Silence warnings under memory pressure Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 136/185] ASoC: Intel: Haswell: Adjust machine device private context Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 137/185] libata/ahci: Drop PCS quirk for Denverton and beyond Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 138/185] iommu/iova: Avoid false sharing on fq_timer_on Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 139/185] libtraceevent: Change users plugin directory Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 140/185] ARM: dts: exynos: Mark LDO10 as always-on on Peach Pit/Pi Chromebooks Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 141/185] x86/amd_nb: Add PCI device IDs for family 17h, model 70h Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 142/185] ACPI: custom_method: fix memory leaks Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 143/185] ACPI / PCI: fix acpi_pci_irq_enable() memory leak Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 144/185] closures: fix a race on wakeup from closure_sync Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 145/185] hwmon: (k10temp) Add support for AMD family 17h, model 70h CPUs Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 146/185] hwmon: (acpi_power_meter) Change log level for 'unsafe software power cap' Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 147/185] md/raid1: fail run raid1 array when active disk less than one Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 148/185] dmaengine: ti: edma: Do not reset reserved paRAM slots Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 149/185] kprobes: Prohibit probing on BUG() and WARN() address Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 150/185] x86/mm: Fix cpumask_of_node() error condition Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 151/185] irqchip/sifive-plic: set max threshold for ignored handlers Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 152/185] s390/crypto: xts-aes-s390 fix extra run-time crypto self tests finding Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 153/185] irqchip/gic-v3-its: Fix LPI release for Multi-MSI devices Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 154/185] x86/platform/uv: Fix kmalloc() NULL check routine Sasha Levin
2019-09-22 20:26   ` Greg KH
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 155/185] x86/cpu: Add Tiger Lake to Intel family Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 156/185] platform/x86: intel_pmc_core: Do not ioremap RAM Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 157/185] ASoC: es8316: support fixed and variable both clock rates Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 158/185] SoC: simple-card-utils: set 0Hz to sysclk when shutdown Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 159/185] ASoC: dmaengine: Make the pcm->name equal to pcm->id if the name is not set Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 160/185] io_uring: fix wrong sequence setting logic Sasha Levin
2019-09-22 18:48 ` [PATCH AUTOSEL 5.2 161/185] block: make rq sector size accessible for block stats Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 162/185] raid5: don't set STRIPE_HANDLE to stripe which is in batch list Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 163/185] mmc: core: Clarify sdio_irq_pending flag for MMC_CAP2_SDIO_IRQ_NOTHREAD Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 164/185] sched/psi: Correct overly pessimistic size calculation Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 165/185] mmc: sdhci: Fix incorrect switch to HS mode Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 166/185] mmc: core: Add helper function to indicate if SDIO IRQs is enabled Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 167/185] mmc: dw_mmc: Re-store SDIO IRQs mask at system resume Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 168/185] raid5: don't increment read_errors on EILSEQ return Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 169/185] mmc: mtk-sd: Re-store SDIO IRQs mask at system resume Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 170/185] media: technisat-usb2: break out of loop at end of buffer Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 171/185] libertas: Add missing sentinel at end of if_usb.c fw_table Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 172/185] e1000e: add workaround for possible stalled packet Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 173/185] ALSA: hda - Add a quirk model for fixing Huawei Matebook X right speaker Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 174/185] ALSA: hda - Drop unsol event handler for Intel HDMI codecs Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 175/185] drm/amd/powerplay/smu7: enforce minimal VBITimeout (v2) Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 176/185] media: ttusb-dec: Fix info-leak in ttusb_dec_send_command() Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 177/185] drm: fix module name in edid_firmware log message Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 178/185] ALSA: hda/realtek - Blacklist PC beep for Lenovo ThinkCentre M73/93 Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 179/185] iommu/amd: Override wrong IVRS IOAPIC on Raven Ridge systems Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 180/185] zd1211rw: remove false assertion from zd_mac_clear() Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 181/185] btrfs: delayed-inode: Kill the BUG_ON() in btrfs_delete_delayed_dir_index() Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 182/185] btrfs: extent-tree: Make sure we only allocate extents from block groups with the same type Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 183/185] btrfs: tree-checker: Add ROOT_ITEM check Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 184/185] btrfs: Detect unbalanced tree with empty leaf before crashing btree operations Sasha Levin
2019-09-22 18:49 ` [PATCH AUTOSEL 5.2 185/185] kvm: Nested KVM MMUs need PAE root too Sasha Levin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190922184924.32534-83-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=andy.shevchenko@gmail.com \
    --cc=hdegoede@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).