Received: by 10.223.164.221 with SMTP id h29csp2733165wrb; Wed, 18 Oct 2017 06:08:13 -0700 (PDT) X-Received: by 10.101.76.139 with SMTP id m11mr14019149pgt.103.1508332093772; Wed, 18 Oct 2017 06:08:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1508332093; cv=none; d=google.com; s=arc-20160816; b=fasVTD6xlSuACH1hBilP5PBu2slZi2OUW0o+u7CK6aIp+myqKa9p3nv7xPNxIltsAy 4zgQPCaS0OZzsMByhJLt9c8ENPQh9L/GJNWPkyhWqhr/lgRoUQ6MYfNu7q1IBgoRA9Pc 0pvgsUv87fBrqyL/UemwRHBAlHXrhOi106iiVu3GN4RWN8NB0tc1iy37bJiYWCbDvWm9 AOAbNH+SLWEOEXanY0hLBB37F0Qzkbgil23ULaKtpEpXNDN946iMloGM3AK17/XUPrvF H3fA2ADd3WFMipUFUbigCR3j10L0sXO3gi9Y4F4gjYvdECJaYyRpCqnaqdoRd+OH/u2e GpQw== 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:to:subject:arc-authentication-results; bh=p9FbdlKcn2lXvX7B+BU+F2TgXkufl5KPx8dhpU777tk=; b=F7HHN/ndsCaWvGfFx1PedYVkGoI0th2PRDszjg584B4xGqdjEpLDHXFDN1zgtEviyy hDmRxQcXEC2gbwIvbAYHiHAmcig3AlWcPQBRgsCphbHkWOefZv5R5kt+WenKqsA+L2HA vwqvSFgicl2NW4fVwmRGgSfvcLnuvgO7gOtr7Gj6CSzVTYiIBVPMdR0+cj+/DUYAZAkW TFImmjvcXH7S8mz2dVixUKpf9sCIOcqRcv5Z9NhStWrw8S4qFDMXt1ZasTUjdwmbnYvE oAjNUYcPqJ8j55R9eMdmP3nMpB1LGJ0wHyZVgkecI6XLdTXVaeby5hFZCwVT3BUOeMjI T+hA== 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 125si7422094pff.568.2017.10.18.06.07.58; Wed, 18 Oct 2017 06:08:13 -0700 (PDT) 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1764172AbdJQUVM (ORCPT + 99 others); Tue, 17 Oct 2017 16:21:12 -0400 Received: from mail-qt0-f171.google.com ([209.85.216.171]:44446 "EHLO mail-qt0-f171.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753410AbdJQUVK (ORCPT ); Tue, 17 Oct 2017 16:21:10 -0400 Received: by mail-qt0-f171.google.com with SMTP id 8so6355735qtv.1 for ; Tue, 17 Oct 2017 13:21:10 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=p9FbdlKcn2lXvX7B+BU+F2TgXkufl5KPx8dhpU777tk=; b=NIRdW19OH+8tb+E0SqCysqFLK9Sc8uUObeKUao0TFr8A5DixzJTHOBCCFhQAoV7kQt m+P+qIYoAHRwzzcyyUX4/uuWgHgCO997D9ko2MzvTu6zlB6VH2C0oStR2DMFOFLIxiAF IIhNtvCWapYm5B2bgSSjtFxjbdVjYLN10N6C9vvYNVhUJ33F+oWN02tdZtUbNMgk7LKz TlLX4k7n8DP5kejLQZPorYLxnqafhNQgLwOqfROt2Idmf7mt1lR4SxSB84ko8olsw+0a IyQNUirsOLGtJk1WcTsvLQsQ+YQbnru/m30H0bs6QKPhstZjyxxCpKRbuO9lo151Q94s Snbw== X-Gm-Message-State: AMCzsaX1rwc1gW3jTXLcHeneqMeF7swXvS5DGlwTdL3DfKsw37RAKk0D XHhAX1CyzbOJBau+KpV6q+73Iw== X-Google-Smtp-Source: AOwi7QBGfL54czhfB39aS50XJShYuPVHRrYT0yoJLn/z1ULUaNxpu64W++NFjoTg6FFXPTtJfyKyGw== X-Received: by 10.237.49.46 with SMTP id 43mr22094398qtg.27.1508271669616; Tue, 17 Oct 2017 13:21:09 -0700 (PDT) Received: from ?IPv6:2601:602:9802:a8dc::e174? ([2601:602:9802:a8dc::e174]) by smtp.gmail.com with ESMTPSA id u32sm6971042qte.25.2017.10.17.13.21.07 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 17 Oct 2017 13:21:08 -0700 (PDT) Subject: Re: [PATCHv3 1/1] [tools/selftests]: android/ion: userspace test utility for ion buffer sharing To: Pintu Agarwal , linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, gregkh@linuxfoundation.org, shuah@kernel.org, dvhart@infradead.org, bamvor.zhangjian@linaro.org References: <1507049339-16963-1-git-send-email-pintu.ping@gmail.com> <1507981006-7430-1-git-send-email-pintu.ping@gmail.com> From: Laura Abbott Message-ID: <2c0cf8c1-7f4d-5639-58d3-0fd7595df256@redhat.com> Date: Tue, 17 Oct 2017 13:21:06 -0700 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-Version: 1.0 In-Reply-To: <1507981006-7430-1-git-send-email-pintu.ping@gmail.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 10/14/2017 04:36 AM, Pintu Agarwal wrote: > This is a test utility to verify ION buffer sharing in user space > between 2 independent processes. > It uses unix domain socket (with SCM_RIGHTS) as IPC to transfer an FD to > another process to share the same buffer. > This utility demonstrates how ION buffer sharing can be implemented between > two user space processes, using various heap types. > > This utility is made to be run as part of kselftest framework in kernel. > The utility is verified on Ubuntu-32 bit system with Linux Kernel 4.14, > using ION system heap and CMA heap. > > For more information about the utility please check the README file. > > Signed-off-by: Pintu Agarwal > --- > tools/testing/selftests/Makefile | 3 +- > tools/testing/selftests/android/Makefile | 44 ++++ > tools/testing/selftests/android/ion/.gitignore | 2 + > tools/testing/selftests/android/ion/Makefile | 16 ++ > tools/testing/selftests/android/ion/README | 132 +++++++++++ > tools/testing/selftests/android/ion/config | 3 + > tools/testing/selftests/android/ion/ion_test.sh | 61 +++++ > .../testing/selftests/android/ion/ionapp_export.c | 151 ++++++++++++ > .../testing/selftests/android/ion/ionapp_import.c | 88 +++++++ > tools/testing/selftests/android/ion/ionutils.c | 259 +++++++++++++++++++++ > tools/testing/selftests/android/ion/ionutils.h | 55 +++++ > tools/testing/selftests/android/ion/ipcsocket.c | 227 ++++++++++++++++++ > tools/testing/selftests/android/ion/ipcsocket.h | 35 +++ > tools/testing/selftests/android/run.sh | 3 + > 14 files changed, 1078 insertions(+), 1 deletion(-) > create mode 100644 tools/testing/selftests/android/Makefile > create mode 100644 tools/testing/selftests/android/ion/.gitignore > create mode 100644 tools/testing/selftests/android/ion/Makefile > create mode 100644 tools/testing/selftests/android/ion/README > create mode 100644 tools/testing/selftests/android/ion/config > create mode 100755 tools/testing/selftests/android/ion/ion_test.sh > create mode 100644 tools/testing/selftests/android/ion/ionapp_export.c > create mode 100644 tools/testing/selftests/android/ion/ionapp_import.c > create mode 100644 tools/testing/selftests/android/ion/ionutils.c > create mode 100644 tools/testing/selftests/android/ion/ionutils.h > create mode 100644 tools/testing/selftests/android/ion/ipcsocket.c > create mode 100644 tools/testing/selftests/android/ion/ipcsocket.h > create mode 100755 tools/testing/selftests/android/run.sh > > diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile > index ff80564..61bc77b 100644 > --- a/tools/testing/selftests/Makefile > +++ b/tools/testing/selftests/Makefile > @@ -1,4 +1,5 @@ > -TARGETS = bpf > +TARGETS = android > +TARGETS += bpf > TARGETS += breakpoints > TARGETS += capabilities > TARGETS += cpufreq > diff --git a/tools/testing/selftests/android/Makefile b/tools/testing/selftests/android/Makefile > new file mode 100644 > index 0000000..ee76446 > --- /dev/null > +++ b/tools/testing/selftests/android/Makefile > @@ -0,0 +1,44 @@ > +SUBDIRS := ion > + > +TEST_PROGS := run.sh > + > +.PHONY: all clean > + > +include ../lib.mk > + > +all: > + @for DIR in $(SUBDIRS); do \ > + BUILD_TARGET=$(OUTPUT)/$$DIR; \ > + mkdir $$BUILD_TARGET -p; \ > + make OUTPUT=$$BUILD_TARGET -C $$DIR $@;\ > + if [ -e $$DIR/$(TEST_PROGS) ]; then > + rsync -a $$DIR/$(TEST_PROGS) $$BUILD_TARGET/; > + fi > + done > + > +override define RUN_TESTS > + @cd $(OUTPUT); ./run.sh > +endef > + > +override define INSTALL_RULE > + mkdir -p $(INSTALL_PATH) > + install -t $(INSTALL_PATH) $(TEST_PROGS) $(TEST_PROGS_EXTENDED) $(TEST_FILES) > + > + @for SUBDIR in $(SUBDIRS); do \ > + BUILD_TARGET=$(OUTPUT)/$$SUBDIR; \ > + mkdir $$BUILD_TARGET -p; \ > + $(MAKE) OUTPUT=$$BUILD_TARGET -C $$SUBDIR INSTALL_PATH=$(INSTALL_PATH)/$$SUBDIR install; \ > + done; > +endef > + > +override define EMIT_TESTS > + echo "./run.sh" > +endef > + > +override define CLEAN > + @for DIR in $(SUBDIRS); do \ > + BUILD_TARGET=$(OUTPUT)/$$DIR; \ > + mkdir $$BUILD_TARGET -p; \ > + make OUTPUT=$$BUILD_TARGET -C $$DIR $@;\ > + done > +endef > diff --git a/tools/testing/selftests/android/ion/.gitignore b/tools/testing/selftests/android/ion/.gitignore > new file mode 100644 > index 0000000..67e6f39 > --- /dev/null > +++ b/tools/testing/selftests/android/ion/.gitignore > @@ -0,0 +1,2 @@ > +ionapp_export > +ionapp_import > diff --git a/tools/testing/selftests/android/ion/Makefile b/tools/testing/selftests/android/ion/Makefile > new file mode 100644 > index 0000000..b84e3b1 > --- /dev/null > +++ b/tools/testing/selftests/android/ion/Makefile > @@ -0,0 +1,16 @@ > + > +INCLUDEDIR := -I../../../../../drivers/staging/android/uapi/ > +CFLAGS := $(INCLUDEDIR) -Wall -O2 -g > + > +TEST_GEN_FILES := ionapp_export ionapp_import > + > +all: $(TEST_GEN_FILES) > + > +$(TEST_GEN_FILES): ipcsocket.c ionutils.c > + > +TEST_PROGS := ion_test.sh > + > +include ../../lib.mk > + > +$(OUTPUT)/ionapp_export: ionapp_export.c ipcsocket.c ionutils.c > +$(OUTPUT)/ionapp_import: ionapp_import.c ipcsocket.c ionutils.c > diff --git a/tools/testing/selftests/android/ion/README b/tools/testing/selftests/android/ion/README > new file mode 100644 > index 0000000..163e353 > --- /dev/null > +++ b/tools/testing/selftests/android/ion/README > @@ -0,0 +1,132 @@ > +ION BUFFER SHARING UTILITY > +========================== > +File: ion_test.sh : Utility to test ION driver buffer sharing mechanism. > +Author: Pintu Kumar > + > +Introduction: > +------------- > +This is a test utility to verify ION buffer sharing in user space > +between 2 independent processes. > +It uses unix domain socket (with SCM_RIGHTS) as IPC to transfer an FD to > +another process to share the same buffer. > +This utility demonstrates how ION buffer sharing can be implemented between > +two user space processes, using various heap types. > +The following heap types are supported by ION driver. > +ION_HEAP_TYPE_SYSTEM (0) > +ION_HEAP_TYPE_SYSTEM_CONTIG (1) > +ION_HEAP_TYPE_CARVEOUT (2) > +ION_HEAP_TYPE_CHUNK (3) > +ION_HEAP_TYPE_DMA (4) > + > +By default only the SYSTEM and SYSTEM_CONTIG heaps are supported. > +Each heap is associated with the respective heap id. > +This utility is designed in the form of client/server program. > +The server part (ionapp_export) is the exporter of the buffer. > +It is responsible for creating an ION client, allocating the buffer based on > +the heap id, writing some data to this buffer and then exporting the FD > +(associated with this buffer) to another process using socket IPC. > +This FD is called as buffer FD (which is different than the ION client FD). > + > +The client part (ionapp_import) is the importer of the buffer. > +It retrives the FD from the socket data and installs into its address space. > +This new FD internally points to the same kernel buffer. > +So first it reads the data that is stored in this buffer and prints it. > +Then it writes the different size of data (it could be different data) to the > +same buffer. > +Finally the buffer FD must be closed by both the exporter and importer. > +Thus the same kernel buffer is shared among two user space processes using > +ION driver and only one time allocation. > + > +Prerequisite: > +------------- > +This utility works only if /dev/ion interface is present. > +The following configs needs to be enabled in kernel to include ion driver. > +CONFIG_ANDROID=y > +CONFIG_ION=y > +CONFIG_ION_SYSTEM_HEAP=y You also need CONFIG_STAGING right now as well. > + > +This utility requires to be run as root user. > + > + > +Compile and test: > +----------------- > +This utility is made to be run as part of kselftest framework in kernel. > +To compile and run using kselftest you can simply do the following from the > +kernel top directory. > +linux$ make TARGETS=android kselftest > +Or you can also use: > +linux$ make -C tools/testing/selftests TARGETS=android run_tests > +Using the selftest it can directly execute the ion_test.sh script to test the > +buffer sharing using ion system heap. > +Currently the heap size is hard coded as just 10 bytes inside this script. > +You need to be a root user to run under selftest. > + > +You can also compile and test manually using the following steps: > +ion$ make > +These will generate 2 executable: ionapp_export, ionapp_import > +Now you can run the export and import manually by specifying the heap type > +and the heap size. > +You can also directly execute the shell script to run the test automatically. > +Simply use the following command to run the test. > +ion$ sudo ./ion_test.sh > + > +Test Results: > +------------- > +The utility is verified on Ubuntu-32 bit system with Linux Kernel 4.14. > +Here is the snapshot of the test result using kselftest. > + > +linux# make TARGETS=android kselftest > +make[2]: Entering directory '/home/pintu/PINTU/OPEN_SOURCE/KERNEL/ > +linux/tools/testing/selftests/android' > +make[3]: Entering directory '/home/pintu/PINTU/OPEN_SOURCE/KERNEL/ > +linux/tools/testing/selftests/android/ion' > +gcc -I../../../../../drivers/staging/android/uapi/ -Wall -O2 -g > +ionapp_export.c ipcsocket.c ionutils.c -o ionapp_export > +gcc -I../../../../../drivers/staging/android/uapi/ -Wall -O2 -g > +ionapp_import.c ipcsocket.c ionutils.c -o ionapp_import > + > +heap_type: 0, heap_size: 10 > +-------------------------------------- > +heap type: 0 > + heap id: 1 > +heap name: ion_system_heap > +-------------------------------------- > +Fill buffer content: > +0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd > +Sharing fd: 6, Client fd: 5 > +: buffer release successfully.... > +Received buffer fd: 4 > +Read buffer content: > +0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0x0 0x0 0x0 0x0 0x0 0x0 > +0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 > +Fill buffer content: > +0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd > +0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd > +0xfd 0xfd > +: buffer release successfully.... > +ion_test.sh: heap_type: 0 - [PASS] > + > +heap_type: 1, heap_size: 10 > +-------------------------------------- > +heap type: 1 > + heap id: 0 > +heap name: ion_system_contig_heap > +-------------------------------------- > +Fill buffer content: > +0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd > +Sharing fd: 6, Client fd: 5 > +: buffer release successfully.... > +Received buffer fd: 4 > +Read buffer content: > +0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0x0 0x0 0x0 0x0 0x0 0x0 0x0 > +0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 0x0 > +Fill buffer content: > +0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd > +0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd 0xfd > +0xfd 0xfd > +: buffer release successfully.... > +ion_test.sh: heap_type: 1 - [PASS] > + > +ion_test.sh: done > +make[2]: Leaving directory '/home/pintu/PINTU/OPEN_SOURCE/KERNEL/ > +linux/tools/testing/selftests/android' > diff --git a/tools/testing/selftests/android/ion/config b/tools/testing/selftests/android/ion/config > new file mode 100644 > index 0000000..614b615 > --- /dev/null > +++ b/tools/testing/selftests/android/ion/config > @@ -0,0 +1,3 @@ > +CONFIG_ANDROID=y > +CONFIG_ION=y > +CONFIG_ION_SYSTEM_HEAP=y > diff --git a/tools/testing/selftests/android/ion/ion_test.sh b/tools/testing/selftests/android/ion/ion_test.sh > new file mode 100755 > index 0000000..dc77a39 > --- /dev/null > +++ b/tools/testing/selftests/android/ion/ion_test.sh > @@ -0,0 +1,61 @@ > +#!/bin/bash > + > +heapsize=10 Nearly all the heaps are going to operate on page size granularity, just set this to 4096. > +TCID="ion_test.sh" > +errcode=0 > + > +run_test() > +{ > + heaptype=$1 > + ./ionapp_export -i $heaptype -s $heapsize & > + sleep 1 > + ./ionapp_import > + if [ $? -ne 0 ]; then > + echo "$TCID: heap_type: $heaptype - [FAIL]" > + errcode=1 > + else > + echo "$TCID: heap_type: $heaptype - [PASS]" > + fi > + sleep 1 > + echo "" > +} > + > +check_root() > +{ > + uid=$(id -u) > + if [ $uid -ne 0 ]; then > + echo $TCID: must be run as root >&2 > + exit 0 > + fi > +} > + > +check_device() > +{ > + DEVICE=/dev/ion > + if [ ! -e $DEVICE ]; then > + echo $TCID: No $DEVICE device found >&2 > + echo $TCID: May be CONFIG_ION is not set >&2 > + exit 0 > + fi > +} > + > +main_function() > +{ > + check_device > + check_root > + > + # ION_SYSTEM_HEAP TEST > + run_test 0 > + # ION_SYSTEM_CONTIG_HEAP TEST > + run_test 1 > + # ION_CARVEOUT HEAP TEST > + #run_test 2 > + # ION_CHUNK_HEAP TEST > + #run_test 3 > + # ION_CMA_HEAP TEST > + #run_test 4 > +} > + > +main_function > +echo "$TCID: done" > +exit $errcode > diff --git a/tools/testing/selftests/android/ion/ionapp_export.c b/tools/testing/selftests/android/ion/ionapp_export.c > new file mode 100644 > index 0000000..59b434f > --- /dev/null > +++ b/tools/testing/selftests/android/ion/ionapp_export.c > @@ -0,0 +1,151 @@ > +/* > + * ionapp_export.c > + * > + * It is a user space utility to create and export android > + * ion memory buffer fd to another process using unix domain socket as IPC. > + * This acts like a server for ionapp_import(client). > + * So, this server has to be started first before the client. > + * > + * Copyright (C) 2017 Pintu Kumar > + * > + * This software is licensed under the terms of the GNU General Public > + * License version 2, as published by the Free Software Foundation, and > + * may be copied, distributed, and modified under those terms. > + * > + * This program is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include "ionutils.h" > +#include "ipcsocket.h" > + > + > +void print_usage(int argc, char *argv[]) > +{ > + printf("********** HEAP TYPE ***********\n"); > + printf("0: ION_HEAP_TYPE_SYSTEM\n"); > + printf("1: ION_HEAP_TYPE_SYSTEM_CONTIG\n"); > + printf("2: ION_HEAP_TYPE_CARVEOUT\n"); > + printf("3: ION_HEAP_TYPE_CHUNK\n"); > + printf("4: ION_HEAP_TYPE_DMA\n"); > + > + printf("Usage: %s [-h ] [-i ] [-s ]\n", > + argv[0]); > +}> + Again, there is no need to test multiple heaps. Just do the test with system heap and remove all the other ones. Thanks, Laura From 1581555105589015999@xxx Wed Oct 18 01:01:24 +0000 2017 X-GM-THRID: 1579656416160844925 X-Gmail-Labels: Inbox,Category Forums