From mboxrd@z Thu Jan 1 00:00:00 1970 From: daniel at ffwll.ch (Daniel Vetter) Date: Mon, 19 Feb 2018 16:31:43 +0100 Subject: [PATCH 2/2] selftests: ion: Add simple test with the vgem driver In-Reply-To: <20180216012445.17264-3-labbott@redhat.com> References: <20180216012445.17264-1-labbott@redhat.com> <20180216012445.17264-3-labbott@redhat.com> Message-ID: <20180219153143.GS22199@phenom.ffwll.local> On Thu, Feb 15, 2018 at 05:24:45PM -0800, Laura Abbott wrote: > Ion is designed to be a framework used by other clients who perform > operations on the buffer. Use the DRM vgem client as a simple consumer. > In conjunction with the dma-buf sync ioctls, this tests the full attach/map > path for the system heap. > > Signed-off-by: Laura Abbott > --- > tools/testing/selftests/android/ion/Makefile | 3 +- > tools/testing/selftests/android/ion/config | 1 + > tools/testing/selftests/android/ion/ionmap_test.c | 136 ++++++++++++++++++++++ > 3 files changed, 139 insertions(+), 1 deletion(-) > create mode 100644 tools/testing/selftests/android/ion/ionmap_test.c > > diff --git a/tools/testing/selftests/android/ion/Makefile b/tools/testing/selftests/android/ion/Makefile > index 96e0c448b39d..d23b6d537d8b 100644 > --- a/tools/testing/selftests/android/ion/Makefile > +++ b/tools/testing/selftests/android/ion/Makefile > @@ -2,7 +2,7 @@ > INCLUDEDIR := -I. -I../../../../../drivers/staging/android/uapi/ > CFLAGS := $(CFLAGS) $(INCLUDEDIR) -Wall -O2 -g > > -TEST_GEN_FILES := ionapp_export ionapp_import > +TEST_GEN_FILES := ionapp_export ionapp_import ionmap_test > > all: $(TEST_GEN_FILES) > > @@ -14,3 +14,4 @@ include ../../lib.mk > > $(OUTPUT)/ionapp_export: ionapp_export.c ipcsocket.c ionutils.c > $(OUTPUT)/ionapp_import: ionapp_import.c ipcsocket.c ionutils.c > +$(OUTPUT)/ionmap_test: ionmap_test.c ionutils.c > diff --git a/tools/testing/selftests/android/ion/config b/tools/testing/selftests/android/ion/config > index 19db6ca9aa2b..b4ad748a9dd9 100644 > --- a/tools/testing/selftests/android/ion/config > +++ b/tools/testing/selftests/android/ion/config > @@ -2,3 +2,4 @@ CONFIG_ANDROID=y > CONFIG_STAGING=y > CONFIG_ION=y > CONFIG_ION_SYSTEM_HEAP=y > +CONFIG_DRM_VGEM=y > diff --git a/tools/testing/selftests/android/ion/ionmap_test.c b/tools/testing/selftests/android/ion/ionmap_test.c > new file mode 100644 > index 000000000000..dab36b06b37d > --- /dev/null > +++ b/tools/testing/selftests/android/ion/ionmap_test.c > @@ -0,0 +1,136 @@ > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > + > +#include > + > +#include > + > +#include "ion.h" > +#include "ionutils.h" > + > +int check_vgem(int fd) > +{ > + drm_version_t version = { 0 }; > + char name[5]; > + int ret; > + > + version.name_len = 4; > + version.name = name; > + > + ret = ioctl(fd, DRM_IOCTL_VERSION, &version); > + if (ret) > + return 1; > + > + return strcmp(name, "vgem"); > +} > + > +int open_vgem(void) > +{ > + int i, fd; > + const char *drmstr = "/dev/dri/card"; > + > + fd = -1; > + for (i = 0; i < 16; i++) { > + char name[80]; > + > + sprintf(name, "%s%u", drmstr, i); > + > + fd = open(name, O_RDWR); > + if (fd < 0) > + continue; > + > + if (check_vgem(fd)) { > + close(fd); > + continue; > + } else { > + break; > + } > + > + } > + return fd; > +} > + > +int import_vgem_fd(int vgem_fd, int dma_buf_fd, uint32_t *handle) > +{ > + struct drm_prime_handle import_handle = { 0 }; > + int ret; > + > + import_handle.fd = dma_buf_fd; > + import_handle.flags = 0; > + import_handle.handle = 0; > + > + ret = ioctl(vgem_fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &import_handle); > + if (ret == 0) > + *handle = import_handle.handle; > + return ret; > +} > + > +void close_handle(int vgem_fd, uint32_t handle) > +{ > + struct drm_gem_close close = { 0 }; > + > + close.handle = handle; > + ioctl(vgem_fd, DRM_IOCTL_GEM_CLOSE, &close); > +} > + > +int main() > +{ > + int ret, vgem_fd; > + struct ion_buffer_info info; > + uint32_t handle = 0; > + struct dma_buf_sync sync = { 0 }; > + > + info.heap_type = ION_HEAP_TYPE_SYSTEM; > + info.heap_size = 4096; > + info.flag_type = ION_FLAG_CACHED; > + > + ret = ion_export_buffer_fd(&info); > + if (ret < 0) { > + printf("ion buffer alloc failed\n"); > + return -1; > + } > + > + vgem_fd = open_vgem(); > + if (vgem_fd < 0) { > + ret = vgem_fd; > + printf("Failed to open vgem\n"); > + goto out_ion; > + } > + > + ret = import_vgem_fd(vgem_fd, info.buffd, &handle); > + > + if (ret < 0) { > + printf("Failed to import buffer\n"); > + goto out_vgem; > + } > + > + sync.flags = DMA_BUF_SYNC_START | DMA_BUF_SYNC_RW; > + ret = ioctl(info.buffd, DMA_BUF_IOCTL_SYNC, &sync); > + if (ret) > + printf("sync start failed %d\n", errno); > + > + memset(info.buffer, 0xff, 4096); > + > + sync.flags = DMA_BUF_SYNC_END | DMA_BUF_SYNC_RW; > + ret = ioctl(info.buffd, DMA_BUF_IOCTL_SYNC, &sync); > + if (ret) > + printf("sync end failed %d\n", errno); At least in drm we require that userspace auto-restarts all ioctls when they get interrupt. See https://cgit.freedesktop.org/drm/libdrm/tree/xf86drm.c#n186 not really an issue with vgem (which can't wait for hw or anything else). But good to make sure we don't spread bad copypastas. Actual use of the ioctls looks all good. With the drmIoctl wrapper added and used this is: Reviewed-by: Daniel Vetter > + > + close_handle(vgem_fd, handle); > + ret = 0; > + > +out_vgem: > + close(vgem_fd); > +out_ion: > + ion_close_buffer_fd(&info); > + printf("done.\n"); > + return ret; > +} > -- > 2.14.3 > > _______________________________________________ > dri-devel mailing list > dri-devel at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch -- To unsubscribe from this list: send the line "unsubscribe linux-kselftest" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html From mboxrd@z Thu Jan 1 00:00:00 1970 From: daniel@ffwll.ch (Daniel Vetter) Date: Mon, 19 Feb 2018 16:31:43 +0100 Subject: [PATCH 2/2] selftests: ion: Add simple test with the vgem driver In-Reply-To: <20180216012445.17264-3-labbott@redhat.com> References: <20180216012445.17264-1-labbott@redhat.com> <20180216012445.17264-3-labbott@redhat.com> Message-ID: <20180219153143.GS22199@phenom.ffwll.local> Content-Type: text/plain; charset="UTF-8" Message-ID: <20180219153143.3P76U3ubiXnQQWffe3twdmsEhfCmEfq6xmM1VZC9EOM@z> On Thu, Feb 15, 2018@05:24:45PM -0800, Laura Abbott wrote: > Ion is designed to be a framework used by other clients who perform > operations on the buffer. Use the DRM vgem client as a simple consumer. > In conjunction with the dma-buf sync ioctls, this tests the full attach/map > path for the system heap. > > Signed-off-by: Laura Abbott > --- > tools/testing/selftests/android/ion/Makefile | 3 +- > tools/testing/selftests/android/ion/config | 1 + > tools/testing/selftests/android/ion/ionmap_test.c | 136 ++++++++++++++++++++++ > 3 files changed, 139 insertions(+), 1 deletion(-) > create mode 100644 tools/testing/selftests/android/ion/ionmap_test.c > > diff --git a/tools/testing/selftests/android/ion/Makefile b/tools/testing/selftests/android/ion/Makefile > index 96e0c448b39d..d23b6d537d8b 100644 > --- a/tools/testing/selftests/android/ion/Makefile > +++ b/tools/testing/selftests/android/ion/Makefile > @@ -2,7 +2,7 @@ > INCLUDEDIR := -I. -I../../../../../drivers/staging/android/uapi/ > CFLAGS := $(CFLAGS) $(INCLUDEDIR) -Wall -O2 -g > > -TEST_GEN_FILES := ionapp_export ionapp_import > +TEST_GEN_FILES := ionapp_export ionapp_import ionmap_test > > all: $(TEST_GEN_FILES) > > @@ -14,3 +14,4 @@ include ../../lib.mk > > $(OUTPUT)/ionapp_export: ionapp_export.c ipcsocket.c ionutils.c > $(OUTPUT)/ionapp_import: ionapp_import.c ipcsocket.c ionutils.c > +$(OUTPUT)/ionmap_test: ionmap_test.c ionutils.c > diff --git a/tools/testing/selftests/android/ion/config b/tools/testing/selftests/android/ion/config > index 19db6ca9aa2b..b4ad748a9dd9 100644 > --- a/tools/testing/selftests/android/ion/config > +++ b/tools/testing/selftests/android/ion/config > @@ -2,3 +2,4 @@ CONFIG_ANDROID=y > CONFIG_STAGING=y > CONFIG_ION=y > CONFIG_ION_SYSTEM_HEAP=y > +CONFIG_DRM_VGEM=y > diff --git a/tools/testing/selftests/android/ion/ionmap_test.c b/tools/testing/selftests/android/ion/ionmap_test.c > new file mode 100644 > index 000000000000..dab36b06b37d > --- /dev/null > +++ b/tools/testing/selftests/android/ion/ionmap_test.c > @@ -0,0 +1,136 @@ > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > + > +#include > + > +#include > + > +#include "ion.h" > +#include "ionutils.h" > + > +int check_vgem(int fd) > +{ > + drm_version_t version = { 0 }; > + char name[5]; > + int ret; > + > + version.name_len = 4; > + version.name = name; > + > + ret = ioctl(fd, DRM_IOCTL_VERSION, &version); > + if (ret) > + return 1; > + > + return strcmp(name, "vgem"); > +} > + > +int open_vgem(void) > +{ > + int i, fd; > + const char *drmstr = "/dev/dri/card"; > + > + fd = -1; > + for (i = 0; i < 16; i++) { > + char name[80]; > + > + sprintf(name, "%s%u", drmstr, i); > + > + fd = open(name, O_RDWR); > + if (fd < 0) > + continue; > + > + if (check_vgem(fd)) { > + close(fd); > + continue; > + } else { > + break; > + } > + > + } > + return fd; > +} > + > +int import_vgem_fd(int vgem_fd, int dma_buf_fd, uint32_t *handle) > +{ > + struct drm_prime_handle import_handle = { 0 }; > + int ret; > + > + import_handle.fd = dma_buf_fd; > + import_handle.flags = 0; > + import_handle.handle = 0; > + > + ret = ioctl(vgem_fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &import_handle); > + if (ret == 0) > + *handle = import_handle.handle; > + return ret; > +} > + > +void close_handle(int vgem_fd, uint32_t handle) > +{ > + struct drm_gem_close close = { 0 }; > + > + close.handle = handle; > + ioctl(vgem_fd, DRM_IOCTL_GEM_CLOSE, &close); > +} > + > +int main() > +{ > + int ret, vgem_fd; > + struct ion_buffer_info info; > + uint32_t handle = 0; > + struct dma_buf_sync sync = { 0 }; > + > + info.heap_type = ION_HEAP_TYPE_SYSTEM; > + info.heap_size = 4096; > + info.flag_type = ION_FLAG_CACHED; > + > + ret = ion_export_buffer_fd(&info); > + if (ret < 0) { > + printf("ion buffer alloc failed\n"); > + return -1; > + } > + > + vgem_fd = open_vgem(); > + if (vgem_fd < 0) { > + ret = vgem_fd; > + printf("Failed to open vgem\n"); > + goto out_ion; > + } > + > + ret = import_vgem_fd(vgem_fd, info.buffd, &handle); > + > + if (ret < 0) { > + printf("Failed to import buffer\n"); > + goto out_vgem; > + } > + > + sync.flags = DMA_BUF_SYNC_START | DMA_BUF_SYNC_RW; > + ret = ioctl(info.buffd, DMA_BUF_IOCTL_SYNC, &sync); > + if (ret) > + printf("sync start failed %d\n", errno); > + > + memset(info.buffer, 0xff, 4096); > + > + sync.flags = DMA_BUF_SYNC_END | DMA_BUF_SYNC_RW; > + ret = ioctl(info.buffd, DMA_BUF_IOCTL_SYNC, &sync); > + if (ret) > + printf("sync end failed %d\n", errno); At least in drm we require that userspace auto-restarts all ioctls when they get interrupt. See https://cgit.freedesktop.org/drm/libdrm/tree/xf86drm.c#n186 not really an issue with vgem (which can't wait for hw or anything else). But good to make sure we don't spread bad copypastas. Actual use of the ioctls looks all good. With the drmIoctl wrapper added and used this is: Reviewed-by: Daniel Vetter > + > + close_handle(vgem_fd, handle); > + ret = 0; > + > +out_vgem: > + close(vgem_fd); > +out_ion: > + ion_close_buffer_fd(&info); > + printf("done.\n"); > + return ret; > +} > -- > 2.14.3 > > _______________________________________________ > dri-devel mailing list > dri-devel at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch -- To unsubscribe from this list: send the line "unsubscribe linux-kselftest" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: Re: [PATCH 2/2] selftests: ion: Add simple test with the vgem driver Date: Mon, 19 Feb 2018 16:31:43 +0100 Message-ID: <20180219153143.GS22199@phenom.ffwll.local> References: <20180216012445.17264-1-labbott@redhat.com> <20180216012445.17264-3-labbott@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x244.google.com (mail-wm0-x244.google.com [IPv6:2a00:1450:400c:c09::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 886506E1FA for ; Mon, 19 Feb 2018 15:31:47 +0000 (UTC) Received: by mail-wm0-x244.google.com with SMTP id z9so10526823wmb.3 for ; Mon, 19 Feb 2018 07:31:47 -0800 (PST) Content-Disposition: inline In-Reply-To: <20180216012445.17264-3-labbott@redhat.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Laura Abbott Cc: devel@driverdev.osuosl.org, Todd Kjos , linux-kernel@vger.kernel.org, Liam Mark , dri-devel@lists.freedesktop.org, linux-kselftest@vger.kernel.org, Shuah Khan List-Id: dri-devel@lists.freedesktop.org T24gVGh1LCBGZWIgMTUsIDIwMTggYXQgMDU6MjQ6NDVQTSAtMDgwMCwgTGF1cmEgQWJib3R0IHdy b3RlOgo+IElvbiBpcyBkZXNpZ25lZCB0byBiZSBhIGZyYW1ld29yayB1c2VkIGJ5IG90aGVyIGNs aWVudHMgd2hvIHBlcmZvcm0KPiBvcGVyYXRpb25zIG9uIHRoZSBidWZmZXIuIFVzZSB0aGUgRFJN IHZnZW0gY2xpZW50IGFzIGEgc2ltcGxlIGNvbnN1bWVyLgo+IEluIGNvbmp1bmN0aW9uIHdpdGgg dGhlIGRtYS1idWYgc3luYyBpb2N0bHMsIHRoaXMgdGVzdHMgdGhlIGZ1bGwgYXR0YWNoL21hcAo+ IHBhdGggZm9yIHRoZSBzeXN0ZW0gaGVhcC4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBMYXVyYSBBYmJv dHQgPGxhYmJvdHRAcmVkaGF0LmNvbT4KPiAtLS0KPiAgdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMv YW5kcm9pZC9pb24vTWFrZWZpbGUgICAgICB8ICAgMyArLQo+ICB0b29scy90ZXN0aW5nL3NlbGZ0 ZXN0cy9hbmRyb2lkL2lvbi9jb25maWcgICAgICAgIHwgICAxICsKPiAgdG9vbHMvdGVzdGluZy9z ZWxmdGVzdHMvYW5kcm9pZC9pb24vaW9ubWFwX3Rlc3QuYyB8IDEzNiArKysrKysrKysrKysrKysr KysrKysrCj4gIDMgZmlsZXMgY2hhbmdlZCwgMTM5IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24o LSkKPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IHRvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FuZHJvaWQv aW9uL2lvbm1hcF90ZXN0LmMKPiAKPiBkaWZmIC0tZ2l0IGEvdG9vbHMvdGVzdGluZy9zZWxmdGVz dHMvYW5kcm9pZC9pb24vTWFrZWZpbGUgYi90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9hbmRyb2lk L2lvbi9NYWtlZmlsZQo+IGluZGV4IDk2ZTBjNDQ4YjM5ZC4uZDIzYjZkNTM3ZDhiIDEwMDY0NAo+ IC0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FuZHJvaWQvaW9uL01ha2VmaWxlCj4gKysr IGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYW5kcm9pZC9pb24vTWFrZWZpbGUKPiBAQCAtMiw3 ICsyLDcgQEAKPiAgSU5DTFVERURJUiA6PSAtSS4gLUkuLi8uLi8uLi8uLi8uLi9kcml2ZXJzL3N0 YWdpbmcvYW5kcm9pZC91YXBpLwo+ICBDRkxBR1MgOj0gJChDRkxBR1MpICQoSU5DTFVERURJUikg LVdhbGwgLU8yIC1nCj4gIAo+IC1URVNUX0dFTl9GSUxFUyA6PSBpb25hcHBfZXhwb3J0IGlvbmFw cF9pbXBvcnQKPiArVEVTVF9HRU5fRklMRVMgOj0gaW9uYXBwX2V4cG9ydCBpb25hcHBfaW1wb3J0 IGlvbm1hcF90ZXN0Cj4gIAo+ICBhbGw6ICQoVEVTVF9HRU5fRklMRVMpCj4gIAo+IEBAIC0xNCwz ICsxNCw0IEBAIGluY2x1ZGUgLi4vLi4vbGliLm1rCj4gIAo+ICAkKE9VVFBVVCkvaW9uYXBwX2V4 cG9ydDogaW9uYXBwX2V4cG9ydC5jIGlwY3NvY2tldC5jIGlvbnV0aWxzLmMKPiAgJChPVVRQVVQp L2lvbmFwcF9pbXBvcnQ6IGlvbmFwcF9pbXBvcnQuYyBpcGNzb2NrZXQuYyBpb251dGlscy5jCj4g KyQoT1VUUFVUKS9pb25tYXBfdGVzdDogaW9ubWFwX3Rlc3QuYyBpb251dGlscy5jCj4gZGlmZiAt LWdpdCBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FuZHJvaWQvaW9uL2NvbmZpZyBiL3Rvb2xz L3Rlc3Rpbmcvc2VsZnRlc3RzL2FuZHJvaWQvaW9uL2NvbmZpZwo+IGluZGV4IDE5ZGI2Y2E5YWEy Yi4uYjRhZDc0OGE5ZGQ5IDEwMDY0NAo+IC0tLSBhL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2Fu ZHJvaWQvaW9uL2NvbmZpZwo+ICsrKyBiL3Rvb2xzL3Rlc3Rpbmcvc2VsZnRlc3RzL2FuZHJvaWQv aW9uL2NvbmZpZwo+IEBAIC0yLDMgKzIsNCBAQCBDT05GSUdfQU5EUk9JRD15Cj4gIENPTkZJR19T VEFHSU5HPXkKPiAgQ09ORklHX0lPTj15Cj4gIENPTkZJR19JT05fU1lTVEVNX0hFQVA9eQo+ICtD T05GSUdfRFJNX1ZHRU09eQo+IGRpZmYgLS1naXQgYS90b29scy90ZXN0aW5nL3NlbGZ0ZXN0cy9h bmRyb2lkL2lvbi9pb25tYXBfdGVzdC5jIGIvdG9vbHMvdGVzdGluZy9zZWxmdGVzdHMvYW5kcm9p ZC9pb24vaW9ubWFwX3Rlc3QuYwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAw MDAwMDAwLi5kYWIzNmIwNmIzN2QKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvdG9vbHMvdGVzdGlu Zy9zZWxmdGVzdHMvYW5kcm9pZC9pb24vaW9ubWFwX3Rlc3QuYwo+IEBAIC0wLDAgKzEsMTM2IEBA Cj4gKyNpbmNsdWRlIDxlcnJuby5oPgo+ICsjaW5jbHVkZSA8ZmNudGwuaD4KPiArI2luY2x1ZGUg PHN0ZGlvLmg+Cj4gKyNpbmNsdWRlIDxzdGRpbnQuaD4KPiArI2luY2x1ZGUgPHN0cmluZy5oPgo+ ICsjaW5jbHVkZSA8dW5pc3RkLmg+Cj4gKwo+ICsjaW5jbHVkZSA8c3lzL2lvY3RsLmg+Cj4gKyNp bmNsdWRlIDxzeXMvdHlwZXMuaD4KPiArI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Cj4gKwo+ICsjaW5j bHVkZSA8bGludXgvZG1hLWJ1Zi5oPgo+ICsKPiArI2luY2x1ZGUgPGRybS9kcm0uaD4KPiArCj4g KyNpbmNsdWRlICJpb24uaCIKPiArI2luY2x1ZGUgImlvbnV0aWxzLmgiCj4gKwo+ICtpbnQgY2hl Y2tfdmdlbShpbnQgZmQpCj4gK3sKPiArCWRybV92ZXJzaW9uX3QgdmVyc2lvbiA9IHsgMCB9Owo+ ICsJY2hhciBuYW1lWzVdOwo+ICsJaW50IHJldDsKPiArCj4gKwl2ZXJzaW9uLm5hbWVfbGVuID0g NDsKPiArCXZlcnNpb24ubmFtZSA9IG5hbWU7Cj4gKwo+ICsJcmV0ID0gaW9jdGwoZmQsIERSTV9J T0NUTF9WRVJTSU9OLCAmdmVyc2lvbik7Cj4gKwlpZiAocmV0KQo+ICsJCXJldHVybiAxOwo+ICsK PiArCXJldHVybiBzdHJjbXAobmFtZSwgInZnZW0iKTsKPiArfQo+ICsKPiAraW50IG9wZW5fdmdl bSh2b2lkKQo+ICt7Cj4gKwlpbnQgaSwgZmQ7Cj4gKwljb25zdCBjaGFyICpkcm1zdHIgPSAiL2Rl di9kcmkvY2FyZCI7Cj4gKwo+ICsJZmQgPSAtMTsKPiArCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsr KSB7Cj4gKwkJY2hhciBuYW1lWzgwXTsKPiArCj4gKwkJc3ByaW50ZihuYW1lLCAiJXMldSIsIGRy bXN0ciwgaSk7Cj4gKwo+ICsJCWZkID0gb3BlbihuYW1lLCBPX1JEV1IpOwo+ICsJCWlmIChmZCA8 IDApCj4gKwkJCWNvbnRpbnVlOwo+ICsKPiArCQlpZiAoY2hlY2tfdmdlbShmZCkpIHsKPiArCQkJ Y2xvc2UoZmQpOwo+ICsJCQljb250aW51ZTsKPiArCQl9IGVsc2Ugewo+ICsJCQlicmVhazsKPiAr CQl9Cj4gKwo+ICsJfQo+ICsJcmV0dXJuIGZkOwo+ICt9Cj4gKwo+ICtpbnQgaW1wb3J0X3ZnZW1f ZmQoaW50IHZnZW1fZmQsIGludCBkbWFfYnVmX2ZkLCB1aW50MzJfdCAqaGFuZGxlKQo+ICt7Cj4g KwlzdHJ1Y3QgZHJtX3ByaW1lX2hhbmRsZSBpbXBvcnRfaGFuZGxlID0geyAwIH07Cj4gKwlpbnQg cmV0Owo+ICsKPiArCWltcG9ydF9oYW5kbGUuZmQgPSBkbWFfYnVmX2ZkOwo+ICsJaW1wb3J0X2hh bmRsZS5mbGFncyA9IDA7Cj4gKwlpbXBvcnRfaGFuZGxlLmhhbmRsZSA9IDA7Cj4gKwo+ICsJcmV0 ID0gaW9jdGwodmdlbV9mZCwgRFJNX0lPQ1RMX1BSSU1FX0ZEX1RPX0hBTkRMRSwgJmltcG9ydF9o YW5kbGUpOwo+ICsJaWYgKHJldCA9PSAwKQo+ICsJCSpoYW5kbGUgPSBpbXBvcnRfaGFuZGxlLmhh bmRsZTsKPiArCXJldHVybiByZXQ7Cj4gK30KPiArCj4gK3ZvaWQgY2xvc2VfaGFuZGxlKGludCB2 Z2VtX2ZkLCB1aW50MzJfdCBoYW5kbGUpCj4gK3sKPiArCXN0cnVjdCBkcm1fZ2VtX2Nsb3NlIGNs b3NlID0geyAwIH07Cj4gKwo+ICsJY2xvc2UuaGFuZGxlID0gaGFuZGxlOwo+ICsJaW9jdGwodmdl bV9mZCwgRFJNX0lPQ1RMX0dFTV9DTE9TRSwgJmNsb3NlKTsKPiArfQo+ICsKPiAraW50IG1haW4o KQo+ICt7Cj4gKwlpbnQgcmV0LCB2Z2VtX2ZkOwo+ICsJc3RydWN0IGlvbl9idWZmZXJfaW5mbyBp bmZvOwo+ICsJdWludDMyX3QgaGFuZGxlID0gMDsKPiArCXN0cnVjdCBkbWFfYnVmX3N5bmMgc3lu YyA9IHsgMCB9Owo+ICsKPiArCWluZm8uaGVhcF90eXBlID0gSU9OX0hFQVBfVFlQRV9TWVNURU07 Cj4gKwlpbmZvLmhlYXBfc2l6ZSA9IDQwOTY7Cj4gKwlpbmZvLmZsYWdfdHlwZSA9IElPTl9GTEFH X0NBQ0hFRDsKPiArCj4gKwlyZXQgPSBpb25fZXhwb3J0X2J1ZmZlcl9mZCgmaW5mbyk7Cj4gKwlp ZiAocmV0IDwgMCkgewo+ICsJCXByaW50ZigiaW9uIGJ1ZmZlciBhbGxvYyBmYWlsZWRcbiIpOwo+ ICsJCXJldHVybiAtMTsKPiArCX0KPiArCj4gKwl2Z2VtX2ZkID0gb3Blbl92Z2VtKCk7Cj4gKwlp ZiAodmdlbV9mZCA8IDApIHsKPiArCQlyZXQgPSB2Z2VtX2ZkOwo+ICsJCXByaW50ZigiRmFpbGVk IHRvIG9wZW4gdmdlbVxuIik7Cj4gKwkJZ290byBvdXRfaW9uOwo+ICsJfQo+ICsKPiArCXJldCA9 IGltcG9ydF92Z2VtX2ZkKHZnZW1fZmQsIGluZm8uYnVmZmQsICZoYW5kbGUpOwo+ICsKPiArCWlm IChyZXQgPCAwKSB7Cj4gKwkJcHJpbnRmKCJGYWlsZWQgdG8gaW1wb3J0IGJ1ZmZlclxuIik7Cj4g KwkJZ290byBvdXRfdmdlbTsKPiArCX0KPiArCj4gKwlzeW5jLmZsYWdzID0gRE1BX0JVRl9TWU5D X1NUQVJUIHwgRE1BX0JVRl9TWU5DX1JXOwo+ICsJcmV0ID0gaW9jdGwoaW5mby5idWZmZCwgRE1B X0JVRl9JT0NUTF9TWU5DLCAmc3luYyk7Cj4gKwlpZiAocmV0KQo+ICsJCXByaW50Zigic3luYyBz dGFydCBmYWlsZWQgJWRcbiIsIGVycm5vKTsKPiArCj4gKwltZW1zZXQoaW5mby5idWZmZXIsIDB4 ZmYsIDQwOTYpOwo+ICsKPiArCXN5bmMuZmxhZ3MgPSBETUFfQlVGX1NZTkNfRU5EIHwgRE1BX0JV Rl9TWU5DX1JXOwo+ICsJcmV0ID0gaW9jdGwoaW5mby5idWZmZCwgRE1BX0JVRl9JT0NUTF9TWU5D LCAmc3luYyk7Cj4gKwlpZiAocmV0KQo+ICsJCXByaW50Zigic3luYyBlbmQgZmFpbGVkICVkXG4i LCBlcnJubyk7CgpBdCBsZWFzdCBpbiBkcm0gd2UgcmVxdWlyZSB0aGF0IHVzZXJzcGFjZSBhdXRv LXJlc3RhcnRzIGFsbCBpb2N0bHMgd2hlbgp0aGV5IGdldCBpbnRlcnJ1cHQuIFNlZQoKaHR0cHM6 Ly9jZ2l0LmZyZWVkZXNrdG9wLm9yZy9kcm0vbGliZHJtL3RyZWUveGY4NmRybS5jI24xODYKCm5v dCByZWFsbHkgYW4gaXNzdWUgd2l0aCB2Z2VtICh3aGljaCBjYW4ndCB3YWl0IGZvciBodyBvciBh bnl0aGluZyBlbHNlKS4KQnV0IGdvb2QgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHNwcmVhZCBiYWQg Y29weXBhc3Rhcy4KCkFjdHVhbCB1c2Ugb2YgdGhlIGlvY3RscyBsb29rcyBhbGwgZ29vZC4gV2l0 aCB0aGUgZHJtSW9jdGwgd3JhcHBlciBhZGRlZAphbmQgdXNlZCB0aGlzIGlzOgoKUmV2aWV3ZWQt Ynk6IERhbmllbCBWZXR0ZXIgPGRhbmllbC52ZXR0ZXJAZmZ3bGwuY2g+Cj4gKwo+ICsJY2xvc2Vf aGFuZGxlKHZnZW1fZmQsIGhhbmRsZSk7Cj4gKwlyZXQgPSAwOwo+ICsKPiArb3V0X3ZnZW06Cj4g KwljbG9zZSh2Z2VtX2ZkKTsKPiArb3V0X2lvbjoKPiArCWlvbl9jbG9zZV9idWZmZXJfZmQoJmlu Zm8pOwo+ICsJcHJpbnRmKCJkb25lLlxuIik7Cj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gLS0gCj4g Mi4xNC4zCj4gCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X18KPiBkcmktZGV2ZWwgbWFpbGluZyBsaXN0Cj4gZHJpLWRldmVsQGxpc3RzLmZyZWVkZXNrdG9w Lm9yZwo+IGh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJp LWRldmVsCgotLSAKRGFuaWVsIFZldHRlcgpTb2Z0d2FyZSBFbmdpbmVlciwgSW50ZWwgQ29ycG9y YXRpb24KaHR0cDovL2Jsb2cuZmZ3bGwuY2gKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMu ZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlz dGluZm8vZHJpLWRldmVsCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Google-Smtp-Source: AH8x225T7kEa7O4yulqn57egFPmB7xvgLiuxzAgwMfb7lHpSybHCujsSwp4NtocjlSbGuT4ySYT1 ARC-Seal: i=1; a=rsa-sha256; t=1519054321; cv=none; d=google.com; s=arc-20160816; b=JsOGa6m0G1HC3vDsS+tj1DnbzZG38hzyF00RbgXygEyDZxwKHZZwPQVhFYowavsSSo YUN5AzmwvqRdYG14S5ZYHz47qM+N1nyXmr1GntRj+Y1DqHRYY4RA37GeJY0GFS1qEnSh OeF7XW/ipbrE2ml2JJ+e312cIMImdBbE0doYfgG4op2OKySkqMPa591Z32n7cuab9sap IHa59gZDWF20O3p/t4ZRuERT1Uky423yEz20tOa5lQ/6YHP4poGdCESV8rOjM6Cp85jk 81e7y/BphtzAsOMQYSEg2CJjbNxrUGoX9I54sKwO38dT7RV9iR5aDg/mTSBEUKkWuGFd Q4JQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:mail-followup-to :message-id:subject:cc:to:from:date:dkim-signature :arc-authentication-results; bh=PBaJNYsQjRnZDT3ZRE1VMndgqtar8tLoKf6CsRx5PJA=; b=hu+aUYyWXzzjzQ2PCq27HIfhjJ0M6yAyVI/9ZBCrM0HrHDFZRME1jDCSKX+fm+Nfe5 RxlztHRJFTN8t4wC0BxMFlGckMmR8UANmSDcJR+v+CHORnCffwx6FOxZQYn4lAx3U53d 8+xNNUQlScCpDYAYfz5y1XJXDDFGNnxWP8+QotAk/axR0x7IhGy64EzNMaC8T6FHbTdj mUpHB1NizI19ZLX/Eh16r0Hnwz4qWAy0o6he4qr8ddEnccbl3oFIPjAWGMwZpmPxeem0 ybC5tPlkhoANZllMgZTJV1JVnNrUpw+6bA4vouORq+eBjxKqMnXctHeLkDds3uYRA9Ck VVfw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@ffwll.ch header.s=google header.b=FxQ106J5; spf=pass (google.com: best guess record for domain of linux-kselftest-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kselftest-owner@vger.kernel.org Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@ffwll.ch header.s=google header.b=FxQ106J5; spf=pass (google.com: best guess record for domain of linux-kselftest-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kselftest-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753202AbeBSPbt (ORCPT ); Mon, 19 Feb 2018 10:31:49 -0500 Received: from mail-wm0-f67.google.com ([74.125.82.67]:39607 "EHLO mail-wm0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753200AbeBSPbr (ORCPT ); Mon, 19 Feb 2018 10:31:47 -0500 Date: Mon, 19 Feb 2018 16:31:43 +0100 From: Daniel Vetter To: Laura Abbott Cc: Sumit Semwal , devel@driverdev.osuosl.org, Todd Kjos , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Liam Mark , linux-kselftest@vger.kernel.org, Shuah Khan Subject: Re: [PATCH 2/2] selftests: ion: Add simple test with the vgem driver Message-ID: <20180219153143.GS22199@phenom.ffwll.local> Mail-Followup-To: Laura Abbott , Sumit Semwal , devel@driverdev.osuosl.org, Todd Kjos , linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Liam Mark , linux-kselftest@vger.kernel.org, Shuah Khan References: <20180216012445.17264-1-labbott@redhat.com> <20180216012445.17264-3-labbott@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20180216012445.17264-3-labbott@redhat.com> X-Operating-System: Linux phenom 4.14.0-3-amd64 User-Agent: Mutt/1.9.3 (2018-01-21) Sender: linux-kselftest-owner@vger.kernel.org X-Mailing-List: linux-kselftest@vger.kernel.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1592518858142172103?= X-GMAIL-MSGID: =?utf-8?q?1592843904156806511?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: On Thu, Feb 15, 2018 at 05:24:45PM -0800, Laura Abbott wrote: > Ion is designed to be a framework used by other clients who perform > operations on the buffer. Use the DRM vgem client as a simple consumer. > In conjunction with the dma-buf sync ioctls, this tests the full attach/map > path for the system heap. > > Signed-off-by: Laura Abbott > --- > tools/testing/selftests/android/ion/Makefile | 3 +- > tools/testing/selftests/android/ion/config | 1 + > tools/testing/selftests/android/ion/ionmap_test.c | 136 ++++++++++++++++++++++ > 3 files changed, 139 insertions(+), 1 deletion(-) > create mode 100644 tools/testing/selftests/android/ion/ionmap_test.c > > diff --git a/tools/testing/selftests/android/ion/Makefile b/tools/testing/selftests/android/ion/Makefile > index 96e0c448b39d..d23b6d537d8b 100644 > --- a/tools/testing/selftests/android/ion/Makefile > +++ b/tools/testing/selftests/android/ion/Makefile > @@ -2,7 +2,7 @@ > INCLUDEDIR := -I. -I../../../../../drivers/staging/android/uapi/ > CFLAGS := $(CFLAGS) $(INCLUDEDIR) -Wall -O2 -g > > -TEST_GEN_FILES := ionapp_export ionapp_import > +TEST_GEN_FILES := ionapp_export ionapp_import ionmap_test > > all: $(TEST_GEN_FILES) > > @@ -14,3 +14,4 @@ include ../../lib.mk > > $(OUTPUT)/ionapp_export: ionapp_export.c ipcsocket.c ionutils.c > $(OUTPUT)/ionapp_import: ionapp_import.c ipcsocket.c ionutils.c > +$(OUTPUT)/ionmap_test: ionmap_test.c ionutils.c > diff --git a/tools/testing/selftests/android/ion/config b/tools/testing/selftests/android/ion/config > index 19db6ca9aa2b..b4ad748a9dd9 100644 > --- a/tools/testing/selftests/android/ion/config > +++ b/tools/testing/selftests/android/ion/config > @@ -2,3 +2,4 @@ CONFIG_ANDROID=y > CONFIG_STAGING=y > CONFIG_ION=y > CONFIG_ION_SYSTEM_HEAP=y > +CONFIG_DRM_VGEM=y > diff --git a/tools/testing/selftests/android/ion/ionmap_test.c b/tools/testing/selftests/android/ion/ionmap_test.c > new file mode 100644 > index 000000000000..dab36b06b37d > --- /dev/null > +++ b/tools/testing/selftests/android/ion/ionmap_test.c > @@ -0,0 +1,136 @@ > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > + > +#include > + > +#include > + > +#include "ion.h" > +#include "ionutils.h" > + > +int check_vgem(int fd) > +{ > + drm_version_t version = { 0 }; > + char name[5]; > + int ret; > + > + version.name_len = 4; > + version.name = name; > + > + ret = ioctl(fd, DRM_IOCTL_VERSION, &version); > + if (ret) > + return 1; > + > + return strcmp(name, "vgem"); > +} > + > +int open_vgem(void) > +{ > + int i, fd; > + const char *drmstr = "/dev/dri/card"; > + > + fd = -1; > + for (i = 0; i < 16; i++) { > + char name[80]; > + > + sprintf(name, "%s%u", drmstr, i); > + > + fd = open(name, O_RDWR); > + if (fd < 0) > + continue; > + > + if (check_vgem(fd)) { > + close(fd); > + continue; > + } else { > + break; > + } > + > + } > + return fd; > +} > + > +int import_vgem_fd(int vgem_fd, int dma_buf_fd, uint32_t *handle) > +{ > + struct drm_prime_handle import_handle = { 0 }; > + int ret; > + > + import_handle.fd = dma_buf_fd; > + import_handle.flags = 0; > + import_handle.handle = 0; > + > + ret = ioctl(vgem_fd, DRM_IOCTL_PRIME_FD_TO_HANDLE, &import_handle); > + if (ret == 0) > + *handle = import_handle.handle; > + return ret; > +} > + > +void close_handle(int vgem_fd, uint32_t handle) > +{ > + struct drm_gem_close close = { 0 }; > + > + close.handle = handle; > + ioctl(vgem_fd, DRM_IOCTL_GEM_CLOSE, &close); > +} > + > +int main() > +{ > + int ret, vgem_fd; > + struct ion_buffer_info info; > + uint32_t handle = 0; > + struct dma_buf_sync sync = { 0 }; > + > + info.heap_type = ION_HEAP_TYPE_SYSTEM; > + info.heap_size = 4096; > + info.flag_type = ION_FLAG_CACHED; > + > + ret = ion_export_buffer_fd(&info); > + if (ret < 0) { > + printf("ion buffer alloc failed\n"); > + return -1; > + } > + > + vgem_fd = open_vgem(); > + if (vgem_fd < 0) { > + ret = vgem_fd; > + printf("Failed to open vgem\n"); > + goto out_ion; > + } > + > + ret = import_vgem_fd(vgem_fd, info.buffd, &handle); > + > + if (ret < 0) { > + printf("Failed to import buffer\n"); > + goto out_vgem; > + } > + > + sync.flags = DMA_BUF_SYNC_START | DMA_BUF_SYNC_RW; > + ret = ioctl(info.buffd, DMA_BUF_IOCTL_SYNC, &sync); > + if (ret) > + printf("sync start failed %d\n", errno); > + > + memset(info.buffer, 0xff, 4096); > + > + sync.flags = DMA_BUF_SYNC_END | DMA_BUF_SYNC_RW; > + ret = ioctl(info.buffd, DMA_BUF_IOCTL_SYNC, &sync); > + if (ret) > + printf("sync end failed %d\n", errno); At least in drm we require that userspace auto-restarts all ioctls when they get interrupt. See https://cgit.freedesktop.org/drm/libdrm/tree/xf86drm.c#n186 not really an issue with vgem (which can't wait for hw or anything else). But good to make sure we don't spread bad copypastas. Actual use of the ioctls looks all good. With the drmIoctl wrapper added and used this is: Reviewed-by: Daniel Vetter > + > + close_handle(vgem_fd, handle); > + ret = 0; > + > +out_vgem: > + close(vgem_fd); > +out_ion: > + ion_close_buffer_fd(&info); > + printf("done.\n"); > + return ret; > +} > -- > 2.14.3 > > _______________________________________________ > dri-devel mailing list > dri-devel@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/dri-devel -- Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch