Lines Matching +full:int +full:- +full:threshold

1 // SPDX-License-Identifier: GPL-2.0-or-later
11 unsigned int index;
21 return devlink_sb->ingress_pools_count + devlink_sb->egress_pools_count; in devlink_sb_pool_count()
25 unsigned int sb_index) in devlink_sb_get_by_index()
29 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_sb_get_by_index()
30 if (devlink_sb->index == sb_index) in devlink_sb_get_by_index()
37 unsigned int sb_index) in devlink_sb_index_exists()
51 return ERR_PTR(-ENODEV); in devlink_sb_get_from_attrs()
54 return ERR_PTR(-EINVAL); in devlink_sb_get_from_attrs()
60 return devlink_sb_get_from_attrs(devlink, info->attrs); in devlink_sb_get_from_info()
63 static int devlink_sb_pool_index_get_from_attrs(struct devlink_sb *devlink_sb, in devlink_sb_pool_index_get_from_attrs()
70 return -EINVAL; in devlink_sb_pool_index_get_from_attrs()
74 return -EINVAL; in devlink_sb_pool_index_get_from_attrs()
79 static int devlink_sb_pool_index_get_from_info(struct devlink_sb *devlink_sb, in devlink_sb_pool_index_get_from_info()
83 return devlink_sb_pool_index_get_from_attrs(devlink_sb, info->attrs, in devlink_sb_pool_index_get_from_info()
87 static int
94 return -EINVAL; in devlink_sb_pool_type_get_from_attrs()
99 return -EINVAL; in devlink_sb_pool_type_get_from_attrs()
104 static int
108 return devlink_sb_pool_type_get_from_attrs(info->attrs, p_pool_type); in devlink_sb_pool_type_get_from_info()
111 static int
118 return -EINVAL; in devlink_sb_th_type_get_from_attrs()
123 return -EINVAL; in devlink_sb_th_type_get_from_attrs()
128 static int
132 return devlink_sb_th_type_get_from_attrs(info->attrs, p_th_type); in devlink_sb_th_type_get_from_info()
135 static int
144 return -EINVAL; in devlink_sb_tc_index_get_from_attrs()
148 val >= devlink_sb->ingress_tc_count) in devlink_sb_tc_index_get_from_attrs()
149 return -EINVAL; in devlink_sb_tc_index_get_from_attrs()
151 val >= devlink_sb->egress_tc_count) in devlink_sb_tc_index_get_from_attrs()
152 return -EINVAL; in devlink_sb_tc_index_get_from_attrs()
157 static int
163 return devlink_sb_tc_index_get_from_attrs(devlink_sb, info->attrs, in devlink_sb_tc_index_get_from_info()
167 static int devlink_nl_sb_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_fill()
170 u32 seq, int flags) in devlink_nl_sb_fill()
176 return -EMSGSIZE; in devlink_nl_sb_fill()
180 if (nla_put_u32(msg, DEVLINK_ATTR_SB_INDEX, devlink_sb->index)) in devlink_nl_sb_fill()
182 if (nla_put_u32(msg, DEVLINK_ATTR_SB_SIZE, devlink_sb->size)) in devlink_nl_sb_fill()
185 devlink_sb->ingress_pools_count)) in devlink_nl_sb_fill()
188 devlink_sb->egress_pools_count)) in devlink_nl_sb_fill()
191 devlink_sb->ingress_tc_count)) in devlink_nl_sb_fill()
194 devlink_sb->egress_tc_count)) in devlink_nl_sb_fill()
202 return -EMSGSIZE; in devlink_nl_sb_fill()
205 int devlink_nl_sb_get_doit(struct sk_buff *skb, struct genl_info *info) in devlink_nl_sb_get_doit()
207 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_sb_get_doit()
210 int err; in devlink_nl_sb_get_doit()
218 return -ENOMEM; in devlink_nl_sb_get_doit()
222 info->snd_portid, info->snd_seq, 0); in devlink_nl_sb_get_doit()
231 static int
233 struct netlink_callback *cb, int flags) in devlink_nl_sb_get_dump_one()
237 int idx = 0; in devlink_nl_sb_get_dump_one()
238 int err = 0; in devlink_nl_sb_get_dump_one()
240 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_sb_get_dump_one()
241 if (idx < state->idx) { in devlink_nl_sb_get_dump_one()
247 NETLINK_CB(cb->skb).portid, in devlink_nl_sb_get_dump_one()
248 cb->nlh->nlmsg_seq, flags); in devlink_nl_sb_get_dump_one()
250 state->idx = idx; in devlink_nl_sb_get_dump_one()
259 int devlink_nl_sb_get_dumpit(struct sk_buff *skb, struct netlink_callback *cb) in devlink_nl_sb_get_dumpit()
264 static int devlink_nl_sb_pool_fill(struct sk_buff *msg, struct devlink *devlink, in devlink_nl_sb_pool_fill()
267 u32 portid, u32 seq, int flags) in devlink_nl_sb_pool_fill()
271 int err; in devlink_nl_sb_pool_fill()
273 err = devlink->ops->sb_pool_get(devlink, devlink_sb->index, in devlink_nl_sb_pool_fill()
280 return -EMSGSIZE; in devlink_nl_sb_pool_fill()
284 if (nla_put_u32(msg, DEVLINK_ATTR_SB_INDEX, devlink_sb->index)) in devlink_nl_sb_pool_fill()
304 return -EMSGSIZE; in devlink_nl_sb_pool_fill()
307 int devlink_nl_sb_pool_get_doit(struct sk_buff *skb, struct genl_info *info) in devlink_nl_sb_pool_get_doit()
309 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_sb_pool_get_doit()
313 int err; in devlink_nl_sb_pool_get_doit()
324 if (!devlink->ops->sb_pool_get) in devlink_nl_sb_pool_get_doit()
325 return -EOPNOTSUPP; in devlink_nl_sb_pool_get_doit()
329 return -ENOMEM; in devlink_nl_sb_pool_get_doit()
333 info->snd_portid, info->snd_seq, 0); in devlink_nl_sb_pool_get_doit()
342 static int __sb_pool_get_dumpit(struct sk_buff *msg, int start, int *p_idx, in __sb_pool_get_dumpit()
345 u32 portid, u32 seq, int flags) in __sb_pool_get_dumpit()
349 int err; in __sb_pool_get_dumpit()
368 static int
370 struct netlink_callback *cb, int flags) in devlink_nl_sb_pool_get_dump_one()
374 int err = 0; in devlink_nl_sb_pool_get_dump_one()
375 int idx = 0; in devlink_nl_sb_pool_get_dump_one()
377 if (!devlink->ops->sb_pool_get) in devlink_nl_sb_pool_get_dump_one()
380 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_sb_pool_get_dump_one()
381 err = __sb_pool_get_dumpit(msg, state->idx, &idx, in devlink_nl_sb_pool_get_dump_one()
383 NETLINK_CB(cb->skb).portid, in devlink_nl_sb_pool_get_dump_one()
384 cb->nlh->nlmsg_seq, flags); in devlink_nl_sb_pool_get_dump_one()
385 if (err == -EOPNOTSUPP) { in devlink_nl_sb_pool_get_dump_one()
388 state->idx = idx; in devlink_nl_sb_pool_get_dump_one()
396 int devlink_nl_sb_pool_get_dumpit(struct sk_buff *skb, in devlink_nl_sb_pool_get_dumpit()
402 static int devlink_sb_pool_set(struct devlink *devlink, unsigned int sb_index, in devlink_sb_pool_set()
408 const struct devlink_ops *ops = devlink->ops; in devlink_sb_pool_set()
410 if (ops->sb_pool_set) in devlink_sb_pool_set()
411 return ops->sb_pool_set(devlink, sb_index, pool_index, in devlink_sb_pool_set()
413 return -EOPNOTSUPP; in devlink_sb_pool_set()
416 int devlink_nl_sb_pool_set_doit(struct sk_buff *skb, struct genl_info *info) in devlink_nl_sb_pool_set_doit()
418 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_sb_pool_set_doit()
423 int err; in devlink_nl_sb_pool_set_doit()
439 return -EINVAL; in devlink_nl_sb_pool_set_doit()
441 size = nla_get_u32(info->attrs[DEVLINK_ATTR_SB_POOL_SIZE]); in devlink_nl_sb_pool_set_doit()
442 return devlink_sb_pool_set(devlink, devlink_sb->index, in devlink_nl_sb_pool_set_doit()
444 info->extack); in devlink_nl_sb_pool_set_doit()
447 static int devlink_nl_sb_port_pool_fill(struct sk_buff *msg, in devlink_nl_sb_port_pool_fill()
453 u32 portid, u32 seq, int flags) in devlink_nl_sb_port_pool_fill()
455 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_port_pool_fill()
456 u32 threshold; in devlink_nl_sb_port_pool_fill() local
458 int err; in devlink_nl_sb_port_pool_fill()
460 err = ops->sb_port_pool_get(devlink_port, devlink_sb->index, in devlink_nl_sb_port_pool_fill()
461 pool_index, &threshold); in devlink_nl_sb_port_pool_fill()
467 return -EMSGSIZE; in devlink_nl_sb_port_pool_fill()
471 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, devlink_port->index)) in devlink_nl_sb_port_pool_fill()
473 if (nla_put_u32(msg, DEVLINK_ATTR_SB_INDEX, devlink_sb->index)) in devlink_nl_sb_port_pool_fill()
477 if (nla_put_u32(msg, DEVLINK_ATTR_SB_THRESHOLD, threshold)) in devlink_nl_sb_port_pool_fill()
480 if (ops->sb_occ_port_pool_get) { in devlink_nl_sb_port_pool_fill()
484 err = ops->sb_occ_port_pool_get(devlink_port, devlink_sb->index, in devlink_nl_sb_port_pool_fill()
486 if (err && err != -EOPNOTSUPP) in devlink_nl_sb_port_pool_fill()
500 err = -EMSGSIZE; in devlink_nl_sb_port_pool_fill()
506 int devlink_nl_sb_port_pool_get_doit(struct sk_buff *skb, in devlink_nl_sb_port_pool_get_doit()
509 struct devlink_port *devlink_port = info->user_ptr[1]; in devlink_nl_sb_port_pool_get_doit()
510 struct devlink *devlink = devlink_port->devlink; in devlink_nl_sb_port_pool_get_doit()
514 int err; in devlink_nl_sb_port_pool_get_doit()
525 if (!devlink->ops->sb_port_pool_get) in devlink_nl_sb_port_pool_get_doit()
526 return -EOPNOTSUPP; in devlink_nl_sb_port_pool_get_doit()
530 return -ENOMEM; in devlink_nl_sb_port_pool_get_doit()
535 info->snd_portid, info->snd_seq, 0); in devlink_nl_sb_port_pool_get_doit()
544 static int __sb_port_pool_get_dumpit(struct sk_buff *msg, int start, int *p_idx, in __sb_port_pool_get_dumpit()
547 u32 portid, u32 seq, int flags) in __sb_port_pool_get_dumpit()
553 int err; in __sb_port_pool_get_dumpit()
555 xa_for_each(&devlink->ports, port_index, devlink_port) { in __sb_port_pool_get_dumpit()
575 static int
578 struct netlink_callback *cb, int flags) in devlink_nl_sb_port_pool_get_dump_one()
582 int idx = 0; in devlink_nl_sb_port_pool_get_dump_one()
583 int err = 0; in devlink_nl_sb_port_pool_get_dump_one()
585 if (!devlink->ops->sb_port_pool_get) in devlink_nl_sb_port_pool_get_dump_one()
588 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_sb_port_pool_get_dump_one()
589 err = __sb_port_pool_get_dumpit(msg, state->idx, &idx, in devlink_nl_sb_port_pool_get_dump_one()
591 NETLINK_CB(cb->skb).portid, in devlink_nl_sb_port_pool_get_dump_one()
592 cb->nlh->nlmsg_seq, flags); in devlink_nl_sb_port_pool_get_dump_one()
593 if (err == -EOPNOTSUPP) { in devlink_nl_sb_port_pool_get_dump_one()
596 state->idx = idx; in devlink_nl_sb_port_pool_get_dump_one()
604 int devlink_nl_sb_port_pool_get_dumpit(struct sk_buff *skb, in devlink_nl_sb_port_pool_get_dumpit()
610 static int devlink_sb_port_pool_set(struct devlink_port *devlink_port, in devlink_sb_port_pool_set()
611 unsigned int sb_index, u16 pool_index, in devlink_sb_port_pool_set()
612 u32 threshold, in devlink_sb_port_pool_set() argument
616 const struct devlink_ops *ops = devlink_port->devlink->ops; in devlink_sb_port_pool_set()
618 if (ops->sb_port_pool_set) in devlink_sb_port_pool_set()
619 return ops->sb_port_pool_set(devlink_port, sb_index, in devlink_sb_port_pool_set()
620 pool_index, threshold, extack); in devlink_sb_port_pool_set()
621 return -EOPNOTSUPP; in devlink_sb_port_pool_set()
624 int devlink_nl_sb_port_pool_set_doit(struct sk_buff *skb, in devlink_nl_sb_port_pool_set_doit()
627 struct devlink_port *devlink_port = info->user_ptr[1]; in devlink_nl_sb_port_pool_set_doit()
628 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_sb_port_pool_set_doit()
631 u32 threshold; in devlink_nl_sb_port_pool_set_doit() local
632 int err; in devlink_nl_sb_port_pool_set_doit()
644 return -EINVAL; in devlink_nl_sb_port_pool_set_doit()
646 threshold = nla_get_u32(info->attrs[DEVLINK_ATTR_SB_THRESHOLD]); in devlink_nl_sb_port_pool_set_doit()
647 return devlink_sb_port_pool_set(devlink_port, devlink_sb->index, in devlink_nl_sb_port_pool_set_doit()
648 pool_index, threshold, info->extack); in devlink_nl_sb_port_pool_set_doit()
651 static int
657 u32 portid, u32 seq, int flags) in devlink_nl_sb_tc_pool_bind_fill()
659 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_tc_pool_bind_fill()
661 u32 threshold; in devlink_nl_sb_tc_pool_bind_fill() local
663 int err; in devlink_nl_sb_tc_pool_bind_fill()
665 err = ops->sb_tc_pool_bind_get(devlink_port, devlink_sb->index, in devlink_nl_sb_tc_pool_bind_fill()
667 &pool_index, &threshold); in devlink_nl_sb_tc_pool_bind_fill()
673 return -EMSGSIZE; in devlink_nl_sb_tc_pool_bind_fill()
677 if (nla_put_u32(msg, DEVLINK_ATTR_PORT_INDEX, devlink_port->index)) in devlink_nl_sb_tc_pool_bind_fill()
679 if (nla_put_u32(msg, DEVLINK_ATTR_SB_INDEX, devlink_sb->index)) in devlink_nl_sb_tc_pool_bind_fill()
687 if (nla_put_u32(msg, DEVLINK_ATTR_SB_THRESHOLD, threshold)) in devlink_nl_sb_tc_pool_bind_fill()
690 if (ops->sb_occ_tc_port_bind_get) { in devlink_nl_sb_tc_pool_bind_fill()
694 err = ops->sb_occ_tc_port_bind_get(devlink_port, in devlink_nl_sb_tc_pool_bind_fill()
695 devlink_sb->index, in devlink_nl_sb_tc_pool_bind_fill()
698 if (err && err != -EOPNOTSUPP) in devlink_nl_sb_tc_pool_bind_fill()
713 return -EMSGSIZE; in devlink_nl_sb_tc_pool_bind_fill()
716 int devlink_nl_sb_tc_pool_bind_get_doit(struct sk_buff *skb, in devlink_nl_sb_tc_pool_bind_get_doit()
719 struct devlink_port *devlink_port = info->user_ptr[1]; in devlink_nl_sb_tc_pool_bind_get_doit()
720 struct devlink *devlink = devlink_port->devlink; in devlink_nl_sb_tc_pool_bind_get_doit()
725 int err; in devlink_nl_sb_tc_pool_bind_get_doit()
740 if (!devlink->ops->sb_tc_pool_bind_get) in devlink_nl_sb_tc_pool_bind_get_doit()
741 return -EOPNOTSUPP; in devlink_nl_sb_tc_pool_bind_get_doit()
745 return -ENOMEM; in devlink_nl_sb_tc_pool_bind_get_doit()
750 info->snd_portid, in devlink_nl_sb_tc_pool_bind_get_doit()
751 info->snd_seq, 0); in devlink_nl_sb_tc_pool_bind_get_doit()
760 static int __sb_tc_pool_bind_get_dumpit(struct sk_buff *msg, in __sb_tc_pool_bind_get_dumpit()
761 int start, int *p_idx, in __sb_tc_pool_bind_get_dumpit()
764 u32 portid, u32 seq, int flags) in __sb_tc_pool_bind_get_dumpit()
769 int err; in __sb_tc_pool_bind_get_dumpit()
771 xa_for_each(&devlink->ports, port_index, devlink_port) { in __sb_tc_pool_bind_get_dumpit()
773 tc_index < devlink_sb->ingress_tc_count; tc_index++) { in __sb_tc_pool_bind_get_dumpit()
791 tc_index < devlink_sb->egress_tc_count; tc_index++) { in __sb_tc_pool_bind_get_dumpit()
812 static int devlink_nl_sb_tc_pool_bind_get_dump_one(struct sk_buff *msg, in devlink_nl_sb_tc_pool_bind_get_dump_one()
815 int flags) in devlink_nl_sb_tc_pool_bind_get_dump_one()
819 int idx = 0; in devlink_nl_sb_tc_pool_bind_get_dump_one()
820 int err = 0; in devlink_nl_sb_tc_pool_bind_get_dump_one()
822 if (!devlink->ops->sb_tc_pool_bind_get) in devlink_nl_sb_tc_pool_bind_get_dump_one()
825 list_for_each_entry(devlink_sb, &devlink->sb_list, list) { in devlink_nl_sb_tc_pool_bind_get_dump_one()
826 err = __sb_tc_pool_bind_get_dumpit(msg, state->idx, &idx, in devlink_nl_sb_tc_pool_bind_get_dump_one()
828 NETLINK_CB(cb->skb).portid, in devlink_nl_sb_tc_pool_bind_get_dump_one()
829 cb->nlh->nlmsg_seq, flags); in devlink_nl_sb_tc_pool_bind_get_dump_one()
830 if (err == -EOPNOTSUPP) { in devlink_nl_sb_tc_pool_bind_get_dump_one()
833 state->idx = idx; in devlink_nl_sb_tc_pool_bind_get_dump_one()
841 int devlink_nl_sb_tc_pool_bind_get_dumpit(struct sk_buff *skb, in devlink_nl_sb_tc_pool_bind_get_dumpit()
848 static int devlink_sb_tc_pool_bind_set(struct devlink_port *devlink_port, in devlink_sb_tc_pool_bind_set()
849 unsigned int sb_index, u16 tc_index, in devlink_sb_tc_pool_bind_set()
851 u16 pool_index, u32 threshold, in devlink_sb_tc_pool_bind_set() argument
855 const struct devlink_ops *ops = devlink_port->devlink->ops; in devlink_sb_tc_pool_bind_set()
857 if (ops->sb_tc_pool_bind_set) in devlink_sb_tc_pool_bind_set()
858 return ops->sb_tc_pool_bind_set(devlink_port, sb_index, in devlink_sb_tc_pool_bind_set()
860 pool_index, threshold, extack); in devlink_sb_tc_pool_bind_set()
861 return -EOPNOTSUPP; in devlink_sb_tc_pool_bind_set()
864 int devlink_nl_sb_tc_pool_bind_set_doit(struct sk_buff *skb, in devlink_nl_sb_tc_pool_bind_set_doit()
867 struct devlink_port *devlink_port = info->user_ptr[1]; in devlink_nl_sb_tc_pool_bind_set_doit()
868 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_sb_tc_pool_bind_set_doit()
873 u32 threshold; in devlink_nl_sb_tc_pool_bind_set_doit() local
874 int err; in devlink_nl_sb_tc_pool_bind_set_doit()
895 return -EINVAL; in devlink_nl_sb_tc_pool_bind_set_doit()
897 threshold = nla_get_u32(info->attrs[DEVLINK_ATTR_SB_THRESHOLD]); in devlink_nl_sb_tc_pool_bind_set_doit()
898 return devlink_sb_tc_pool_bind_set(devlink_port, devlink_sb->index, in devlink_nl_sb_tc_pool_bind_set_doit()
900 pool_index, threshold, info->extack); in devlink_nl_sb_tc_pool_bind_set_doit()
903 int devlink_nl_sb_occ_snapshot_doit(struct sk_buff *skb, struct genl_info *info) in devlink_nl_sb_occ_snapshot_doit()
905 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_sb_occ_snapshot_doit()
906 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_occ_snapshot_doit()
913 if (ops->sb_occ_snapshot) in devlink_nl_sb_occ_snapshot_doit()
914 return ops->sb_occ_snapshot(devlink, devlink_sb->index); in devlink_nl_sb_occ_snapshot_doit()
915 return -EOPNOTSUPP; in devlink_nl_sb_occ_snapshot_doit()
918 int devlink_nl_sb_occ_max_clear_doit(struct sk_buff *skb, in devlink_nl_sb_occ_max_clear_doit()
921 struct devlink *devlink = info->user_ptr[0]; in devlink_nl_sb_occ_max_clear_doit()
922 const struct devlink_ops *ops = devlink->ops; in devlink_nl_sb_occ_max_clear_doit()
929 if (ops->sb_occ_max_clear) in devlink_nl_sb_occ_max_clear_doit()
930 return ops->sb_occ_max_clear(devlink, devlink_sb->index); in devlink_nl_sb_occ_max_clear_doit()
931 return -EOPNOTSUPP; in devlink_nl_sb_occ_max_clear_doit()
934 int devl_sb_register(struct devlink *devlink, unsigned int sb_index, in devl_sb_register()
941 lockdep_assert_held(&devlink->lock); in devl_sb_register()
944 return -EEXIST; in devl_sb_register()
948 return -ENOMEM; in devl_sb_register()
949 devlink_sb->index = sb_index; in devl_sb_register()
950 devlink_sb->size = size; in devl_sb_register()
951 devlink_sb->ingress_pools_count = ingress_pools_count; in devl_sb_register()
952 devlink_sb->egress_pools_count = egress_pools_count; in devl_sb_register()
953 devlink_sb->ingress_tc_count = ingress_tc_count; in devl_sb_register()
954 devlink_sb->egress_tc_count = egress_tc_count; in devl_sb_register()
955 list_add_tail(&devlink_sb->list, &devlink->sb_list); in devl_sb_register()
960 int devlink_sb_register(struct devlink *devlink, unsigned int sb_index, in devlink_sb_register()
965 int err; in devlink_sb_register()
976 void devl_sb_unregister(struct devlink *devlink, unsigned int sb_index) in devl_sb_unregister()
980 lockdep_assert_held(&devlink->lock); in devl_sb_unregister()
984 list_del(&devlink_sb->list); in devl_sb_unregister()
989 void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index) in devlink_sb_unregister()