Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp817101imu; Tue, 20 Nov 2018 07:24:32 -0800 (PST) X-Google-Smtp-Source: AJdET5e/qxAJznNQMHPAg3KD2995xnNNIac0+yWNT7B4GWDbsnvz11SGux6wrKxnG7OI7efvlj/2 X-Received: by 2002:a63:5357:: with SMTP id t23-v6mr2368129pgl.40.1542727472276; Tue, 20 Nov 2018 07:24:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542727472; cv=none; d=google.com; s=arc-20160816; b=A/bQf3H9PfCKi5mz98aEiHF9aJ1Hyhm9G9BSjlY+KRwdSrPtl3dQIAV3a2RBx2i2HD +P1bgo5EJ5HKycpgICtk/wt8mJgE8e6SjZqb52Y3gEyLVDbmHI9r8zhVUwsMSq8XJqQ2 +mnphJOp9sRloNRcaLvIrG6JTTcbrfp29giwSOdd9zx6SmME2UBGbPwtLwwytdGdycRv sLHUYw2AjU1lvdpn46uRG7oReqEXClXyYHzsFUTzWigmhzsXTSEeE+sYm5G4mn/1Qbkx c5VrrGuSKsU3VyXGWBRL/8rMdMFuKPiom/QBix/JcvJWxKUImCGZWezUi5Zx/NMDklk1 Hm0g== 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:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=Cmr1JIU0QY03nBCVX5bAzNJju9qxv9an2QKojKvUI38=; b=A+I+7aZwt9hAcfN2HByP9/r5MWmXZIuaIYedZK86G1I5SJXOQcvXeglhyOVo/PR4FE YS2gTZ7sp+LHBsMiFRJ2eAn0q4WK/1UY7eU9NpMaIKMgQQBITf/1CbedDa+6fojkeXHu pYDmMKv+fOGC920rCMNn8Pzd6h57Cwe8eM+bw9Q1hZyVs8aqwqFptpr7s9IqmPCXvH+4 5MjuKWuY3Vpmx/d7/eh26bIIynXeKYSlUP/u8s1Il7b/FizI0Oh2v7vg/rHaL+++XnDM XLrEa1UYlycsm4TxBvu0OIIObizI2GOAGQaVivugDy/KbyjfdSIdmAN/M9IkJHTXttpU TymA== 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 i35si3253768plg.396.2018.11.20.07.24.17; Tue, 20 Nov 2018 07:24:32 -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 S1730090AbeKUBYt (ORCPT + 99 others); Tue, 20 Nov 2018 20:24:49 -0500 Received: from mx2.suse.de ([195.135.220.15]:39252 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727466AbeKUBXl (ORCPT ); Tue, 20 Nov 2018 20:23:41 -0500 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id AB634AD94; Tue, 20 Nov 2018 14:54:08 +0000 (UTC) From: Nicolas Saenz Julienne To: stefan.wahren@i2se.com, eric@anholt.net, dave.stevenson@raspberrypi.org Cc: linux-rpi-kernel@lists.infradead.org, gregkh@linuxfoundation.org, linux-arm-kernel@lists.infradead.org, devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org, Nicolas Saenz Julienne Subject: [PATCH 06/16] staging: vchiq_arm: rework vchiq_ioc_copy_element_data Date: Tue, 20 Nov 2018 15:53:41 +0100 Message-Id: <20181120145351.30390-7-nsaenzjulienne@suse.de> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20181120145351.30390-1-nsaenzjulienne@suse.de> References: <20181120145351.30390-1-nsaenzjulienne@suse.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The function is passed to vchiq_core.c for it to go trough all the transfer elements (an array of pointers to data) and copy them into the actual transfer memory (contiguous memory). The logic in the function was "copy an element and return, except when the element is empty, in which case look for the next non-empty element and copy it. The function will be called as many times as necessary until all the elements are copied". Now, this approach already forces the function to loop around elements and felt convoluted, so it was changed to a more straightforward "Copy all the elements into memory as long as they fit". The resulting function is shorter and simpler. Signed-off-by: Nicolas Saenz Julienne --- .../interface/vchiq_arm/vchiq_arm.c | 89 +++++++------------ 1 file changed, 31 insertions(+), 58 deletions(-) diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c index 525458551a22..7fa734991db9 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_arm.c @@ -752,74 +752,48 @@ static void close_delivered(USER_SERVICE_T *user_service) } struct vchiq_io_copy_callback_context { - struct vchiq_element *current_element; - size_t current_element_offset; + struct vchiq_element *element; + size_t element_offset; unsigned long elements_to_go; - size_t current_offset; }; -static ssize_t -vchiq_ioc_copy_element_data( - void *context, - void *dest, - size_t offset, - size_t maxsize) +static ssize_t vchiq_ioc_copy_element_data(void *context, void *dest, + size_t offset, size_t maxsize) { - long res; + struct vchiq_io_copy_callback_context *cc = context; + size_t total_bytes_copied = 0; size_t bytes_this_round; - struct vchiq_io_copy_callback_context *copy_context = - (struct vchiq_io_copy_callback_context *)context; - - if (offset != copy_context->current_offset) - return 0; - - if (!copy_context->elements_to_go) - return 0; - - /* - * Complex logic here to handle the case of 0 size elements - * in the middle of the array of elements. - * - * Need to skip over these 0 size elements. - */ - while (1) { - bytes_this_round = min(copy_context->current_element->size - - copy_context->current_element_offset, - maxsize); - - if (bytes_this_round) - break; - copy_context->elements_to_go--; - copy_context->current_element++; - copy_context->current_element_offset = 0; + while (total_bytes_copied < maxsize) { + if (!cc->elements_to_go) + return total_bytes_copied; - if (!copy_context->elements_to_go) - return 0; - } + if (!cc->element->size) { + cc->elements_to_go--; + cc->element++; + cc->element_offset = 0; + continue; + } - res = copy_from_user(dest, - copy_context->current_element->data + - copy_context->current_element_offset, - bytes_this_round); + bytes_this_round = min(cc->element->size - cc->element_offset, + maxsize - total_bytes_copied); - if (res != 0) - return -EFAULT; + if (copy_from_user(dest + total_bytes_copied, + cc->element->data + cc->element_offset, + bytes_this_round)) + return -EFAULT; - copy_context->current_element_offset += bytes_this_round; - copy_context->current_offset += bytes_this_round; + cc->element_offset += bytes_this_round; + total_bytes_copied += bytes_this_round; - /* - * Check if done with current element, and if so advance to the next. - */ - if (copy_context->current_element_offset == - copy_context->current_element->size) { - copy_context->elements_to_go--; - copy_context->current_element++; - copy_context->current_element_offset = 0; + if (cc->element_offset == cc->element->size) { + cc->elements_to_go--; + cc->element++; + cc->element_offset = 0; + } } - return bytes_this_round; + return maxsize; } /************************************************************************** @@ -836,10 +810,9 @@ vchiq_ioc_queue_message(VCHIQ_SERVICE_HANDLE_T handle, unsigned long i; size_t total_size = 0; - context.current_element = elements; - context.current_element_offset = 0; + context.element = elements; + context.element_offset = 0; context.elements_to_go = count; - context.current_offset = 0; for (i = 0; i < count; i++) { if (!elements[i].data && elements[i].size != 0) -- 2.19.1