Message ID | 20220905152719.128539-5-dakr@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/arm/hdlcd: use drm managed resources | expand |
Hi Danilo, I have applied your patch series for HDLCD on top of drm-next (commit 213cb76ddc8b) and on start up I get a warning: [ 12.882554] hdlcd 7ff50000.hdlcd: drm_WARN_ON(funcs && funcs->destroy) [ 12.882596] WARNING: CPU: 1 PID: 211 at drivers/gpu/drm/drm_crtc.c:393 __drmm_crtc_init_with_planes+0x70/0xf0 [drm] It looks like the .destroy hook is still required or I'm missing some other required series where the WARN has been removed? Best regards, Liviu On Mon, Sep 05, 2022 at 05:27:16PM +0200, Danilo Krummrich wrote: > Use drm managed resource allocation (drmm_universal_plane_alloc()) in > order to get rid of the explicit destroy hook in struct drm_plane_funcs. > > Signed-off-by: Danilo Krummrich <dakr@redhat.com> > --- > drivers/gpu/drm/arm/hdlcd_crtc.c | 20 +++++++------------- > 1 file changed, 7 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c > index c0a5ca7f578a..17d3ccf12245 100644 > --- a/drivers/gpu/drm/arm/hdlcd_crtc.c > +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c > @@ -289,7 +289,6 @@ static const struct drm_plane_helper_funcs hdlcd_plane_helper_funcs = { > static const struct drm_plane_funcs hdlcd_plane_funcs = { > .update_plane = drm_atomic_helper_update_plane, > .disable_plane = drm_atomic_helper_disable_plane, > - .destroy = drm_plane_cleanup, > .reset = drm_atomic_helper_plane_reset, > .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state, > .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, > @@ -297,24 +296,19 @@ static const struct drm_plane_funcs hdlcd_plane_funcs = { > > static struct drm_plane *hdlcd_plane_init(struct drm_device *drm) > { > - struct hdlcd_drm_private *hdlcd = drm->dev_private; > + struct hdlcd_drm_private *hdlcd = drm_to_hdlcd_priv(drm); > struct drm_plane *plane = NULL; > u32 formats[ARRAY_SIZE(supported_formats)], i; > - int ret; > - > - plane = devm_kzalloc(drm->dev, sizeof(*plane), GFP_KERNEL); > - if (!plane) > - return ERR_PTR(-ENOMEM); > > for (i = 0; i < ARRAY_SIZE(supported_formats); i++) > formats[i] = supported_formats[i].fourcc; > > - ret = drm_universal_plane_init(drm, plane, 0xff, &hdlcd_plane_funcs, > - formats, ARRAY_SIZE(formats), > - NULL, > - DRM_PLANE_TYPE_PRIMARY, NULL); > - if (ret) > - return ERR_PTR(ret); > + plane = drmm_universal_plane_alloc(drm, struct drm_plane, dev, 0xff, > + &hdlcd_plane_funcs, > + formats, ARRAY_SIZE(formats), > + NULL, DRM_PLANE_TYPE_PRIMARY, NULL); > + if (IS_ERR(plane)) > + return plane; > > drm_plane_helper_add(plane, &hdlcd_plane_helper_funcs); > hdlcd->plane = plane; > -- > 2.37.2 >
Hi Liviu, Thanks for having a look! This is not about this patch, it's about patch 3/7 "drm/arm/hdlcd: crtc: use drmm_crtc_init_with_planes()". And there it's the other way around. When using drmm_crtc_init_with_planes() we shouldn't have a destroy hook in place, that's the whole purpose of drmm_crtc_init_with_planes(). We should just drop patch 3/7 "drm/arm/hdlcd: crtc: use drmm_crtc_init_with_planes()", it's wrong. Do you want me to send a v2 for that? - Danilo On 9/12/22 19:36, Liviu Dudau wrote: > Hi Danilo, > > I have applied your patch series for HDLCD on top of drm-next (commit 213cb76ddc8b) > and on start up I get a warning: > > [ 12.882554] hdlcd 7ff50000.hdlcd: drm_WARN_ON(funcs && funcs->destroy) > [ 12.882596] WARNING: CPU: 1 PID: 211 at drivers/gpu/drm/drm_crtc.c:393 __drmm_crtc_init_with_planes+0x70/0xf0 [drm] > > It looks like the .destroy hook is still required or I'm missing some other required > series where the WARN has been removed? > > Best regards, > Liviu > > On Mon, Sep 05, 2022 at 05:27:16PM +0200, Danilo Krummrich wrote: >> Use drm managed resource allocation (drmm_universal_plane_alloc()) in >> order to get rid of the explicit destroy hook in struct drm_plane_funcs. >> >> Signed-off-by: Danilo Krummrich <dakr@redhat.com> >> --- >> drivers/gpu/drm/arm/hdlcd_crtc.c | 20 +++++++------------- >> 1 file changed, 7 insertions(+), 13 deletions(-) >> >> diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c >> index c0a5ca7f578a..17d3ccf12245 100644 >> --- a/drivers/gpu/drm/arm/hdlcd_crtc.c >> +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c >> @@ -289,7 +289,6 @@ static const struct drm_plane_helper_funcs hdlcd_plane_helper_funcs = { >> static const struct drm_plane_funcs hdlcd_plane_funcs = { >> .update_plane = drm_atomic_helper_update_plane, >> .disable_plane = drm_atomic_helper_disable_plane, >> - .destroy = drm_plane_cleanup, >> .reset = drm_atomic_helper_plane_reset, >> .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state, >> .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, >> @@ -297,24 +296,19 @@ static const struct drm_plane_funcs hdlcd_plane_funcs = { >> >> static struct drm_plane *hdlcd_plane_init(struct drm_device *drm) >> { >> - struct hdlcd_drm_private *hdlcd = drm->dev_private; >> + struct hdlcd_drm_private *hdlcd = drm_to_hdlcd_priv(drm); >> struct drm_plane *plane = NULL; >> u32 formats[ARRAY_SIZE(supported_formats)], i; >> - int ret; >> - >> - plane = devm_kzalloc(drm->dev, sizeof(*plane), GFP_KERNEL); >> - if (!plane) >> - return ERR_PTR(-ENOMEM); >> >> for (i = 0; i < ARRAY_SIZE(supported_formats); i++) >> formats[i] = supported_formats[i].fourcc; >> >> - ret = drm_universal_plane_init(drm, plane, 0xff, &hdlcd_plane_funcs, >> - formats, ARRAY_SIZE(formats), >> - NULL, >> - DRM_PLANE_TYPE_PRIMARY, NULL); >> - if (ret) >> - return ERR_PTR(ret); >> + plane = drmm_universal_plane_alloc(drm, struct drm_plane, dev, 0xff, >> + &hdlcd_plane_funcs, >> + formats, ARRAY_SIZE(formats), >> + NULL, DRM_PLANE_TYPE_PRIMARY, NULL); >> + if (IS_ERR(plane)) >> + return plane; >> >> drm_plane_helper_add(plane, &hdlcd_plane_helper_funcs); >> hdlcd->plane = plane; >> -- >> 2.37.2 >> >
On Mon, Sep 12, 2022 at 09:50:26PM +0200, Danilo Krummrich wrote: > Hi Liviu, Hi Danilo, > > Thanks for having a look! > > This is not about this patch, it's about patch 3/7 "drm/arm/hdlcd: crtc: use > drmm_crtc_init_with_planes()". Agree! However, this is the patch that removes the .destroy hook, so I've replied here. > > And there it's the other way around. When using drmm_crtc_init_with_planes() > we shouldn't have a destroy hook in place, that's the whole purpose of > drmm_crtc_init_with_planes(). > > We should just drop patch 3/7 "drm/arm/hdlcd: crtc: use > drmm_crtc_init_with_planes()", it's wrong. So we end up with mixed use of managed and unmanaged APIs? > > Do you want me to send a v2 for that? Yes please! It would help me to understand your thinking around the whole lifecycle of the driver. BTW, I appreciate the care in patches 5-7 to make sure that the driver doesn't access freed resources, however I'm not sure I like the fact that rmmod-ing the hdlcd driver while I have an fbcon running hangs now the command and prevents a kernel reboot, while it works without your series. Can you explain to me again what are you trying to fix? Best regards, Liviu > > - Danilo > > > > On 9/12/22 19:36, Liviu Dudau wrote: > > Hi Danilo, > > > > I have applied your patch series for HDLCD on top of drm-next (commit 213cb76ddc8b) > > and on start up I get a warning: > > > > [ 12.882554] hdlcd 7ff50000.hdlcd: drm_WARN_ON(funcs && funcs->destroy) > > [ 12.882596] WARNING: CPU: 1 PID: 211 at drivers/gpu/drm/drm_crtc.c:393 __drmm_crtc_init_with_planes+0x70/0xf0 [drm] > > > > It looks like the .destroy hook is still required or I'm missing some other required > > series where the WARN has been removed? > > > > Best regards, > > Liviu > > > > On Mon, Sep 05, 2022 at 05:27:16PM +0200, Danilo Krummrich wrote: > > > Use drm managed resource allocation (drmm_universal_plane_alloc()) in > > > order to get rid of the explicit destroy hook in struct drm_plane_funcs. > > > > > > Signed-off-by: Danilo Krummrich <dakr@redhat.com> > > > --- > > > drivers/gpu/drm/arm/hdlcd_crtc.c | 20 +++++++------------- > > > 1 file changed, 7 insertions(+), 13 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c > > > index c0a5ca7f578a..17d3ccf12245 100644 > > > --- a/drivers/gpu/drm/arm/hdlcd_crtc.c > > > +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c > > > @@ -289,7 +289,6 @@ static const struct drm_plane_helper_funcs hdlcd_plane_helper_funcs = { > > > static const struct drm_plane_funcs hdlcd_plane_funcs = { > > > .update_plane = drm_atomic_helper_update_plane, > > > .disable_plane = drm_atomic_helper_disable_plane, > > > - .destroy = drm_plane_cleanup, > > > .reset = drm_atomic_helper_plane_reset, > > > .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state, > > > .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, > > > @@ -297,24 +296,19 @@ static const struct drm_plane_funcs hdlcd_plane_funcs = { > > > static struct drm_plane *hdlcd_plane_init(struct drm_device *drm) > > > { > > > - struct hdlcd_drm_private *hdlcd = drm->dev_private; > > > + struct hdlcd_drm_private *hdlcd = drm_to_hdlcd_priv(drm); > > > struct drm_plane *plane = NULL; > > > u32 formats[ARRAY_SIZE(supported_formats)], i; > > > - int ret; > > > - > > > - plane = devm_kzalloc(drm->dev, sizeof(*plane), GFP_KERNEL); > > > - if (!plane) > > > - return ERR_PTR(-ENOMEM); > > > for (i = 0; i < ARRAY_SIZE(supported_formats); i++) > > > formats[i] = supported_formats[i].fourcc; > > > - ret = drm_universal_plane_init(drm, plane, 0xff, &hdlcd_plane_funcs, > > > - formats, ARRAY_SIZE(formats), > > > - NULL, > > > - DRM_PLANE_TYPE_PRIMARY, NULL); > > > - if (ret) > > > - return ERR_PTR(ret); > > > + plane = drmm_universal_plane_alloc(drm, struct drm_plane, dev, 0xff, > > > + &hdlcd_plane_funcs, > > > + formats, ARRAY_SIZE(formats), > > > + NULL, DRM_PLANE_TYPE_PRIMARY, NULL); > > > + if (IS_ERR(plane)) > > > + return plane; > > > drm_plane_helper_add(plane, &hdlcd_plane_helper_funcs); > > > hdlcd->plane = plane; > > > -- > > > 2.37.2 > > > > > >
On 9/13/22 10:58, Liviu Dudau wrote: > On Mon, Sep 12, 2022 at 09:50:26PM +0200, Danilo Krummrich wrote: >> Hi Liviu, > > Hi Danilo, > >> >> Thanks for having a look! >> >> This is not about this patch, it's about patch 3/7 "drm/arm/hdlcd: crtc: use >> drmm_crtc_init_with_planes()". > > Agree! However, this is the patch that removes the .destroy hook, so I've replied here. This is a different .destroy hook, it's the struct drm_plane_funcs one, not the struct drm_crtc_funcs one, which the warning is about. Anyway, as said, we can just drop the mentioned patch. :-) > >> >> And there it's the other way around. When using drmm_crtc_init_with_planes() >> we shouldn't have a destroy hook in place, that's the whole purpose of >> drmm_crtc_init_with_planes(). >> >> We should just drop patch 3/7 "drm/arm/hdlcd: crtc: use >> drmm_crtc_init_with_planes()", it's wrong. > > So we end up with mixed use of managed and unmanaged APIs? In this case, yes. However, I don't think this makes it inconsistent. They only thing drmm_crtc_init_with_planes() does different than drm_crtc_init_with_planes() is that it set's things up to automatically call drm_crtc_cleanup() on .destroy. Since this driver also does a register write in the .destroy callback and hence we can't get rid of the callback we can just keep it as it is. > >> >> Do you want me to send a v2 for that? > > Yes please! It would help me to understand your thinking around the whole lifecycle of the driver. > > BTW, I appreciate the care in patches 5-7 to make sure that the driver doesn't access freed resources, > however I'm not sure I like the fact that rmmod-ing the hdlcd driver while I have an fbcon running > hangs now the command and prevents a kernel reboot, while it works without your series. Can you explain > to me again what are you trying to fix? Sure! DRM managed resources are cleaned up whenever the last reference is put. This is not necessarily the case when the driver is unbound, hence there might still be calls into the driver and therefore we must protect resources that are bound to the driver/device lifecycle (e.g. a MMIO region mapped via devm_ioremap_resource()) from being accessed. That's why the hdlcd_write() and hdlcd_read() calls in the crtc callbacks need to be protected. However, of course, the changes needed to achieve that should not result into hanging rmmod. Unfortunately, just by looking at the patches again I don't see how this could happen. Do you mind trying again with my v2 (although v2 shouldn't make a difference for this issue) and provide the back-trace when it hangs? Thanks, Danilo > > Best regards, > Liviu > > >> >> - Danilo >> >> >> >> On 9/12/22 19:36, Liviu Dudau wrote: >>> Hi Danilo, >>> >>> I have applied your patch series for HDLCD on top of drm-next (commit 213cb76ddc8b) >>> and on start up I get a warning: >>> >>> [ 12.882554] hdlcd 7ff50000.hdlcd: drm_WARN_ON(funcs && funcs->destroy) >>> [ 12.882596] WARNING: CPU: 1 PID: 211 at drivers/gpu/drm/drm_crtc.c:393 __drmm_crtc_init_with_planes+0x70/0xf0 [drm] >>> >>> It looks like the .destroy hook is still required or I'm missing some other required >>> series where the WARN has been removed? >>> >>> Best regards, >>> Liviu
On Wed, Sep 14, 2022 at 12:03:58AM +0200, Danilo Krummrich wrote: > On 9/13/22 10:58, Liviu Dudau wrote: > > On Mon, Sep 12, 2022 at 09:50:26PM +0200, Danilo Krummrich wrote: > > > Hi Liviu, > > > > Hi Danilo, > > > > > > > > Thanks for having a look! > > > > > > This is not about this patch, it's about patch 3/7 "drm/arm/hdlcd: crtc: use > > > drmm_crtc_init_with_planes()". > > > > Agree! However, this is the patch that removes the .destroy hook, so I've replied here. > > This is a different .destroy hook, it's the struct drm_plane_funcs one, not > the struct drm_crtc_funcs one, which the warning is about. Anyway, as said, > we can just drop the mentioned patch. :-) Sorry, my mistake. > > > > > > > > > And there it's the other way around. When using drmm_crtc_init_with_planes() > > > we shouldn't have a destroy hook in place, that's the whole purpose of > > > drmm_crtc_init_with_planes(). > > > > > > We should just drop patch 3/7 "drm/arm/hdlcd: crtc: use > > > drmm_crtc_init_with_planes()", it's wrong. > > > > So we end up with mixed use of managed and unmanaged APIs? > > In this case, yes. However, I don't think this makes it inconsistent. They > only thing drmm_crtc_init_with_planes() does different than > drm_crtc_init_with_planes() is that it set's things up to automatically call > drm_crtc_cleanup() on .destroy. Since this driver also does a register write > in the .destroy callback and hence we can't get rid of the callback we can > just keep it as it is. I'm trying to test your v2 on a flaky platform (my Juno R1 has developed some memory issues that leads to crashes on most boots) and I'm seeing some issues that I'm trying to replicate (and understand) before posting the stack trace. I'm not sure yet if they are related to the mixing of managed and unmanaged APIs, I need a bit more time for testing. > > > > > > > > > Do you want me to send a v2 for that? > > > > Yes please! It would help me to understand your thinking around the whole lifecycle of the driver. > > > > BTW, I appreciate the care in patches 5-7 to make sure that the driver doesn't access freed resources, > > however I'm not sure I like the fact that rmmod-ing the hdlcd driver while I have an fbcon running > > hangs now the command and prevents a kernel reboot, while it works without your series. Can you explain > > to me again what are you trying to fix? > > Sure! DRM managed resources are cleaned up whenever the last reference is > put. This is not necessarily the case when the driver is unbound, hence > there might still be calls into the driver and therefore we must protect > resources that are bound to the driver/device lifecycle (e.g. a MMIO region > mapped via devm_ioremap_resource()) from being accessed. That's why the > hdlcd_write() and hdlcd_read() calls in the crtc callbacks need to be > protected. Thanks for the explanation on what the code ultimately does. I was trying to understand what was the impetus for the change in the first place. Why did you thought adding the calls to managed APIs was needed and what were you trying to fix? > > However, of course, the changes needed to achieve that should not result > into hanging rmmod. Unfortunately, just by looking at the patches again I > don't see how this could happen. > > Do you mind trying again with my v2 (although v2 shouldn't make a difference > for this issue) and provide the back-trace when it hangs? I'm trying to do that. I've got one good trace that I'm trying to reproduce, but unfortunately my main Juno board has developed a memory fault and the replacement for it is taking longer than I wanted. Best regards, Liviu > > Thanks, > Danilo > > > > > Best regards, > > Liviu > > > > > > > > > > - Danilo > > > > > > > > > > > > On 9/12/22 19:36, Liviu Dudau wrote: > > > > Hi Danilo, > > > > > > > > I have applied your patch series for HDLCD on top of drm-next (commit 213cb76ddc8b) > > > > and on start up I get a warning: > > > > > > > > [ 12.882554] hdlcd 7ff50000.hdlcd: drm_WARN_ON(funcs && funcs->destroy) > > > > [ 12.882596] WARNING: CPU: 1 PID: 211 at drivers/gpu/drm/drm_crtc.c:393 __drmm_crtc_init_with_planes+0x70/0xf0 [drm] > > > > > > > > It looks like the .destroy hook is still required or I'm missing some other required > > > > series where the WARN has been removed? > > > > > > > > Best regards, > > > > Liviu >
On Wed, Sep 14, 2022 at 12:03:58AM +0200, Danilo Krummrich wrote: > On 9/13/22 10:58, Liviu Dudau wrote: > > On Mon, Sep 12, 2022 at 09:50:26PM +0200, Danilo Krummrich wrote: > > > Hi Liviu, > > > > Hi Danilo, > > > > > > > > Thanks for having a look! > > > > > > This is not about this patch, it's about patch 3/7 "drm/arm/hdlcd: crtc: use > > > drmm_crtc_init_with_planes()". > > > > Agree! However, this is the patch that removes the .destroy hook, so I've replied here. > > This is a different .destroy hook, it's the struct drm_plane_funcs one, not > the struct drm_crtc_funcs one, which the warning is about. Anyway, as said, > we can just drop the mentioned patch. :-) > > > > > > > > > And there it's the other way around. When using drmm_crtc_init_with_planes() > > > we shouldn't have a destroy hook in place, that's the whole purpose of > > > drmm_crtc_init_with_planes(). > > > > > > We should just drop patch 3/7 "drm/arm/hdlcd: crtc: use > > > drmm_crtc_init_with_planes()", it's wrong. > > > > So we end up with mixed use of managed and unmanaged APIs? > > In this case, yes. However, I don't think this makes it inconsistent. They > only thing drmm_crtc_init_with_planes() does different than > drm_crtc_init_with_planes() is that it set's things up to automatically call > drm_crtc_cleanup() on .destroy. Since this driver also does a register write > in the .destroy callback and hence we can't get rid of the callback we can > just keep it as it is. > > > > > > > > > Do you want me to send a v2 for that? > > > > Yes please! It would help me to understand your thinking around the whole lifecycle of the driver. > > > > BTW, I appreciate the care in patches 5-7 to make sure that the driver doesn't access freed resources, > > however I'm not sure I like the fact that rmmod-ing the hdlcd driver while I have an fbcon running > > hangs now the command and prevents a kernel reboot, while it works without your series. Can you explain > > to me again what are you trying to fix? > > Sure! DRM managed resources are cleaned up whenever the last reference is > put. This is not necessarily the case when the driver is unbound, hence > there might still be calls into the driver and therefore we must protect > resources that are bound to the driver/device lifecycle (e.g. a MMIO region > mapped via devm_ioremap_resource()) from being accessed. That's why the > hdlcd_write() and hdlcd_read() calls in the crtc callbacks need to be > protected. > > However, of course, the changes needed to achieve that should not result > into hanging rmmod. Unfortunately, just by looking at the patches again I > don't see how this could happen. > > Do you mind trying again with my v2 (although v2 shouldn't make a difference > for this issue) and provide the back-trace when it hangs? Hi Danilo, I've finally got a replacement Juno board that it is stable enough. I've tried your v2 on top of 7860d720a84c ("drm/msm: Fix build break with recent mm tree") which is the head of drm-next today and rmmod hangs. /proc/<pid_of_rmmod>/stack shows: [<0>] __synchronize_srcu.part.0+0x78/0xec [<0>] synchronize_srcu+0xe0/0x134 [<0>] drm_dev_unplug+0x2c/0x60 [drm] [<0>] hdlcd_drm_unbind+0x20/0xc0 [hdlcd] [<0>] component_master_del+0xa4/0xc0 [<0>] hdlcd_remove+0x1c/0x2c [hdlcd] [<0>] platform_remove+0x28/0x60 [<0>] device_remove+0x4c/0x80 [<0>] device_release_driver_internal+0x1e4/0x250 [<0>] driver_detach+0x50/0xe0 [<0>] bus_remove_driver+0x5c/0xbc [<0>] driver_unregister+0x30/0x60 [<0>] platform_driver_unregister+0x14/0x20 [<0>] hdlcd_platform_driver_exit+0x1c/0xe40 [hdlcd] [<0>] __arm64_sys_delete_module+0x18c/0x240 [<0>] invoke_syscall+0x48/0x114 [<0>] el0_svc_common.constprop.0+0xcc/0xec [<0>] do_el0_svc+0x2c/0xc0 [<0>] el0_svc+0x2c/0x84 [<0>] el0t_64_sync_handler+0x11c/0x150 [<0>] el0t_64_sync+0x18c/0x190 My quick guess would be that the mixing of managed and unmanaged APIs manages to confuse the sleepable RCUs and we get the hang. Will chat with Daniel Vetter next week at XDC on what would be the best approach here. Best regards, Liviu > > Thanks, > Danilo > > > > > Best regards, > > Liviu > > > > > > > > > > - Danilo > > > > > > > > > > > > On 9/12/22 19:36, Liviu Dudau wrote: > > > > Hi Danilo, > > > > > > > > I have applied your patch series for HDLCD on top of drm-next (commit 213cb76ddc8b) > > > > and on start up I get a warning: > > > > > > > > [ 12.882554] hdlcd 7ff50000.hdlcd: drm_WARN_ON(funcs && funcs->destroy) > > > > [ 12.882596] WARNING: CPU: 1 PID: 211 at drivers/gpu/drm/drm_crtc.c:393 __drmm_crtc_init_with_planes+0x70/0xf0 [drm] > > > > > > > > It looks like the .destroy hook is still required or I'm missing some other required > > > > series where the WARN has been removed? > > > > > > > > Best regards, > > > > Liviu >
Hi Liviu, On 9/30/22 18:56, Liviu Dudau wrote: > On Wed, Sep 14, 2022 at 12:03:58AM +0200, Danilo Krummrich wrote: >> Do you mind trying again with my v2 (although v2 shouldn't make a difference >> for this issue) and provide the back-trace when it hangs? > > Hi Danilo, > > > I've finally got a replacement Juno board that it is stable enough. That's great! > > I've tried your v2 on top of 7860d720a84c ("drm/msm: Fix build break with recent mm tree") which > is the head of drm-next today and rmmod hangs. /proc/<pid_of_rmmod>/stack shows: Thanks for taking the time to test the patches and providing this stacktrace. > > [<0>] __synchronize_srcu.part.0+0x78/0xec > [<0>] synchronize_srcu+0xe0/0x134 > [<0>] drm_dev_unplug+0x2c/0x60 [drm] > [<0>] hdlcd_drm_unbind+0x20/0xc0 [hdlcd] > [<0>] component_master_del+0xa4/0xc0 > [<0>] hdlcd_remove+0x1c/0x2c [hdlcd] > [<0>] platform_remove+0x28/0x60 > [<0>] device_remove+0x4c/0x80 > [<0>] device_release_driver_internal+0x1e4/0x250 > [<0>] driver_detach+0x50/0xe0 > [<0>] bus_remove_driver+0x5c/0xbc > [<0>] driver_unregister+0x30/0x60 > [<0>] platform_driver_unregister+0x14/0x20 > [<0>] hdlcd_platform_driver_exit+0x1c/0xe40 [hdlcd] > [<0>] __arm64_sys_delete_module+0x18c/0x240 > [<0>] invoke_syscall+0x48/0x114 > [<0>] el0_svc_common.constprop.0+0xcc/0xec > [<0>] do_el0_svc+0x2c/0xc0 > [<0>] el0_svc+0x2c/0x84 > [<0>] el0t_64_sync_handler+0x11c/0x150 > [<0>] el0t_64_sync+0x18c/0x190 > I think I figured it out. I messed up two of the srcu read-side critical sections by overlooking alternate return paths within those sections - yikes! I also found a potential use-after-free I accidentally introduced while removing the patch in v2. Finally, I added a patch to remove unnecessary calls to drm_mode_config_cleanup() and replaced drm_mode_config_init() with drmm_mode_config_init(). I will send you a v3 containing those fixes. > My quick guess would be that the mixing of managed and unmanaged APIs manages to > confuse the sleepable RCUs and we get the hang. I guess you're referring to drm_crtc_init_with_planes() and providing a .destroy callback in hdlcd_crtc_funcs. Actually, this .destroy callback is handled in the same way as when initializing the crtc with drmm_crtc_init_with_planes(), hence I don't think we have a mix of managed and unmanaged APIs here. drmm_crtc_init_with_planes() just calls __drm_crtc_init_with_planes() and adds the cleanup via drmm_add_action_or_reset(). Having a .destroy callback registered via drm_crtc_init_with_planes() ends up the same way, since drm_mode_config_init() simply calls drmm_mode_config_init(), which also registers drm_mode_config_cleanup() (ultimately calling the crtc->destroy callback) via drmm_add_action_or_reset(). - Danilo > Will chat with Daniel Vetter next > week at XDC on what would be the best approach here. > > Best regards, > Liviu
diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c index c0a5ca7f578a..17d3ccf12245 100644 --- a/drivers/gpu/drm/arm/hdlcd_crtc.c +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c @@ -289,7 +289,6 @@ static const struct drm_plane_helper_funcs hdlcd_plane_helper_funcs = { static const struct drm_plane_funcs hdlcd_plane_funcs = { .update_plane = drm_atomic_helper_update_plane, .disable_plane = drm_atomic_helper_disable_plane, - .destroy = drm_plane_cleanup, .reset = drm_atomic_helper_plane_reset, .atomic_duplicate_state = drm_atomic_helper_plane_duplicate_state, .atomic_destroy_state = drm_atomic_helper_plane_destroy_state, @@ -297,24 +296,19 @@ static const struct drm_plane_funcs hdlcd_plane_funcs = { static struct drm_plane *hdlcd_plane_init(struct drm_device *drm) { - struct hdlcd_drm_private *hdlcd = drm->dev_private; + struct hdlcd_drm_private *hdlcd = drm_to_hdlcd_priv(drm); struct drm_plane *plane = NULL; u32 formats[ARRAY_SIZE(supported_formats)], i; - int ret; - - plane = devm_kzalloc(drm->dev, sizeof(*plane), GFP_KERNEL); - if (!plane) - return ERR_PTR(-ENOMEM); for (i = 0; i < ARRAY_SIZE(supported_formats); i++) formats[i] = supported_formats[i].fourcc; - ret = drm_universal_plane_init(drm, plane, 0xff, &hdlcd_plane_funcs, - formats, ARRAY_SIZE(formats), - NULL, - DRM_PLANE_TYPE_PRIMARY, NULL); - if (ret) - return ERR_PTR(ret); + plane = drmm_universal_plane_alloc(drm, struct drm_plane, dev, 0xff, + &hdlcd_plane_funcs, + formats, ARRAY_SIZE(formats), + NULL, DRM_PLANE_TYPE_PRIMARY, NULL); + if (IS_ERR(plane)) + return plane; drm_plane_helper_add(plane, &hdlcd_plane_helper_funcs); hdlcd->plane = plane;
Use drm managed resource allocation (drmm_universal_plane_alloc()) in order to get rid of the explicit destroy hook in struct drm_plane_funcs. Signed-off-by: Danilo Krummrich <dakr@redhat.com> --- drivers/gpu/drm/arm/hdlcd_crtc.c | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-)