Lines Matching refs:enabler
134 struct user_event_enabler *enabler; member
381 static void user_event_enabler_destroy(struct user_event_enabler *enabler, in user_event_enabler_destroy() argument
384 list_del_rcu(&enabler->mm_enablers_link); in user_event_enabler_destroy()
387 user_event_put(enabler->event, locked); in user_event_enabler_destroy()
389 kfree(enabler); in user_event_enabler_destroy()
422 struct user_event_enabler *enabler,
429 struct user_event_enabler *enabler = fault->enabler; in user_event_enabler_fault_fixup() local
431 unsigned long uaddr = enabler->addr; in user_event_enabler_fault_fixup()
438 struct user_event *user = enabler->event; in user_event_enabler_fault_fixup()
448 if (test_bit(ENABLE_VAL_FREEING_BIT, ENABLE_BITOPS(enabler))) { in user_event_enabler_fault_fixup()
449 user_event_enabler_destroy(enabler, true); in user_event_enabler_fault_fixup()
460 clear_bit(ENABLE_VAL_FAULTING_BIT, ENABLE_BITOPS(enabler)); in user_event_enabler_fault_fixup()
464 user_event_enabler_write(mm, enabler, true, &attempt); in user_event_enabler_fault_fixup()
476 struct user_event_enabler *enabler, in user_event_enabler_queue_fault() argument
488 fault->enabler = enabler; in user_event_enabler_queue_fault()
492 set_bit(ENABLE_VAL_FAULTING_BIT, ENABLE_BITOPS(enabler)); in user_event_enabler_queue_fault()
496 clear_bit(ENABLE_VAL_FAULTING_BIT, ENABLE_BITOPS(enabler)); in user_event_enabler_queue_fault()
508 struct user_event_enabler *enabler, in user_event_enabler_write() argument
511 unsigned long uaddr = enabler->addr; in user_event_enabler_write()
515 int bit = ENABLE_BIT(enabler); in user_event_enabler_write()
527 if (unlikely(test_bit(ENABLE_VAL_FAULTING_BIT, ENABLE_BITOPS(enabler)) || in user_event_enabler_write()
528 test_bit(ENABLE_VAL_FREEING_BIT, ENABLE_BITOPS(enabler)))) in user_event_enabler_write()
531 align_addr_bit(&uaddr, &bit, ENABLE_BITOPS(enabler)); in user_event_enabler_write()
540 if (!user_event_enabler_queue_fault(mm, enabler, *attempt)) in user_event_enabler_write()
550 if (enabler->event && enabler->event->status) in user_event_enabler_write()
564 struct user_event_enabler *enabler; in user_event_enabler_exists() local
566 list_for_each_entry(enabler, &mm->enablers, mm_enablers_link) { in user_event_enabler_exists()
567 if (enabler->addr == uaddr && ENABLE_BIT(enabler) == bit) in user_event_enabler_exists()
576 struct user_event_enabler *enabler; in user_event_enabler_update() local
600 list_for_each_entry(enabler, &mm->enablers, mm_enablers_link) { in user_event_enabler_update()
601 if (enabler->event == user) { in user_event_enabler_update()
603 user_event_enabler_write(mm, enabler, true, &attempt); in user_event_enabler_update()
616 struct user_event_enabler *enabler; in user_event_enabler_dup() local
622 enabler = kzalloc(sizeof(*enabler), GFP_NOWAIT | __GFP_ACCOUNT); in user_event_enabler_dup()
624 if (!enabler) in user_event_enabler_dup()
627 enabler->event = user_event_get(orig->event); in user_event_enabler_dup()
628 enabler->addr = orig->addr; in user_event_enabler_dup()
631 enabler->values = orig->values & ENABLE_VAL_DUP_MASK; in user_event_enabler_dup()
634 list_add(&enabler->mm_enablers_link, &mm->enablers); in user_event_enabler_dup()
649 struct user_event_enabler *enabler; in user_event_mm_get_all() local
673 list_for_each_entry_rcu(enabler, &mm->enablers, mm_enablers_link) { in user_event_mm_get_all()
674 if (enabler->event == user) { in user_event_mm_get_all()
746 struct user_event_enabler *enabler, *next; in user_event_mm_destroy() local
748 list_for_each_entry_safe(enabler, next, &mm->enablers, mm_enablers_link) in user_event_mm_destroy()
749 user_event_enabler_destroy(enabler, false); in user_event_mm_destroy()
826 struct user_event_enabler *enabler; in user_event_mm_dup() local
833 list_for_each_entry_rcu(enabler, &old_mm->enablers, mm_enablers_link) { in user_event_mm_dup()
834 if (!user_event_enabler_dup(enabler, mm)) in user_event_mm_dup()
867 struct user_event_enabler *enabler; in user_event_enabler_create() local
877 enabler = kzalloc(sizeof(*enabler), GFP_KERNEL_ACCOUNT); in user_event_enabler_create()
879 if (!enabler) in user_event_enabler_create()
882 enabler->event = user; in user_event_enabler_create()
883 enabler->addr = uaddr; in user_event_enabler_create()
884 enabler->values = reg->enable_bit; in user_event_enabler_create()
888 set_bit(ENABLE_VAL_32_ON_64_BIT, ENABLE_BITOPS(enabler)); in user_event_enabler_create()
897 *write_result = user_event_enabler_write(user_mm, enabler, false, in user_event_enabler_create()
911 list_add_rcu(&enabler->mm_enablers_link, &user_mm->enablers); in user_event_enabler_create()
921 kfree(enabler); in user_event_enabler_create()
922 enabler = NULL; in user_event_enabler_create()
927 return enabler; in user_event_enabler_create()
2389 struct user_event_enabler *enabler; in user_events_ioctl_reg() local
2445 enabler = user_event_enabler_create(®, user, &write_result); in user_events_ioctl_reg()
2447 if (!enabler) in user_events_ioctl_reg()
2514 struct user_event_enabler enabler; in user_event_mm_clear_bit() local
2518 memset(&enabler, 0, sizeof(enabler)); in user_event_mm_clear_bit()
2519 enabler.addr = uaddr; in user_event_mm_clear_bit()
2520 enabler.values = bit | flags; in user_event_mm_clear_bit()
2527 result = user_event_enabler_write(user_mm, &enabler, false, &attempt); in user_event_mm_clear_bit()
2548 struct user_event_enabler *enabler, *next; in user_events_ioctl_unreg() local
2573 list_for_each_entry_safe(enabler, next, &mm->enablers, mm_enablers_link) { in user_events_ioctl_unreg()
2574 if (enabler->addr == reg.disable_addr && in user_events_ioctl_unreg()
2575 ENABLE_BIT(enabler) == reg.disable_bit) { in user_events_ioctl_unreg()
2576 set_bit(ENABLE_VAL_FREEING_BIT, ENABLE_BITOPS(enabler)); in user_events_ioctl_unreg()
2579 flags |= enabler->values & ENABLE_VAL_COMPAT_MASK; in user_events_ioctl_unreg()
2581 if (!test_bit(ENABLE_VAL_FAULTING_BIT, ENABLE_BITOPS(enabler))) in user_events_ioctl_unreg()
2582 user_event_enabler_destroy(enabler, true); in user_events_ioctl_unreg()