Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp232995pxu; Tue, 1 Dec 2020 09:54:12 -0800 (PST) X-Google-Smtp-Source: ABdhPJxzv8voAd071mUGwPlid5NTRiIpkPDp7lNrvFz5KSEIHNYAUU8kWqz74pPsZK/2LFX98qMg X-Received: by 2002:a05:6402:2da:: with SMTP id b26mr4145892edx.176.1606845252362; Tue, 01 Dec 2020 09:54:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1606845252; cv=none; d=google.com; s=arc-20160816; b=KnwDOqz1GzGYMHhAsJYJfonFnImQfBiORzNYVfa3ynVW8QDrkkZ2AJwuUq/iqjiS6s xdx5JUFFVYwYROAOzRIegv0LEvdRLcPalZEmOhnInGcyKCmty7K6bg8NnBQ1q8H/NhaU SVqRQq8GP6eusocu5ZsAk2oWeAIETUBbTncldOwkdmQgwz7CNlSxmyy7vDkTz9PSIktA /rMTlLJ0nV5+tpUWBOuKuppEUPq+99RnlIX9Vlwo/y9xLBl2w7BpwKxXuRmreZsCaBtJ I+zyyijrY34D19GtgmJzraSTMXZjK5rwXl/N0lqmPKu9NqqorTgmzNcJ7un883L85IsP jntg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject:dmarc-filter:sender:dkim-signature; bh=fh/kVL+dGB0NTQQrmc6RSxNoxpUueL3Ji7DBNgVNqg8=; b=SuRlVJ/CM7/X1kejth6IyaQlILIhvzdubyqeSli75rQy5YBIRqVEF0F4Qpnj+7m73J FnhToB7G04xNaK+iWaUpMgWlL9xNMT9CnB6ARXaCTQ6t4X4ZxmvfGC7godGJ6RJ4eDbq c4KJuzP4PcuJuQrcISuizYFr5VyJitlTy2n8cv7S7TYlZnWoqjnSYfkLYjTAra0bBZvq NeNdjNkrc6sxR8SpNel6HzdBrXrrHTwdvWanAo6W4zECGSwLXSkpuQT6qh/zJ/MaWaZH /uXrZxKXQdn19eEtBwTGyP1tgsNCQXIXu5ai9/xagcrC8kGpllCprBRtNMBA78eXw2h3 HBVQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@mg.codeaurora.org header.s=smtp header.b=WjR9uRYJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id t20si326380edw.478.2020.12.01.09.53.49; Tue, 01 Dec 2020 09:54:12 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@mg.codeaurora.org header.s=smtp header.b=WjR9uRYJ; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729139AbgLARwA (ORCPT + 99 others); Tue, 1 Dec 2020 12:52:00 -0500 Received: from a2.mail.mailgun.net ([198.61.254.61]:14557 "EHLO a2.mail.mailgun.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726104AbgLARwA (ORCPT ); Tue, 1 Dec 2020 12:52:00 -0500 DKIM-Signature: a=rsa-sha256; v=1; c=relaxed/relaxed; d=mg.codeaurora.org; q=dns/txt; s=smtp; t=1606845102; h=Content-Transfer-Encoding: Content-Type: In-Reply-To: MIME-Version: Date: Message-ID: From: References: Cc: To: Subject: Sender; bh=fh/kVL+dGB0NTQQrmc6RSxNoxpUueL3Ji7DBNgVNqg8=; b=WjR9uRYJc6S4EJIaDG4wNXktej3cWa26eH+CcEdbZLnXWusajBNM1fLxfLxnXpIvj38b+EeT fRNrLk+CpFx+0mSdszC1EVr34WjGwr+jHBnG0NIlqffkw/S+lVuF6gADEEWtldihy+3sbqIx MJDjXLLZMqMZ2hcogCVviTM6nsk= X-Mailgun-Sending-Ip: 198.61.254.61 X-Mailgun-Sid: WyI0MWYwYSIsICJsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnIiwgImJlOWU0YSJd Received: from smtp.codeaurora.org (ec2-35-166-182-171.us-west-2.compute.amazonaws.com [35.166.182.171]) by smtp-out-n01.prod.us-west-2.postgun.com with SMTP id 5fc682a8265512b1b2e8c2ed (version=TLS1.2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256); Tue, 01 Dec 2020 17:51:36 GMT Sender: jhugo=codeaurora.org@mg.codeaurora.org Received: by smtp.codeaurora.org (Postfix, from userid 1001) id 5CADBC433ED; Tue, 1 Dec 2020 17:51:36 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-caf-mail-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=ALL_TRUSTED,BAYES_00, NICE_REPLY_A,SPF_FAIL,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.0 Received: from [10.226.59.216] (i-global254.qualcomm.com [199.106.103.254]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: jhugo) by smtp.codeaurora.org (Postfix) with ESMTPSA id 81732C43460; Tue, 1 Dec 2020 17:51:34 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 81732C43460 Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: aws-us-west-2-caf-mail-1.web.codeaurora.org; spf=fail smtp.mailfrom=jhugo@codeaurora.org Subject: Re: [PATCH v13 4/4] bus: mhi: Add userspace client interface driver To: Loic Poulain Cc: Hemant Kumar , Manivannan Sadhasivam , Greg Kroah-Hartman , linux-arm-msm , open list , Bhaumik Bhatt , Network Development References: <1606533966-22821-1-git-send-email-hemantk@codeaurora.org> <1606533966-22821-5-git-send-email-hemantk@codeaurora.org> <1247e32e-ed67-de6b-81ec-3bde9ad93250@codeaurora.org> From: Jeffrey Hugo Message-ID: <1a9f7ed5-7060-9146-47ff-087b9096ba3a@codeaurora.org> Date: Tue, 1 Dec 2020 10:51:33 -0700 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 12/1/2020 10:52 AM, Loic Poulain wrote: > On Tue, 1 Dec 2020 at 18:37, Jeffrey Hugo wrote: >> >> On 12/1/2020 10:36 AM, Loic Poulain wrote: >>> On Tue, 1 Dec 2020 at 02:16, Hemant Kumar wrote: >>>> >>>> Hi Loic, >>>> >>>> On 11/30/20 10:22 AM, Loic Poulain wrote: >>>>> On Sat, 28 Nov 2020 at 04:26, Hemant Kumar wrote: >>>>>> >>>>>> This MHI client driver allows userspace clients to transfer >>>>>> raw data between MHI device and host using standard file operations. >>>>>> Driver instantiates UCI device object which is associated to device >>>>>> file node. UCI device object instantiates UCI channel object when device >>>>>> file node is opened. UCI channel object is used to manage MHI channels >>>>>> by calling MHI core APIs for read and write operations. MHI channels >>>>>> are started as part of device open(). MHI channels remain in start >>>>>> state until last release() is called on UCI device file node. Device >>>>>> file node is created with format >>>>> >>>>> [...] >>>>> >>>>>> +struct uci_chan { >>>>>> + struct uci_dev *udev; >>>>>> + wait_queue_head_t ul_wq; >>>>>> + >>>>>> + /* ul channel lock to synchronize multiple writes */ >>>>>> + struct mutex write_lock; >>>>>> + >>>>>> + wait_queue_head_t dl_wq; >>>>>> + >>>>>> + /* dl channel lock to synchronize multiple reads */ >>>>>> + struct mutex read_lock; >>>>>> + >>>>>> + /* >>>>>> + * protects pending list in bh context, channel release, read and >>>>>> + * poll >>>>>> + */ >>>>>> + spinlock_t dl_pending_lock; >>>>>> + >>>>>> + struct list_head dl_pending; >>>>>> + struct uci_buf *cur_buf; >>>>>> + size_t dl_size; >>>>>> + struct kref ref_count; >>>>>> +}; >>>>> >>>>> [...] >>>>> >>>>>> + * struct uci_dev - MHI UCI device >>>>>> + * @minor: UCI device node minor number >>>>>> + * @mhi_dev: associated mhi device object >>>>>> + * @uchan: UCI uplink and downlink channel object >>>>>> + * @mtu: max TRE buffer length >>>>>> + * @enabled: Flag to track the state of the UCI device >>>>>> + * @lock: mutex lock to manage uchan object >>>>>> + * @ref_count: uci_dev reference count >>>>>> + */ >>>>>> +struct uci_dev { >>>>>> + unsigned int minor; >>>>>> + struct mhi_device *mhi_dev; >>>>>> + struct uci_chan *uchan; >>>>> >>>>> Why a pointer to uci_chan and not just plainly integrating the >>>>> structure here, AFAIU uci_chan describes the channels and is just a >>>>> subpart of uci_dev. That would reduce the number of dynamic >>>>> allocations you manage and the extra kref. do you even need a separate >>>>> structure for this? >>>> >>>> This goes back to one of my patch versions i tried to address concern >>>> from Greg. Since we need to ref count the channel as well as the uci >>>> device i decoupled the two objects and used two reference counts for two >>>> different objects. >>> >>> What Greg complained about is the two kref in the same structure and >>> that you were using kref as an open() counter. But splitting your >>> struct in two in order to keep the two kref does not make the much >>> code better (and simpler). I'm still a bit puzzled about the driver >>> complexity, it's supposed to be just a passthrough interface to MHI >>> after all. >>> >>> I would suggest several changes, that IMHO would simplify reviewing: >>> - Use only one structure representing the 'uci' context (uci_dev) >>> - Keep the read path simple (mhi_uci_read), do no use an intermediate >>> cur_buf pointer, only dequeue the buffer when it is fully consumed. >>> - As I commented before, take care of the dl_pending list access >>> concurrency, even in wait_event. >>> - You don't need to count the number of open() calls, AFAIK, >>> mhi_prepare_for_transfer() simply fails if channels are already >>> started... >> >> Unless I missed something, you seem to have ignored the root issue that >> Hemant needs to solve, which is when to call >> mhi_unprepare_for_transfer(). You can't just call that when close() is >> called because there might be multiple users, and each one is going to >> trigger a close(), so you need to know how many close() instances to >> expect, and only call mhi_unprepare_for_transfer() for the last one. > > That one part of his problem, yes, but if you unconditionally call > mhi_prepare_for_transfer in open(), it should fail for subsequent > users, and so only one user will successfully open the device. I'm pretty sure that falls under "trying to prevent users from opening a device" which Greg gave a pretty strong NACK to. So, that's not a solution. So, the complete problem is - N users need to be able to use the device (and by proxy, the channel) concurrently, but prepare needs to be called on the first user coming into the picture, and unprepare needs to be called on the last user exiting the picture. Hemant has supported this usecase in every rev of this series I've looked at, but apparently every solution he has proposed to handle this has caused confusion. -- Jeffrey Hugo Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.