linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: ChiYuan Huang <u0084500@gmail.com>
To: Sasha Levin <sashal@kernel.org>
Cc: linux-kernel@vger.kernel.org, stable@vger.kernel.org,
	ChiYuan Huang <cy_huang@richtek.com>,
	Yang Yingliang <yangyingliang@huawei.com>,
	Mark Brown <broonie@kernel.org>,
	djrscally@gmail.com, hdegoede@redhat.com, markgross@kernel.org,
	lgirdwood@gmail.com, mcoquelin.stm32@gmail.com,
	alexandre.torgue@foss.st.com,
	platform-driver-x86@vger.kernel.org,
	linux-stm32@st-md-mailman.stormreply.com,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH AUTOSEL 6.1 81/85] regulator: core: Use different devices for resource allocation and DT lookup
Date: Mon, 19 Dec 2022 09:08:26 +0800	[thread overview]
Message-ID: <20221219010819.GA7596@cyhuang-hp-elitebook-840-g3.rt> (raw)
In-Reply-To: <20221218160142.925394-81-sashal@kernel.org>

On Sun, Dec 18, 2022 at 11:01:38AM -0500, Sasha Levin wrote:
Hi,
  Thanks, but there's one more case not considered.
  It may cause a unexpected regulator shutdown by regulator core.

  Here's the discussion link that reported from Marek Szyprowski.
  https://lore.kernel.org/lkml/dd329b51-f11a-2af6-9549-c8a014fd5a71@samsung.com/

  I have post a patch to fix it.
  You may need to cherry-pick the below patch also.
  0debed5b117d ("regulator: core: Fix resolve supply lookup issue")

Best regards,
ChiYuan.
> From: ChiYuan Huang <cy_huang@richtek.com>
> 
> [ Upstream commit 8f3cbcd6b440032ebc7f7d48a1689dcc70a4eb98 ]
> 
> Following by the below discussion, there's the potential UAF issue
> between regulator and mfd.
> https://lore.kernel.org/all/20221128143601.1698148-1-yangyingliang@huawei.com/
> 
> >From the analysis of Yingliang
> 
> CPU A				|CPU B
> mt6370_probe()			|
>   devm_mfd_add_devices()	|
> 				|mt6370_regulator_probe()
> 				|  regulator_register()
> 				|    //allocate init_data and add it to devres
> 				|    regulator_of_get_init_data()
> i2c_unregister_device()		|
>   device_del()			|
>     devres_release_all()	|
>       // init_data is freed	|
>       release_nodes()		|
> 				|  // using init_data causes UAF
> 				|  regulator_register()
> 
> It's common to use mfd core to create child device for the regulator.
> In order to do the DT lookup for init data, the child that registered
> the regulator would pass its parent as the parameter. And this causes
> init data resource allocated to its parent, not itself. The issue happen
> when parent device is going to release and regulator core is still doing
> some operation of init data constraint for the regulator of child device.
> 
> To fix it, this patch expand 'regulator_register' API to use the
> different devices for init data allocation and DT lookup.
> 
> Reported-by: Yang Yingliang <yangyingliang@huawei.com>
> Signed-off-by: ChiYuan Huang <cy_huang@richtek.com>
> Link: https://lore.kernel.org/r/1670311341-32664-1-git-send-email-u0084500@gmail.com
> Signed-off-by: Mark Brown <broonie@kernel.org>
> Signed-off-by: Sasha Levin <sashal@kernel.org>
> ---
>  drivers/platform/x86/intel/int3472/clk_and_regulator.c | 3 ++-
>  drivers/regulator/core.c                               | 8 ++++----
>  drivers/regulator/devres.c                             | 2 +-
>  drivers/regulator/of_regulator.c                       | 2 +-
>  drivers/regulator/stm32-vrefbuf.c                      | 2 +-
>  include/linux/regulator/driver.h                       | 3 ++-
>  6 files changed, 11 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/platform/x86/intel/int3472/clk_and_regulator.c b/drivers/platform/x86/intel/int3472/clk_and_regulator.c
> index 1cf958983e86..b2342b3d78c7 100644
> --- a/drivers/platform/x86/intel/int3472/clk_and_regulator.c
> +++ b/drivers/platform/x86/intel/int3472/clk_and_regulator.c
> @@ -185,7 +185,8 @@ int skl_int3472_register_regulator(struct int3472_discrete_device *int3472,
>  	cfg.init_data = &init_data;
>  	cfg.ena_gpiod = int3472->regulator.gpio;
>  
> -	int3472->regulator.rdev = regulator_register(&int3472->regulator.rdesc,
> +	int3472->regulator.rdev = regulator_register(int3472->dev,
> +						     &int3472->regulator.rdesc,
>  						     &cfg);
>  	if (IS_ERR(int3472->regulator.rdev)) {
>  		ret = PTR_ERR(int3472->regulator.rdev);
> diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
> index 1cfac32121c0..10df84c2c288 100644
> --- a/drivers/regulator/core.c
> +++ b/drivers/regulator/core.c
> @@ -5402,6 +5402,7 @@ static struct regulator_coupler generic_regulator_coupler = {
>  
>  /**
>   * regulator_register - register regulator
> + * @dev: the device that drive the regulator
>   * @regulator_desc: regulator to register
>   * @cfg: runtime configuration for regulator
>   *
> @@ -5410,7 +5411,8 @@ static struct regulator_coupler generic_regulator_coupler = {
>   * or an ERR_PTR() on error.
>   */
>  struct regulator_dev *
> -regulator_register(const struct regulator_desc *regulator_desc,
> +regulator_register(struct device *dev,
> +		   const struct regulator_desc *regulator_desc,
>  		   const struct regulator_config *cfg)
>  {
>  	const struct regulator_init_data *init_data;
> @@ -5419,7 +5421,6 @@ regulator_register(const struct regulator_desc *regulator_desc,
>  	struct regulator_dev *rdev;
>  	bool dangling_cfg_gpiod = false;
>  	bool dangling_of_gpiod = false;
> -	struct device *dev;
>  	int ret, i;
>  	bool resolved_early = false;
>  
> @@ -5432,8 +5433,7 @@ regulator_register(const struct regulator_desc *regulator_desc,
>  		goto rinse;
>  	}
>  
> -	dev = cfg->dev;
> -	WARN_ON(!dev);
> +	WARN_ON(!dev || !cfg->dev);
>  
>  	if (regulator_desc->name == NULL || regulator_desc->ops == NULL) {
>  		ret = -EINVAL;
> diff --git a/drivers/regulator/devres.c b/drivers/regulator/devres.c
> index 3265e75e97ab..5c7ff9b3e8a7 100644
> --- a/drivers/regulator/devres.c
> +++ b/drivers/regulator/devres.c
> @@ -385,7 +385,7 @@ struct regulator_dev *devm_regulator_register(struct device *dev,
>  	if (!ptr)
>  		return ERR_PTR(-ENOMEM);
>  
> -	rdev = regulator_register(regulator_desc, config);
> +	rdev = regulator_register(dev, regulator_desc, config);
>  	if (!IS_ERR(rdev)) {
>  		*ptr = rdev;
>  		devres_add(dev, ptr);
> diff --git a/drivers/regulator/of_regulator.c b/drivers/regulator/of_regulator.c
> index 0aff1c2886b5..cd726d4e8fbf 100644
> --- a/drivers/regulator/of_regulator.c
> +++ b/drivers/regulator/of_regulator.c
> @@ -505,7 +505,7 @@ struct regulator_init_data *regulator_of_get_init_data(struct device *dev,
>  	struct device_node *child;
>  	struct regulator_init_data *init_data = NULL;
>  
> -	child = regulator_of_get_init_node(dev, desc);
> +	child = regulator_of_get_init_node(config->dev, desc);
>  	if (!child)
>  		return NULL;
>  
> diff --git a/drivers/regulator/stm32-vrefbuf.c b/drivers/regulator/stm32-vrefbuf.c
> index 30ea3bc8ca19..7a454b7b6eab 100644
> --- a/drivers/regulator/stm32-vrefbuf.c
> +++ b/drivers/regulator/stm32-vrefbuf.c
> @@ -210,7 +210,7 @@ static int stm32_vrefbuf_probe(struct platform_device *pdev)
>  						      pdev->dev.of_node,
>  						      &stm32_vrefbuf_regu);
>  
> -	rdev = regulator_register(&stm32_vrefbuf_regu, &config);
> +	rdev = regulator_register(&pdev->dev, &stm32_vrefbuf_regu, &config);
>  	if (IS_ERR(rdev)) {
>  		ret = PTR_ERR(rdev);
>  		dev_err(&pdev->dev, "register failed with error %d\n", ret);
> diff --git a/include/linux/regulator/driver.h b/include/linux/regulator/driver.h
> index f9a7461e72b8..d3b4a3d4514a 100644
> --- a/include/linux/regulator/driver.h
> +++ b/include/linux/regulator/driver.h
> @@ -687,7 +687,8 @@ static inline int regulator_err2notif(int err)
>  
>  
>  struct regulator_dev *
> -regulator_register(const struct regulator_desc *regulator_desc,
> +regulator_register(struct device *dev,
> +		   const struct regulator_desc *regulator_desc,
>  		   const struct regulator_config *config);
>  struct regulator_dev *
>  devm_regulator_register(struct device *dev,
> -- 
> 2.35.1
> 
> 
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2022-12-19  1:08 UTC|newest]

Thread overview: 86+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-12-18 16:00 [PATCH AUTOSEL 6.1 01/85] drm/etnaviv: add missing quirks for GC300 Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 02/85] media: imx-jpeg: Disable useless interrupt to avoid kernel panic Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 03/85] brcmfmac: return error when getting invalid max_flowrings from dongle Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 04/85] wifi: ath9k: verify the expected usb_endpoints are present Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 05/85] wifi: ar5523: Fix use-after-free on ar5523_cmd() timed out Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 06/85] ASoC: codecs: rt298: Add quirk for KBL-R RVP platform Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 07/85] ASoC: Intel: avs: " Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 08/85] ipmi: fix memleak when unload ipmi driver Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 09/85] wifi: ath10k: Delay the unmapping of the buffer Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 10/85] openvswitch: Use kmalloc_size_roundup() to match ksize() usage Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 11/85] bnx2: " Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 12/85] drm/amd/display: skip commit minimal transition state Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 13/85] drm/amd/display: prevent memory leak Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 14/85] drm/edid: add a quirk for two LG monitors to get them to work on 10bpc Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 15/85] Revert "drm/amd/display: Limit max DSC target bpp for specific monitors" Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 16/85] drm/rockchip: use pm_runtime_resume_and_get() instead of pm_runtime_get_sync() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 17/85] blk-mq: avoid double ->queue_rq() because of early timeout Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 18/85] HID: apple: fix key translations where multiple quirks attempt to translate the same key Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 19/85] HID: apple: enable APPLE_ISO_TILDE_QUIRK for the keyboards of Macs with the T2 chip Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 20/85] wifi: ath11k: Fix qmi_msg_handler data structure initialization Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 21/85] qed (gcc13): use u16 for fid to be big enough Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 22/85] drm/meson: Fix return type of meson_encoder_cvbs_mode_valid() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 23/85] bpf: make sure skb->len != 0 when redirecting to a tunneling device Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 24/85] net: ethernet: ti: Fix return type of netcp_ndo_start_xmit() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 25/85] hamradio: baycom_epp: Fix return type of baycom_send_packet() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 26/85] wifi: brcmfmac: Fix potential shift-out-of-bounds in brcmf_fw_alloc_request() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 27/85] wifi: brcmfmac: Fix potential NULL pointer dereference in 'brcmf_c_preinit_dcmds()' Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 28/85] HID: input: do not query XP-PEN Deco LW battery Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 29/85] HID: uclogic: Add support for XP-PEN Deco LW Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 30/85] igb: Do not free q_vector unless new one was allocated Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 31/85] drm/amdgpu: Fix type of second parameter in trans_msg() callback Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 32/85] drm/amdgpu: Fix type of second parameter in odn_edit_dpm_table() callback Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 33/85] s390/ctcm: Fix return type of ctc{mp,}m_tx() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 34/85] s390/netiucv: Fix return type of netiucv_tx() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 35/85] s390/lcs: Fix return type of lcs_start_xmit() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 36/85] drm/amd/display: Use min transition for SubVP into MPO Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 37/85] drm/amd/display: Disable DRR actions during state commit Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 38/85] drm/msm: Use drm_mode_copy() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 39/85] drm/rockchip: " Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 40/85] drm/sti: " Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 41/85] drm/mediatek: Fix return type of mtk_hdmi_bridge_mode_valid() Sasha Levin
2022-12-18 16:00 ` [PATCH AUTOSEL 6.1 42/85] drivers/md/md-bitmap: check the return value of md_bitmap_get_counter() Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 43/85] md/raid0, raid10: Don't set discard sectors for request queue Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 44/85] md/raid1: stop mdx_raid1 thread when raid1 array run failed Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 45/85] drm/amd/display: Workaround to increase phantom pipe vactive in pipesplit Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 46/85] drm/amd/display: fix array index out of bound error in bios parser Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 47/85] nvme-auth: don't override ctrl keys before validation Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 48/85] net: add atomic_long_t to net_device_stats fields Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 49/85] ipv6/sit: use DEV_STATS_INC() to avoid data-races Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 50/85] mrp: introduce active flags to prevent UAF when applicant uninit Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 51/85] net: ethernet: mtk_eth_soc: drop packets to WDMA if the ring is full Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 52/85] bpf/verifier: Use kmalloc_size_roundup() to match ksize() usage Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 53/85] ppp: associate skb with a device at tx Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 54/85] drm/amd/display: Fix display corruption w/ VSR enable Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 55/85] bpf: Fix a BTF_ID_LIST bug with CONFIG_DEBUG_INFO_BTF not set Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 56/85] bpf: Prevent decl_tag from being referenced in func_proto arg Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 57/85] ethtool: avoiding integer overflow in ethtool_phys_id() Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 58/85] media: dvb-frontends: fix leak of memory fw Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 59/85] media: dvbdev: adopts refcnt to avoid UAF Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 60/85] media: dvb-usb: fix memory leak in dvb_usb_adapter_init() Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 61/85] media: mediatek: vcodec: Can't set dst buffer to done when lat decode error Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 62/85] blk-mq: fix possible memleak when register 'hctx' failed Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 63/85] ALSA: usb-audio: Add quirk for Tascam Model 12 Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 64/85] drm/amdgpu: Fix potential double free and null pointer dereference Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 65/85] drm/amd/display: Use the largest vready_offset in pipe group Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 66/85] drm/amd/display: Fix DTBCLK disable requests and SRC_SEL programming Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 67/85] ASoC: amd: yc: Add Xiaomi Redmi Book Pro 14 2022 into DMI table Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 68/85] libbpf: Avoid enum forward-declarations in public API in C++ mode Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 69/85] regulator: core: fix use_count leakage when handling boot-on Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 70/85] net: dpaa2: publish MAC stringset to ethtool -S even if MAC is missing Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 71/85] wifi: mt76: do not run mt76u_status_worker if the device is not running Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 72/85] hwmon: (nct6775) add ASUS CROSSHAIR VIII/TUF/ProArt B550M Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 73/85] selftests/bpf: Fix conflicts with built-in functions in bpf_iter_ksym Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 74/85] nfs: fix possible null-ptr-deref when parsing param Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 75/85] mmc: f-sdh30: Add quirks for broken timeout clock capability Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 76/85] mmc: renesas_sdhi: add quirk for broken register layout Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 77/85] mmc: renesas_sdhi: better reset from HS400 mode Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 78/85] mmc: sdhci-tegra: Issue CMD and DAT resets together Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 79/85] media: si470x: Fix use-after-free in si470x_int_in_callback() Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 80/85] clk: st: Fix memory leak in st_of_quadfs_setup() Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 81/85] regulator: core: Use different devices for resource allocation and DT lookup Sasha Levin
2022-12-19  1:08   ` ChiYuan Huang [this message]
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 82/85] ice: synchronize the misc IRQ when tearing down Tx tracker Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 83/85] Bluetooth: hci_bcm: Add CYW4373A0 support Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 84/85] Bluetooth: Add quirk to disable extended scanning Sasha Levin
2022-12-18 16:01 ` [PATCH AUTOSEL 6.1 85/85] Bluetooth: Add quirk to disable MWS Transport Configuration 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=20221219010819.GA7596@cyhuang-hp-elitebook-840-g3.rt \
    --to=u0084500@gmail.com \
    --cc=alexandre.torgue@foss.st.com \
    --cc=broonie@kernel.org \
    --cc=cy_huang@richtek.com \
    --cc=djrscally@gmail.com \
    --cc=hdegoede@redhat.com \
    --cc=lgirdwood@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-stm32@st-md-mailman.stormreply.com \
    --cc=markgross@kernel.org \
    --cc=mcoquelin.stm32@gmail.com \
    --cc=platform-driver-x86@vger.kernel.org \
    --cc=sashal@kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=yangyingliang@huawei.com \
    /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).