static GF_Proto_Node *parse_file(const char *file) { int len, msglen; GF_Proto_Node *msg = 0; const char *fstr = get_str_from_file(file, &len); const char *curr, *next = fstr; while (curr = get_next_msgdef_str(next, len, &next)) { msglen = next - curr; msg = parse_msgdef_from_str(curr, msglen); if (msg) { _msg_defs._len++; realloc_str(&_msg_defs._nodes, _msg_defs._len * sizeof(GF_Proto_Node*)); _msg_defs._nodes[_msg_defs._len - 1] = msg; } } GFPFree(fstr); return 0; }
int main(int argc, char *argv[]) { int op; int rc; char buf[BUFSIZ]; uint32_t count = 0; uint32_t i, threads = 0; uint32_t ring_size, queue_depth = 0; uint32_t transfer_size, order = 0; uint64_t total_size, copied = 0; uint64_t elapsed_time = 0; uint64_t total_time = 0; uint64_t perf, total_copied = 0; char channel[1024]; if (check_modules("ioatdma")) { fprintf(stderr, "Ioat driver not loaded," " run `modprobe -v ioatdma` first\n"); return -1; } if (check_modules("dmaperf")) { fprintf(stderr, "Kernel Ioat test driver not loaded," " run `insmod dmaperf.ko` in the kmod directory\n"); return -1; } count = get_dma_channel_count(); if (!count) { fprintf(stderr, "No DMA channel found\n"); return -1; } ring_size = 1UL << 16; while ((op = getopt(argc, argv, "hn:q:s:t:")) != -1) { switch (op) { case 'n': threads = atoi(optarg); if (threads > count) { fprintf(stderr, "Error: Total channel count %u\n", count); return -1; } rc = put_u32_to_file("/sys/kernel/debug/dmaperf/dmaperf/threads", threads); if (rc < 0) { fprintf(stderr, "Cannot set dma channels\n"); return -1; } break; case 'q': queue_depth = atoi(optarg); if (queue_depth > ring_size) { fprintf(stderr, "Max Ioat DMA ring size %d\n", ring_size); return -1; } rc = put_u32_to_file("/sys/kernel/debug/dmaperf/dmaperf/queue_depth", queue_depth); if (rc < 0) { fprintf(stderr, "Cannot set queue depth\n"); return -1; } break; case 's': order = atoi(optarg); rc = put_u32_to_file("/sys/kernel/debug/dmaperf/dmaperf/transfer_size_order", order); if (rc < 0) { fprintf(stderr, "Cannot set descriptor transfer size order\n"); return -1; } break; case 't': order = atoi(optarg); rc = put_u32_to_file("/sys/kernel/debug/dmaperf/dmaperf/total_size_order", order); if (rc < 0) { fprintf(stderr, "Cannot set channel total transfer size order\n"); return -1; } break; case 'h' : usage(argv[0]); exit(0); default: usage(argv[0]); exit(1); } } /* get driver configuration */ rc = get_u32_from_file("/sys/kernel/debug/dmaperf/dmaperf/transfer_size_order", &order); if (rc < 0) { fprintf(stderr, "Cannot get channel descriptor transfer size\n"); return -1; } transfer_size = 1UL << order; rc = get_u32_from_file("/sys/kernel/debug/dmaperf/dmaperf/total_size_order", &order); if (rc < 0) { fprintf(stderr, "Cannot get channel total transfer size\n"); return -1; } total_size = 1ULL << order; rc = get_u32_from_file("/sys/kernel/debug/dmaperf/dmaperf/threads", &threads); if (rc < 0) { fprintf(stderr, "Cannot get dma channel threads\n"); return -1; } rc = get_u32_from_file("/sys/kernel/debug/dmaperf/dmaperf/queue_depth", &queue_depth); if (rc < 0) { fprintf(stderr, "Cannot get queue depth\n"); return -1; } fprintf(stdout, "Total %d Channels, Queue_Depth %d, Transfer Size %d Bytes, Total Transfer Size %"PRIu64" GB\n", threads, queue_depth, transfer_size, total_size >> 30ULL); /* run the channels */ rc = put_u32_to_file("/sys/kernel/debug/dmaperf/dmaperf/run", 1); if (rc < 0) { fprintf(stderr, "Cannot run the channels\n"); return -1; } fprintf(stdout, "Running I/O "); fflush(stdout); memset(buf, 0, BUFSIZ); /* wait all the channels to be idle */ do { fprintf(stdout, ". "); fflush(stdout); sleep(1); if (strstr(buf, "idle") != NULL) { fprintf(stdout, "\n"); fflush(stdout); sleep(1); break; } } while (!get_str_from_file("/sys/kernel/debug/dmaperf/dmaperf/status", buf, BUFSIZ)); /* collect each channel performance data */ for (i = 0; i < threads; i++) { /* total data transfer length for the DMA channel in Bytes */ sprintf(channel, "/sys/kernel/debug/dmaperf/dmaperf/thread_%u/copied", i); rc = get_u64_from_file(channel, &copied); if (rc < 0) { fprintf(stderr, "Cannot get channel copied data\n"); return -1; } /* time in microseconds for total data transfer length */ sprintf(channel, "/sys/kernel/debug/dmaperf/dmaperf/thread_%u/elapsed_time", i); /* elapsed_time is in microsecond */ rc = get_u64_from_file(channel, &elapsed_time); if (rc < 0) { fprintf(stderr, "Cannot get channel elapsed time\n"); return -1; } assert(elapsed_time != 0); perf = (copied * 1000 * 1000) / (elapsed_time * 1024 * 1024); total_copied += copied; total_time = ioat_max(elapsed_time, total_time); fprintf(stdout, "Channel %d Bandwidth %"PRIu64" MiB/s\n", i, perf); } if (total_time && threads) { fprintf(stdout, "Total Channel Bandwidth: %"PRIu64" MiB/s\n", total_copied / total_time); fprintf(stdout, "Average Bandwidth Per Channel: %"PRIu64" MiB/s\n", (total_copied * 1000 * 1000) / (total_time * threads * 1024 * 1024)); } return 0; }