| /* GPLv2 or OpenIB.org BSD (MIT) See COPYING file */ |
| |
| #include <stdint.h> |
| |
| struct iset; |
| |
| /** |
| * iset_create - Create an interval set |
| * |
| * Return the created iset if succeeded, NULL otherwise, with errno set |
| */ |
| struct iset *iset_create(void); |
| |
| /** |
| * iset_destroy - Destroy an interval set |
| * @iset: The set to be destroyed |
| */ |
| void iset_destroy(struct iset *iset); |
| |
| /** |
| * iset_insert_range - Insert a range to the set |
| * @iset: The set to be operated |
| * @start: The start address of the range |
| * @length: The length of the range |
| * |
| * If this range is continuous to the adjacent ranges (before and/or after), |
| * then they will be combined to a larger one. |
| * |
| * Return 0 if succeeded, errno otherwise |
| */ |
| int iset_insert_range(struct iset *iset, uint64_t start, uint64_t length); |
| |
| /** |
| * iset_alloc_range - Allocate a range from the set |
| * |
| * @iset: The set to be operated |
| * @length: The length of the range |
| * @start: The start address of the allocated range |
| * @alignment: The alignment that @start must be aligned with, must be power |
| * of two |
| * |
| * Return 0 if succeeded, errno otherwise |
| * |
| * Note: There are these cases: |
| * |
| Case 1: Original range is fully taken |
| +------------------+ |
| |XXXXXXXXXXXXXXXXXX| |
| +------------------+ |
| => (NULL) |
| |
| Case 2: Original range shrunk |
| +------------------+ |
| |XXXXX | |
| +------------------+ |
| => |
| +------------+ |
| | | |
| +------------+ |
| |
| Case 3: Original range shrunk |
| +------------------+ |
| | XXXXX| |
| +------------------+ |
| => |
| +------------+ |
| | | |
| +------------+ |
| |
| Case 4: Original range splited |
| +------------------+ |
| | XXXXX | |
| +------------------+ |
| => |
| +-----+ +------+ |
| | | | | |
| +-----+ +------+ |
| */ |
| int iset_alloc_range(struct iset *iset, uint64_t length, |
| uint64_t *start, uint64_t alignment); |