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; }
void kp_free(ktap_state *ks, void *addr) { preempt_disable(); KTAP_STATS(ks)->nr_mem_free += 1; preempt_enable(); kfree(addr); }
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; }
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; }