Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp546239imm; Mon, 21 May 2018 10:07:29 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqD8RiZlGBWNQjLkvIoLWwVoAJp6RsQM3/MWxBn2NsocEZY00xAI+qwJpiKrj1iSGt8xUXw X-Received: by 2002:a17:902:43:: with SMTP id 61-v6mr21528544pla.112.1526922449576; Mon, 21 May 2018 10:07:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1526922449; cv=none; d=google.com; s=arc-20160816; b=xZiz7rM6wKRnNi/efueB3rq3WpZMSOcLRh33wdTFUUy1pKJx+Nx3Fqv+/2VNm5EMrE SevyZKXpwPBsN7NUtXCz3aocGHQ5KFB9YJnY1AuNGf1c8qNbJNjxhoaeqWiNmHXrFtXf HZA+xCCWsmRUq5nnaf/5Pd2qLeerZNnFSv0X3iyreceJlrutQSVT7V1WvIYbUkQ/oL1l USKxc1UIYY1vcRKYZFVZhqzBUwskv9FM2ye6GTo3MmK9X0GcWij+fgEQk+eUYMEu1oK5 2hidesPSfK8H5/U1QBpP4u8WnTtGv5OfOkSKcRmNwMHHCfhRMQV0WNz2WeeANM2+8+Zr WjkQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=22f95hGtTwL41ZUtvdUDtgUJ62jcmndcFHfFKglL9dg=; b=UMkpNHAmmqIrjqbol3pllPIzUn65yo39BcsdbLufpQXxRe7hPl5m6J4UzBwa2hUHCV vo0kMETotulbkyHfc1evpKK8FAbRHs1JRFLQLOawQRLMnV8azYNwIQCo4KHQbCIcwo3g RarICatxA2ZvSWnKNRk2adx3djeUiYShE2KQZFwa4pISuAGt0H9plgkM+uxhcTGJJ486 qZ7LCGsEIrQqDwn9mWcaLHjSN2bi0CbHGLOb1Mg+rck/H3LyzpAtJk3QW7dSQH0PtW6C a1m10709440kzH+mqjqdPrslZwTrW/k3v1OGaELQ+T2WkFBVfLTxmEY5AZXG0hJHRxkA 3tkg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w25-v6si11281145pgv.526.2018.05.21.10.07.15; Mon, 21 May 2018 10:07:29 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753309AbeEURBm (ORCPT + 99 others); Mon, 21 May 2018 13:01:42 -0400 Received: from bhuna.collabora.co.uk ([46.235.227.227]:44280 "EHLO bhuna.collabora.co.uk" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753255AbeEURBd (ORCPT ); Mon, 21 May 2018 13:01:33 -0400 Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: ezequiel) with ESMTPSA id 532D4273677 From: Ezequiel Garcia To: linux-media@vger.kernel.org Cc: kernel@collabora.com, Hans Verkuil , Mauro Carvalho Chehab , Shuah Khan , Pawel Osciak , Alexandre Courbot , Sakari Ailus , Brian Starkey , linux-kernel@vger.kernel.org, Gustavo Padovan , Ezequiel Garcia Subject: [PATCH v10 01/16] videobuf2: Make struct vb2_buffer refcounted Date: Mon, 21 May 2018 13:59:31 -0300 Message-Id: <20180521165946.11778-2-ezequiel@collabora.com> X-Mailer: git-send-email 2.16.3 In-Reply-To: <20180521165946.11778-1-ezequiel@collabora.com> References: <20180521165946.11778-1-ezequiel@collabora.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The in-fence implementation involves having a per-buffer fence callback, that triggers on the fence signal. The fence callback is called asynchronously and needs a valid reference to the associated ideobuf2 buffer. Allow this by making the vb2_buffer refcounted, so it can be passed to other contexts. Signed-off-by: Ezequiel Garcia --- drivers/media/common/videobuf2/videobuf2-core.c | 27 ++++++++++++++++++++++--- include/media/videobuf2-core.h | 7 +++++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/drivers/media/common/videobuf2/videobuf2-core.c b/drivers/media/common/videobuf2/videobuf2-core.c index d3f7bb33a54d..f1feb45c1e37 100644 --- a/drivers/media/common/videobuf2/videobuf2-core.c +++ b/drivers/media/common/videobuf2/videobuf2-core.c @@ -190,6 +190,26 @@ module_param(debug, int, 0644); static void __vb2_queue_cancel(struct vb2_queue *q); static void __enqueue_in_driver(struct vb2_buffer *vb); +static void __vb2_buffer_free(struct kref *kref) +{ + struct vb2_buffer *vb = + container_of(kref, struct vb2_buffer, refcount); + kfree(vb); +} + +static void __vb2_buffer_put(struct vb2_buffer *vb) +{ + if (vb) + kref_put(&vb->refcount, __vb2_buffer_free); +} + +static struct vb2_buffer *__vb2_buffer_get(struct vb2_buffer *vb) +{ + if (vb) + kref_get(&vb->refcount); + return vb; +} + /* * __vb2_buf_mem_alloc() - allocate video memory for the given buffer */ @@ -346,6 +366,7 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory, break; } + kref_init(&vb->refcount); vb->state = VB2_BUF_STATE_DEQUEUED; vb->vb2_queue = q; vb->num_planes = num_planes; @@ -365,7 +386,7 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory, dprintk(1, "failed allocating memory for buffer %d\n", buffer); q->bufs[vb->index] = NULL; - kfree(vb); + __vb2_buffer_put(vb); break; } __setup_offsets(vb); @@ -380,7 +401,7 @@ static int __vb2_queue_alloc(struct vb2_queue *q, enum vb2_memory memory, buffer, vb); __vb2_buf_mem_free(vb); q->bufs[vb->index] = NULL; - kfree(vb); + __vb2_buffer_put(vb); break; } } @@ -520,7 +541,7 @@ static int __vb2_queue_free(struct vb2_queue *q, unsigned int buffers) /* Free videobuf buffers */ for (buffer = q->num_buffers - buffers; buffer < q->num_buffers; ++buffer) { - kfree(q->bufs[buffer]); + __vb2_buffer_put(q->bufs[buffer]); q->bufs[buffer] = NULL; } diff --git a/include/media/videobuf2-core.h b/include/media/videobuf2-core.h index f6818f732f34..baa4632c7e59 100644 --- a/include/media/videobuf2-core.h +++ b/include/media/videobuf2-core.h @@ -12,11 +12,12 @@ #ifndef _MEDIA_VIDEOBUF2_CORE_H #define _MEDIA_VIDEOBUF2_CORE_H +#include +#include +#include #include #include #include -#include -#include #define VB2_MAX_FRAME (32) #define VB2_MAX_PLANES (8) @@ -249,6 +250,7 @@ struct vb2_buffer { /* private: internal use only * + * refcount: refcount for this buffer * state: current buffer state; do not change * queued_entry: entry on the queued buffers list, which holds * all buffers queued from userspace @@ -256,6 +258,7 @@ struct vb2_buffer { * to be dequeued to userspace * vb2_plane: per-plane information; do not change */ + struct kref refcount; enum vb2_buffer_state state; struct vb2_plane planes[VB2_MAX_PLANES]; -- 2.16.3