struct i3c_generic_ibi_pool {
spinlock_t lock;
unsigned int num_slots;
- struct i3c_generic_ibi_slot *slots;
void *payload_buf;
struct list_head free_slots;
struct list_head pending;
+ struct i3c_generic_ibi_slot slots[] __counted_by(num_slots);
};
/**
WARN_ON(nslots != pool->num_slots);
kfree(pool->payload_buf);
- kfree(pool->slots);
kfree(pool);
}
EXPORT_SYMBOL_GPL(i3c_generic_ibi_free_pool);
unsigned int i;
int ret;
- pool = kzalloc_obj(*pool);
+ pool = kzalloc_flex(*pool, slots, req->num_slots);
if (!pool)
return ERR_PTR(-ENOMEM);
+ pool->num_slots = req->num_slots;
+
spin_lock_init(&pool->lock);
INIT_LIST_HEAD(&pool->free_slots);
INIT_LIST_HEAD(&pool->pending);
- pool->slots = kzalloc_objs(*slot, req->num_slots);
- if (!pool->slots) {
- ret = -ENOMEM;
- goto err_free_pool;
- }
-
if (req->max_payload_len) {
pool->payload_buf = kcalloc(req->num_slots,
req->max_payload_len, GFP_KERNEL);
(i * req->max_payload_len);
list_add_tail(&slot->node, &pool->free_slots);
- pool->num_slots++;
}
return pool;