All of lore.kernel.org
 help / color / mirror / Atom feed
From: Tang Chen <tangchen@cn.fujitsu.com>
To: Yinghai Lu <yinghai@kernel.org>
Cc: Bjorn Helgaas <bhelgaas@google.com>, Len Brown <lenb@kernel.org>,
	Taku Izumi <izumi.taku@jp.fujitsu.com>,
	Jiang Liu <jiang.liu@huawei.com>, x86 <x86@kernel.org>,
	Andrew Morton <akpm@linux-foundation.org>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-acpi@vger.kernel.org
Subject: Re: [PATCH 22/40] PCI, acpiphp: Separate out hot-add support of pci host bridge
Date: Fri, 12 Oct 2012 18:36:52 +0800	[thread overview]
Message-ID: <5077F2C4.4000203@cn.fujitsu.com> (raw)
In-Reply-To: <1348080894-23412-23-git-send-email-yinghai@kernel.org>

Hi Yinghai,

When I was reviewing this patch, I found a little problem.

Please refer to email:
[PATCH 0/3] Find pci root bridges by comparing HID from 
acpi_device_info, not acpi_device.

I could be wrong. :)
If I didn't consider your idea correct, or you have a better solution,
please let me know.

Thanks. :)


On 09/20/2012 02:54 AM, Yinghai Lu wrote:
> It causes confusion.
>
> We may only need acpi hp for pci host bridge.
>
> Split host bridge hot-add support to pci_root_hp, and keep acpiphp simple.
>
> Also remove not used res_lock in the struct.
>
> -v2: put back pci_root_hp change in one patch
> -v3: add pcibios_resource_survey_bus() calling
> -v4: remove not needed code with remove_bridge
> -v5: put back support for acpiphp support for slots just on root bus.
> -v6: change some functions to *_p2p_* to make it more clean.
>
> Signed-off-by: Yinghai Lu<yinghai@kernel.org>
> ---
>   drivers/acpi/Makefile              |    1 +
>   drivers/acpi/pci_root_hp.c         |  238 ++++++++++++++++++++++++++++++++++++
>   drivers/pci/hotplug/acpiphp_glue.c |   59 +++-------
>   3 files changed, 254 insertions(+), 44 deletions(-)
>   create mode 100644 drivers/acpi/pci_root_hp.c
>
> diff --git a/drivers/acpi/Makefile b/drivers/acpi/Makefile
> index 47199e2..c9abd4c 100644
> --- a/drivers/acpi/Makefile
> +++ b/drivers/acpi/Makefile
> @@ -36,6 +36,7 @@ acpi-y				+= processor_core.o
>   acpi-y				+= ec.o
>   acpi-$(CONFIG_ACPI_DOCK)	+= dock.o
>   acpi-y				+= pci_root.o pci_link.o pci_irq.o pci_bind.o
> +acpi-$(CONFIG_HOTPLUG)		+= pci_root_hp.o
>   acpi-y				+= power.o
>   acpi-y				+= event.o
>   acpi-y				+= sysfs.o
> diff --git a/drivers/acpi/pci_root_hp.c b/drivers/acpi/pci_root_hp.c
> new file mode 100644
> index 0000000..e07c31b
> --- /dev/null
> +++ b/drivers/acpi/pci_root_hp.c
> @@ -0,0 +1,238 @@
> +/*
> + * Separated from drivers/pci/hotplug/acpiphp_glue.c
> + *	only support root bridge
> + */
> +
> +#include<linux/init.h>
> +#include<linux/module.h>
> +
> +#include<linux/kernel.h>
> +#include<linux/pci.h>
> +#include<linux/mutex.h>
> +#include<linux/slab.h>
> +#include<linux/acpi.h>
> +
> +static LIST_HEAD(acpi_root_bridge_list);
> +struct acpi_root_bridge {
> +	struct list_head list;
> +	acpi_handle handle;
> +	u32 flags;
> +};
> +
> +/* bridge flags */
> +#define ROOT_BRIDGE_HAS_EJ0	(0x00000002)
> +#define ROOT_BRIDGE_HAS_PS3	(0x00000080)
> +
> +#define ACPI_STA_FUNCTIONING	(0x00000008)
> +
> +static struct acpi_root_bridge *acpi_root_handle_to_bridge(acpi_handle handle)
> +{
> +	struct acpi_root_bridge *bridge;
> +
> +	list_for_each_entry(bridge,&acpi_root_bridge_list, list)
> +		if (bridge->handle == handle)
> +			return bridge;
> +
> +	return NULL;
> +}
> +
> +/* allocate and initialize host bridge data structure */
> +static void add_acpi_root_bridge(acpi_handle handle)
> +{
> +	struct acpi_root_bridge *bridge;
> +	acpi_handle dummy_handle;
> +	acpi_status status;
> +
> +	/* if the bridge doesn't have _STA, we assume it is always there */
> +	status = acpi_get_handle(handle, "_STA",&dummy_handle);
> +	if (ACPI_SUCCESS(status)) {
> +		unsigned long long tmp;
> +
> +		status = acpi_evaluate_integer(handle, "_STA", NULL,&tmp);
> +		if (ACPI_FAILURE(status)) {
> +			printk(KERN_DEBUG "%s: _STA evaluation failure\n",
> +						 __func__);
> +			return;
> +		}
> +		if ((tmp&  ACPI_STA_FUNCTIONING) == 0)
> +			/* don't register this object */
> +			return;
> +	}
> +
> +	bridge = kzalloc(sizeof(struct acpi_root_bridge), GFP_KERNEL);
> +	if (!bridge)
> +		return;
> +
> +	bridge->handle = handle;
> +
> +	if (ACPI_SUCCESS(acpi_get_handle(handle, "_EJ0",&dummy_handle)))
> +		bridge->flags |= ROOT_BRIDGE_HAS_EJ0;
> +	if (ACPI_SUCCESS(acpi_get_handle(handle, "_PS3",&dummy_handle)))
> +		bridge->flags |= ROOT_BRIDGE_HAS_PS3;
> +
> +	list_add(&bridge->list,&acpi_root_bridge_list);
> +}
> +
> +struct acpi_root_hp_work {
> +	struct work_struct work;
> +	acpi_handle handle;
> +	u32 type;
> +	void *context;
> +};
> +
> +static void alloc_acpi_root_hp_work(acpi_handle handle, u32 type,
> +					void *context,
> +					void (*func)(struct work_struct *work))
> +{
> +	struct acpi_root_hp_work *hp_work;
> +	int ret;
> +
> +	hp_work = kmalloc(sizeof(*hp_work), GFP_KERNEL);
> +	if (!hp_work)
> +		return;
> +
> +	hp_work->handle = handle;
> +	hp_work->type = type;
> +	hp_work->context = context;
> +
> +	INIT_WORK(&hp_work->work, func);
> +	ret = queue_work(kacpi_hotplug_wq,&hp_work->work);
> +	if (!ret)
> +		kfree(hp_work);
> +}
> +
> +/* Program resources in newly inserted bridge */
> +static void acpi_root_configure_bridge(acpi_handle handle)
> +{
> +	struct acpi_pci_root *root = acpi_pci_find_root(handle);
> +
> +	pcibios_resource_survey_bus(root->bus);
> +	pci_assign_unassigned_bus_resources(root->bus);
> +}
> +
> +static void handle_root_bridge_insertion(acpi_handle handle)
> +{
> +	struct acpi_device *device, *pdevice;
> +	acpi_handle phandle;
> +	int ret_val;
> +
> +	acpi_get_parent(handle,&phandle);
> +	if (acpi_bus_get_device(phandle,&pdevice)) {
> +		printk(KERN_DEBUG "no parent device, assuming NULL\n");
> +		pdevice = NULL;
> +	}
> +	if (!acpi_bus_get_device(handle,&device)) {
> +		/* check if  pci root_bus is removed */
> +		struct acpi_pci_root *root = acpi_driver_data(device);
> +		if (pci_find_bus(root->segment, root->secondary.start))
> +			return;
> +
> +		printk(KERN_DEBUG "bus exists... trim\n");
> +		/* this shouldn't be in here, so remove
> +		 * the bus then re-add it...
> +		 */
> +		ret_val = acpi_bus_trim(device, 1);
> +		printk(KERN_DEBUG "acpi_bus_trim return %x\n", ret_val);
> +	}
> +	if (acpi_bus_add(&device, pdevice, handle, ACPI_BUS_TYPE_DEVICE)) {
> +		printk(KERN_ERR "cannot add bridge to acpi list\n");
> +		return;
> +	}
> +	acpi_root_configure_bridge(handle);
> +	if (acpi_bus_start(device))
> +		printk(KERN_ERR "cannot start bridge\n");
> +}
> +
> +static void _handle_hotplug_event_root(struct work_struct *work)
> +{
> +	struct acpi_root_bridge *bridge;
> +	char objname[64];
> +	struct acpi_buffer buffer = { .length = sizeof(objname),
> +				      .pointer = objname };
> +	struct acpi_root_hp_work *hp_work;
> +	acpi_handle handle;
> +	u32 type;
> +
> +	hp_work = container_of(work, struct acpi_root_hp_work, work);
> +	handle = hp_work->handle;
> +	type = hp_work->type;
> +
> +	bridge = acpi_root_handle_to_bridge(handle);
> +
> +	acpi_get_name(handle, ACPI_FULL_PATHNAME,&buffer);
> +
> +	switch (type) {
> +	case ACPI_NOTIFY_BUS_CHECK:
> +		/* bus enumerate */
> +		printk(KERN_DEBUG "%s: Bus check notify on %s\n", __func__,
> +				 objname);
> +		if (!bridge) {
> +			handle_root_bridge_insertion(handle);
> +			add_acpi_root_bridge(handle);
> +		}
> +
> +		break;
> +
> +	case ACPI_NOTIFY_DEVICE_CHECK:
> +		/* device check */
> +		printk(KERN_DEBUG "%s: Device check notify on %s\n", __func__,
> +				 objname);
> +		if (!bridge) {
> +			handle_root_bridge_insertion(handle);
> +			add_acpi_root_bridge(handle);
> +		}
> +		break;
> +
> +	default:
> +		printk(KERN_WARNING "notify_handler: unknown event type 0x%x for %s\n",
> +				 type, objname);
> +		break;
> +	}
> +
> +	kfree(hp_work); /* allocated in handle_hotplug_event_bridge */
> +}
> +
> +static void handle_hotplug_event_root(acpi_handle handle, u32 type,
> +					void *context)
> +{
> +	alloc_acpi_root_hp_work(handle, type, context,
> +				_handle_hotplug_event_root);
> +}
> +
> +static acpi_status __init
> +find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
> +{
> +	char objname[64];
> +	struct acpi_buffer buffer = { .length = sizeof(objname),
> +				      .pointer = objname };
> +	int *count = (int *)context;
> +
> +	if (!acpi_is_root_bridge(handle))
> +		return AE_OK;
> +
> +	(*count)++;
> +
> +	acpi_get_name(handle, ACPI_FULL_PATHNAME,&buffer);
> +
> +	acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
> +				handle_hotplug_event_root, NULL);
> +	printk(KERN_DEBUG "acpi root: %s notify handler installed\n", objname);
> +
> +	add_acpi_root_bridge(handle);
> +
> +	return AE_OK;
> +}
> +
> +static int __init acpi_pci_root_hp_init(void)
> +{
> +	int num = 0;
> +
> +	acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
> +		ACPI_UINT32_MAX, find_root_bridges, NULL,&num, NULL);
> +
> +	printk(KERN_DEBUG "Found %d acpi root devices\n", num);
> +
> +	return 0;
> +}
> +
> +subsys_initcall(acpi_pci_root_hp_init);
> diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c
> index 6cb1923..00fa414 100644
> --- a/drivers/pci/hotplug/acpiphp_glue.c
> +++ b/drivers/pci/hotplug/acpiphp_glue.c
> @@ -521,10 +521,13 @@ static void cleanup_bridge(struct acpiphp_bridge *bridge)
>   	acpi_status status;
>   	acpi_handle handle = bridge->handle;
>
> -	status = acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
> +	if (bridge->type != BRIDGE_TYPE_HOST) {
> +		status = acpi_remove_notify_handler(handle,
> +					    ACPI_SYSTEM_NOTIFY,
>   					    handle_hotplug_event_bridge);
> -	if (ACPI_FAILURE(status))
> -		err("failed to remove notify handler\n");
> +		if (ACPI_FAILURE(status))
> +			err("failed to remove notify handler\n");
> +	}
>
>   	if ((bridge->type != BRIDGE_TYPE_HOST)&&
>   	((bridge->flags&  BRIDGE_HAS_EJ0)&&  bridge->func)) {
> @@ -607,9 +610,6 @@ static void remove_bridge(acpi_handle handle)
>   	bridge = acpiphp_handle_to_bridge(handle);
>   	if (bridge)
>   		cleanup_bridge(bridge);
> -	else
> -		acpi_remove_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
> -					   handle_hotplug_event_bridge);
>   }
>
>   static int power_on_slot(struct acpiphp_slot *slot)
> @@ -1110,18 +1110,12 @@ static void acpiphp_sanitize_bus(struct pci_bus *bus)
>   }
>
>   /* Program resources in newly inserted bridge */
> -static int acpiphp_configure_bridge (acpi_handle handle)
> +static int acpiphp_configure_p2p_bridge(acpi_handle handle)
>   {
> -	struct pci_bus *bus;
> +	struct pci_dev *pdev = acpi_get_pci_dev(handle);
> +	struct pci_bus *bus = pdev->subordinate;
>
> -	if (acpi_is_root_bridge(handle)) {
> -		struct acpi_pci_root *root = acpi_pci_find_root(handle);
> -		bus = root->bus;
> -	} else {
> -		struct pci_dev *pdev = acpi_get_pci_dev(handle);
> -		bus = pdev->subordinate;
> -		pci_dev_put(pdev);
> -	}
> +	pci_dev_put(pdev);
>
>   	pci_bus_size_bridges(bus);
>   	pci_bus_assign_resources(bus);
> @@ -1131,7 +1125,7 @@ static int acpiphp_configure_bridge (acpi_handle handle)
>   	return 0;
>   }
>
> -static void handle_bridge_insertion(acpi_handle handle, u32 type)
> +static void handle_p2p_bridge_insertion(acpi_handle handle, u32 type)
>   {
>   	struct acpi_device *device, *pdevice;
>   	acpi_handle phandle;
> @@ -1151,9 +1145,9 @@ static void handle_bridge_insertion(acpi_handle handle, u32 type)
>   		err("cannot add bridge to acpi list\n");
>   		return;
>   	}
> -	if (!acpiphp_configure_bridge(handle)&&
> +	if (!acpiphp_configure_p2p_bridge(handle)&&
>   		!acpi_bus_start(device))
> -		add_bridge(handle);
> +		add_p2p_bridge(handle);
>   	else
>   		err("cannot configure and start bridge\n");
>
> @@ -1239,7 +1233,7 @@ static void _handle_hotplug_event_bridge(struct work_struct *work)
>
>   	if (acpi_bus_get_device(handle,&device)) {
>   		/* This bridge must have just been physically inserted */
> -		handle_bridge_insertion(handle, type);
> +		handle_p2p_bridge_insertion(handle, type);
>   		goto out;
>   	}
>
> @@ -1416,21 +1410,6 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type,
>   			      _handle_hotplug_event_func);
>   }
>
> -static acpi_status
> -find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
> -{
> -	int *count = (int *)context;
> -
> -	if (!acpi_is_root_bridge(handle))
> -		return AE_OK;
> -
> -	(*count)++;
> -	acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
> -				    handle_hotplug_event_bridge, NULL);
> -
> -	return AE_OK ;
> -}
> -
>   static struct acpi_pci_driver acpi_pci_hp_driver = {
>   	.add =		add_bridge,
>   	.remove =	remove_bridge,
> @@ -1441,15 +1420,7 @@ static struct acpi_pci_driver acpi_pci_hp_driver = {
>    */
>   int __init acpiphp_glue_init(void)
>   {
> -	int num = 0;
> -
> -	acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
> -			ACPI_UINT32_MAX, find_root_bridges, NULL,&num, NULL);
> -
> -	if (num<= 0)
> -		return -1;
> -	else
> -		acpi_pci_register_driver(&acpi_pci_hp_driver);
> +	acpi_pci_register_driver(&acpi_pci_hp_driver);
>
>   	return 0;
>   }

  reply	other threads:[~2012-10-12 10:36 UTC|newest]

Thread overview: 63+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-02 21:50 [PATCH part2 0/6] PCI, x86: pci root bus hotplug support - part2 Yinghai Lu
2012-09-02 21:50 ` [PATCH part2 1/6] x86, PCI: Separate pcibios_allocate_bridge_resources() Yinghai Lu
2012-09-02 21:50 ` [PATCH part2 2/6] x86, PCI: Separate pcibios_allocate_dev_resources() Yinghai Lu
2012-09-02 21:50 ` [PATCH part2 3/6] x86, PCI: Let pcibios_allocate_bus_resources() take bus instead Yinghai Lu
2012-09-02 21:50 ` [PATCH part2 4/6] x86, PCI: Separate rom resource claim out Yinghai Lu
2012-09-17 23:38   ` Bjorn Helgaas
2012-09-18  3:18     ` Yinghai Lu
2012-09-02 21:50 ` [PATCH part2 5/6] PCI, x86: Add pcibios_fw_addr_done Yinghai Lu
2012-09-02 21:50 ` [PATCH part2 6/6] PCI: Claim hw/fw allocated resources in hot add path Yinghai Lu
2012-09-18  0:12   ` Bjorn Helgaas
2012-09-18  4:44     ` Yinghai Lu
2012-09-18  5:36       ` Yinghai Lu
2012-09-19 18:54         ` [PATCH 00/40] PCI, ACPI, x86: pci root bus hotplug support Yinghai Lu
2012-09-19 18:54           ` [PATCH 01/40] PCI: fix default vga ref_count Yinghai Lu
2012-09-21 20:52             ` Bjorn Helgaas
2012-09-21 21:18               ` Yinghai Lu
2012-09-23 15:25             ` Jiang Liu
2012-09-19 18:54           ` [PATCH 02/40] PCI, x86: clear initial value for root info resources Yinghai Lu
2012-09-19 18:54           ` [PATCH 03/40] PCI, ia64: " Yinghai Lu
2012-09-19 18:54             ` Yinghai Lu
2012-09-19 18:54           ` [PATCH 04/40] PCI, acpiphp: Add is_hotplug_bridge detection Yinghai Lu
2012-09-19 18:54           ` [PATCH 05/40] PCI: Add root bus children dev's res to fail list Yinghai Lu
2012-09-19 18:54           ` [PATCH 06/40] PCI: Split out stop_bus_device and remove_bus_dev again Yinghai Lu
2012-09-19 18:54           ` [PATCH 07/40] x86, PCI: Separate pcibios_allocate_bridge_resources() Yinghai Lu
2012-09-19 18:54           ` [PATCH 08/40] x86, PCI: Separate pcibios_allocate_dev_resources() Yinghai Lu
2012-09-19 18:54           ` [PATCH 09/40] x86, PCI: Let pcibios_allocate_bus_resources() take bus instead Yinghai Lu
2012-09-19 18:54           ` [PATCH 10/40] x86, PCI: Separate rom resource claim out Yinghai Lu
2012-09-19 18:54           ` [PATCH 11/40] PCI, x86: Add pcibios_fw_addr_done Yinghai Lu
2012-09-19 18:54           ` [PATCH 12/40] PCI, x86: Remove __init for hw/fw allocated functions Yinghai Lu
2012-09-19 18:54           ` [PATCH 13/40] PCI: Claim hw/fw allocated resources in hot add path Yinghai Lu
2012-09-19 18:54           ` [PATCH 14/40] PCI: Separate out pci_assign_unassigned_bus_resources() Yinghai Lu
2012-09-19 18:54           ` [PATCH 15/40] PCI: Move back pci_rescan_bus() to probe.c Yinghai Lu
2012-09-19 18:54           ` [PATCH 16/40] PCI: pci_bus_size_bridges() should not size own bridge Yinghai Lu
2012-09-19 18:54           ` [PATCH 17/40] PCI: Use __pci_bus_size_bridges() directly in pci_assign_unassigned_bus_resources() Yinghai Lu
2012-09-19 18:54           ` [PATCH 18/40] PCI: Rescan bus using callback method too Yinghai Lu
2012-09-19 18:54           ` [PATCH 19/40] PCI, sysfs: Clean up rescan/remove with schedule_callback Yinghai Lu
2012-09-19 18:54           ` [PATCH 20/40] PCI: Fix a device reference count leakage issue in pci_dev_present() Yinghai Lu
2012-09-19 18:54           ` [PATCH 21/40] PCI: Add pci_stop_and_remove_root_bus() Yinghai Lu
2012-09-19 18:54           ` [PATCH 22/40] PCI, acpiphp: Separate out hot-add support of pci host bridge Yinghai Lu
2012-10-12 10:36             ` Tang Chen [this message]
2012-09-19 18:54           ` [PATCH 23/40] PCI, ACPI: Pass device instead of handle when config root bridge Yinghai Lu
2012-09-19 18:54           ` [PATCH 24/40] PCI, acpi: Update acpi_pci_driver add/remove interface Yinghai Lu
2012-09-19 18:54           ` [PATCH 25/40] PCI, ACPI: Make acpi_pci_root_remove remove pci root bus too Yinghai Lu
2012-09-19 18:54           ` [PATCH 26/40] PCI, ACPI: del root bus prt Yinghai Lu
2012-09-19 18:54           ` [PATCH 27/40] ACPI: acpi_bus_trim to support two steps Yinghai Lu
2012-09-19 18:54           ` [PATCH 28/40] PCI, ACPI: Add pci_root_hp hot removal notification support Yinghai Lu
2012-09-19 18:54           ` [PATCH 29/40] PCI, ACPI: Add alloc_acpi_hp_work() Yinghai Lu
2012-09-19 18:54           ` [PATCH 30/40] PCI, acpiphp: Use acpi_hp_work Yinghai Lu
2012-09-19 18:54           ` [PATCH 31/40] PCI, pci_root_hp: " Yinghai Lu
2012-09-19 18:54           ` [PATCH 32/40] PCI, ACPI: Make kacpi_hotplug_wq static Yinghai Lu
2012-09-19 18:54           ` [PATCH 33/40] ACPI, PCI: Use normal list for struct acpi_pci_driver Yinghai Lu
2012-09-19 18:54           ` [PATCH 34/40] ACPI, PCI: Notify acpi_pci_drivers when hot-plugging PCI root bridges Yinghai Lu
2012-09-19 18:54           ` [PATCH 35/40] ACPI, PCI: Protect global lists in drivers/acpi/pci_root.c Yinghai Lu
2012-09-19 18:54           ` [PATCH 36/40] PCI: Set dev_node early for pci_dev Yinghai Lu
2012-09-19 18:54           ` [PATCH 37/40] PCI, x86: Move pci_enable_bridges() down Yinghai Lu
2012-09-19 18:54           ` [PATCH 38/40] ACPI, PCI: Skip extra pci_enable_bridges for non hot-add root Yinghai Lu
2012-09-19 18:54           ` [PATCH 39/40] PCI, acpiphp: Don't ailout even no slots found yet Yinghai Lu
2012-09-19 18:54           ` [PATCH 40/40] ACPI: Enable SCI_EMULATE to manually simulate physical hotplug testing Yinghai Lu
2012-10-17  7:50           ` [PATCH 00/40] PCI, ACPI, x86: pci root bus hotplug support Yijing Wang
2012-10-17  7:50             ` Yijing Wang
2012-10-17 16:19             ` Yinghai Lu
2012-10-18  0:51               ` Yijing Wang
2012-10-18  0:51                 ` Yijing Wang

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=5077F2C4.4000203@cn.fujitsu.com \
    --to=tangchen@cn.fujitsu.com \
    --cc=akpm@linux-foundation.org \
    --cc=bhelgaas@google.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=izumi.taku@jp.fujitsu.com \
    --cc=jiang.liu@huawei.com \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=torvalds@linux-foundation.org \
    --cc=x86@kernel.org \
    --cc=yinghai@kernel.org \
    /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 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.