• Home
  • Raw
  • Download

Lines Matching refs:area

1440 static int xol_add_vma(struct mm_struct *mm, struct xol_area *area)  in xol_add_vma()  argument
1453 if (!area->vaddr) { in xol_add_vma()
1455 area->vaddr = get_unmapped_area(NULL, TASK_SIZE - PAGE_SIZE, in xol_add_vma()
1457 if (IS_ERR_VALUE(area->vaddr)) { in xol_add_vma()
1458 ret = area->vaddr; in xol_add_vma()
1463 vma = _install_special_mapping(mm, area->vaddr, PAGE_SIZE, in xol_add_vma()
1465 &area->xol_mapping); in xol_add_vma()
1473 smp_store_release(&mm->uprobes_state.xol_area, area); /* ^^^ */ in xol_add_vma()
1484 struct xol_area *area; in __create_xol_area() local
1486 area = kmalloc(sizeof(*area), GFP_KERNEL); in __create_xol_area()
1487 if (unlikely(!area)) in __create_xol_area()
1490 area->bitmap = kcalloc(BITS_TO_LONGS(UINSNS_PER_PAGE), sizeof(long), in __create_xol_area()
1492 if (!area->bitmap) in __create_xol_area()
1495 area->xol_mapping.name = "[uprobes]"; in __create_xol_area()
1496 area->xol_mapping.fault = NULL; in __create_xol_area()
1497 area->xol_mapping.pages = area->pages; in __create_xol_area()
1498 area->pages[0] = alloc_page(GFP_HIGHUSER); in __create_xol_area()
1499 if (!area->pages[0]) in __create_xol_area()
1501 area->pages[1] = NULL; in __create_xol_area()
1503 area->vaddr = vaddr; in __create_xol_area()
1504 init_waitqueue_head(&area->wq); in __create_xol_area()
1506 set_bit(0, area->bitmap); in __create_xol_area()
1507 atomic_set(&area->slot_count, 1); in __create_xol_area()
1508 arch_uprobe_copy_ixol(area->pages[0], 0, &insn, UPROBE_SWBP_INSN_SIZE); in __create_xol_area()
1510 if (!xol_add_vma(mm, area)) in __create_xol_area()
1511 return area; in __create_xol_area()
1513 __free_page(area->pages[0]); in __create_xol_area()
1515 kfree(area->bitmap); in __create_xol_area()
1517 kfree(area); in __create_xol_area()
1531 struct xol_area *area; in get_xol_area() local
1537 area = READ_ONCE(mm->uprobes_state.xol_area); /* ^^^ */ in get_xol_area()
1538 return area; in get_xol_area()
1546 struct xol_area *area = mm->uprobes_state.xol_area; in uprobe_clear_state() local
1552 if (!area) in uprobe_clear_state()
1555 put_page(area->pages[0]); in uprobe_clear_state()
1556 kfree(area->bitmap); in uprobe_clear_state()
1557 kfree(area); in uprobe_clear_state()
1582 static unsigned long xol_take_insn_slot(struct xol_area *area) in xol_take_insn_slot() argument
1588 slot_nr = find_first_zero_bit(area->bitmap, UINSNS_PER_PAGE); in xol_take_insn_slot()
1590 if (!test_and_set_bit(slot_nr, area->bitmap)) in xol_take_insn_slot()
1596 wait_event(area->wq, (atomic_read(&area->slot_count) < UINSNS_PER_PAGE)); in xol_take_insn_slot()
1599 slot_addr = area->vaddr + (slot_nr * UPROBE_XOL_SLOT_BYTES); in xol_take_insn_slot()
1600 atomic_inc(&area->slot_count); in xol_take_insn_slot()
1611 struct xol_area *area; in xol_get_insn_slot() local
1614 area = get_xol_area(); in xol_get_insn_slot()
1615 if (!area) in xol_get_insn_slot()
1618 xol_vaddr = xol_take_insn_slot(area); in xol_get_insn_slot()
1622 arch_uprobe_copy_ixol(area->pages[0], xol_vaddr, in xol_get_insn_slot()
1635 struct xol_area *area; in xol_free_insn_slot() local
1646 area = tsk->mm->uprobes_state.xol_area; in xol_free_insn_slot()
1647 vma_end = area->vaddr + PAGE_SIZE; in xol_free_insn_slot()
1648 if (area->vaddr <= slot_addr && slot_addr < vma_end) { in xol_free_insn_slot()
1652 offset = slot_addr - area->vaddr; in xol_free_insn_slot()
1657 clear_bit(slot_nr, area->bitmap); in xol_free_insn_slot()
1658 atomic_dec(&area->slot_count); in xol_free_insn_slot()
1660 if (waitqueue_active(&area->wq)) in xol_free_insn_slot()
1661 wake_up(&area->wq); in xol_free_insn_slot()
1801 struct xol_area *area; in uprobe_copy_process() local
1815 area = mm->uprobes_state.xol_area; in uprobe_copy_process()
1816 if (!area) in uprobe_copy_process()
1822 t->utask->dup_xol_addr = area->vaddr; in uprobe_copy_process()
1835 struct xol_area *area; in get_trampoline_vaddr() local
1839 area = READ_ONCE(current->mm->uprobes_state.xol_area); /* ^^^ */ in get_trampoline_vaddr()
1840 if (area) in get_trampoline_vaddr()
1841 trampoline_vaddr = area->vaddr; in get_trampoline_vaddr()