udmabuf.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <errno.h>
  7. #include <fcntl.h>
  8. #include <malloc.h>
  9. #include <sys/ioctl.h>
  10. #include <sys/syscall.h>
  11. #include <linux/memfd.h>
  12. #include <linux/udmabuf.h>
  13. #define TEST_PREFIX "drivers/dma-buf/udmabuf"
  14. #define NUM_PAGES 4
  15. static int memfd_create(const char *name, unsigned int flags)
  16. {
  17. return syscall(__NR_memfd_create, name, flags);
  18. }
  19. int main(int argc, char *argv[])
  20. {
  21. struct udmabuf_create create;
  22. int devfd, memfd, buf, ret;
  23. off_t size;
  24. void *mem;
  25. devfd = open("/dev/udmabuf", O_RDWR);
  26. if (devfd < 0) {
  27. printf("%s: [skip,no-udmabuf]\n", TEST_PREFIX);
  28. exit(77);
  29. }
  30. memfd = memfd_create("udmabuf-test", MFD_CLOEXEC);
  31. if (memfd < 0) {
  32. printf("%s: [skip,no-memfd]\n", TEST_PREFIX);
  33. exit(77);
  34. }
  35. size = getpagesize() * NUM_PAGES;
  36. ret = ftruncate(memfd, size);
  37. if (ret == -1) {
  38. printf("%s: [FAIL,memfd-truncate]\n", TEST_PREFIX);
  39. exit(1);
  40. }
  41. memset(&create, 0, sizeof(create));
  42. /* should fail (offset not page aligned) */
  43. create.memfd = memfd;
  44. create.offset = getpagesize()/2;
  45. create.size = getpagesize();
  46. buf = ioctl(devfd, UDMABUF_CREATE, &create);
  47. if (buf >= 0) {
  48. printf("%s: [FAIL,test-1]\n", TEST_PREFIX);
  49. exit(1);
  50. }
  51. /* should fail (size not multiple of page) */
  52. create.memfd = memfd;
  53. create.offset = 0;
  54. create.size = getpagesize()/2;
  55. buf = ioctl(devfd, UDMABUF_CREATE, &create);
  56. if (buf >= 0) {
  57. printf("%s: [FAIL,test-2]\n", TEST_PREFIX);
  58. exit(1);
  59. }
  60. /* should fail (not memfd) */
  61. create.memfd = 0; /* stdin */
  62. create.offset = 0;
  63. create.size = size;
  64. buf = ioctl(devfd, UDMABUF_CREATE, &create);
  65. if (buf >= 0) {
  66. printf("%s: [FAIL,test-3]\n", TEST_PREFIX);
  67. exit(1);
  68. }
  69. /* should work */
  70. create.memfd = memfd;
  71. create.offset = 0;
  72. create.size = size;
  73. buf = ioctl(devfd, UDMABUF_CREATE, &create);
  74. if (buf < 0) {
  75. printf("%s: [FAIL,test-4]\n", TEST_PREFIX);
  76. exit(1);
  77. }
  78. fprintf(stderr, "%s: ok\n", TEST_PREFIX);
  79. close(buf);
  80. close(memfd);
  81. close(devfd);
  82. return 0;
  83. }