Lines Matching refs:area
1141 static int xol_add_vma(struct mm_struct *mm, struct xol_area *area) in xol_add_vma() argument
1154 if (!area->vaddr) { in xol_add_vma()
1156 area->vaddr = get_unmapped_area(NULL, TASK_SIZE - PAGE_SIZE, in xol_add_vma()
1158 if (area->vaddr & ~PAGE_MASK) { in xol_add_vma()
1159 ret = area->vaddr; in xol_add_vma()
1164 vma = _install_special_mapping(mm, area->vaddr, PAGE_SIZE, in xol_add_vma()
1166 &area->xol_mapping); in xol_add_vma()
1174 smp_store_release(&mm->uprobes_state.xol_area, area); /* ^^^ */ in xol_add_vma()
1185 struct xol_area *area; in __create_xol_area() local
1187 area = kmalloc(sizeof(*area), GFP_KERNEL); in __create_xol_area()
1188 if (unlikely(!area)) in __create_xol_area()
1191 area->bitmap = kcalloc(BITS_TO_LONGS(UINSNS_PER_PAGE), sizeof(long), in __create_xol_area()
1193 if (!area->bitmap) in __create_xol_area()
1196 area->xol_mapping.name = "[uprobes]"; in __create_xol_area()
1197 area->xol_mapping.fault = NULL; in __create_xol_area()
1198 area->xol_mapping.pages = area->pages; in __create_xol_area()
1199 area->pages[0] = alloc_page(GFP_HIGHUSER); in __create_xol_area()
1200 if (!area->pages[0]) in __create_xol_area()
1202 area->pages[1] = NULL; in __create_xol_area()
1204 area->vaddr = vaddr; in __create_xol_area()
1205 init_waitqueue_head(&area->wq); in __create_xol_area()
1207 set_bit(0, area->bitmap); in __create_xol_area()
1208 atomic_set(&area->slot_count, 1); in __create_xol_area()
1209 arch_uprobe_copy_ixol(area->pages[0], 0, &insn, UPROBE_SWBP_INSN_SIZE); in __create_xol_area()
1211 if (!xol_add_vma(mm, area)) in __create_xol_area()
1212 return area; in __create_xol_area()
1214 __free_page(area->pages[0]); in __create_xol_area()
1216 kfree(area->bitmap); in __create_xol_area()
1218 kfree(area); in __create_xol_area()
1232 struct xol_area *area; in get_xol_area() local
1238 area = READ_ONCE(mm->uprobes_state.xol_area); /* ^^^ */ in get_xol_area()
1239 return area; in get_xol_area()
1247 struct xol_area *area = mm->uprobes_state.xol_area; in uprobe_clear_state() local
1249 if (!area) in uprobe_clear_state()
1252 put_page(area->pages[0]); in uprobe_clear_state()
1253 kfree(area->bitmap); in uprobe_clear_state()
1254 kfree(area); in uprobe_clear_state()
1279 static unsigned long xol_take_insn_slot(struct xol_area *area) in xol_take_insn_slot() argument
1285 slot_nr = find_first_zero_bit(area->bitmap, UINSNS_PER_PAGE); in xol_take_insn_slot()
1287 if (!test_and_set_bit(slot_nr, area->bitmap)) in xol_take_insn_slot()
1293 wait_event(area->wq, (atomic_read(&area->slot_count) < UINSNS_PER_PAGE)); in xol_take_insn_slot()
1296 slot_addr = area->vaddr + (slot_nr * UPROBE_XOL_SLOT_BYTES); in xol_take_insn_slot()
1297 atomic_inc(&area->slot_count); in xol_take_insn_slot()
1308 struct xol_area *area; in xol_get_insn_slot() local
1311 area = get_xol_area(); in xol_get_insn_slot()
1312 if (!area) in xol_get_insn_slot()
1315 xol_vaddr = xol_take_insn_slot(area); in xol_get_insn_slot()
1319 arch_uprobe_copy_ixol(area->pages[0], xol_vaddr, in xol_get_insn_slot()
1332 struct xol_area *area; in xol_free_insn_slot() local
1343 area = tsk->mm->uprobes_state.xol_area; in xol_free_insn_slot()
1344 vma_end = area->vaddr + PAGE_SIZE; in xol_free_insn_slot()
1345 if (area->vaddr <= slot_addr && slot_addr < vma_end) { in xol_free_insn_slot()
1349 offset = slot_addr - area->vaddr; in xol_free_insn_slot()
1354 clear_bit(slot_nr, area->bitmap); in xol_free_insn_slot()
1355 atomic_dec(&area->slot_count); in xol_free_insn_slot()
1357 if (waitqueue_active(&area->wq)) in xol_free_insn_slot()
1358 wake_up(&area->wq); in xol_free_insn_slot()
1498 struct xol_area *area; in uprobe_copy_process() local
1512 area = mm->uprobes_state.xol_area; in uprobe_copy_process()
1513 if (!area) in uprobe_copy_process()
1519 t->utask->dup_xol_addr = area->vaddr; in uprobe_copy_process()
1532 struct xol_area *area; in get_trampoline_vaddr() local
1536 area = READ_ONCE(current->mm->uprobes_state.xol_area); /* ^^^ */ in get_trampoline_vaddr()
1537 if (area) in get_trampoline_vaddr()
1538 trampoline_vaddr = area->vaddr; in get_trampoline_vaddr()