mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			94 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			94 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From fdf7e26618d92e6ec22695cc616798a0ec5a120a Mon Sep 17 00:00:00 2001
 | |
| From: Ezequiel Garcia <ezequiel@collabora.com>
 | |
| Date: Sun, 21 Mar 2021 16:38:54 -0300
 | |
| Subject: [PATCH] RFC: media: Add media_request_{pin,unpin} API
 | |
| 
 | |
| This is probably not the API we will want to add, but it
 | |
| should show what semantics are needed by drivers.
 | |
| 
 | |
| The goal is to allow the OUTPUT (aka source) buffer and the
 | |
| controls associated to a request to be released from the request,
 | |
| and in particular return the OUTPUT buffer back to userspace,
 | |
| without signalling the media request fd.
 | |
| 
 | |
| This is useful for devices that are able to pre-process
 | |
| the OUTPUT buffer, therefore able to release it before
 | |
| the decoding is finished. These drivers should signal
 | |
| the media request fd only after the CAPTURE buffer is done.
 | |
| 
 | |
| Tested-by: John Cox <jc@kynesim.co.uk>
 | |
| Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
 | |
| ---
 | |
|  drivers/media/mc/mc-request.c | 35 +++++++++++++++++++++++++++++++++++
 | |
|  include/media/media-request.h | 12 ++++++++++++
 | |
|  2 files changed, 47 insertions(+)
 | |
| 
 | |
| --- a/drivers/media/mc/mc-request.c
 | |
| +++ b/drivers/media/mc/mc-request.c
 | |
| @@ -505,3 +505,38 @@ unlock:
 | |
|  		media_request_put(req);
 | |
|  }
 | |
|  EXPORT_SYMBOL_GPL(media_request_object_complete);
 | |
| +
 | |
| +void media_request_pin(struct media_request *req)
 | |
| +{
 | |
| +	unsigned long flags;
 | |
| +
 | |
| +	spin_lock_irqsave(&req->lock, flags);
 | |
| +	if (WARN_ON(req->state != MEDIA_REQUEST_STATE_QUEUED))
 | |
| +		goto unlock;
 | |
| +	req->num_incomplete_objects++;
 | |
| +unlock:
 | |
| +	spin_unlock_irqrestore(&req->lock, flags);
 | |
| +}
 | |
| +EXPORT_SYMBOL_GPL(media_request_pin);
 | |
| +
 | |
| +void media_request_unpin(struct media_request *req)
 | |
| +{
 | |
| +	unsigned long flags;
 | |
| +	bool completed = false;
 | |
| +
 | |
| +	spin_lock_irqsave(&req->lock, flags);
 | |
| +	if (WARN_ON(!req->num_incomplete_objects) ||
 | |
| +	    WARN_ON(req->state != MEDIA_REQUEST_STATE_QUEUED))
 | |
| +		goto unlock;
 | |
| +
 | |
| +	if (!--req->num_incomplete_objects) {
 | |
| +		req->state = MEDIA_REQUEST_STATE_COMPLETE;
 | |
| +		wake_up_interruptible_all(&req->poll_wait);
 | |
| +		completed = true;
 | |
| +	}
 | |
| +unlock:
 | |
| +	spin_unlock_irqrestore(&req->lock, flags);
 | |
| +	if (completed)
 | |
| +		media_request_put(req);
 | |
| +}
 | |
| +EXPORT_SYMBOL_GPL(media_request_unpin);
 | |
| --- a/include/media/media-request.h
 | |
| +++ b/include/media/media-request.h
 | |
| @@ -189,6 +189,10 @@ static inline void media_request_get(str
 | |
|   */
 | |
|  void media_request_put(struct media_request *req);
 | |
|  
 | |
| +void media_request_pin(struct media_request *req);
 | |
| +
 | |
| +void media_request_unpin(struct media_request *req);
 | |
| +
 | |
|  /**
 | |
|   * media_request_get_by_fd - Get a media request by fd
 | |
|   *
 | |
| @@ -228,6 +232,14 @@ static inline void media_request_put(str
 | |
|  {
 | |
|  }
 | |
|  
 | |
| +static inline void media_request_pin(struct media_request *req)
 | |
| +{
 | |
| +}
 | |
| +
 | |
| +static inline void media_request_unpin(struct media_request *req)
 | |
| +{
 | |
| +}
 | |
| +
 | |
|  static inline struct media_request *
 | |
|  media_request_get_by_fd(struct media_device *mdev, int request_fd)
 | |
|  {
 |