163a93856SMark Peek /*- 2*3eeb7511SMark Peek * Copyright (c) 2018 VMware, Inc. 363a93856SMark Peek * 48c302b2eSMark Peek * SPDX-License-Identifier: (BSD-2-Clause OR GPL-2.0) 563a93856SMark Peek */ 663a93856SMark Peek 763a93856SMark Peek /* VMCI Resource Access Control API. */ 863a93856SMark Peek 963a93856SMark Peek #ifndef _VMCI_RESOURCE_H_ 1063a93856SMark Peek #define _VMCI_RESOURCE_H_ 1163a93856SMark Peek 1263a93856SMark Peek #include "vmci_defs.h" 1363a93856SMark Peek #include "vmci_hashtable.h" 1463a93856SMark Peek #include "vmci_kernel_if.h" 1563a93856SMark Peek 1663a93856SMark Peek #define RESOURCE_CONTAINER(ptr, type, member) \ 1763a93856SMark Peek ((type *)((char *)(ptr) - offsetof(type, member))) 1863a93856SMark Peek 1963a93856SMark Peek typedef void(*vmci_resource_free_cb)(void *resource); 2063a93856SMark Peek 2163a93856SMark Peek typedef enum { 2263a93856SMark Peek VMCI_RESOURCE_TYPE_ANY, 2363a93856SMark Peek VMCI_RESOURCE_TYPE_API, 2463a93856SMark Peek VMCI_RESOURCE_TYPE_GROUP, 2563a93856SMark Peek VMCI_RESOURCE_TYPE_DATAGRAM, 2663a93856SMark Peek VMCI_RESOURCE_TYPE_DOORBELL, 2763a93856SMark Peek } vmci_resource_type; 2863a93856SMark Peek 2963a93856SMark Peek struct vmci_resource { 3063a93856SMark Peek struct vmci_hash_entry hash_entry; 3163a93856SMark Peek vmci_resource_type type; 3263a93856SMark Peek /* Callback to free container object when refCount is 0. */ 3363a93856SMark Peek vmci_resource_free_cb container_free_cb; 3463a93856SMark Peek /* Container object reference. */ 3563a93856SMark Peek void *container_object; 3663a93856SMark Peek }; 3763a93856SMark Peek 3863a93856SMark Peek int vmci_resource_init(void); 3963a93856SMark Peek void vmci_resource_exit(void); 4063a93856SMark Peek void vmci_resource_sync(void); 4163a93856SMark Peek 4263a93856SMark Peek vmci_id vmci_resource_get_id(vmci_id context_id); 4363a93856SMark Peek 4463a93856SMark Peek int vmci_resource_add(struct vmci_resource *resource, 4563a93856SMark Peek vmci_resource_type resource_type, 4663a93856SMark Peek struct vmci_handle resource_handle, 4763a93856SMark Peek vmci_resource_free_cb container_free_cb, void *container_object); 4863a93856SMark Peek void vmci_resource_remove(struct vmci_handle resource_handle, 4963a93856SMark Peek vmci_resource_type resource_type); 5063a93856SMark Peek struct vmci_resource *vmci_resource_get(struct vmci_handle resource_handle, 5163a93856SMark Peek vmci_resource_type resource_type); 5263a93856SMark Peek void vmci_resource_hold(struct vmci_resource *resource); 5363a93856SMark Peek int vmci_resource_release(struct vmci_resource *resource); 5463a93856SMark Peek struct vmci_handle vmci_resource_handle(struct vmci_resource *resource); 5563a93856SMark Peek 5663a93856SMark Peek #endif /* !_VMCI_RESOURCE_H_ */ 57