Lines Matching refs:area

1127 static int xol_add_vma(struct mm_struct *mm, struct xol_area *area)  in xol_add_vma()  argument
1138 if (!area->vaddr) { in xol_add_vma()
1140 area->vaddr = get_unmapped_area(NULL, TASK_SIZE - PAGE_SIZE, in xol_add_vma()
1142 if (area->vaddr & ~PAGE_MASK) { in xol_add_vma()
1143 ret = area->vaddr; in xol_add_vma()
1148 vma = _install_special_mapping(mm, area->vaddr, PAGE_SIZE, in xol_add_vma()
1150 &area->xol_mapping); in xol_add_vma()
1158 mm->uprobes_state.xol_area = area; in xol_add_vma()
1169 struct xol_area *area; in __create_xol_area() local
1171 area = kmalloc(sizeof(*area), GFP_KERNEL); in __create_xol_area()
1172 if (unlikely(!area)) in __create_xol_area()
1175 area->bitmap = kzalloc(BITS_TO_LONGS(UINSNS_PER_PAGE) * sizeof(long), GFP_KERNEL); in __create_xol_area()
1176 if (!area->bitmap) in __create_xol_area()
1179 area->xol_mapping.name = "[uprobes]"; in __create_xol_area()
1180 area->xol_mapping.pages = area->pages; in __create_xol_area()
1181 area->pages[0] = alloc_page(GFP_HIGHUSER); in __create_xol_area()
1182 if (!area->pages[0]) in __create_xol_area()
1184 area->pages[1] = NULL; in __create_xol_area()
1186 area->vaddr = vaddr; in __create_xol_area()
1187 init_waitqueue_head(&area->wq); in __create_xol_area()
1189 set_bit(0, area->bitmap); in __create_xol_area()
1190 atomic_set(&area->slot_count, 1); in __create_xol_area()
1191 copy_to_page(area->pages[0], 0, &insn, UPROBE_SWBP_INSN_SIZE); in __create_xol_area()
1193 if (!xol_add_vma(mm, area)) in __create_xol_area()
1194 return area; in __create_xol_area()
1196 __free_page(area->pages[0]); in __create_xol_area()
1198 kfree(area->bitmap); in __create_xol_area()
1200 kfree(area); in __create_xol_area()
1214 struct xol_area *area; in get_xol_area() local
1219 area = mm->uprobes_state.xol_area; in get_xol_area()
1221 return area; in get_xol_area()
1229 struct xol_area *area = mm->uprobes_state.xol_area; in uprobe_clear_state() local
1231 if (!area) in uprobe_clear_state()
1234 put_page(area->pages[0]); in uprobe_clear_state()
1235 kfree(area->bitmap); in uprobe_clear_state()
1236 kfree(area); in uprobe_clear_state()
1263 static unsigned long xol_take_insn_slot(struct xol_area *area) in xol_take_insn_slot() argument
1269 slot_nr = find_first_zero_bit(area->bitmap, UINSNS_PER_PAGE); in xol_take_insn_slot()
1271 if (!test_and_set_bit(slot_nr, area->bitmap)) in xol_take_insn_slot()
1277 wait_event(area->wq, (atomic_read(&area->slot_count) < UINSNS_PER_PAGE)); in xol_take_insn_slot()
1280 slot_addr = area->vaddr + (slot_nr * UPROBE_XOL_SLOT_BYTES); in xol_take_insn_slot()
1281 atomic_inc(&area->slot_count); in xol_take_insn_slot()
1292 struct xol_area *area; in xol_get_insn_slot() local
1295 area = get_xol_area(); in xol_get_insn_slot()
1296 if (!area) in xol_get_insn_slot()
1299 xol_vaddr = xol_take_insn_slot(area); in xol_get_insn_slot()
1303 arch_uprobe_copy_ixol(area->pages[0], xol_vaddr, in xol_get_insn_slot()
1316 struct xol_area *area; in xol_free_insn_slot() local
1327 area = tsk->mm->uprobes_state.xol_area; in xol_free_insn_slot()
1328 vma_end = area->vaddr + PAGE_SIZE; in xol_free_insn_slot()
1329 if (area->vaddr <= slot_addr && slot_addr < vma_end) { in xol_free_insn_slot()
1333 offset = slot_addr - area->vaddr; in xol_free_insn_slot()
1338 clear_bit(slot_nr, area->bitmap); in xol_free_insn_slot()
1339 atomic_dec(&area->slot_count); in xol_free_insn_slot()
1341 if (waitqueue_active(&area->wq)) in xol_free_insn_slot()
1342 wake_up(&area->wq); in xol_free_insn_slot()
1481 struct xol_area *area; in uprobe_copy_process() local
1495 area = mm->uprobes_state.xol_area; in uprobe_copy_process()
1496 if (!area) in uprobe_copy_process()
1502 t->utask->dup_xol_addr = area->vaddr; in uprobe_copy_process()
1515 struct xol_area *area; in get_trampoline_vaddr() local
1518 area = current->mm->uprobes_state.xol_area; in get_trampoline_vaddr()
1520 if (area) in get_trampoline_vaddr()
1521 trampoline_vaddr = area->vaddr; in get_trampoline_vaddr()