1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (C) 2012 VMware, Inc. All rights reserved.
8 #include <linux/slab.h>
9 #include "vmci_handle_array.h"
11 static size_t handle_arr_calc_size(size_t capacity)
13 return sizeof(struct vmci_handle_arr) +
14 capacity * sizeof(struct vmci_handle);
17 struct vmci_handle_arr *vmci_handle_arr_create(size_t capacity)
19 struct vmci_handle_arr *array;
22 capacity = VMCI_HANDLE_ARRAY_DEFAULT_SIZE;
24 array = kmalloc(handle_arr_calc_size(capacity), GFP_ATOMIC);
28 array->capacity = capacity;
34 void vmci_handle_arr_destroy(struct vmci_handle_arr *array)
39 void vmci_handle_arr_append_entry(struct vmci_handle_arr **array_ptr,
40 struct vmci_handle handle)
42 struct vmci_handle_arr *array = *array_ptr;
44 if (unlikely(array->size >= array->capacity)) {
46 struct vmci_handle_arr *new_array;
47 size_t new_capacity = array->capacity * VMCI_ARR_CAP_MULT;
48 size_t new_size = handle_arr_calc_size(new_capacity);
50 new_array = krealloc(array, new_size, GFP_ATOMIC);
54 new_array->capacity = new_capacity;
55 *array_ptr = array = new_array;
58 array->entries[array->size] = handle;
63 * Handle that was removed, VMCI_INVALID_HANDLE if entry not found.
65 struct vmci_handle vmci_handle_arr_remove_entry(struct vmci_handle_arr *array,
66 struct vmci_handle entry_handle)
68 struct vmci_handle handle = VMCI_INVALID_HANDLE;
71 for (i = 0; i < array->size; i++) {
72 if (vmci_handle_is_equal(array->entries[i], entry_handle)) {
73 handle = array->entries[i];
75 array->entries[i] = array->entries[array->size];
76 array->entries[array->size] = VMCI_INVALID_HANDLE;
85 * Handle that was removed, VMCI_INVALID_HANDLE if array was empty.
87 struct vmci_handle vmci_handle_arr_remove_tail(struct vmci_handle_arr *array)
89 struct vmci_handle handle = VMCI_INVALID_HANDLE;
93 handle = array->entries[array->size];
94 array->entries[array->size] = VMCI_INVALID_HANDLE;
101 * Handle at given index, VMCI_INVALID_HANDLE if invalid index.
104 vmci_handle_arr_get_entry(const struct vmci_handle_arr *array, size_t index)
106 if (unlikely(index >= array->size))
107 return VMCI_INVALID_HANDLE;
109 return array->entries[index];
112 bool vmci_handle_arr_has_entry(const struct vmci_handle_arr *array,
113 struct vmci_handle entry_handle)
117 for (i = 0; i < array->size; i++)
118 if (vmci_handle_is_equal(array->entries[i], entry_handle))
125 * NULL if the array is empty. Otherwise, a pointer to the array
126 * of VMCI handles in the handle array.
128 struct vmci_handle *vmci_handle_arr_get_handles(struct vmci_handle_arr *array)
131 return array->entries;