int main(int argc, char* argv[]) { int c, ret; unsigned int count = 1, iteration = 1, j, custom_test_num = 1; enum tests { ALLOC_TEST = 0, MAP_TEST, CUSTOM_TEST, }; while (1) { static struct option opts[] = { {"alloc", no_argument, 0, 'a'}, {"alloc_flags", required_argument, 0, 'f'}, {"map", no_argument, 0, 'm'}, {"custom", required_argument, 0, 'c'}, {"len", required_argument, 0, 'l'}, {"align", required_argument, 0, 'g'}, {"map_flags", required_argument, 0, 'z'}, {"prot", required_argument, 0, 'p'}, {"alloc_tiler", no_argument, 0, 't'}, {"width", required_argument, 0, 'w'}, {"height", required_argument, 0, 'h'}, {"fmt", required_argument, 0, 'r'}, {"count", required_argument, 0, 'n'}, {"iteration", required_argument, 0, 'i'}, }; int i = 0; c = getopt_long(argc, argv, "af:h:l:mr:stw:c:n:i:", opts, &i); if (c == -1) break; switch (c) { case 'l': len = atol(optarg); break; case 'g': align = atol(optarg); break; case 'z': map_flags = 0; map_flags |= strstr(optarg, "PROT_EXEC") ? PROT_EXEC : 0; map_flags |= strstr(optarg, "PROT_READ") ? PROT_READ: 0; map_flags |= strstr(optarg, "PROT_WRITE") ? PROT_WRITE: 0; map_flags |= strstr(optarg, "PROT_NONE") ? PROT_NONE: 0; break; case 'p': prot = 0; prot |= strstr(optarg, "MAP_PRIVATE") ? MAP_PRIVATE : 0; prot |= strstr(optarg, "MAP_SHARED") ? MAP_PRIVATE : 0; break; case 'f': alloc_flags = atol(optarg); break; case 'a': test = ALLOC_TEST; break; case 'm': test = MAP_TEST; break; case 'c': test = CUSTOM_TEST; printf("KALP : Case 'c'\n"); custom_test_num = atol(optarg); break; case 'r': fmt = atol(optarg); break; case 'w': width = atol(optarg); break; case 'h': height = atol(optarg); break; case 't': tiler_test = 1; break; case 'n': printf("KALP : Case 'n'\n"); count = atol(optarg); break; case 'i': printf("KALP : Case 'i'\n"); iteration = atol(optarg); break; } } printf("test %d, len %u, width %u, height %u, fmt %u, align %u, count %d, " "iteration %d, map_flags %d, prot %d, alloc_flags %d\n", test, len, width, height, fmt, align, count, iteration, map_flags, prot, alloc_flags); switch (test) { case ALLOC_TEST: for(j = 0; j < iteration; j++) { ret = ion_alloc_test(count); if(ret) { printf("\nion alloc test: FAILED at iteration-%d\n", j+1); break; } } break; case MAP_TEST: for(j = 0; j < iteration; j++) { ret = ion_map_test(count); if(ret) { printf("\nion map test: FAILED at iteration-%d\n", j+1); break; } } break; case CUSTOM_TEST: ret = custom_test(custom_test_num); if(ret) { printf("\nion custom test #%d: FAILED\n", custom_test_num); } break; default: printf("must specify a test (alloc, map, custom)\n"); } return 0; }
void ion_share_test() { ion_user_handle_t handle; int sd[2]; int num_fd = 1; struct iovec count_vec = { .iov_base = &num_fd, .iov_len = sizeof num_fd, }; char buf[CMSG_SPACE(sizeof(int))]; socketpair(AF_UNIX, SOCK_STREAM, 0, sd); if (fork()) { struct msghdr msg = { .msg_control = buf, .msg_controllen = sizeof buf, .msg_iov = &count_vec, .msg_iovlen = 1, }; struct cmsghdr *cmsg; int fd, share_fd, ret; char *ptr; /* parent */ if(_ion_alloc_test(&fd, &handle)) return; ret = ion_share(fd, handle, &share_fd); if (ret) printf("share failed %s\n", strerror(errno)); ptr = mmap(NULL, len, prot, map_flags, share_fd, 0); if (ptr == MAP_FAILED) { return; } strcpy(ptr, "master"); cmsg = CMSG_FIRSTHDR(&msg); cmsg->cmsg_level = SOL_SOCKET; cmsg->cmsg_type = SCM_RIGHTS; cmsg->cmsg_len = CMSG_LEN(sizeof(int)); *(int *)CMSG_DATA(cmsg) = share_fd; /* send the fd */ printf("master? [%10s] should be [master]\n", ptr); printf("master sending msg 1\n"); sendmsg(sd[0], &msg, 0); if (recvmsg(sd[0], &msg, 0) < 0) perror("master recv msg 2"); printf("master? [%10s] should be [child]\n", ptr); /* send ping */ sendmsg(sd[0], &msg, 0); printf("master->master? [%10s]\n", ptr); if (recvmsg(sd[0], &msg, 0) < 0) perror("master recv 1"); } else { struct msghdr msg; struct cmsghdr *cmsg; char* ptr; int fd, recv_fd; char* child_buf[100]; /* child */ struct iovec count_vec = { .iov_base = child_buf, .iov_len = sizeof child_buf, }; struct msghdr child_msg = { .msg_control = buf, .msg_controllen = sizeof buf, .msg_iov = &count_vec, .msg_iovlen = 1, }; if (recvmsg(sd[1], &child_msg, 0) < 0) perror("child recv msg 1"); cmsg = CMSG_FIRSTHDR(&child_msg); if (cmsg == NULL) { printf("no cmsg rcvd in child"); return; } recv_fd = *(int*)CMSG_DATA(cmsg); if (recv_fd < 0) { printf("could not get recv_fd from socket"); return; } printf("child %d\n", recv_fd); fd = ion_open(); ptr = mmap(NULL, len, prot, map_flags, recv_fd, 0); if (ptr == MAP_FAILED) { return; } printf("child? [%10s] should be [master]\n", ptr); strcpy(ptr, "child"); printf("child sending msg 2\n"); sendmsg(sd[1], &child_msg, 0); } } int main(int argc, char* argv[]) { int c; enum tests { ALLOC_TEST = 0, MAP_TEST, SHARE_TEST, }; while (1) { static struct option opts[] = { {"alloc", no_argument, 0, 'a'}, {"alloc_flags", required_argument, 0, 'f'}, {"map", no_argument, 0, 'm'}, {"share", no_argument, 0, 's'}, {"len", required_argument, 0, 'l'}, {"align", required_argument, 0, 'g'}, {"map_flags", required_argument, 0, 'z'}, {"prot", required_argument, 0, 'p'}, {"width", required_argument, 0, 'w'}, {"height", required_argument, 0, 'h'}, }; int i = 0; c = getopt_long(argc, argv, "af:h:l:mr:stw:", opts, &i); if (c == -1) break; switch (c) { case 'l': len = atol(optarg); break; case 'g': align = atol(optarg); break; case 'z': map_flags = 0; map_flags |= strstr(optarg, "PROT_EXEC") ? PROT_EXEC : 0; map_flags |= strstr(optarg, "PROT_READ") ? PROT_READ: 0; map_flags |= strstr(optarg, "PROT_WRITE") ? PROT_WRITE: 0; map_flags |= strstr(optarg, "PROT_NONE") ? PROT_NONE: 0; break; case 'p': prot = 0; prot |= strstr(optarg, "MAP_PRIVATE") ? MAP_PRIVATE : 0; prot |= strstr(optarg, "MAP_SHARED") ? MAP_PRIVATE : 0; break; case 'f': alloc_flags = atol(optarg); break; case 'a': test = ALLOC_TEST; break; case 'm': test = MAP_TEST; break; case 's': test = SHARE_TEST; break; case 'w': width = atol(optarg); break; case 'h': height = atol(optarg); break; } } printf("test %d, len %u, width %u, height %u align %u, " "map_flags %d, prot %d, alloc_flags %d\n", test, len, width, height, align, map_flags, prot, alloc_flags); switch (test) { case ALLOC_TEST: ion_alloc_test(); break; case MAP_TEST: ion_map_test(); break; case SHARE_TEST: ion_share_test(); break; default: printf("must specify a test (alloc, map, share)\n"); } return 0; }