Received: by 10.223.176.5 with SMTP id f5csp1094103wra; Wed, 31 Jan 2018 01:00:54 -0800 (PST) X-Google-Smtp-Source: AH8x225CL9BmWQ/7PsHlP5FKACZjs1Idf/Xiyf6RyYnfGGXFtt66koSB53RF4J6rfzG6NTCSZOPe X-Received: by 10.99.96.210 with SMTP id u201mr26343579pgb.248.1517389254224; Wed, 31 Jan 2018 01:00:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517389254; cv=none; d=google.com; s=arc-20160816; b=Q9rJgxt8M/hM0sRA+zl1PT/cF/SlTjsIkRvouCYofY2cZnDMAendOaTQRxvyu3I+g6 aor7r/H/evS47tvwJOrcEe6u264fYjf0IcsVsovMkG1kky2zwRBcv6k3Zv/SagDXMIHc K5iOacDHUSLwh4ZsHCWmfpvSwo68A9/fhJTy3s8IqzwcNqDCOTssgVBQOzM65JKdQEvz EB6B7nGvfQOD29QVeAhT4dTKS5b4fE7Sk8DxWHelM1Ic71fohyp/RXGlrEIc4EUfHJlk c2zW/9yfUB7GRewc7efpiAfNO0AEz74BsMCFnCSUPlg5ma5cZX9/pYgK0iQStg1bLdC/ C02A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=ZO5y0DMzm2jT26INr6LL7Wc2G/swgerJa8wF4cuQf04=; b=ouyN4MRPOuyfFi68sgvDHgrVmjnCGmKgro8KqaWHWtr2AG79qLsgAJRIai7UKoWcTP vEk2KctSgnq+DNN4rlsRkwDwYG5UYcQe0RucJQCqb6jjgcybnSzy0dYw0GBQNLuMrll6 jAQeMmX5lYdyZxh1PFTc1032pDNO4SPJl17i3fMv7XOUAY05BO0UxYGNnMS8aihDgMAv 5bJscIpTT4080zgOSB1IJVhzXBY0zW19lPpIdVjtPuBTjW8EqRZXXdD1Ev7HszfI4AW6 zERCyAGTgOI0rJ+QLdfbKUjSryI1Dw8WXMi39+cW+QhntxwKYtt60ROkBc/Vp2NExXRE /+mQ== 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g67si3256471pgc.555.2018.01.31.01.00.39; Wed, 31 Jan 2018 01:00:54 -0800 (PST) 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753536AbeAaIsA (ORCPT + 99 others); Wed, 31 Jan 2018 03:48:00 -0500 Received: from lb2-smtp-cloud8.xs4all.net ([194.109.24.25]:56887 "EHLO lb2-smtp-cloud8.xs4all.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751822AbeAaIr7 (ORCPT ); Wed, 31 Jan 2018 03:47:59 -0500 Received: from [192.168.2.10] ([212.251.195.8]) by smtp-cloud8.xs4all.net with ESMTPA id go3eeJW9Qar0wgo3heHKJC; Wed, 31 Jan 2018 09:47:57 +0100 Subject: Re: [RFC PATCH 0/8] [media] Request API, take three To: Tomasz Figa Cc: Alexandre Courbot , Mauro Carvalho Chehab , Laurent Pinchart , Pawel Osciak , Marek Szyprowski , Sakari Ailus , Gustavo Padovan , Linux Media Mailing List , linux-kernel@vger.kernel.org References: <20180126060216.147918-1-acourbot@chromium.org> <307f58dd-ce7e-b6f5-092a-f8679349be73@xs4all.nl> From: Hans Verkuil Message-ID: Date: Wed, 31 Jan 2018 09:47:54 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-CMAE-Envelope: MS4wfGwAP2SJ5zhDVLEa378PtUdVlMni1yL79DDJ/d5c8kQjZRBhdksQd8UizSGlI1yp0tJnVXkznax+DRlXQ95LFCnvRx5eAvwd2kG6siIqH1S5wqRbd6A6 tXwjn1zln2BsWGiTOWQtjIjyrlES5tZZuod1uQbi+h+VaWKlLzI0dPb1mGiD8vMK7m1zk4axHN5b/np5dS2cCRbQ1TUNzqgDiSjYPE15vqZ2IjkWxu3QKie8 vmblWT/6KrMf025maR5egNvZ9Vq74SWs0pSphBh4/ZbQ75Z0jcLYis8yzUDNejm/m6qAFoiC7TkSZaTm+kWEvusK/OkP/e4hmyLSITL1OAy2k58DglfgA1HB AiXwPn1Ihsz2E4rzd9rOhedSOsAES9wzltAghUf+xtAlwkDJNNg/hIxYU1BKij0PkUJA8CJnk92Y5jSYD4B/yTUYgMu/ng== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 01/31/2018 09:10 AM, Tomasz Figa wrote: > Hi Hans, > > Sorry for joining the party late. > > On Wed, Jan 31, 2018 at 4:50 PM, Hans Verkuil wrote: >> On 01/30/2018 07:31 AM, Alexandre Courbot wrote: >>> Hi Hans, >>> >>> On Mon, Jan 29, 2018 at 8:21 PM, Hans Verkuil wrote: >>>> On 01/26/2018 07:02 AM, Alexandre Courbot wrote: >>>>> Howdy. Here is your bi-weekly request API redesign! ;) >>>>> >>>>> Again, this is a simple version that only implements the flow of requests, >>>>> without applying controls. The intent is to get an agreement on a base to work >>>>> on, since the previous versions went straight back to the redesign board. >>>>> >>>>> Highlights of this version: >>>>> >>>>> * As requested by Hans, request-bound buffers are now passed earlier to drivers, >>>>> as early as the request itself is submitted. Doing it earlier is not be useful >>>>> since the driver would not know the state of the request, and thus cannot do >>>>> anything with the buffer. Drivers are now responsible for applying request >>>>> parameters themselves. >>>>> >>>>> * As a consequence, there is no such thing as a "request queue" anymore. The >>>>> flow of buffers decides the order in which requests are processed. Individual >>>>> devices of the same pipeline can implement synchronization if needed, but this >>>>> is beyond this first version. >>>>> >>>>> * VB2 code is still a bit shady. Some of it will interfere with the fences >>>>> series, so I am waiting for the latter to land to do it properly. >>>>> >>>>> * Requests that are not yet submitted effectively act as fences on the buffers >>>>> they own, resulting in the buffer queue being blocked until the request is >>>>> submitted. An alternate design would be to only block the >>>>> not-submitted-request's buffer and let further buffers pass before it, but since >>>>> buffer order is becoming increasingly important I have decided to just block the >>>>> queue. This is open to discussion though. >>>> >>>> I don't think we should mess with the order. >>> >>> Agreed, let's keep it that way then. >>> > > I'm not sure I'm following here. Does it mean (quoting Alex): > > a) "Requests that are not yet submitted effectively act as fences on the buffers > they own, resulting in the buffer queue being blocked until the request is > submitted." > > b) "block the not-submitted-request's buffer and let further buffers > pass before it" > > or neither? > > Hans, could you clarify what you think is the right behavior here? I think I misread the text. Alexandre, buffers in not-yet-submitted requests should not act as fences. They are similar to buffers that are prepared through the VIDIOC_PREPARE_BUF call. They are just sitting there and won't be in the queue until someone calls QBUF. It's the same for not-yet-submitted requests: the buffers don't act as fences until the request is submitted. Interesting related questions: how does VIDIOC_PREPARE_BUF interact with a request? What happens if a buffer is added to a non-yet-submitted request and userspace calls VIDIOC_QBUF with that same buffer but with no request? This all needs to be defined. > >>>>> * For the codec usecase, I have experimented a bit marking CAPTURE buffers with >>>>> the request FD that produced them (vim2m acts that way). This seems to work >>>>> well, however FDs are process-local and could be closed before the CAPTURE >>>>> buffer is dequeued, rendering that information less meaningful, if not >>>>> dangerous. >>>> >>>> I don't follow this. Once the fd is passed to the kernel its refcount should be >>>> increased so the data it represents won't be released if userspace closes the fd. >>> >>> The refcount of the request is increased. The refcount of the FD is >>> not, since it is only a userspace reference to the request. >> >> I don't think that's right. Looking at how dma-buf does this (dma_buf_get in >> dma-buf.c) it calls fget(fd) which increases the fd refcount. In fact, as far as >> I can see the struct dma_buf doesn't have a refcount, it is solely refcounted >> through the fd. That's probably the model you want to follow. > > As far as I can see from the code, fget() on an fd increases a > reference count on the struct file backing the fd. I don't think there > is another level of reference counting of fds themselves - that's why > dup(fd) gives you another fd and you can't call close(fd) on the same > fd two times. > >> >>> >>>> >>>> Obviously if userspace closes the fd it cannot do anything with it anymore, but >>>> it shouldn't be 'dangerous' AFAICT. >>> >>> It userspace later gets that closed FD back from a DQBUF call, and >>> decides to use it again, then we would have a problem. I agree that it >>> is userspace responsibility to be careful here, but making things >>> foolproof never hurts. >> >> I think all the issues will go away if you refcount the fd instead of the >> request. It worked well for dma-buf for years. > > I'm confused here. The kernel never returns the same FD for the same > DMA-buf twice. Every time an ioctl is called, which returns a DMA-buf > FD, it creates a new FD. Sorry, where I say 'refcount the fd' I indeed meant 'refcount the file struct'. Looking at the code in the patch series I see: +struct media_request * +media_request_get_from_fd(int fd) +{ + struct file *f; + struct media_request *req; + + f = fget(fd); + if (!f) + return NULL; + + /* Not a request FD? */ + if (f->f_op != &request_fops) { + fput(f); + return NULL; + } + + req = f->private_data; + media_request_get(req); + fput(f); + + return req; +} +EXPORT_SYMBOL_GPL(media_request_get_from_fd); So this does not refcount the file struct but the request struct, and I think that's wrong. The file struct represents the request struct, and it is the file struct that should be refcounted. So when you give a request_fd to VIDIOC_QBUF, then the refcount should be increased since vb2 now needs to hold on to it. It's what dma-buf does. Now, I agree that if userspace closes the fd before kernelspace is finished with it, then the request_fd returned by VIDIOC_DQBUF is no longer valid. But so what? It's the same with the dma-buf fd. I don't think this is a problem at all. Regards, Hans