lkml.org 
[lkml]   [2023]   [Oct]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v14 53/56] media: core: Free range of buffers
    Date
    Improve __vb2_queue_free() and __vb2_free_mem() to free
    range of buffers and not only the last few buffers.
    Intoduce starting index to be flexible on range and change the loops
    according to this parameters.

    Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
    ---
    .../media/common/videobuf2/videobuf2-core.c | 59 +++++++++----------
    1 file changed, 28 insertions(+), 31 deletions(-)

    diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c
    index 6e88406fcae9..010a8bca0240 100644
    --- a/drivers/media/common/videobuf2/videobuf2-core.c
    +++ b/drivers/media/common/videobuf2/videobuf2-core.c
    @@ -519,15 +519,13 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory,
    /*
    * __vb2_free_mem() - release all video buffer memory for a given queue
    */
    -static void __vb2_free_mem(struct vb2_queue *q, unsigned int buffers)
    +static void __vb2_free_mem(struct vb2_queue *q, unsigned int start, unsigned int count)
    {
    - unsigned int buffer;
    + unsigned int i;
    struct vb2_buffer *vb;
    - unsigned int q_num_buffers = vb2_get_num_buffers(q);

    - for (buffer = q_num_buffers - buffers; buffer < q_num_buffers;
    - ++buffer) {
    - vb = vb2_get_buffer(q, buffer);
    + for (i = start; i < q->max_num_buffers && i < start + count; i++) {
    + vb = vb2_get_buffer(q, i);
    if (!vb)
    continue;

    @@ -542,35 +540,35 @@ static void __vb2_free_mem(struct vb2_queue *q, unsigned int buffers)
    }

    /*
    - * __vb2_queue_free() - free buffers at the end of the queue - video memory and
    + * __vb2_queue_free() - free count buffers from start index of the queue - video memory and
    * related information, if no buffers are left return the queue to an
    * uninitialized state. Might be called even if the queue has already been freed.
    */
    -static void __vb2_queue_free(struct vb2_queue *q, unsigned int buffers)
    +static void __vb2_queue_free(struct vb2_queue *q, unsigned int start, unsigned int count)
    {
    - unsigned int buffer;
    - unsigned int q_num_buffers = vb2_get_num_buffers(q);
    + unsigned int i;

    lockdep_assert_held(&q->mmap_lock);

    /* Call driver-provided cleanup function for each buffer, if provided */
    - for (buffer = q_num_buffers - buffers; buffer < q_num_buffers;
    - ++buffer) {
    - struct vb2_buffer *vb = vb2_get_buffer(q, buffer);
    + for (i = start; i < q->max_num_buffers && i < start + count; i++) {
    + struct vb2_buffer *vb = vb2_get_buffer(q, i);

    - if (vb && vb->planes[0].mem_priv)
    + if (!vb)
    + continue;
    + if (vb->planes[0].mem_priv)
    call_void_vb_qop(vb, buf_cleanup, vb);
    }

    /* Release video buffer memory */
    - __vb2_free_mem(q, buffers);
    + __vb2_free_mem(q, start, count);

    #ifdef CONFIG_VIDEO_ADV_DEBUG
    /*
    * Check that all the calls were balanced during the life-time of this
    * queue. If not then dump the counters to the kernel log.
    */
    - if (q_num_buffers) {
    + if (vb2_get_num_buffers(q)) {
    bool unbalanced = q->cnt_start_streaming != q->cnt_stop_streaming ||
    q->cnt_prepare_streaming != q->cnt_unprepare_streaming ||
    q->cnt_wait_prepare != q->cnt_wait_finish;
    @@ -596,8 +594,8 @@ static void __vb2_queue_free(struct vb2_queue *q, unsigned int buffers)
    q->cnt_stop_streaming = 0;
    q->cnt_unprepare_streaming = 0;
    }
    - for (buffer = 0; buffer < vb2_get_num_buffers(q); buffer++) {
    - struct vb2_buffer *vb = vb2_get_buffer(q, buffer);
    + for (i = start; i < q->max_num_buffers && i < start + count; i++) {
    + struct vb2_buffer *vb = vb2_get_buffer(q, i);
    bool unbalanced;

    if (!vb)
    @@ -614,7 +612,7 @@ static void __vb2_queue_free(struct vb2_queue *q, unsigned int buffers)

    if (unbalanced) {
    pr_info("unbalanced counters for queue %p, buffer %d:\n",
    - q, buffer);
    + q, i);
    if (vb->cnt_buf_init != vb->cnt_buf_cleanup)
    pr_info(" buf_init: %u buf_cleanup: %u\n",
    vb->cnt_buf_init, vb->cnt_buf_cleanup);
    @@ -648,9 +646,8 @@ static void __vb2_queue_free(struct vb2_queue *q, unsigned int buffers)
    #endif

    /* Free vb2 buffers */
    - for (buffer = q_num_buffers - buffers; buffer < q_num_buffers;
    - ++buffer) {
    - struct vb2_buffer *vb = vb2_get_buffer(q, buffer);
    + for (i = start; i < q->max_num_buffers && i < start + count; i++) {
    + struct vb2_buffer *vb = vb2_get_buffer(q, i);

    if (!vb)
    continue;
    @@ -690,7 +687,7 @@ EXPORT_SYMBOL(vb2_buffer_in_use);
    static bool __buffers_in_use(struct vb2_queue *q)
    {
    unsigned int buffer;
    - for (buffer = 0; buffer < vb2_get_num_buffers(q); ++buffer) {
    + for (buffer = 0; buffer < q->max_num_buffers; ++buffer) {
    struct vb2_buffer *vb = vb2_get_buffer(q, buffer);

    if (!vb)
    @@ -850,7 +847,7 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory,
    * queued without ever calling STREAMON.
    */
    __vb2_queue_cancel(q);
    - __vb2_queue_free(q, q_num_bufs);
    + __vb2_queue_free(q, 0, q->max_num_buffers);
    mutex_unlock(&q->mmap_lock);

    /*
    @@ -960,7 +957,7 @@ int vb2_core_reqbufs(struct vb2_queue *q, enum vb2_memory memory,
    * from already queued buffers and it will reset q->memory to
    * VB2_MEMORY_UNKNOWN.
    */
    - __vb2_queue_free(q, allocated_buffers);
    + __vb2_queue_free(q, first_index, allocated_buffers);
    mutex_unlock(&q->mmap_lock);
    return ret;
    }
    @@ -1000,7 +997,7 @@ int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory,
    bool no_previous_buffers = !q_num_bufs;
    int ret = 0;

    - if (q->num_buffers == q->max_num_buffers) {
    + if (q_num_bufs == q->max_num_buffers) {
    dprintk(q, 1, "maximum number of buffers already allocated\n");
    return -ENOBUFS;
    }
    @@ -1100,7 +1097,7 @@ int vb2_core_create_bufs(struct vb2_queue *q, enum vb2_memory memory,
    * from already queued buffers and it will reset q->memory to
    * VB2_MEMORY_UNKNOWN.
    */
    - __vb2_queue_free(q, allocated_buffers);
    + __vb2_queue_free(q, *first_index, allocated_buffers);
    mutex_unlock(&q->mmap_lock);
    return -ENOMEM;
    }
    @@ -1714,7 +1711,7 @@ static int vb2_start_streaming(struct vb2_queue *q)
    * Forcefully reclaim buffers if the driver did not
    * correctly return them to vb2.
    */
    - for (i = 0; i < vb2_get_num_buffers(q); ++i) {
    + for (i = 0; i < q->max_num_buffers; ++i) {
    vb = vb2_get_buffer(q, i);

    if (!vb)
    @@ -2120,7 +2117,7 @@ static void __vb2_queue_cancel(struct vb2_queue *q)
    * to vb2 in stop_streaming().
    */
    if (WARN_ON(atomic_read(&q->owned_by_drv_count))) {
    - for (i = 0; i < vb2_get_num_buffers(q); i++) {
    + for (i = 0; i < q->max_num_buffers; i++) {
    struct vb2_buffer *vb = vb2_get_buffer(q, i);

    if (!vb)
    @@ -2164,7 +2161,7 @@ static void __vb2_queue_cancel(struct vb2_queue *q)
    * call to __fill_user_buffer() after buf_finish(). That order can't
    * be changed, so we can't move the buf_finish() to __vb2_dqbuf().
    */
    - for (i = 0; i < vb2_get_num_buffers(q); i++) {
    + for (i = 0; i < q->max_num_buffers; i++) {
    struct vb2_buffer *vb;
    struct media_request *req;

    @@ -2568,7 +2565,7 @@ void vb2_core_queue_release(struct vb2_queue *q)
    __vb2_cleanup_fileio(q);
    __vb2_queue_cancel(q);
    mutex_lock(&q->mmap_lock);
    - __vb2_queue_free(q, q->max_num_buffers);
    + __vb2_queue_free(q, 0, q->max_num_buffers);
    kfree(q->bufs);
    q->bufs = NULL;
    bitmap_free(q->bufs_bitmap);
    --
    2.39.2
    \
     
     \ /
      Last update: 2023-10-31 17:36    [W:4.157 / U:0.148 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site