* [PATCH] drm: move lease init after validation in drm_lease_create
@ 2017-12-21 6:54 Keith Packard
2017-12-21 8:50 ` Daniel Vetter
0 siblings, 1 reply; 2+ messages in thread
From: Keith Packard @ 2017-12-21 6:54 UTC (permalink / raw)
To: linux-kernel, Dave Airlie, Daniel Vetter; +Cc: Keith Packard, dri-devel
Patch bd36d3bab2e3d08f80766c86487090dbceed4651 fixed a deadlock in the
failure path of drm_lease_create. This made the partially initialized
lease object visible for a short window of time.
To avoid having the lessee state appear transiently, I've rearranged
the code so that the lessor fields are not filled in until the
parameters are all validated and the function will succeed.
Signed-off-by: Keith Packard <keithp@keithp.com>
---
drivers/gpu/drm/drm_lease.c | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/drivers/gpu/drm/drm_lease.c b/drivers/gpu/drm/drm_lease.c
index 59849f02e2ad..1402c0e71b03 100644
--- a/drivers/gpu/drm/drm_lease.c
+++ b/drivers/gpu/drm/drm_lease.c
@@ -220,17 +220,6 @@ static struct drm_master *drm_lease_create(struct drm_master *lessor, struct idr
mutex_lock(&dev->mode_config.idr_mutex);
- /* Insert the new lessee into the tree */
- id = idr_alloc(&(drm_lease_owner(lessor)->lessee_idr), lessee, 1, 0, GFP_KERNEL);
- if (id < 0) {
- error = id;
- goto out_lessee;
- }
-
- lessee->lessee_id = id;
- lessee->lessor = drm_master_get(lessor);
- list_add_tail(&lessee->lessee_list, &lessor->lessees);
-
idr_for_each_entry(leases, entry, object) {
error = 0;
if (!idr_find(&dev->mode_config.crtc_idr, object))
@@ -246,6 +235,17 @@ static struct drm_master *drm_lease_create(struct drm_master *lessor, struct idr
}
}
+ /* Insert the new lessee into the tree */
+ id = idr_alloc(&(drm_lease_owner(lessor)->lessee_idr), lessee, 1, 0, GFP_KERNEL);
+ if (id < 0) {
+ error = id;
+ goto out_lessee;
+ }
+
+ lessee->lessee_id = id;
+ lessee->lessor = drm_master_get(lessor);
+ list_add_tail(&lessee->lessee_list, &lessor->lessees);
+
/* Move the leases over */
lessee->leases = *leases;
DRM_DEBUG_LEASE("new lessee %d %p, lessor %d %p\n", lessee->lessee_id, lessee, lessor->lessee_id, lessor);
--
2.15.1
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] drm: move lease init after validation in drm_lease_create
2017-12-21 6:54 [PATCH] drm: move lease init after validation in drm_lease_create Keith Packard
@ 2017-12-21 8:50 ` Daniel Vetter
0 siblings, 0 replies; 2+ messages in thread
From: Daniel Vetter @ 2017-12-21 8:50 UTC (permalink / raw)
To: Keith Packard; +Cc: linux-kernel, Dave Airlie, Daniel Vetter, dri-devel
On Wed, Dec 20, 2017 at 10:54:24PM -0800, Keith Packard wrote:
> Patch bd36d3bab2e3d08f80766c86487090dbceed4651 fixed a deadlock in the
> failure path of drm_lease_create. This made the partially initialized
> lease object visible for a short window of time.
>
> To avoid having the lessee state appear transiently, I've rearranged
> the code so that the lessor fields are not filled in until the
> parameters are all validated and the function will succeed.
>
> Signed-off-by: Keith Packard <keithp@keithp.com>
Good catch, sorry I missed that. And registering the object as the very
last thing is definitely the safe pattern.
Applied, thanks for your patch.
-Daniel
> ---
> drivers/gpu/drm/drm_lease.c | 22 +++++++++++-----------
> 1 file changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_lease.c b/drivers/gpu/drm/drm_lease.c
> index 59849f02e2ad..1402c0e71b03 100644
> --- a/drivers/gpu/drm/drm_lease.c
> +++ b/drivers/gpu/drm/drm_lease.c
> @@ -220,17 +220,6 @@ static struct drm_master *drm_lease_create(struct drm_master *lessor, struct idr
>
> mutex_lock(&dev->mode_config.idr_mutex);
>
> - /* Insert the new lessee into the tree */
> - id = idr_alloc(&(drm_lease_owner(lessor)->lessee_idr), lessee, 1, 0, GFP_KERNEL);
> - if (id < 0) {
> - error = id;
> - goto out_lessee;
> - }
> -
> - lessee->lessee_id = id;
> - lessee->lessor = drm_master_get(lessor);
> - list_add_tail(&lessee->lessee_list, &lessor->lessees);
> -
> idr_for_each_entry(leases, entry, object) {
> error = 0;
> if (!idr_find(&dev->mode_config.crtc_idr, object))
> @@ -246,6 +235,17 @@ static struct drm_master *drm_lease_create(struct drm_master *lessor, struct idr
> }
> }
>
> + /* Insert the new lessee into the tree */
> + id = idr_alloc(&(drm_lease_owner(lessor)->lessee_idr), lessee, 1, 0, GFP_KERNEL);
> + if (id < 0) {
> + error = id;
> + goto out_lessee;
> + }
> +
> + lessee->lessee_id = id;
> + lessee->lessor = drm_master_get(lessor);
> + list_add_tail(&lessee->lessee_list, &lessor->lessees);
> +
> /* Move the leases over */
> lessee->leases = *leases;
> DRM_DEBUG_LEASE("new lessee %d %p, lessor %d %p\n", lessee->lessee_id, lessee, lessor->lessee_id, lessor);
> --
> 2.15.1
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2017-12-21 8:50 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-12-21 6:54 [PATCH] drm: move lease init after validation in drm_lease_create Keith Packard
2017-12-21 8:50 ` Daniel Vetter
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®