Ejemplo n.º 1
0
void *kp_reallocv(ktap_state *ks, void *addr, int oldsize, int newsize)
{
	void *new_addr;

	new_addr = krealloc(addr, newsize, KTAP_ALLOC_FLAGS);
	if (unlikely(!new_addr)) {
		kp_error(ks, "krealloc size %d failed, retry again\n", newsize);
		printk("ktap krealloc size %d failed, retry again\n", newsize);
		dump_stack();
		while (1) {
			new_addr = krealloc(addr, newsize, KTAP_ALLOC_FLAGS);
			if (new_addr)
				break;
		}
		kp_printf(ks, "krealloc retry success after failed, exit\n");
	}

	preempt_disable();
	if (oldsize == 0) {
		KTAP_STATS(ks)->nr_mem_allocate += 1;
	}
	KTAP_STATS(ks)->mem_allocated += newsize - oldsize;
	preempt_enable();

	return new_addr;
}
Ejemplo n.º 2
0
void kp_free(ktap_state *ks, void *addr)
{
	preempt_disable();
	KTAP_STATS(ks)->nr_mem_free += 1;
	preempt_enable();

	kfree(addr);
}
Ejemplo n.º 3
0
void *kp_malloc(ktap_state *ks, int size)
{
	void *addr;

	/*
	 * Normally we don't want to trace under memory pressure,
	 * so we use a simple rule to handle memory allocation failure:
	 *
	 * retry until allocation success, this will make caller don't need
	 * to handle the unlikely failure case, then ktap exit.
	 *
	 * In this approach, if user find there have memory allocation failure,
	 * user should re-run the ktap script, or fix the memory pressure
	 * issue, or figure out why the script need so many memory.
	 *
	 * Perhaps return pre-allocated stub memory trunk when allocate failed
	 * is a better approch?
	 */
	addr = kmalloc(size, KTAP_ALLOC_FLAGS);
	if (unlikely(!addr)) {
		kp_error(ks, "kmalloc size %d failed, retry again\n", size);
		printk("ktap kmalloc size %d failed, retry again\n", size);
		dump_stack();
		while (1) {
			addr = kmalloc(size, KTAP_ALLOC_FLAGS);
			if (addr)
				break;
		}
		kp_printf(ks, "kmalloc retry success after failed, exit\n");
	}

	preempt_disable();
	KTAP_STATS(ks)->nr_mem_allocate += 1;
	KTAP_STATS(ks)->mem_allocated += size;
	preempt_enable();

	return addr;
}
Ejemplo n.º 4
0
void *kp_zalloc(ktap_state *ks, int size)
{
	void *addr;

	addr = kzalloc(size, KTAP_ALLOC_FLAGS);
	if (unlikely(!addr)) {
		kp_error(ks, "kzalloc size %d failed, retry again\n", size);
		printk("ktap kzalloc size %d failed, retry again\n", size);
		dump_stack();
		while (1) {
			addr = kzalloc(size, KTAP_ALLOC_FLAGS);
			if (addr)
				break;
		}
		kp_printf(ks, "kzalloc retry success after failed, exit\n");
	}

	preempt_disable();
	KTAP_STATS(ks)->nr_mem_allocate += 1;
	KTAP_STATS(ks)->mem_allocated += size;
	preempt_enable();

	return addr;
}