parman
parman_item_remove(tcam_region->parman,
struct parman *parman;
struct parman *parman;
parman = parman_create(&mlxsw_sp1_mr_tcam_region_parman_ops,
if (!parman) {
mr_tcam_region->parman = parman;
parman_prio_init(mr_tcam_region->parman,
parman_destroy(parman);
parman_destroy(mr_tcam_region->parman);
err = parman_item_add(tcam_region->parman,
cregion->parman = parman_create(&mlxsw_sp_acl_ctcam_region_parman_ops,
if (!cregion->parman)
parman_destroy(cregion->parman);
parman_prio_init(cregion->parman, &cchunk->parman_prio, priority);
err = parman_item_add(cregion->parman, &cchunk->parman_prio,
parman_item_remove(cregion->parman, &cchunk->parman_prio,
parman_item_remove(cregion->parman, &cchunk->parman_prio,
struct parman *parman;
struct parman;
struct parman *parman_create(const struct parman_ops *ops, void *priv);
void parman_destroy(struct parman *parman);
void parman_prio_init(struct parman *parman, struct parman_prio *prio,
int parman_item_add(struct parman *parman, struct parman_prio *prio,
void parman_item_remove(struct parman *parman, struct parman_prio *prio,
static unsigned long parman_lsort_new_index_find(struct parman *parman,
list_for_each_entry_from_reverse(prio, &parman->prio_list, list) {
static void __parman_prio_move(struct parman *parman, struct parman_prio *prio,
parman->ops->move(parman->priv, item->index, to_index, count);
static void parman_prio_shift_down(struct parman *parman,
__parman_prio_move(parman, prio, item, to_index, 1);
static void parman_prio_shift_up(struct parman *parman,
__parman_prio_move(parman, prio, item, to_index, 1);
static void parman_prio_item_remove(struct parman *parman,
__parman_prio_move(parman, prio, last_item, to_index, 1);
static int parman_lsort_item_add(struct parman *parman,
if (parman->count + 1 > parman->limit_count) {
err = parman_enlarge(parman);
new_index = parman_lsort_new_index_find(parman, prio);
list_for_each_entry_reverse(prio2, &parman->prio_list, list) {
parman_prio_shift_down(parman, prio2);
parman->count++;
static void parman_lsort_item_remove(struct parman *parman,
parman_prio_item_remove(parman, prio, item);
list_for_each_entry_continue(prio, &parman->prio_list, list)
parman_prio_shift_up(parman, prio);
parman->count--;
if (parman->limit_count - parman->count >= parman->ops->resize_step)
parman_shrink(parman);
struct parman *parman_create(const struct parman_ops *ops, void *priv)
struct parman *parman;
parman = kzalloc_obj(*parman);
if (!parman)
INIT_LIST_HEAD(&parman->prio_list);
parman->ops = ops;
parman->priv = priv;
parman->limit_count = ops->base_count;
parman->algo = parman_algos[ops->algo];
return parman;
void parman_destroy(struct parman *parman)
WARN_ON(!list_empty(&parman->prio_list));
kfree(parman);
void parman_prio_init(struct parman *parman, struct parman_prio *prio,
list_for_each(pos, &parman->prio_list) {
int parman_item_add(struct parman *parman, struct parman_prio *prio,
return parman->algo->item_add(parman, prio, item);
void parman_item_remove(struct parman *parman, struct parman_prio *prio,
parman->algo->item_remove(parman, prio, item);
int (*item_add)(struct parman *parman, struct parman_prio *prio,
void (*item_remove)(struct parman *parman, struct parman_prio *prio,
static int parman_enlarge(struct parman *parman)
unsigned long new_count = parman->limit_count +
parman->ops->resize_step;
err = parman->ops->resize(parman->priv, new_count);
parman->limit_count = new_count;
static int parman_shrink(struct parman *parman)
unsigned long new_count = parman->limit_count -
parman->ops->resize_step;
if (new_count < parman->ops->base_count)
err = parman->ops->resize(parman->priv, new_count);
parman->limit_count = new_count;
parman_prio_init(test_parman->parman, &prio->parman_prio,
parman_item_remove(test_parman->parman,
test_parman->parman = parman_create(ops, test_parman);
if (!test_parman->parman) {
parman_destroy(test_parman->parman);
err = parman_item_add(test_parman->parman,
parman_item_remove(test_parman->parman,
struct parman *parman;