/* $NetBSD: reservation.h,v 1.8 2018/08/27 15:25:13 riastradh Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Taylor R. Campbell. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #ifndef _LINUX_RESERVATION_H_ #define _LINUX_RESERVATION_H_ #include #include #include struct reservation_object { struct ww_mutex lock; unsigned robj_version; struct fence __rcu *robj_fence; struct reservation_object_list __rcu *robj_list; struct reservation_object_list __rcu *robj_prealloc; }; struct reservation_object_list { struct rcu_head rol_rcu; uint32_t shared_count; uint32_t shared_max; struct fence __rcu *shared[]; }; /* NetBSD addition */ struct reservation_poll { kmutex_t rp_lock; struct selinfo rp_selq; struct fence_cb rp_fcb; bool rp_claimed; }; #define reservation_object_add_excl_fence linux_reservation_object_add_excl_fence #define reservation_object_add_shared_fence linux_reservation_object_add_shared_fence #define reservation_object_fini linux_reservation_object_fini #define reservation_object_get_excl linux_reservation_object_get_excl #define reservation_object_get_fences_rcu linux_reservation_object_get_fences_rcu #define reservation_object_get_list linux_reservation_object_get_list #define reservation_object_held linux_reservation_object_held #define reservation_object_init linux_reservation_object_init #define reservation_object_kqfilter linux_reservation_object_kqfilter #define reservation_object_poll linux_reservation_object_poll #define reservation_object_reserve_shared linux_reservation_object_reserve_shared #define reservation_object_test_signaled_rcu linux_reservation_object_test_signaled_rcu #define reservation_object_wait_timeout_rcu linux_reservation_object_wait_timeout_rcu #define reservation_poll_fini linux_reservation_poll_fini #define reservation_poll_init linux_reservation_poll_init #define reservation_ww_class linux_reservation_ww_class extern struct ww_class reservation_ww_class; void reservation_object_init(struct reservation_object *); void reservation_object_fini(struct reservation_object *); bool reservation_object_held(struct reservation_object *); struct fence * reservation_object_get_excl(struct reservation_object *); struct reservation_object_list * reservation_object_get_list(struct reservation_object *); int reservation_object_reserve_shared(struct reservation_object *); void reservation_object_add_excl_fence(struct reservation_object *, struct fence *); void reservation_object_add_shared_fence(struct reservation_object *, struct fence *); int reservation_object_get_fences_rcu(struct reservation_object *, struct fence **, unsigned *, struct fence ***); bool reservation_object_test_signaled_rcu(struct reservation_object *, bool); long reservation_object_wait_timeout_rcu(struct reservation_object *, bool, bool, unsigned long); /* NetBSD additions */ void reservation_poll_init(struct reservation_poll *); void reservation_poll_fini(struct reservation_poll *); int reservation_object_poll(struct reservation_object *, int, struct reservation_poll *); int reservation_object_kqfilter(struct reservation_object *, struct knote *, struct reservation_poll *); #endif /* _LINUX_RESERVATION_H_ */