102 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| ION BUFFER SHARING UTILITY
 | |
| ==========================
 | |
| File: ion_test.sh : Utility to test ION driver buffer sharing mechanism.
 | |
| Author: Pintu Kumar <pintu.ping@gmail.com>
 | |
| 
 | |
| 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_STAGING=y
 | |
| CONFIG_ION=y
 | |
| CONFIG_ION_SYSTEM_HEAP=y
 | |
| 
 | |
| 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
 | |
| 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
 | |
| <ion_close_buffer_fd>: 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
 | |
| <ion_close_buffer_fd>: buffer release successfully....
 | |
| ion_test.sh: heap_type: 0 - [PASS]
 | |
| 
 | |
| ion_test.sh: done
 |