Lines Matching refs:area

1443 static int xol_add_vma(struct mm_struct *mm, struct xol_area *area)  in xol_add_vma()  argument
1456 if (!area->vaddr) { in xol_add_vma()
1458 area->vaddr = get_unmapped_area(NULL, TASK_SIZE - PAGE_SIZE, in xol_add_vma()
1460 if (area->vaddr & ~PAGE_MASK) { in xol_add_vma()
1461 ret = area->vaddr; in xol_add_vma()
1466 vma = _install_special_mapping(mm, area->vaddr, PAGE_SIZE, in xol_add_vma()
1468 &area->xol_mapping); in xol_add_vma()
1476 smp_store_release(&mm->uprobes_state.xol_area, area); /* ^^^ */ in xol_add_vma()
1487 struct xol_area *area; in __create_xol_area() local
1489 area = kmalloc(sizeof(*area), GFP_KERNEL); in __create_xol_area()
1490 if (unlikely(!area)) in __create_xol_area()
1493 area->bitmap = kcalloc(BITS_TO_LONGS(UINSNS_PER_PAGE), sizeof(long), in __create_xol_area()
1495 if (!area->bitmap) in __create_xol_area()
1498 area->xol_mapping.name = "[uprobes]"; in __create_xol_area()
1499 area->xol_mapping.fault = NULL; in __create_xol_area()
1500 area->xol_mapping.pages = area->pages; in __create_xol_area()
1501 area->pages[0] = alloc_page(GFP_HIGHUSER); in __create_xol_area()
1502 if (!area->pages[0]) in __create_xol_area()
1504 area->pages[1] = NULL; in __create_xol_area()
1506 area->vaddr = vaddr; in __create_xol_area()
1507 init_waitqueue_head(&area->wq); in __create_xol_area()
1509 set_bit(0, area->bitmap); in __create_xol_area()
1510 atomic_set(&area->slot_count, 1); in __create_xol_area()
1511 arch_uprobe_copy_ixol(area->pages[0], 0, &insn, UPROBE_SWBP_INSN_SIZE); in __create_xol_area()
1513 if (!xol_add_vma(mm, area)) in __create_xol_area()
1514 return area; in __create_xol_area()
1516 __free_page(area->pages[0]); in __create_xol_area()
1518 kfree(area->bitmap); in __create_xol_area()
1520 kfree(area); in __create_xol_area()
1534 struct xol_area *area; in get_xol_area() local
1540 area = READ_ONCE(mm->uprobes_state.xol_area); /* ^^^ */ in get_xol_area()
1541 return area; in get_xol_area()
1549 struct xol_area *area = mm->uprobes_state.xol_area; in uprobe_clear_state() local
1555 if (!area) in uprobe_clear_state()
1558 put_page(area->pages[0]); in uprobe_clear_state()
1559 kfree(area->bitmap); in uprobe_clear_state()
1560 kfree(area); in uprobe_clear_state()
1585 static unsigned long xol_take_insn_slot(struct xol_area *area) in xol_take_insn_slot() argument
1591 slot_nr = find_first_zero_bit(area->bitmap, UINSNS_PER_PAGE); in xol_take_insn_slot()
1593 if (!test_and_set_bit(slot_nr, area->bitmap)) in xol_take_insn_slot()
1599 wait_event(area->wq, (atomic_read(&area->slot_count) < UINSNS_PER_PAGE)); in xol_take_insn_slot()
1602 slot_addr = area->vaddr + (slot_nr * UPROBE_XOL_SLOT_BYTES); in xol_take_insn_slot()
1603 atomic_inc(&area->slot_count); in xol_take_insn_slot()
1614 struct xol_area *area; in xol_get_insn_slot() local
1617 area = get_xol_area(); in xol_get_insn_slot()
1618 if (!area) in xol_get_insn_slot()
1621 xol_vaddr = xol_take_insn_slot(area); in xol_get_insn_slot()
1625 arch_uprobe_copy_ixol(area->pages[0], xol_vaddr, in xol_get_insn_slot()
1638 struct xol_area *area; in xol_free_insn_slot() local
1649 area = tsk->mm->uprobes_state.xol_area; in xol_free_insn_slot()
1650 vma_end = area->vaddr + PAGE_SIZE; in xol_free_insn_slot()
1651 if (area->vaddr <= slot_addr && slot_addr < vma_end) { in xol_free_insn_slot()
1655 offset = slot_addr - area->vaddr; in xol_free_insn_slot()
1660 clear_bit(slot_nr, area->bitmap); in xol_free_insn_slot()
1661 atomic_dec(&area->slot_count); in xol_free_insn_slot()
1663 if (waitqueue_active(&area->wq)) in xol_free_insn_slot()
1664 wake_up(&area->wq); in xol_free_insn_slot()
1804 struct xol_area *area; in uprobe_copy_process() local
1818 area = mm->uprobes_state.xol_area; in uprobe_copy_process()
1819 if (!area) in uprobe_copy_process()
1825 t->utask->dup_xol_addr = area->vaddr; in uprobe_copy_process()
1838 struct xol_area *area; in get_trampoline_vaddr() local
1842 area = READ_ONCE(current->mm->uprobes_state.xol_area); /* ^^^ */ in get_trampoline_vaddr()
1843 if (area) in get_trampoline_vaddr()
1844 trampoline_vaddr = area->vaddr; in get_trampoline_vaddr()