Message ID | 20231114085258.2378-1-quic_aiquny@quicinc.com |
---|---|
State | Superseded |
Headers | show |
Series | pinctrl: avoid reload of p state in interation | expand |
Hi Maria, thanks for your patch! On Tue, Nov 14, 2023 at 9:54 AM Maria Yu <quic_aiquny@quicinc.com> wrote: > When in the list_for_each_entry interation, reload of p->state->settings > with a local setting from old_state will makes the list interation in a > infite loop. > > Signed-off-by: Maria Yu <quic_aiquny@quicinc.com> This makes sense in a way, since this is a compiler-dependent problem, can you state in the commit message which compiler and architecture you see this on? If it is a regression, should this also be queued for stable? (I guess so?) Yours, Linus Walleij
On 11/14/2023 9:21 PM, Linus Walleij wrote: > Hi Maria, > > thanks for your patch! > > On Tue, Nov 14, 2023 at 9:54 AM Maria Yu <quic_aiquny@quicinc.com> wrote: > >> When in the list_for_each_entry interation, reload of p->state->settings >> with a local setting from old_state will makes the list interation in a >> infite loop. >> >> Signed-off-by: Maria Yu <quic_aiquny@quicinc.com> > > This makes sense in a way, since this is a compiler-dependent problem, > can you state in the commit message which compiler and architecture > you see this on? I have a crash dump which caused by this issue which is using Clang 10.0, arm64, Linux Version 4.19. Thx for your suggestion, I will put this information in the commit message. > > If it is a regression, should this also be queued for stable? (I guess so?) This is a corner case which is very hard to reproduce in product, I suggest this fix to be queued for stable. > > Yours, > Linus Walleij
Wed, Nov 15, 2023 at 08:56:35AM +0800, Aiqun(Maria) Yu kirjoitti: > On 11/14/2023 9:21 PM, Linus Walleij wrote: > > On Tue, Nov 14, 2023 at 9:54 AM Maria Yu <quic_aiquny@quicinc.com> wrote: ... > > This makes sense in a way, since this is a compiler-dependent problem, > > can you state in the commit message which compiler and architecture > > you see this on? > I have a crash dump which caused by this issue which is using Clang 10.0, > arm64, Linux Version 4.19. > Thx for your suggestion, I will put this information in the commit message. Please, also add a kernel version and a few (most important) lines from the crash. > > If it is a regression, should this also be queued for stable? (I guess so?) > This is a corner case which is very hard to reproduce in product, I suggest > this fix to be queued for stable. Please, provide a respective Fixes tag.
On 11/15/2023 10:07 AM, andy.shevchenko@gmail.com wrote: > Wed, Nov 15, 2023 at 08:56:35AM +0800, Aiqun(Maria) Yu kirjoitti: >> On 11/14/2023 9:21 PM, Linus Walleij wrote: >>> On Tue, Nov 14, 2023 at 9:54 AM Maria Yu <quic_aiquny@quicinc.com> wrote: > > ... > >>> This makes sense in a way, since this is a compiler-dependent problem, >>> can you state in the commit message which compiler and architecture >>> you see this on? >> I have a crash dump which caused by this issue which is using Clang 10.0, >> arm64, Linux Version 4.19. >> Thx for your suggestion, I will put this information in the commit message. > > Please, also add a kernel version and a few (most important) lines from the crash. Thx for the suggetion. Will add kernel version as well. > >>> If it is a regression, should this also be queued for stable? (I guess so?) >> This is a corner case which is very hard to reproduce in product, I suggest >> this fix to be queued for stable. > > Please, provide a respective Fixes tag. Thx for remind. Will do. >
diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c index 1fa89be29b8f..f2977eb65522 100644 --- a/drivers/pinctrl/core.c +++ b/drivers/pinctrl/core.c @@ -1262,17 +1262,17 @@ static void pinctrl_link_add(struct pinctrl_dev *pctldev, static int pinctrl_commit_state(struct pinctrl *p, struct pinctrl_state *state) { struct pinctrl_setting *setting, *setting2; - struct pinctrl_state *old_state = p->state; + struct pinctrl_state *old_state = READ_ONCE(p->state); int ret; - if (p->state) { + if (old_state) { /* * For each pinmux setting in the old state, forget SW's record * of mux owner for that pingroup. Any pingroups which are * still owned by the new state will be re-acquired by the call * to pinmux_enable_setting() in the loop below. */ - list_for_each_entry(setting, &p->state->settings, node) { + list_for_each_entry(setting, &old_state->settings, node) { if (setting->type != PIN_MAP_TYPE_MUX_GROUP) continue; pinmux_disable_setting(setting);
When in the list_for_each_entry interation, reload of p->state->settings with a local setting from old_state will makes the list interation in a infite loop. Signed-off-by: Maria Yu <quic_aiquny@quicinc.com> --- drivers/pinctrl/core.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) base-commit: 9bacdd8996c77c42ca004440be610692275ff9d0