Esempio n. 1
0
int __init
pool_benchmark(void)
{
	long i, j, t0, t1;
	ngx_pool_t *np;
	TfwPool *tp;

	printk(KERN_ERR "object sizes: Small - %lu, Big - %lu Huge - %lu\n",
	       sizeof(Small), sizeof(Big), sizeof(Huge));

	t0 = jiffies;
	for (i = 0; i < N_ALLOC; ++i) {
		p_arr[i] = (void *)__get_free_pages(GFP_KERNEL, 0);
		touch_obj(p_arr[i]);
	}
	for (i = 0; i < N_ALLOC; ++i)
		free_pages((unsigned long)p_arr[i], 0);
	t1 = jiffies;
	printk(KERN_ERR "alloc & free:  %ldms\n", t1 - t0);

	/*****************************************************************/
	np = ngx_create_pool(PAGE_SIZE);
	BUG_ON(!np);
	t0 = jiffies;
	for (i = 0; i < N; ++i) {
		Small *o = (Small *)ngx_palloc(np, sizeof(Small));
		touch_obj(o);
	}
	t1 = jiffies;
	ngx_destroy_pool(np);
	/* HZ = 1000 for my kernel. */
	printk(KERN_ERR "ngx_pool (Small):  %ldms\n", t1 - t0);

	np = ngx_create_pool(PAGE_SIZE);
	BUG_ON(!np);
	t0 = jiffies;
	for (i = 0; i < N * sizeof(Small) / sizeof(Big); ++i) {
		Big *o = (Big *)ngx_palloc(np, sizeof(Big));
		touch_obj(o);
	}
	t1 = jiffies;
	ngx_destroy_pool(np);
	printk(KERN_ERR "ngx_pool (Big):  %ldms\n", t1 - t0);

	np = ngx_create_pool(PAGE_SIZE);
	BUG_ON(!np);
	t0 = jiffies;
	for (i = 0; i < N; ++i) {
		if (unlikely(!(i & 0xfff))) {
			Huge *o = (Huge *)ngx_palloc(np, sizeof(*o));
			touch_obj(o);
			if (!(i & 1))
				ngx_pfree(np, o);
		}
		else if (unlikely(!(i & 3))) {
			Big *o = (Big *)ngx_palloc(np, sizeof(*o));
			touch_obj(o);
		}
		else {
			Small *o = (Small *)ngx_palloc(np, sizeof(*o));
			touch_obj(o);
		}
	}
	t1 = jiffies;
	ngx_destroy_pool(np);
	printk(KERN_ERR "ngx_pool w/ free (Mix):  %ldms\n", t1 - t0);

	t0 = jiffies;
	for (i = 0; i < N / 100; ++i) {
		np = ngx_create_pool(PAGE_SIZE);
		for (j = 0; j < 100; ++j) {
			if (unlikely(!(i & 3))) {
				Big *o = (Big *)ngx_palloc(np, sizeof(*o));
				touch_obj(o);
			} else {
				Small *o;
				o = (Small *)ngx_palloc(np, sizeof(*o));
				touch_obj(o);
			}
		}
		ngx_destroy_pool(np);
	}
	t1 = jiffies;
	printk(KERN_ERR "ngx_pool cr. & destr.:  %ldms\n", t1 - t0);

	/*****************************************************************/
	tp = __tfw_pool_new(0);
	BUG_ON(!tp);
	t0 = jiffies;
	for (i = 0; i < N; ++i) {
		Small *o = (Small *)tfw_pool_alloc(tp, sizeof(Small));
		touch_obj(o);
	}
	t1 = jiffies;
	tfw_pool_destroy(tp);
	printk(KERN_ERR "tfw_pool (Small):  %ldms\n", t1 - t0);

	tp = __tfw_pool_new(0);
	BUG_ON(!tp);
	t0 = jiffies;
	for (i = 0; i < N; ++i) {
		Small *o = (Small *)tfw_pool_alloc(tp, sizeof(Small));
		touch_obj(o);
		if (unlikely(!(i & 3)))
			tfw_pool_free(tp, o, sizeof(Small));
	}
	t1 = jiffies;
	tfw_pool_destroy(tp);
	printk(KERN_ERR "tfw_pool w/ free (Small):  %ldms\n", t1 - t0);

	tp = __tfw_pool_new(0);
	BUG_ON(!tp);
	t0 = jiffies;
	for (i = 0; i < N * sizeof(Small) / sizeof(Big); ++i) {
		Big *o = (Big *)tfw_pool_alloc(tp, sizeof(Big));
		touch_obj(o);
	}
	t1 = jiffies;
	tfw_pool_destroy(tp);
	printk(KERN_ERR "tfw_pool (Big):  %ldms\n", t1 - t0);

	tp = __tfw_pool_new(0);
	BUG_ON(!tp);
	t0 = jiffies;
	for (i = 0; i < N * sizeof(Small) / sizeof(Big); ++i) {
		Big *o = (Big *)tfw_pool_alloc(tp, sizeof(Big));
		touch_obj(o);
		if (unlikely(!(i & 3)))
			tfw_pool_free(tp, o, sizeof(Big));
	}
	t1 = jiffies;
	tfw_pool_destroy(tp);
	printk(KERN_ERR "tfw_pool w/ free (Big):  %ldms\n", t1 - t0);

	tp = __tfw_pool_new(0);
	BUG_ON(!tp);
	t0 = jiffies;
	for (i = 0; i < N; ++i) {
		if (unlikely(!(i & 0xfff))) {
			Huge *o = (Huge *)tfw_pool_alloc(tp, sizeof(*o));
			touch_obj(o);
			if (!(i & 1))
				tfw_pool_free(tp, o, sizeof(*o));
		}
		else if (unlikely(!(i & 3))) {
			Big *o = (Big *)tfw_pool_alloc(tp, sizeof(*o));
			touch_obj(o);
			if (!(i & 1))
				tfw_pool_free(tp, o, sizeof(*o));
		}
		else {
			Small *o = (Small *)tfw_pool_alloc(tp, sizeof(*o));
			touch_obj(o);
		}
	}
	t1 = jiffies;
	tfw_pool_destroy(tp);
	printk(KERN_ERR "tfw_pool w/ free (Mix):  %ldms\n", t1 - t0);

	t0 = jiffies;
	for (i = 0; i < N / 100; ++i) {
		tp = __tfw_pool_new(0);
		for (j = 0; j < 100; ++j) {
			if (unlikely(!(i & 3))) {
				Big *o = (Big *)tfw_pool_alloc(tp, sizeof(*o));
				touch_obj(o);
			} else {
				Small *o;
				o = (Small *)tfw_pool_alloc(tp, sizeof(*o));
				touch_obj(o);
			}
		}
		tfw_pool_destroy(tp);
	}
	t1 = jiffies;
	printk(KERN_ERR "tfw_pool cr. & destr.:  %ldms\n", t1 - t0);

	return 0;
}
Esempio n. 2
0
void
free_all_str(void)
{
	tfw_pool_destroy(str_pool);
	str_pool = NULL;
}