/* GPLv2 or OpenIB.org BSD (MIT) See COPYING file */ #include 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);