static int __init patch_init(void) { struct kpatch_patch *patches; int i, ret; patches = (struct kpatch_patch *)&__kpatch_patches; kpmod.mod = THIS_MODULE; kpmod.num_funcs = (&__kpatch_patches_end - &__kpatch_patches) / sizeof(*patches); kpmod.funcs = kmalloc(kpmod.num_funcs * sizeof(struct kpatch_func), GFP_KERNEL); if (!kpmod.funcs) return -ENOMEM; for (i = 0; i < kpmod.num_funcs; i++) { kpmod.funcs[i].old_addr = patches[i].old_addr; kpmod.funcs[i].old_size = patches[i].old_size; kpmod.funcs[i].new_addr = patches[i].new_addr; kpmod.funcs[i].new_size = patches[i].new_size; } ret = kpatch_register(&kpmod); if (ret) goto err_free; return 0; err_free: kfree(kpmod.funcs); return ret; }
static int __init patch_init(void) { struct kpatch_patch *patches; int i; patches = (struct kpatch_patch *)&__kpatch_patches; num_funcs = (&__kpatch_patches_end - &__kpatch_patches) / sizeof(*patches); funcs = kmalloc(num_funcs * sizeof(*funcs), GFP_KERNEL); if (!funcs) return -ENOMEM; for (i = 0; i < num_funcs; i++) { funcs[i].old_addr = patches[i].old_addr; funcs[i].old_size = patches[i].old_size; funcs[i].new_addr = patches[i].new_addr; } return kpatch_register(THIS_MODULE, funcs, num_funcs); }