From patchwork Wed Aug 16 17:19:04 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sricharan Ramabadhran X-Patchwork-Id: 9904469 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 502BF6038C for ; Wed, 16 Aug 2017 18:03:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 37A64289DC for ; Wed, 16 Aug 2017 18:03:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 29BB928A3C; Wed, 16 Aug 2017 18:03:58 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.6 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_LOW autolearn=unavailable version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 9DD51289DC for ; Wed, 16 Aug 2017 18:03:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=eOM5Qs9hA6EybvRoAuBgmEYqa6z8N5nOfKihdVgVJFo=; b=NhT9qL7ViBPGa6WvEuj24rF+1I Vv82NPAMbliMJ3la7PpLimtK8rOAvHpufB6MmC6pllaz+jKujW2TfdSK/CKru/K9M8RILZGnmFH/V NVqnd5mbi22f86fURkE/SsmAl3oJRYeoJboXmmaanZaxlEPTBALNwBFupROEXQ0gPEkGmyb7jmDDJ 7bEtgX2qc4nCDvJCyrocD6B4I+xzl3dqcMxwNuAe46Mbcg43kQjDhPHjwaUdsVu/ExZNPRe5oSzF2 ylxbBd2SmxqhVe6/+52aBc4BcQ9f2+r6snKH2EsnPvOXzEXjeHw0edWH+4QpceUSuqmopTeKP3nhP trd17fpQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1di2fN-0007UC-NL; Wed, 16 Aug 2017 18:03:41 +0000 Received: from merlin.infradead.org ([2001:8b0:10b:1231::1]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1di2SL-0003ys-5I for linux-arm-kernel@bombadil.infradead.org; Wed, 16 Aug 2017 17:50:13 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=merlin.20170209; h=References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=RMh6o2fesIRuFvOrtLzHAMsbu78li/EbBL4N6WbjppI=; b=gW3OUKjstQZzw8sTSrGFJsu0h 77BZMtSXwgWrt7Ei24peakchCyDuUfFHKbyK7ajrjnDvmm27NFY9daf5CTD1fBFJDqDnkx+aWWuW9 /Yw+LkZpwHoJg0McpyY+c8Ux7iOUXYGreSc0In+hW8pF26GDhnBKqxblU34ZEXQHBttZaU4lzGj5K t88Rkmuihd/rzvCL5/Qc40Dgh+S30wmyn3AthDQuYdRizKdAlyZYD2at7CbewZ0aoCo2cXaJ4VuET 6pBDyKVWbiBbZaQ9jUfHi0MiQQkeysEl8DXbkwT2GL03CJiJu2s2wJeSwFVukVyo+Rf3U5bHeBcCr Wyco17UKg==; Received: from smtp.codeaurora.org ([198.145.29.96]) by merlin.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1di207-0005bx-B5 for linux-arm-kernel@lists.infradead.org; Wed, 16 Aug 2017 17:21:04 +0000 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 956EC6014C; Wed, 16 Aug 2017 17:20:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1502904032; bh=zFpDozGE4pOA5Z31/toUiHtE8GXbh7FinXoqNSG1MfQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UKnRP4ngzK9jil/UimtEiSkVDgGzLISmGQY/KH2dhnM8mPx4hUcHjk/SmQw9PwGtc rBitqGL81CutqOZn03sM8NjNNNPt0dYF76mSS55FgF18DucFNw1sNwq3pjHxAVEDVq SmPWINuAFLLKOBWuI7QmxkmjNV+f2zVVKl+4bj10= Received: from srichara-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: sricharan@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id 16A126073E; Wed, 16 Aug 2017 17:19:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1502904001; bh=zFpDozGE4pOA5Z31/toUiHtE8GXbh7FinXoqNSG1MfQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=binjngoDvvsVfuWtdEm0F07Wv5P4jDUcWISXK3a1WJvKySvjb0Pp2iZmzOKj27NnI 92KH3kizQoDTZZihIg2jd9yg0378zvUjpyCzFC/gZbpL4QC9v8FZwHf2lhz2VxC4C8 27m0tZnjN+3Rsay8IeW9LT3O+kmjkDKUbkYJxYYc= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org 16A126073E Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=sricharan@codeaurora.org From: Sricharan R To: ohad@wizery.com, bjorn.andersson@linaro.org, linux-remoteproc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 11/18] rpmsg: glink: Use the local intents when receiving data Date: Wed, 16 Aug 2017 22:49:04 +0530 Message-Id: <1502903951-5403-12-git-send-email-sricharan@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1502903951-5403-1-git-send-email-sricharan@codeaurora.org> References: <1502903951-5403-1-git-send-email-sricharan@codeaurora.org> X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: sricharan@codeaurora.org MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP So previously on request from remote side, we allocated local intent buffers and passed the ids to the remote. Now when we receive data buffers from remote directed to that intent id, copy the data to the corresponding preallocated intent buffer. Signed-off-by: Sricharan R Signed-off-by: Bjorn Andersson --- drivers/rpmsg/qcom_glink_native.c | 75 ++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 25 deletions(-) diff --git a/drivers/rpmsg/qcom_glink_native.c b/drivers/rpmsg/qcom_glink_native.c index cbc9f9e..d6aa589 100644 --- a/drivers/rpmsg/qcom_glink_native.c +++ b/drivers/rpmsg/qcom_glink_native.c @@ -160,7 +160,7 @@ struct glink_channel { spinlock_t intent_lock; struct idr liids; - void *buf; + struct glink_core_rx_intent *buf; int buf_offset; int buf_size; @@ -607,6 +607,7 @@ static int qcom_glink_rx_defer(struct qcom_glink *glink, size_t extra) static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail) { + struct glink_core_rx_intent *intent; struct glink_channel *channel; struct { struct glink_msg msg; @@ -616,6 +617,8 @@ static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail) unsigned int chunk_size; unsigned int left_size; unsigned int rcid; + unsigned int liid; + int ret = 0; unsigned long flags; if (avail < sizeof(hdr)) { @@ -643,56 +646,78 @@ static int qcom_glink_rx_data(struct qcom_glink *glink, size_t avail) dev_dbg(glink->dev, "Data on non-existing channel\n"); /* Drop the message */ - qcom_glink_rx_advance(glink, - ALIGN(sizeof(hdr) + chunk_size, 8)); - return 0; + goto advance_rx; } - /* Might have an ongoing, fragmented, message to append */ - if (!channel->buf) { - channel->buf = kmalloc(chunk_size + left_size, GFP_ATOMIC); - if (!channel->buf) - return -ENOMEM; + if (glink->intentless) { + /* Might have an ongoing, fragmented, message to append */ + if (!channel->buf) { + intent = kzalloc(sizeof(*intent), GFP_ATOMIC); + if (!intent) + return -ENOMEM; + + intent->data = kmalloc(chunk_size + left_size, + GFP_ATOMIC); + if (!intent->data) { + kfree(intent); + return -ENOMEM; + } + + intent->id = 0xbabababa; + intent->size = chunk_size + left_size; + intent->offset = 0; + + channel->buf = intent; + } else { + intent = channel->buf; + } + } else { + liid = le32_to_cpu(hdr.msg.param2); - channel->buf_size = chunk_size + left_size; - channel->buf_offset = 0; - } + spin_lock_irqsave(&channel->intent_lock, flags); + intent = idr_find(&channel->liids, liid); + spin_unlock_irqrestore(&channel->intent_lock, flags); - qcom_glink_rx_advance(glink, sizeof(hdr)); + if (!intent) { + dev_err(glink->dev, + "no intent found for channel %s intent %d", + channel->name, liid); + goto advance_rx; + } + } - if (channel->buf_size - channel->buf_offset < chunk_size) { - dev_err(glink->dev, "Insufficient space in input buffer\n"); + if (intent->size - intent->offset < chunk_size) { + dev_err(glink->dev, "Insufficient space in intent\n"); /* The packet header lied, drop payload */ - qcom_glink_rx_advance(glink, chunk_size); - return -ENOMEM; + goto advance_rx; } - qcom_glink_rx_peak(glink, channel->buf + channel->buf_offset, + qcom_glink_rx_advance(glink, ALIGN(sizeof(hdr), 8)); + qcom_glink_rx_peak(glink, intent->data + intent->offset, chunk_size); - channel->buf_offset += chunk_size; + intent->offset += chunk_size; /* Handle message when no fragments remain to be received */ if (!left_size) { spin_lock(&channel->recv_lock); if (channel->ept.cb) { channel->ept.cb(channel->ept.rpdev, - channel->buf, - channel->buf_offset, + intent->data, + intent->offset, channel->ept.priv, RPMSG_ADDR_ANY); } spin_unlock(&channel->recv_lock); - kfree(channel->buf); + intent->offset = 0; channel->buf = NULL; - channel->buf_size = 0; } - /* Each message starts at 8 byte aligned address */ +advance_rx: qcom_glink_rx_advance(glink, ALIGN(chunk_size, 8)); - return 0; + return ret; } static int qcom_glink_rx_open_ack(struct qcom_glink *glink, unsigned int lcid)