From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-ed1-f53.google.com (mail-ed1-f53.google.com [209.85.208.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 54EEA366053 for ; Sat, 31 Jan 2026 20:14:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=209.85.208.53 ARC-Seal:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769890471; cv=pass; b=I46gevpX4itobcf9uU3D+LmlV/zVyE4vSpNicQ5RV2mFNGnF2gHYeJ/92a5V10ieJMaYkOWzAajcTCMJw7DlhJWpbiQjlWLflXCWjfVgoCsCzLDdogMk9sOQaWUJv4uMK+oHCEZ0aN9AWqMgqykHMnF5+DG5Yci/WBt3effBNdE= ARC-Message-Signature:i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769890471; c=relaxed/simple; bh=yMZHFitBveSwTiyRgSyxNN1NEBI5FO4K9xicZu7zkl4=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=acqDvmBYH2lrSUYGGzgx8K1ja0BpAkxDUociftmpmk5cOowa9ehHNo1XM4Vm3zoRdZKORgwsDcJXavZIVXcEXnRUROCcQxSulaZTgVqH60+zulJlJjUFuYvYSVRSwfTZH+r7IoeO/MVsTNhSMMG0VqJso+62gMCiW4dATVvOtV8= ARC-Authentication-Results:i=2; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=tnS/G4TN; arc=pass smtp.client-ip=209.85.208.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="tnS/G4TN" Received: by mail-ed1-f53.google.com with SMTP id 4fb4d7f45d1cf-658f1fde4bfso1417756a12.1 for ; Sat, 31 Jan 2026 12:14:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1769890468; cv=none; d=google.com; s=arc-20240605; b=YVz1ah+KsmD6cB16di1gSbipcd9oKNeYlunzzNEy2RlxpVju9speI9pE1wHeustwSw JRF9eUNmh0oQHShwaF6ZpxH49+xEjCJymVGFai4Q7I00jIPR8cN1tY5mRQDWAQz8IUdb pXUjvLT8SYHfODC43PGUwGKTvxmN5THtGyI4MqvnAoDYybDVBqiOUNSHOX8zUXA7FS9K A73vb4JmpeaSzkuEaELrFEWLJeCob/ETyMX40D60k3DvDDnOw0h0N8b6XprIKJhQWOj7 EjwKjTer+LK+KyuolM1ia2n0F2Tbf4D7hGva1oMv/b+m2CMFksyM8H9QS1/6e2FQwMO3 Cv/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=km8kplnm0XUJRbZI5k8OFXrzF6vf8FSgEbZtSrDmOz4=; fh=Tu/soITWqgQZ9CLAo0o3k+p10Rrt0QCbbZJL0kaHEDU=; b=cGEiKmoumawq//M8oW/Z4IZl2cttuJ1PZfzAXQ6weHVYr/me6JazJmNzt9iyK2SCmz gHtrVojtQFLNl9jHsZndQKxPpbncjN711G11J3lkNrQkywU9bEC1rY+ZtGxngCbYrPxC P1Kz0iUNxxadmPTtBdTbenQCaeJ/74l9OLd9NxRWuybQOsfbfztls34LNciFTPUAaGZP xwGcTh3xeNteHdTTCUZaerhCopgoCfAuZRQEI2iCj/QVs8B9CPC/blgiTGX+cptvvii4 hqEWFwzu6RS2YOOZ9Qtx6y92wtnpGy2wsMxrW5ftbaAG8gJ6WRsQKP9OYODFbtASISiJ 5c6Q==; darn=vger.kernel.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1769890468; x=1770495268; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=km8kplnm0XUJRbZI5k8OFXrzF6vf8FSgEbZtSrDmOz4=; b=tnS/G4TNEedmNr80OFoKem8ANs3tt3BZcWf8YQpk9OyLKiA89e1lPKqDHo1IAB8pHA EPYHJj8G/qWsfd3DsYU2EOCA/Jn4Pp0ZfMF+DUBEprY4CEoQMUYc3KiIFwIFMEJ04I69 J+Bn80+H3EThh1iautNEZvzWsYTpk+TiVXyLUfpuIWk9SH7e737Bf+AYoJPGlbzQnvBa ofIsqEZVwxoaluliTZ46jHbPbyFAeV7q6IJRO92IIYdXncwGDtR9zk5eWrNVvuyENY2p Rt1uUNsSNia1f4arhgaaZuDXwKuPP3bnxbd8D0C4m1d4NyMuLxjK/0bjmaAerBh0509C aZSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769890468; x=1770495268; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=km8kplnm0XUJRbZI5k8OFXrzF6vf8FSgEbZtSrDmOz4=; b=Z+l9FPzRewAJH7dSh4i1lLZ/fxtmcxP3XSvEn92kpBsVvrrfcsiHQiUMHiYwKRibCi BfMqir2clSsrUNf0aimgREXACruiZ3Gr0mRoazwBi7X6PQdEHe0ef0nZICHN3ixB7PSk nuckwQi+BQwIA9VcmCWE4I9MGyy1hy4q24DHL+R2Y13DwNHFhAQbIUIgKG0haOpuZUvl Q6oVDjvRt4OOQEaanggrwbum8lEUqKDMMJICrRLp2Aurp7ntAdbsyUlDJmruIilCCy8u 7U8U2edyJ/cV4Puwv7h83KKvaT67cx4lIiXUgVrrbq+o5cfZO9f/BPzQrg2t5xCT82tj zq1Q== X-Forwarded-Encrypted: i=1; AJvYcCXVnuF02vUV3tMlcmB9wYw6b28Dov8RMZJp+ISJ2Z0GFhTFayO77/QBqvzbKP1KVxDi4vG4oIVCd3RuDP0=@vger.kernel.org X-Gm-Message-State: AOJu0YxAyEP1VciXdIAhfE/9kKRy7w/MKVSe2sYEHYcOGFvNIR1X/vwa LTJDXH4ZPteRAljGaYXCYrGWzadbxvvJ9obhhFq/t6zOHWU2usMOysGV3p3bU3QwpChN7Agt/BM JVUmc6YxDWvWoTZomWTNkobR0SKdZ8who/ITGLU5/ X-Gm-Gg: AZuq6aKUU3GNoO/P8QvYoxuDRmoATY5E3/1KNCR/sPmXJDT9ltXo0hJ11qvJZ9QGlf5 6BwpAbzdNkeQNshP1O+wEgc66Uq/ZaxN3BgtU4CbapdI1Cv7+8yqzlUBaJmFMVsN95l7bCmL29h oZHI8afCNBtCBbOz4DzHbZy1RnuvQTZyCXSKCpC28DH/LUx24kUUHDJqYequxPtzZU/SqGAeu3s ahzycCY4bFV+PG3Xbmoxe80frVLM1NVaipdV1Frr3I/ogvGjzxTxmrget/shMc6f3HU X-Received: by 2002:a17:907:720a:b0:b07:87f1:fc42 with SMTP id a640c23a62f3a-b8dff432d83mr474220066b.16.1769890467383; Sat, 31 Jan 2026 12:14:27 -0800 (PST) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20260129111403.3081730-1-prashanth.k@oss.qualcomm.com> In-Reply-To: <20260129111403.3081730-1-prashanth.k@oss.qualcomm.com> From: Samuel Wu Date: Sat, 31 Jan 2026 12:14:16 -0800 X-Gm-Features: AZwV_QidVxFPSSU4X1IAAyjblyzS6gM99DWlGcx5x-nNJW2TuFYl1jr8vKw-2Xw Message-ID: Subject: Re: [PATCH] usb: dwc3: gadget: Move vbus draw to workqueue context To: Prashanth K Cc: Thinh Nguyen , Greg Kroah-Hartman , linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, stable@vger.kernel.org, Android Kernel Team Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Thu, Jan 29, 2026 at 3:14=E2=80=AFAM Prashanth K wrote: > > Currently dwc3_gadget_vbus_draw() can be called from atomic > context, which in turn invokes power-supply-core APIs. And > some these PMIC APIs have operations that may sleep, leading > to kernel panic. > > Fix this by moving the vbus_draw into a workqueue context. > > Fixes: 66e0ea341a2a ("usb: dwc3: core: Defer the probe until USB power su= pply ready") > Cc: stable@vger.kernel.org > Signed-off-by: Prashanth K > --- > drivers/usb/dwc3/core.c | 19 ++++++++++++++++++- > drivers/usb/dwc3/core.h | 4 ++++ > drivers/usb/dwc3/gadget.c | 8 +++----- > 3 files changed, 25 insertions(+), 6 deletions(-) > > diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c > index f32b67bf73a4..c9af126b9695 100644 > --- a/drivers/usb/dwc3/core.c > +++ b/drivers/usb/dwc3/core.c > @@ -2155,6 +2155,20 @@ static int dwc3_get_num_ports(struct dwc3 *dwc) > return 0; > } > > +static void dwc3_vbus_draw_work(struct work_struct *work) > +{ > + struct dwc3 *dwc =3D container_of(work, struct dwc3, vbus_draw_wo= rk); > + union power_supply_propval val =3D {0}; > + int ret; > + > + val.intval =3D 1000 * (dwc->vbus_draw_current); > + ret =3D power_supply_set_property(dwc->usb_psy, POWER_SUPPLY_PROP= _INPUT_CURRENT_LIMIT, &val); > + > + if (ret < 0) > + dev_dbg(dwc->dev, "Error (%d) setting vbus draw (%d mA)\n= ", > + ret, dwc->vbus_draw_current); > +} > + > static struct power_supply *dwc3_get_usb_power_supply(struct dwc3 *dwc) > { > struct power_supply *usb_psy; > @@ -2169,6 +2183,7 @@ static struct power_supply *dwc3_get_usb_power_supp= ly(struct dwc3 *dwc) > if (!usb_psy) > return ERR_PTR(-EPROBE_DEFER); > > + INIT_WORK(&dwc->vbus_draw_work, dwc3_vbus_draw_work); > return usb_psy; > } > > @@ -2395,8 +2410,10 @@ void dwc3_core_remove(struct dwc3 *dwc) > > dwc3_free_event_buffers(dwc); > > - if (dwc->usb_psy) > + if (dwc->usb_psy) { > + cancel_work_sync(&dwc->vbus_draw_work); > power_supply_put(dwc->usb_psy); > + } > } > EXPORT_SYMBOL_GPL(dwc3_core_remove); > > diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h > index 08cc6f2b5c23..052fb18c6b5c 100644 > --- a/drivers/usb/dwc3/core.h > +++ b/drivers/usb/dwc3/core.h > @@ -1178,6 +1178,8 @@ struct dwc3_glue_ops { > * @wakeup_pending_funcs: Indicates whether any interface has requested = for > * function wakeup in bitmap format where bit posit= ion > * represents interface_id. > + * @vbus_draw_work: Workqueue used for scheduling vbus draw work > + * @vbus_draw_current: How much current to draw from vbus, in milliAmper= es. > */ > struct dwc3 { > struct work_struct drd_work; > @@ -1413,6 +1415,8 @@ struct dwc3 { > struct dentry *debug_root; > u32 gsbuscfg0_reqinfo; > u32 wakeup_pending_funcs; > + struct work_struct vbus_draw_work; > + unsigned int vbus_draw_current; > }; > > #define INCRX_BURST_MODE 0 > diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c > index 9355c952c140..03d8a3a151e0 100644 > --- a/drivers/usb/dwc3/gadget.c > +++ b/drivers/usb/dwc3/gadget.c > @@ -3124,8 +3124,6 @@ static void dwc3_gadget_set_ssp_rate(struct usb_gad= get *g, > static int dwc3_gadget_vbus_draw(struct usb_gadget *g, unsigned int mA) > { > struct dwc3 *dwc =3D gadget_to_dwc(g); > - union power_supply_propval val =3D {0}; > - int ret; > > if (dwc->usb2_phy) > return usb_phy_set_power(dwc->usb2_phy, mA); > @@ -3133,10 +3131,10 @@ static int dwc3_gadget_vbus_draw(struct usb_gadge= t *g, unsigned int mA) > if (!dwc->usb_psy) > return -EOPNOTSUPP; > > - val.intval =3D 1000 * mA; > - ret =3D power_supply_set_property(dwc->usb_psy, POWER_SUPPLY_PROP= _INPUT_CURRENT_LIMIT, &val); > + dwc->vbus_draw_current =3D mA; > + schedule_work(&dwc->vbus_draw_work); > > - return ret; > + return 0; > } > > /** > -- > 2.34.1 > On Pixel 6 with this patch applied on 6.19-rc7, I am no longer seeing the following lockdep: [ BUG: Invalid wait context ] 6.19.0-rc7-mainline-maybe-dirty-4k #1 Tainted: G W O ----------------------------- irq/360-dwc3/1244 is trying to lock: ffffff8018110eb8 (&psy->extensions_sem){.+.+}-{3:3}, at: __power_supply_set_property+0x40/0x180 other info that might help us debug this: context-{4:4} 1 lock held by irq/360-dwc3/1244: #0: ffffff80368d78f8 (&gi->spinlock){....}-{2:2}, at: configfs_composite_suspend+0x28/0x68 stack backtrace: goodixfp: Succeed to open device. irq =3D 417 CPU: 0 UID: 0 PID: 1244 Comm: irq/360-dwc3 Tainted: G W O 6.19.0-rc7-mainline-maybe-dirty-4k #1 PREEMPT Tainted: [W]=3DWARN, [O]=3DOOT_MODULE Hardware name: Oriole EVT 1.0 (DT) Call trace: show_stack+0x18/0x28 (C) __dump_stack+0x28/0x3c dump_stack_lvl+0xac/0xf0 dump_stack+0x18/0x3c __lock_acquire+0x794/0x2b08 lock_acquire+0x138/0x2c4 down_read+0x3c/0x17c __power_supply_set_property+0x40/0x180 power_supply_set_property+0x14/0x20 dwc3_gadget_vbus_draw+0x8c/0xcc usb_gadget_vbus_draw+0x48/0x128 composite_suspend+0xcc/0xe4 configfs_composite_suspend+0x44/0x68 dwc3_thread_interrupt+0x7b4/0xc7c irq_thread_fn+0x48/0xa8 irq_thread+0x16c/0x338 kthread+0x150/0x280 ret_from_fork+0x10/0x20 Tested-by: Samuel Wu