• Home
  • Raw
  • Download

Lines Matching refs:area

1441 static int xol_add_vma(struct mm_struct *mm, struct xol_area *area)  in xol_add_vma()  argument
1454 if (!area->vaddr) { in xol_add_vma()
1456 area->vaddr = get_unmapped_area(NULL, TASK_SIZE - PAGE_SIZE, in xol_add_vma()
1458 if (IS_ERR_VALUE(area->vaddr)) { in xol_add_vma()
1459 ret = area->vaddr; in xol_add_vma()
1464 vma = _install_special_mapping(mm, area->vaddr, PAGE_SIZE, in xol_add_vma()
1466 &area->xol_mapping); in xol_add_vma()
1474 smp_store_release(&mm->uprobes_state.xol_area, area); /* ^^^ */ in xol_add_vma()
1485 struct xol_area *area; in __create_xol_area() local
1487 area = kmalloc(sizeof(*area), GFP_KERNEL); in __create_xol_area()
1488 if (unlikely(!area)) in __create_xol_area()
1491 area->bitmap = kcalloc(BITS_TO_LONGS(UINSNS_PER_PAGE), sizeof(long), in __create_xol_area()
1493 if (!area->bitmap) in __create_xol_area()
1496 area->xol_mapping.name = "[uprobes]"; in __create_xol_area()
1497 area->xol_mapping.fault = NULL; in __create_xol_area()
1498 area->xol_mapping.pages = area->pages; in __create_xol_area()
1499 area->pages[0] = alloc_page(GFP_HIGHUSER); in __create_xol_area()
1500 if (!area->pages[0]) in __create_xol_area()
1502 area->pages[1] = NULL; in __create_xol_area()
1504 area->vaddr = vaddr; in __create_xol_area()
1505 init_waitqueue_head(&area->wq); in __create_xol_area()
1507 set_bit(0, area->bitmap); in __create_xol_area()
1508 atomic_set(&area->slot_count, 1); in __create_xol_area()
1509 arch_uprobe_copy_ixol(area->pages[0], 0, &insn, UPROBE_SWBP_INSN_SIZE); in __create_xol_area()
1511 if (!xol_add_vma(mm, area)) in __create_xol_area()
1512 return area; in __create_xol_area()
1514 __free_page(area->pages[0]); in __create_xol_area()
1516 kfree(area->bitmap); in __create_xol_area()
1518 kfree(area); in __create_xol_area()
1532 struct xol_area *area; in get_xol_area() local
1538 area = READ_ONCE(mm->uprobes_state.xol_area); /* ^^^ */ in get_xol_area()
1539 return area; in get_xol_area()
1547 struct xol_area *area = mm->uprobes_state.xol_area; in uprobe_clear_state() local
1553 if (!area) in uprobe_clear_state()
1556 put_page(area->pages[0]); in uprobe_clear_state()
1557 kfree(area->bitmap); in uprobe_clear_state()
1558 kfree(area); in uprobe_clear_state()
1583 static unsigned long xol_take_insn_slot(struct xol_area *area) in xol_take_insn_slot() argument
1589 slot_nr = find_first_zero_bit(area->bitmap, UINSNS_PER_PAGE); in xol_take_insn_slot()
1591 if (!test_and_set_bit(slot_nr, area->bitmap)) in xol_take_insn_slot()
1597 wait_event(area->wq, (atomic_read(&area->slot_count) < UINSNS_PER_PAGE)); in xol_take_insn_slot()
1600 slot_addr = area->vaddr + (slot_nr * UPROBE_XOL_SLOT_BYTES); in xol_take_insn_slot()
1601 atomic_inc(&area->slot_count); in xol_take_insn_slot()
1612 struct xol_area *area; in xol_get_insn_slot() local
1615 area = get_xol_area(); in xol_get_insn_slot()
1616 if (!area) in xol_get_insn_slot()
1619 xol_vaddr = xol_take_insn_slot(area); in xol_get_insn_slot()
1623 arch_uprobe_copy_ixol(area->pages[0], xol_vaddr, in xol_get_insn_slot()
1636 struct xol_area *area; in xol_free_insn_slot() local
1647 area = tsk->mm->uprobes_state.xol_area; in xol_free_insn_slot()
1648 vma_end = area->vaddr + PAGE_SIZE; in xol_free_insn_slot()
1649 if (area->vaddr <= slot_addr && slot_addr < vma_end) { in xol_free_insn_slot()
1653 offset = slot_addr - area->vaddr; in xol_free_insn_slot()
1658 clear_bit(slot_nr, area->bitmap); in xol_free_insn_slot()
1659 atomic_dec(&area->slot_count); in xol_free_insn_slot()
1661 if (waitqueue_active(&area->wq)) in xol_free_insn_slot()
1662 wake_up(&area->wq); in xol_free_insn_slot()
1802 struct xol_area *area; in uprobe_copy_process() local
1816 area = mm->uprobes_state.xol_area; in uprobe_copy_process()
1817 if (!area) in uprobe_copy_process()
1823 t->utask->dup_xol_addr = area->vaddr; in uprobe_copy_process()
1836 struct xol_area *area; in get_trampoline_vaddr() local
1840 area = READ_ONCE(current->mm->uprobes_state.xol_area); /* ^^^ */ in get_trampoline_vaddr()
1841 if (area) in get_trampoline_vaddr()
1842 trampoline_vaddr = area->vaddr; in get_trampoline_vaddr()