From patchwork Thu Aug 24 07:21:35 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sricharan Ramabadhran X-Patchwork-Id: 9919325 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 BF4F960349 for ; Thu, 24 Aug 2017 07:39:40 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id B096328BA7 for ; Thu, 24 Aug 2017 07:39:40 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id A546928BAF; Thu, 24 Aug 2017 07:39:40 +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 28EAC28BA8 for ; Thu, 24 Aug 2017 07:39:39 +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=fitAcFvChudJmOtoboFm+Km/fFfqABm6evH2m4C/LuI=; b=pHbTIXZtmzwwoGau4XMF2JZA09 V5cG8NOu73q6fkv5x4NFIRf4EPpAXeT7vEqwdpqcHzAfT6jnoIhayJqtbADj+hjK4+JV+xFvh0FpX /qHvo5deSJbC2PAE77pa/E9iXdrxHl+SQd3LuQrOim9tkz+JyLnwGgQzc9KggfpIzV5ZSSY7zeV9t Ejl2seuzKT2sdvBoa8wlYXOhKJ5dJ+JKiCz/cJpywhfzePlkoOdvA4g0n8y67+6TlxtZdLZU0hhzA dDWFffwoUZh5Es+rD6JIC9Icw1BV4OEYUrsG5JZrABU3xIiL0k54FMpuiVvEA0S7pOUtG6L3ECZYo ARN/9ufQ==; 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 1dkmjg-00009j-MJ; Thu, 24 Aug 2017 07:39:28 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dkmhj-00075A-D6 for linux-arm-kernel@bombadil.infradead.org; Thu, 24 Aug 2017 07:37:27 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.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=vHeTwJxirJuSat9/joyLzoRau/48dXGePQqMVpbc+F4=; b=tVHweob10D4oVCIvasHRZNgmT 8zvp4AinjFU3r/H+QzxFWJfStgGnsI0gplQ0HRqZGdOw60Yu+I5N7Gc0MEFu0oNIb+pTmE+a8QW0J DetD6H5Tp6xPHICGxM1WJOdAE9R48Sitx4oNWGAiiYnGXe0wylusjOSdxsh3dERHeVMJHzFnpSfve ow7557Qf3Jw7h3pUyRb31DJY6SPV3LVnIVImidjWjIJAIYlIF0IUNUzPdPSeV80P6b6TOVJEYSZY6 w09zZGqUk79aWK4t7QXNvCyt0HVMvMqwG+RphTvTMhRgrob8XXYJAJO/5GMMLR/H3zmyOuva+aAiF kDVTyfHQQ==; Received: from smtp.codeaurora.org ([198.145.29.96]) by casper.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1dkmTr-0004p9-N6 for linux-arm-kernel@lists.infradead.org; Thu, 24 Aug 2017 07:23:10 +0000 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id EA0DD607C8; Thu, 24 Aug 2017 07:22:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1503559366; bh=2F0d2ojkWvCRlFV8WDGTi7O/Xo7F7UWOBss0CGDh9CU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bD1Ax5SkVN4FL0+wxR+r+DixqqV+aTblKfWtU3hXrg6e03E2999eunMW+OOmgY2Yb YXnAwyYrggXsSgwHaSbfIS5B6+pe+9oTA6NHQ2pVSBu+5BOxPRovwGP7qJT1nyJ1hw 4/xiUnvAFw+HDO+37C4KOTAQHZSJmYGUvqrndFA0= 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 AAEE160798; Thu, 24 Aug 2017 07:22:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1503559355; bh=2F0d2ojkWvCRlFV8WDGTi7O/Xo7F7UWOBss0CGDh9CU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=RDYeyIHQWeMUGNt5jVdtU6OqcsPXqKxSkZzyW4tHMWi8Z0+5k3W5cYLP4/0Y1TxEy aAdlEGP5EDUwgMQqRltDOfUpdBd8MHd7qdrxzlLBN4SqJOWo+9kXicaYlIJC9E7iyw PsKpxcS0ba+844zVPjONh8cKo2CgRfjJNAd6+1kc= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org AAEE160798 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 v2 13/20] rpmsg: glink: Use the local intents when receiving data Date: Thu, 24 Aug 2017 12:51:35 +0530 Message-Id: <1503559302-3744-14-git-send-email-sricharan@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1503559302-3744-1-git-send-email-sricharan@codeaurora.org> References: <1503559302-3744-1-git-send-email-sricharan@codeaurora.org> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20170824_082308_044675_C33BD085 X-CRM114-Status: GOOD ( 23.08 ) 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 Acked-by: Arun Kumar Neelakantam --- 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 7778e57..67eeb86 100644 --- a/drivers/rpmsg/qcom_glink_native.c +++ b/drivers/rpmsg/qcom_glink_native.c @@ -162,7 +162,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; @@ -614,6 +614,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; @@ -623,6 +624,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)) { @@ -650,56 +653,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)