예제 #1
0
파일: gfproto.c 프로젝트: cokeboL/gf_proto
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;
}
예제 #2
0
파일: ioat_kperf.c 프로젝트: chennqqi/spdk
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;
}