| /* |
| * Copyright (C) 2010-2011, 2013-2014 ARM Limited. All rights reserved. |
| * |
| * This program is free software and is provided to you under the terms of the GNU General Public License version 2 |
| * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence. |
| * |
| * A copy of the licence is included with the program, and can also be obtained from Free Software |
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
| */ |
| |
| /** |
| * @file ump_kernel_random_mapping.h |
| */ |
| |
| #ifndef __UMP_KERNEL_RANDOM_MAPPING_H__ |
| #define __UMP_KERNEL_RANDOM_MAPPING_H__ |
| |
| #include "mali_osk.h" |
| #include <linux/rbtree.h> |
| |
| #define UMP_RANDOM_MAP_DELAY 1 |
| #define UMP_FAILED_LOOKUP_DELAY 10 /* ms */ |
| #define UMP_FAILED_LOOKUPS_ALLOWED 10 /* number of allowed failed lookups */ |
| |
| /** |
| * The random mapping object |
| * Provides a separate namespace where we can map an integer to a pointer |
| */ |
| typedef struct ump_random_mapping { |
| _mali_osk_mutex_rw_t *lock; /**< Lock protecting access to the mapping object */ |
| struct rb_root root; |
| #if UMP_RANDOM_MAP_DELAY |
| struct { |
| unsigned long count; |
| unsigned long timestamp; |
| } failed; |
| #endif |
| } ump_random_mapping; |
| |
| /** |
| * Create a random mapping object |
| * Create a random mapping capable of holding 2^20 entries |
| * @return Pointer to a random mapping object, NULL on failure |
| */ |
| ump_random_mapping *ump_random_mapping_create(void); |
| |
| /** |
| * Destroy a random mapping object |
| * @param map The map to free |
| */ |
| void ump_random_mapping_destroy(ump_random_mapping *map); |
| |
| /** |
| * Allocate a new mapping entry (random ID) |
| * Allocates a new entry in the map. |
| * @param map The map to allocate a new entry in |
| * @param target The value to map to |
| * @return The random allocated, a negative value on error |
| */ |
| int ump_random_mapping_insert(ump_random_mapping *map, ump_dd_mem *mem); |
| |
| /** |
| * Get the value mapped to by a random ID |
| * |
| * If the lookup fails, punish the calling thread by applying a delay. |
| * |
| * @param map The map to lookup the random id in |
| * @param id The ID to lookup |
| * @param target Pointer to a pointer which will receive the stored value |
| * @return ump_dd_mem pointer on successful lookup, NULL on error |
| */ |
| ump_dd_mem *ump_random_mapping_get(ump_random_mapping *map, int id); |
| |
| void ump_random_mapping_put(ump_dd_mem *mem); |
| |
| /** |
| * Free the random ID |
| * For the random to be reused it has to be freed |
| * @param map The map to free the random from |
| * @param id The ID to free |
| */ |
| ump_dd_mem *ump_random_mapping_remove(ump_random_mapping *map, int id); |
| |
| #endif /* __UMP_KERNEL_RANDOM_MAPPING_H__ */ |