All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH -v3 0/4] PCI/PM: PCI D3cold support fixes for 3.6-rc1
@ 2012-08-08  1:07 Huang Ying
  2012-08-08  1:07 ` [BUGFIX -v3 1/4] PCI/PM: enable D3/D3cold by default for most devices Huang Ying
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Huang Ying @ 2012-08-08  1:07 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: linux-kernel, linux-pci, linux-pm, Rafael J. Wysocki, Huang Ying,
	Alan Stern

Changes:

v3:

- Add some comments per Rafael's comments.

v2:

- Change some pm_runtime_put to pm_runtime_put_sync per Alan and Rafael's comments.


[BUGFIX -v3 1/4] PCI/PM: enable D3/D3cold by default for most devices
[BUGFIX -v3 2/4] PCI/PM: Keep parent bridge active when probing device
[BUGFIX -v3 3/4] PCI/PM: Fix config reg access for D3cold and bridge suspending
[PATCH -v3 4/4] PCI/PM: Add ABI document for sysfs file d3cold_allowed

Best Regards,
Huang Ying

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [BUGFIX -v3 1/4] PCI/PM: enable D3/D3cold by default for most devices
  2012-08-08  1:07 [PATCH -v3 0/4] PCI/PM: PCI D3cold support fixes for 3.6-rc1 Huang Ying
@ 2012-08-08  1:07 ` Huang Ying
  2012-08-08  1:07 ` [BUGFIX -v3 2/4] PCI/PM: Keep parent bridge active when probing device Huang Ying
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Huang Ying @ 2012-08-08  1:07 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: linux-kernel, linux-pci, linux-pm, Rafael J. Wysocki, Huang Ying,
	Alan Stern

This patch fixes the following bug:

http://marc.info/?l=linux-usb&m=134318961120825&w=2

Originally, device lower power states include D1, D2, D3.  After that,
D3 is further divided into D3hot and D3cold.  To support both scenario
safely, original D3 is mapped to D3cold.

When adding D3cold support, because worry about some device may have
broken D3cold support, D3cold is disabled by default.  This disable D3
on original platform too.  But some original platform may only have
working D3, but no working D1, D2.  The root cause of the above bug is
it too.

To deal with this, this patch enables D3/D3cold by default for most
devices.  This restores the original behavior.  For some devices that
suspected to have broken D3cold support, such as PCIe port, D3cold is
disabled by default.

Reported-by: Bjorn Mork <bjorn@mork.no>
Signed-off-by: Huang Ying <ying.huang@intel.com>
Reviewed-by: Rafael J. Wysocki <rjw@sisk.pl>
---
 drivers/pci/pci.c              |    1 +
 drivers/pci/pcie/portdrv_pci.c |    5 +++++
 2 files changed, 6 insertions(+)

--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1941,6 +1941,7 @@ void pci_pm_init(struct pci_dev *dev)
 	dev->pm_cap = pm;
 	dev->d3_delay = PCI_PM_D3_WAIT;
 	dev->d3cold_delay = PCI_PM_D3COLD_WAIT;
+	dev->d3cold_allowed = true;
 
 	dev->d1_support = false;
 	dev->d2_support = false;
--- a/drivers/pci/pcie/portdrv_pci.c
+++ b/drivers/pci/pcie/portdrv_pci.c
@@ -200,6 +200,11 @@ static int __devinit pcie_portdrv_probe(
 		return status;
 
 	pci_save_state(dev);
+	/*
+	 * D3cold may not work properly on some PCIe port, so disable
+	 * it by default.
+	 */
+	dev->d3cold_allowed = false;
 	if (!pci_match_id(port_runtime_pm_black_list, dev))
 		pm_runtime_put_noidle(&dev->dev);
 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [BUGFIX -v3 2/4] PCI/PM: Keep parent bridge active when probing device
  2012-08-08  1:07 [PATCH -v3 0/4] PCI/PM: PCI D3cold support fixes for 3.6-rc1 Huang Ying
  2012-08-08  1:07 ` [BUGFIX -v3 1/4] PCI/PM: enable D3/D3cold by default for most devices Huang Ying
@ 2012-08-08  1:07 ` Huang Ying
  2012-08-08  1:07 ` [BUGFIX -v3 3/4] PCI/PM: Fix config reg access for D3cold and bridge suspending Huang Ying
  2012-08-08  1:07 ` [PATCH -v3 4/4] PCI/PM: Add ABI document for sysfs file d3cold_allowed Huang Ying
  3 siblings, 0 replies; 7+ messages in thread
From: Huang Ying @ 2012-08-08  1:07 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: linux-kernel, linux-pci, linux-pm, Rafael J. Wysocki, Huang Ying,
	Alan Stern

This patch fixes the following bug:

http://marc.info/?l=linux-pci&m=134329923124234&w=2

The root cause of the bug is as follow.

If a device is not bound with the corresponding driver, the device
runtime PM will be disabled and the device will be put into suspended
state.  So that, the bridge/PCIe port connected to it may be put into
suspended and low power state.  When do probing for the device later,
because the bridge/PCIe port connected to it is in low power state,
the IO access to device may fail.

To solve the issue, the bridge/PCIe port connected to the device is
put into active state before probing.

Reported-by: Bjorn Mork <bjorn@mork.no>
Signed-off-by: Huang Ying <ying.huang@intel.com>
Reviewed-by: Rafael J. Wysocki <rjw@sisk.pl>
---
 drivers/pci/pci-driver.c |    6 ++++++
 1 file changed, 6 insertions(+)

--- a/drivers/pci/pci-driver.c
+++ b/drivers/pci/pci-driver.c
@@ -280,8 +280,12 @@ static long local_pci_probe(void *_ddi)
 {
 	struct drv_dev_and_id *ddi = _ddi;
 	struct device *dev = &ddi->dev->dev;
+	struct device *parent = dev->parent;
 	int rc;
 
+	/* The parent bridge must be in active state when probing */
+	if (parent)
+		pm_runtime_get_sync(parent);
 	/* Unbound PCI devices are always set to disabled and suspended.
 	 * During probe, the device is set to enabled and active and the
 	 * usage count is incremented.  If the driver supports runtime PM,
@@ -298,6 +302,8 @@ static long local_pci_probe(void *_ddi)
 		pm_runtime_set_suspended(dev);
 		pm_runtime_put_noidle(dev);
 	}
+	if (parent)
+		pm_runtime_put(parent);
 	return rc;
 }
 

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [BUGFIX -v3 3/4] PCI/PM: Fix config reg access for D3cold and bridge suspending
  2012-08-08  1:07 [PATCH -v3 0/4] PCI/PM: PCI D3cold support fixes for 3.6-rc1 Huang Ying
  2012-08-08  1:07 ` [BUGFIX -v3 1/4] PCI/PM: enable D3/D3cold by default for most devices Huang Ying
  2012-08-08  1:07 ` [BUGFIX -v3 2/4] PCI/PM: Keep parent bridge active when probing device Huang Ying
@ 2012-08-08  1:07 ` Huang Ying
  2012-08-10  2:36   ` Huang Ying
  2012-08-08  1:07 ` [PATCH -v3 4/4] PCI/PM: Add ABI document for sysfs file d3cold_allowed Huang Ying
  3 siblings, 1 reply; 7+ messages in thread
From: Huang Ying @ 2012-08-08  1:07 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: linux-kernel, linux-pci, linux-pm, Rafael J. Wysocki, Huang Ying,
	Alan Stern

This patch fixes the following bug:

http://marc.info/?l=linux-pci&m=134338059022620&w=2

Where lspci does not work properly if a device and the corresponding
parent bridge (such as PCIe port) is suspended.  This is because the
device configuration space registers will be not accessible if the
corresponding parent bridge is suspended or the device is put into
D3cold state.

To solve the issue, the bridge/PCIe port connected to the device is
put into active state before read/write configuration space registers.
If the device is in D3cold state, it will be put into active state
too.

To avoid resume/suspend PCIe port for each configuration register
read/write, a small delay is added before the PCIe port to go
suspended.

Reported-by: Bjorn Mork <bjorn@mork.no>
Signed-off-by: Huang Ying <ying.huang@intel.com>
---
 drivers/pci/pci-sysfs.c        |   43 +++++++++++++++++++++++++++++++++++++++++
 drivers/pci/pcie/portdrv_pci.c |    9 ++++++++
 2 files changed, 52 insertions(+)

--- a/drivers/pci/pci-sysfs.c
+++ b/drivers/pci/pci-sysfs.c
@@ -458,6 +458,41 @@ boot_vga_show(struct device *dev, struct
 }
 struct device_attribute vga_attr = __ATTR_RO(boot_vga);
 
+static void
+pci_config_pm_runtime_get(struct pci_dev *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct device *parent = dev->parent;
+
+	if (parent)
+		pm_runtime_get_sync(parent);
+	pm_runtime_get_noresume(dev);
+	/*
+	 * pdev->current_state is set to PCI_D3cold during suspending,
+	 * so wait until suspending completes
+	 */
+	pm_runtime_barrier(dev);
+	if (pdev->current_state == PCI_D3cold) {
+		/*
+		 * Already called pm_runtime_get_noresume above, so
+		 * just calling pm_runtime_resume is sufficient, need
+		 * not to call pm_runtime_get_sync.
+		 */
+		pm_runtime_resume(dev);
+	}
+}
+
+static void
+pci_config_pm_runtime_put(struct pci_dev *pdev)
+{
+	struct device *dev = &pdev->dev;
+	struct device *parent = dev->parent;
+
+	pm_runtime_put(dev);
+	if (parent)
+		pm_runtime_put_sync(parent);
+}
+
 static ssize_t
 pci_read_config(struct file *filp, struct kobject *kobj,
 		struct bin_attribute *bin_attr,
@@ -484,6 +519,8 @@ pci_read_config(struct file *filp, struc
 		size = count;
 	}
 
+	pci_config_pm_runtime_get(dev);
+
 	if ((off & 1) && size) {
 		u8 val;
 		pci_user_read_config_byte(dev, off, &val);
@@ -529,6 +566,8 @@ pci_read_config(struct file *filp, struc
 		--size;
 	}
 
+	pci_config_pm_runtime_put(dev);
+
 	return count;
 }
 
@@ -549,6 +588,8 @@ pci_write_config(struct file* filp, stru
 		count = size;
 	}
 	
+	pci_config_pm_runtime_get(dev);
+
 	if ((off & 1) && size) {
 		pci_user_write_config_byte(dev, off, data[off - init_off]);
 		off++;
@@ -587,6 +628,8 @@ pci_write_config(struct file* filp, stru
 		--size;
 	}
 
+	pci_config_pm_runtime_put(dev);
+
 	return count;
 }
 
--- a/drivers/pci/pcie/portdrv_pci.c
+++ b/drivers/pci/pcie/portdrv_pci.c
@@ -140,9 +140,17 @@ static int pcie_port_runtime_resume(stru
 {
 	return 0;
 }
+
+static int pcie_port_runtime_idle(struct device *dev)
+{
+	/* Delay for a short while to prevent too frequent suspend/resume */
+	pm_schedule_suspend(dev, 10);
+	return -EBUSY;
+}
 #else
 #define pcie_port_runtime_suspend	NULL
 #define pcie_port_runtime_resume	NULL
+#define pcie_port_runtime_idle		NULL
 #endif
 
 static const struct dev_pm_ops pcie_portdrv_pm_ops = {
@@ -155,6 +163,7 @@ static const struct dev_pm_ops pcie_port
 	.resume_noirq	= pcie_port_resume_noirq,
 	.runtime_suspend = pcie_port_runtime_suspend,
 	.runtime_resume = pcie_port_runtime_resume,
+	.runtime_idle	= pcie_port_runtime_idle,
 };
 
 #define PCIE_PORTDRV_PM_OPS	(&pcie_portdrv_pm_ops)

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH -v3 4/4] PCI/PM: Add ABI document for sysfs file d3cold_allowed
  2012-08-08  1:07 [PATCH -v3 0/4] PCI/PM: PCI D3cold support fixes for 3.6-rc1 Huang Ying
                   ` (2 preceding siblings ...)
  2012-08-08  1:07 ` [BUGFIX -v3 3/4] PCI/PM: Fix config reg access for D3cold and bridge suspending Huang Ying
@ 2012-08-08  1:07 ` Huang Ying
  3 siblings, 0 replies; 7+ messages in thread
From: Huang Ying @ 2012-08-08  1:07 UTC (permalink / raw)
  To: Bjorn Helgaas
  Cc: linux-kernel, linux-pci, linux-pm, Rafael J. Wysocki, Huang Ying,
	Alan Stern

This patch adds ABI document for the following sysfs file:

/sys/bus/pci/devices/.../d3cold_allowed

Signed-off-by: Huang Ying <ying.huang@intel.com>
Acked-by: Rafael J. Wysocki <rjw@sisk.pl>
---
 Documentation/ABI/testing/sysfs-bus-pci |   12 ++++++++++++
 1 file changed, 12 insertions(+)

--- a/Documentation/ABI/testing/sysfs-bus-pci
+++ b/Documentation/ABI/testing/sysfs-bus-pci
@@ -210,3 +210,15 @@ Users:
 		firmware assigned instance number of the PCI
 		device that can help in understanding the firmware
 		intended order of the PCI device.
+
+What:		/sys/bus/pci/devices/.../d3cold_allowed
+Date:		July 2012
+Contact:	Huang Ying <ying.huang@intel.com>
+Description:
+		d3cold_allowed is bit to control whether the corresponding PCI
+		device can be put into D3Cold state.  If it is cleared, the
+		device will never be put into D3Cold state.  If it is set, the
+		device may be put into D3Cold state if other requirements are
+		satisfied too.  Reading this attribute will show the current
+		value of d3cold_allowed bit.  Writing this attribute will set
+		the value of d3cold_allowed bit.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [BUGFIX -v3 3/4] PCI/PM: Fix config reg access for D3cold and bridge suspending
  2012-08-08  1:07 ` [BUGFIX -v3 3/4] PCI/PM: Fix config reg access for D3cold and bridge suspending Huang Ying
@ 2012-08-10  2:36   ` Huang Ying
  2012-08-14 21:53     ` Rafael J. Wysocki
  0 siblings, 1 reply; 7+ messages in thread
From: Huang Ying @ 2012-08-10  2:36 UTC (permalink / raw)
  To: Rafael J. Wysocki
  Cc: linux-kernel, linux-pci, linux-pm, Alan Stern, Bjorn Helgaas

On Wed, 2012-08-08 at 09:07 +0800, Huang Ying wrote:
> This patch fixes the following bug:
> 
> http://marc.info/?l=linux-pci&m=134338059022620&w=2
> 
> Where lspci does not work properly if a device and the corresponding
> parent bridge (such as PCIe port) is suspended.  This is because the
> device configuration space registers will be not accessible if the
> corresponding parent bridge is suspended or the device is put into
> D3cold state.
> 
> To solve the issue, the bridge/PCIe port connected to the device is
> put into active state before read/write configuration space registers.
> If the device is in D3cold state, it will be put into active state
> too.
> 
> To avoid resume/suspend PCIe port for each configuration register
> read/write, a small delay is added before the PCIe port to go
> suspended.
> 
> Reported-by: Bjorn Mork <bjorn@mork.no>
> Signed-off-by: Huang Ying <ying.huang@intel.com>
> ---
>  drivers/pci/pci-sysfs.c        |   43 +++++++++++++++++++++++++++++++++++++++++
>  drivers/pci/pcie/portdrv_pci.c |    9 ++++++++
>  2 files changed, 52 insertions(+)
> 
> --- a/drivers/pci/pci-sysfs.c
> +++ b/drivers/pci/pci-sysfs.c
> @@ -458,6 +458,41 @@ boot_vga_show(struct device *dev, struct
>  }
>  struct device_attribute vga_attr = __ATTR_RO(boot_vga);
>  
> +static void
> +pci_config_pm_runtime_get(struct pci_dev *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct device *parent = dev->parent;
> +
> +	if (parent)
> +		pm_runtime_get_sync(parent);
> +	pm_runtime_get_noresume(dev);
> +	/*
> +	 * pdev->current_state is set to PCI_D3cold during suspending,
> +	 * so wait until suspending completes
> +	 */
> +	pm_runtime_barrier(dev);
> +	if (pdev->current_state == PCI_D3cold) {
> +		/*
> +		 * Already called pm_runtime_get_noresume above, so
> +		 * just calling pm_runtime_resume is sufficient, need
> +		 * not to call pm_runtime_get_sync.
> +		 */
> +		pm_runtime_resume(dev);

Hi, Rafael,

Do you OK with this new version and the comments added above?

Best Regards,
Huang Ying

> +	}
> +}
> +
> +static void
> +pci_config_pm_runtime_put(struct pci_dev *pdev)
> +{
> +	struct device *dev = &pdev->dev;
> +	struct device *parent = dev->parent;
> +
> +	pm_runtime_put(dev);
> +	if (parent)
> +		pm_runtime_put_sync(parent);
> +}
> +
>  static ssize_t
>  pci_read_config(struct file *filp, struct kobject *kobj,
>  		struct bin_attribute *bin_attr,
> @@ -484,6 +519,8 @@ pci_read_config(struct file *filp, struc
>  		size = count;
>  	}
>  
> +	pci_config_pm_runtime_get(dev);
> +
>  	if ((off & 1) && size) {
>  		u8 val;
>  		pci_user_read_config_byte(dev, off, &val);
> @@ -529,6 +566,8 @@ pci_read_config(struct file *filp, struc
>  		--size;
>  	}
>  
> +	pci_config_pm_runtime_put(dev);
> +
>  	return count;
>  }
>  
> @@ -549,6 +588,8 @@ pci_write_config(struct file* filp, stru
>  		count = size;
>  	}
>  	
> +	pci_config_pm_runtime_get(dev);
> +
>  	if ((off & 1) && size) {
>  		pci_user_write_config_byte(dev, off, data[off - init_off]);
>  		off++;
> @@ -587,6 +628,8 @@ pci_write_config(struct file* filp, stru
>  		--size;
>  	}
>  
> +	pci_config_pm_runtime_put(dev);
> +
>  	return count;
>  }
>  
> --- a/drivers/pci/pcie/portdrv_pci.c
> +++ b/drivers/pci/pcie/portdrv_pci.c
> @@ -140,9 +140,17 @@ static int pcie_port_runtime_resume(stru
>  {
>  	return 0;
>  }
> +
> +static int pcie_port_runtime_idle(struct device *dev)
> +{
> +	/* Delay for a short while to prevent too frequent suspend/resume */
> +	pm_schedule_suspend(dev, 10);
> +	return -EBUSY;
> +}
>  #else
>  #define pcie_port_runtime_suspend	NULL
>  #define pcie_port_runtime_resume	NULL
> +#define pcie_port_runtime_idle		NULL
>  #endif
>  
>  static const struct dev_pm_ops pcie_portdrv_pm_ops = {
> @@ -155,6 +163,7 @@ static const struct dev_pm_ops pcie_port
>  	.resume_noirq	= pcie_port_resume_noirq,
>  	.runtime_suspend = pcie_port_runtime_suspend,
>  	.runtime_resume = pcie_port_runtime_resume,
> +	.runtime_idle	= pcie_port_runtime_idle,
>  };
>  
>  #define PCIE_PORTDRV_PM_OPS	(&pcie_portdrv_pm_ops)



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [BUGFIX -v3 3/4] PCI/PM: Fix config reg access for D3cold and bridge suspending
  2012-08-10  2:36   ` Huang Ying
@ 2012-08-14 21:53     ` Rafael J. Wysocki
  0 siblings, 0 replies; 7+ messages in thread
From: Rafael J. Wysocki @ 2012-08-14 21:53 UTC (permalink / raw)
  To: Huang Ying; +Cc: linux-kernel, linux-pci, linux-pm, Alan Stern, Bjorn Helgaas

Sorry for the delay.

On Friday, August 10, 2012, Huang Ying wrote:
> On Wed, 2012-08-08 at 09:07 +0800, Huang Ying wrote:
> > This patch fixes the following bug:
> > 
> > http://marc.info/?l=linux-pci&m=134338059022620&w=2
> > 
> > Where lspci does not work properly if a device and the corresponding
> > parent bridge (such as PCIe port) is suspended.  This is because the
> > device configuration space registers will be not accessible if the
> > corresponding parent bridge is suspended or the device is put into
> > D3cold state.
> > 
> > To solve the issue, the bridge/PCIe port connected to the device is
> > put into active state before read/write configuration space registers.
> > If the device is in D3cold state, it will be put into active state
> > too.
> > 
> > To avoid resume/suspend PCIe port for each configuration register
> > read/write, a small delay is added before the PCIe port to go
> > suspended.
> > 
> > Reported-by: Bjorn Mork <bjorn@mork.no>
> > Signed-off-by: Huang Ying <ying.huang@intel.com>
> > ---
> >  drivers/pci/pci-sysfs.c        |   43 +++++++++++++++++++++++++++++++++++++++++
> >  drivers/pci/pcie/portdrv_pci.c |    9 ++++++++
> >  2 files changed, 52 insertions(+)
> > 
> > --- a/drivers/pci/pci-sysfs.c
> > +++ b/drivers/pci/pci-sysfs.c
> > @@ -458,6 +458,41 @@ boot_vga_show(struct device *dev, struct
> >  }
> >  struct device_attribute vga_attr = __ATTR_RO(boot_vga);
> >  
> > +static void
> > +pci_config_pm_runtime_get(struct pci_dev *pdev)
> > +{
> > +	struct device *dev = &pdev->dev;
> > +	struct device *parent = dev->parent;
> > +
> > +	if (parent)
> > +		pm_runtime_get_sync(parent);
> > +	pm_runtime_get_noresume(dev);
> > +	/*
> > +	 * pdev->current_state is set to PCI_D3cold during suspending,
> > +	 * so wait until suspending completes
> > +	 */
> > +	pm_runtime_barrier(dev);
> > +	if (pdev->current_state == PCI_D3cold) {
> > +		/*
> > +		 * Already called pm_runtime_get_noresume above, so
> > +		 * just calling pm_runtime_resume is sufficient, need
> > +		 * not to call pm_runtime_get_sync.
> > +		 */
> > +		pm_runtime_resume(dev);
> 
> Hi, Rafael,
> 
> Do you OK with this new version and the comments added above?

I meant something different.  Namely, it may not be entirely clear why
we make the effort to check if pdev->current_state is equal to PCI_D3cold
instead of just calling pm_runtime_get_sync() right after resuming the
parent.

My understanding is that we do it because in principle the device may
be suspended, but not in D3cold, and in that case we don't need to
resume it.  If that is the reason, it may be a good idea to document it
in a comment.

The comment explaining why the barrier is there is clearly useful, though.

Thanks,
Rafael

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2012-08-14 21:48 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-08  1:07 [PATCH -v3 0/4] PCI/PM: PCI D3cold support fixes for 3.6-rc1 Huang Ying
2012-08-08  1:07 ` [BUGFIX -v3 1/4] PCI/PM: enable D3/D3cold by default for most devices Huang Ying
2012-08-08  1:07 ` [BUGFIX -v3 2/4] PCI/PM: Keep parent bridge active when probing device Huang Ying
2012-08-08  1:07 ` [BUGFIX -v3 3/4] PCI/PM: Fix config reg access for D3cold and bridge suspending Huang Ying
2012-08-10  2:36   ` Huang Ying
2012-08-14 21:53     ` Rafael J. Wysocki
2012-08-08  1:07 ` [PATCH -v3 4/4] PCI/PM: Add ABI document for sysfs file d3cold_allowed Huang Ying

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.