diff mbox series

[rebase,1/3] drm: Add drm_vblank_work_flush_all().

Message ID 20240404104813.150030-1-maarten.lankhorst@linux.intel.com (mailing list archive)
State New, archived
Headers show
Series [rebase,1/3] drm: Add drm_vblank_work_flush_all(). | expand

Commit Message

Maarten Lankhorst April 4, 2024, 10:48 a.m. UTC
From: Maarten Lankhorst <dev@lankhorst.se>

In some cases we want to flush all vblank work, right before vblank_off
for example. Add a simple function to make this possible.

Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
---
 drivers/gpu/drm/drm_vblank_work.c | 22 ++++++++++++++++++++++
 include/drm/drm_vblank_work.h     |  2 ++
 2 files changed, 24 insertions(+)

Comments

Lucas De Marchi April 5, 2024, 1:36 p.m. UTC | #1
what does "rebase" instead of "PATCH" is supposed to mean here?
And then we have a "PATCH v2" as reply to this one.

Shouldn't this go to dri-devel (too)?

Lucas De Marchi

On Thu, Apr 04, 2024 at 12:48:11PM +0200, Maarten Lankhorst wrote:
>From: Maarten Lankhorst <dev@lankhorst.se>
>
>In some cases we want to flush all vblank work, right before vblank_off
>for example. Add a simple function to make this possible.
>
>Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
>---
> drivers/gpu/drm/drm_vblank_work.c | 22 ++++++++++++++++++++++
> include/drm/drm_vblank_work.h     |  2 ++
> 2 files changed, 24 insertions(+)
>
>diff --git a/drivers/gpu/drm/drm_vblank_work.c b/drivers/gpu/drm/drm_vblank_work.c
>index 43cd5c0f4f6f..ff86f2b2e052 100644
>--- a/drivers/gpu/drm/drm_vblank_work.c
>+++ b/drivers/gpu/drm/drm_vblank_work.c
>@@ -232,6 +232,28 @@ void drm_vblank_work_flush(struct drm_vblank_work *work)
> }
> EXPORT_SYMBOL(drm_vblank_work_flush);
>
>+/**
>+ * drm_vblank_work_flush_all - flush all currently pending vblank work on crtc.
>+ * @crtc: crtc for which vblank work to flush
>+ *
>+ * Wait until all currently queued vblank work on @crtc
>+ * has finished executing once.
>+ */
>+void drm_vblank_work_flush_all(struct drm_crtc *crtc)
>+{
>+	struct drm_device *dev = crtc->dev;
>+	struct drm_vblank_crtc *vblank = &dev->vblank[drm_crtc_index(crtc)];
>+
>+	spin_lock_irq(&dev->event_lock);
>+	wait_event_lock_irq(vblank->work_wait_queue,
>+			    waitqueue_active(&vblank->work_wait_queue),
>+			    dev->event_lock);
>+	spin_unlock_irq(&dev->event_lock);
>+
>+	kthread_flush_worker(vblank->worker);
>+}
>+EXPORT_SYMBOL(drm_vblank_work_flush_all);
>+
> /**
>  * drm_vblank_work_init - initialize a vblank work item
>  * @work: vblank work item
>diff --git a/include/drm/drm_vblank_work.h b/include/drm/drm_vblank_work.h
>index eb41d0810c4f..e04d436b7297 100644
>--- a/include/drm/drm_vblank_work.h
>+++ b/include/drm/drm_vblank_work.h
>@@ -17,6 +17,7 @@ struct drm_crtc;
>  * drm_vblank_work_init()
>  * drm_vblank_work_cancel_sync()
>  * drm_vblank_work_flush()
>+ * drm_vblank_work_flush_all()
>  */
> struct drm_vblank_work {
> 	/**
>@@ -67,5 +68,6 @@ void drm_vblank_work_init(struct drm_vblank_work *work, struct drm_crtc *crtc,
> 			  void (*func)(struct kthread_work *work));
> bool drm_vblank_work_cancel_sync(struct drm_vblank_work *work);
> void drm_vblank_work_flush(struct drm_vblank_work *work);
>+void drm_vblank_work_flush_all(struct drm_crtc *crtc);
>
> #endif /* !_DRM_VBLANK_WORK_H_ */
>-- 
>2.43.0
>
Maarten Lankhorst April 6, 2024, 5:45 p.m. UTC | #2
Hey,

On 2024-04-05 15:36, Lucas De Marchi wrote:
> what does "rebase" instead of "PATCH" is supposed to mean here?
> And then we have a "PATCH v2" as reply to this one.
> 
> Shouldn't this go to dri-devel (too)?
> 
> Lucas De Marchi
I was rebasing so no changes were originally made.

Afterwards I found out why the patch series failed,
and sent a v2 patch for that specifically.

I think this should go to dri-devel, forgot this patch required it. :)

Can send a full v2 patch series in the beginning of next week. It looks 
like I still missed a uaf even with this fix. :(

Cheers,
~Maarten

> 
> On Thu, Apr 04, 2024 at 12:48:11PM +0200, Maarten Lankhorst wrote:
>> From: Maarten Lankhorst <dev@lankhorst.se>
>>
>> In some cases we want to flush all vblank work, right before vblank_off
>> for example. Add a simple function to make this possible.
>>
>> Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
>> ---
>> drivers/gpu/drm/drm_vblank_work.c | 22 ++++++++++++++++++++++
>> include/drm/drm_vblank_work.h     |  2 ++
>> 2 files changed, 24 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/drm_vblank_work.c 
>> b/drivers/gpu/drm/drm_vblank_work.c
>> index 43cd5c0f4f6f..ff86f2b2e052 100644
>> --- a/drivers/gpu/drm/drm_vblank_work.c
>> +++ b/drivers/gpu/drm/drm_vblank_work.c
>> @@ -232,6 +232,28 @@ void drm_vblank_work_flush(struct drm_vblank_work 
>> *work)
>> }
>> EXPORT_SYMBOL(drm_vblank_work_flush);
>>
>> +/**
>> + * drm_vblank_work_flush_all - flush all currently pending vblank 
>> work on crtc.
>> + * @crtc: crtc for which vblank work to flush
>> + *
>> + * Wait until all currently queued vblank work on @crtc
>> + * has finished executing once.
>> + */
>> +void drm_vblank_work_flush_all(struct drm_crtc *crtc)
>> +{
>> +    struct drm_device *dev = crtc->dev;
>> +    struct drm_vblank_crtc *vblank = &dev->vblank[drm_crtc_index(crtc)];
>> +
>> +    spin_lock_irq(&dev->event_lock);
>> +    wait_event_lock_irq(vblank->work_wait_queue,
>> +                waitqueue_active(&vblank->work_wait_queue),
>> +                dev->event_lock);
>> +    spin_unlock_irq(&dev->event_lock);
>> +
>> +    kthread_flush_worker(vblank->worker);
>> +}
>> +EXPORT_SYMBOL(drm_vblank_work_flush_all);
>> +
>> /**
>>  * drm_vblank_work_init - initialize a vblank work item
>>  * @work: vblank work item
>> diff --git a/include/drm/drm_vblank_work.h 
>> b/include/drm/drm_vblank_work.h
>> index eb41d0810c4f..e04d436b7297 100644
>> --- a/include/drm/drm_vblank_work.h
>> +++ b/include/drm/drm_vblank_work.h
>> @@ -17,6 +17,7 @@ struct drm_crtc;
>>  * drm_vblank_work_init()
>>  * drm_vblank_work_cancel_sync()
>>  * drm_vblank_work_flush()
>> + * drm_vblank_work_flush_all()
>>  */
>> struct drm_vblank_work {
>>     /**
>> @@ -67,5 +68,6 @@ void drm_vblank_work_init(struct drm_vblank_work 
>> *work, struct drm_crtc *crtc,
>>               void (*func)(struct kthread_work *work));
>> bool drm_vblank_work_cancel_sync(struct drm_vblank_work *work);
>> void drm_vblank_work_flush(struct drm_vblank_work *work);
>> +void drm_vblank_work_flush_all(struct drm_crtc *crtc);
>>
>> #endif /* !_DRM_VBLANK_WORK_H_ */
>> -- 
>> 2.43.0
>>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/drm_vblank_work.c b/drivers/gpu/drm/drm_vblank_work.c
index 43cd5c0f4f6f..ff86f2b2e052 100644
--- a/drivers/gpu/drm/drm_vblank_work.c
+++ b/drivers/gpu/drm/drm_vblank_work.c
@@ -232,6 +232,28 @@  void drm_vblank_work_flush(struct drm_vblank_work *work)
 }
 EXPORT_SYMBOL(drm_vblank_work_flush);
 
+/**
+ * drm_vblank_work_flush_all - flush all currently pending vblank work on crtc.
+ * @crtc: crtc for which vblank work to flush
+ *
+ * Wait until all currently queued vblank work on @crtc
+ * has finished executing once.
+ */
+void drm_vblank_work_flush_all(struct drm_crtc *crtc)
+{
+	struct drm_device *dev = crtc->dev;
+	struct drm_vblank_crtc *vblank = &dev->vblank[drm_crtc_index(crtc)];
+
+	spin_lock_irq(&dev->event_lock);
+	wait_event_lock_irq(vblank->work_wait_queue,
+			    waitqueue_active(&vblank->work_wait_queue),
+			    dev->event_lock);
+	spin_unlock_irq(&dev->event_lock);
+
+	kthread_flush_worker(vblank->worker);
+}
+EXPORT_SYMBOL(drm_vblank_work_flush_all);
+
 /**
  * drm_vblank_work_init - initialize a vblank work item
  * @work: vblank work item
diff --git a/include/drm/drm_vblank_work.h b/include/drm/drm_vblank_work.h
index eb41d0810c4f..e04d436b7297 100644
--- a/include/drm/drm_vblank_work.h
+++ b/include/drm/drm_vblank_work.h
@@ -17,6 +17,7 @@  struct drm_crtc;
  * drm_vblank_work_init()
  * drm_vblank_work_cancel_sync()
  * drm_vblank_work_flush()
+ * drm_vblank_work_flush_all()
  */
 struct drm_vblank_work {
 	/**
@@ -67,5 +68,6 @@  void drm_vblank_work_init(struct drm_vblank_work *work, struct drm_crtc *crtc,
 			  void (*func)(struct kthread_work *work));
 bool drm_vblank_work_cancel_sync(struct drm_vblank_work *work);
 void drm_vblank_work_flush(struct drm_vblank_work *work);
+void drm_vblank_work_flush_all(struct drm_crtc *crtc);
 
 #endif /* !_DRM_VBLANK_WORK_H_ */