Lines Matching full:region
29 struct devlink_region *region; member
37 struct devlink_region *region; in devlink_region_get_by_name() local
39 list_for_each_entry(region, &devlink->region_list, list) in devlink_region_get_by_name()
40 if (!strcmp(region->ops->name, region_name)) in devlink_region_get_by_name()
41 return region; in devlink_region_get_by_name()
50 struct devlink_region *region; in devlink_port_region_get_by_name() local
52 list_for_each_entry(region, &port->region_list, list) in devlink_port_region_get_by_name()
53 if (!strcmp(region->ops->name, region_name)) in devlink_port_region_get_by_name()
54 return region; in devlink_port_region_get_by_name()
60 devlink_region_snapshot_get_by_id(struct devlink_region *region, u32 id) in devlink_region_snapshot_get_by_id() argument
64 list_for_each_entry(snapshot, ®ion->snapshot_list, list) in devlink_region_snapshot_get_by_id()
96 struct devlink_region *region) in devlink_nl_region_snapshots_id_put() argument
107 list_for_each_entry(snapshot, ®ion->snapshot_list, list) { in devlink_nl_region_snapshots_id_put()
124 struct devlink_region *region) in devlink_nl_region_fill() argument
137 if (region->port) { in devlink_nl_region_fill()
139 region->port->index); in devlink_nl_region_fill()
144 err = nla_put_string(msg, DEVLINK_ATTR_REGION_NAME, region->ops->name); in devlink_nl_region_fill()
148 err = devlink_nl_put_u64(msg, DEVLINK_ATTR_REGION_SIZE, region->size); in devlink_nl_region_fill()
153 region->max_snapshots); in devlink_nl_region_fill()
157 err = devlink_nl_region_snapshots_id_put(msg, devlink, region); in devlink_nl_region_fill()
170 devlink_nl_region_notify_build(struct devlink_region *region, in devlink_nl_region_notify_build() argument
174 struct devlink *devlink = region->devlink; in devlink_nl_region_notify_build()
193 if (region->port) { in devlink_nl_region_notify_build()
195 region->port->index); in devlink_nl_region_notify_build()
201 region->ops->name); in devlink_nl_region_notify_build()
212 region->size); in devlink_nl_region_notify_build()
227 static void devlink_nl_region_notify(struct devlink_region *region, in devlink_nl_region_notify() argument
231 struct devlink *devlink = region->devlink; in devlink_nl_region_notify()
239 msg = devlink_nl_region_notify_build(region, snapshot, cmd, 0, 0); in devlink_nl_region_notify()
248 struct devlink_region *region; in devlink_regions_notify_register() local
250 list_for_each_entry(region, &devlink->region_list, list) in devlink_regions_notify_register()
251 devlink_nl_region_notify(region, NULL, DEVLINK_CMD_REGION_NEW); in devlink_regions_notify_register()
256 struct devlink_region *region; in devlink_regions_notify_unregister() local
258 list_for_each_entry_reverse(region, &devlink->region_list, list) in devlink_regions_notify_unregister()
259 devlink_nl_region_notify(region, NULL, DEVLINK_CMD_REGION_DEL); in devlink_regions_notify_unregister()
402 * This will add a new snapshot of a region. The snapshot
403 * will be stored on the region struct and can be accessed
405 * Multiple snapshots can be created on a region.
408 * Must be called only while holding the region snapshot lock.
410 * @region: devlink region of the snapshot
415 __devlink_region_snapshot_create(struct devlink_region *region, in __devlink_region_snapshot_create() argument
418 struct devlink *devlink = region->devlink; in __devlink_region_snapshot_create()
422 lockdep_assert_held(®ion->snapshot_lock); in __devlink_region_snapshot_create()
424 /* check if region can hold one more snapshot */ in __devlink_region_snapshot_create()
425 if (region->cur_snapshots == region->max_snapshots) in __devlink_region_snapshot_create()
428 if (devlink_region_snapshot_get_by_id(region, snapshot_id)) in __devlink_region_snapshot_create()
440 snapshot->region = region; in __devlink_region_snapshot_create()
443 list_add_tail(&snapshot->list, ®ion->snapshot_list); in __devlink_region_snapshot_create()
445 region->cur_snapshots++; in __devlink_region_snapshot_create()
447 devlink_nl_region_notify(region, snapshot, DEVLINK_CMD_REGION_NEW); in __devlink_region_snapshot_create()
455 static void devlink_region_snapshot_del(struct devlink_region *region, in devlink_region_snapshot_del() argument
458 struct devlink *devlink = region->devlink; in devlink_region_snapshot_del()
460 lockdep_assert_held(®ion->snapshot_lock); in devlink_region_snapshot_del()
462 devlink_nl_region_notify(region, snapshot, DEVLINK_CMD_REGION_DEL); in devlink_region_snapshot_del()
463 region->cur_snapshots--; in devlink_region_snapshot_del()
465 region->ops->destructor(snapshot->data); in devlink_region_snapshot_del()
474 struct devlink_region *region; in devlink_nl_region_get_doit() local
493 region = devlink_port_region_get_by_name(port, region_name); in devlink_nl_region_get_doit()
495 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_region_get_doit()
497 if (!region) in devlink_nl_region_get_doit()
506 region); in devlink_nl_region_get_doit()
520 struct devlink_region *region; in devlink_nl_cmd_region_get_port_dumpit() local
523 list_for_each_entry(region, &port->region_list, list) { in devlink_nl_cmd_region_get_port_dumpit()
532 flags, region); in devlink_nl_cmd_region_get_port_dumpit()
548 struct devlink_region *region; in devlink_nl_region_get_dump_one() local
554 list_for_each_entry(region, &devlink->region_list, list) { in devlink_nl_region_get_dump_one()
563 region); in devlink_nl_region_get_dump_one()
594 struct devlink_region *region; in devlink_nl_region_del_doit() local
615 region = devlink_port_region_get_by_name(port, region_name); in devlink_nl_region_del_doit()
617 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_region_del_doit()
619 if (!region) in devlink_nl_region_del_doit()
622 mutex_lock(®ion->snapshot_lock); in devlink_nl_region_del_doit()
623 snapshot = devlink_region_snapshot_get_by_id(region, snapshot_id); in devlink_nl_region_del_doit()
625 mutex_unlock(®ion->snapshot_lock); in devlink_nl_region_del_doit()
629 devlink_region_snapshot_del(region, snapshot); in devlink_nl_region_del_doit()
630 mutex_unlock(®ion->snapshot_lock); in devlink_nl_region_del_doit()
640 struct devlink_region *region; in devlink_nl_region_new_doit() local
648 NL_SET_ERR_MSG(info->extack, "No region name provided"); in devlink_nl_region_new_doit()
663 region = devlink_port_region_get_by_name(port, region_name); in devlink_nl_region_new_doit()
665 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_region_new_doit()
667 if (!region) { in devlink_nl_region_new_doit()
668 NL_SET_ERR_MSG(info->extack, "The requested region does not exist"); in devlink_nl_region_new_doit()
672 if (!region->ops->snapshot) { in devlink_nl_region_new_doit()
673 …NL_SET_ERR_MSG(info->extack, "The requested region does not support taking an immediate snapshot"); in devlink_nl_region_new_doit()
677 mutex_lock(®ion->snapshot_lock); in devlink_nl_region_new_doit()
679 if (region->cur_snapshots == region->max_snapshots) { in devlink_nl_region_new_doit()
680 NL_SET_ERR_MSG(info->extack, "The region has reached the maximum number of stored snapshots"); in devlink_nl_region_new_doit()
689 if (devlink_region_snapshot_get_by_id(region, snapshot_id)) { in devlink_nl_region_new_doit()
707 err = region->port_ops->snapshot(port, region->port_ops, in devlink_nl_region_new_doit()
710 err = region->ops->snapshot(devlink, region->ops, in devlink_nl_region_new_doit()
715 err = __devlink_region_snapshot_create(region, data, snapshot_id); in devlink_nl_region_new_doit()
722 snapshot = devlink_region_snapshot_get_by_id(region, in devlink_nl_region_new_doit()
729 msg = devlink_nl_region_notify_build(region, snapshot, in devlink_nl_region_new_doit()
742 mutex_unlock(®ion->snapshot_lock); in devlink_nl_region_new_doit()
746 region->ops->destructor(data); in devlink_nl_region_new_doit()
749 mutex_unlock(®ion->snapshot_lock); in devlink_nl_region_new_doit()
753 devlink_region_snapshot_del(region, snapshot); in devlink_nl_region_new_doit()
755 mutex_unlock(®ion->snapshot_lock); in devlink_nl_region_new_doit()
847 struct devlink_region *region = cb_priv; in devlink_region_port_direct_fill() local
849 return region->port_ops->read(region->port, region->port_ops, extack, in devlink_region_port_direct_fill()
857 struct devlink_region *region = cb_priv; in devlink_region_direct_fill() local
859 return region->ops->read(region->devlink, region->ops, extack, in devlink_region_direct_fill()
873 struct devlink_region *region; in devlink_nl_region_read_dumpit() local
889 NL_SET_ERR_MSG(cb->extack, "No region name provided"); in devlink_nl_region_read_dumpit()
908 region = devlink_port_region_get_by_name(port, region_name); in devlink_nl_region_read_dumpit()
910 region = devlink_region_get_by_name(devlink, region_name); in devlink_nl_region_read_dumpit()
912 if (!region) { in devlink_nl_region_read_dumpit()
913 NL_SET_ERR_MSG_ATTR(cb->extack, region_attr, "Requested region does not exist"); in devlink_nl_region_read_dumpit()
926 if (!region->ops->read) { in devlink_nl_region_read_dumpit()
927 NL_SET_ERR_MSG(cb->extack, "Requested region does not support direct read"); in devlink_nl_region_read_dumpit()
936 region_cb_priv = region; in devlink_nl_region_read_dumpit()
942 NL_SET_ERR_MSG_ATTR(cb->extack, snapshot_attr, "Direct region read does not use snapshot"); in devlink_nl_region_read_dumpit()
948 snapshot = devlink_region_snapshot_get_by_id(region, snapshot_id); in devlink_nl_region_read_dumpit()
968 if (end_offset > region->size) in devlink_nl_region_read_dumpit()
969 end_offset = region->size; in devlink_nl_region_read_dumpit()
989 if (region->port) { in devlink_nl_region_read_dumpit()
991 region->port->index); in devlink_nl_region_read_dumpit()
1036 * devl_region_create - create a new address region
1039 * @ops: region operations and name
1040 * @region_max_snapshots: Maximum supported number of snapshots for region
1041 * @region_size: size of region
1048 struct devlink_region *region; in devl_region_create() local
1058 region = kzalloc(sizeof(*region), GFP_KERNEL); in devl_region_create()
1059 if (!region) in devl_region_create()
1062 region->devlink = devlink; in devl_region_create()
1063 region->max_snapshots = region_max_snapshots; in devl_region_create()
1064 region->ops = ops; in devl_region_create()
1065 region->size = region_size; in devl_region_create()
1066 INIT_LIST_HEAD(®ion->snapshot_list); in devl_region_create()
1067 mutex_init(®ion->snapshot_lock); in devl_region_create()
1068 list_add_tail(®ion->list, &devlink->region_list); in devl_region_create()
1069 devlink_nl_region_notify(region, NULL, DEVLINK_CMD_REGION_NEW); in devl_region_create()
1071 return region; in devl_region_create()
1076 * devlink_region_create - create a new address region
1079 * @ops: region operations and name
1080 * @region_max_snapshots: Maximum supported number of snapshots for region
1081 * @region_size: size of region
1090 struct devlink_region *region; in devlink_region_create() local
1093 region = devl_region_create(devlink, ops, region_max_snapshots, in devlink_region_create()
1096 return region; in devlink_region_create()
1101 * devlink_port_region_create - create a new address region for a port
1104 * @ops: region operations and name
1105 * @region_max_snapshots: Maximum supported number of snapshots for region
1106 * @region_size: size of region
1116 struct devlink_region *region; in devlink_port_region_create() local
1131 region = kzalloc(sizeof(*region), GFP_KERNEL); in devlink_port_region_create()
1132 if (!region) { in devlink_port_region_create()
1137 region->devlink = devlink; in devlink_port_region_create()
1138 region->port = port; in devlink_port_region_create()
1139 region->max_snapshots = region_max_snapshots; in devlink_port_region_create()
1140 region->port_ops = ops; in devlink_port_region_create()
1141 region->size = region_size; in devlink_port_region_create()
1142 INIT_LIST_HEAD(®ion->snapshot_list); in devlink_port_region_create()
1143 mutex_init(®ion->snapshot_lock); in devlink_port_region_create()
1144 list_add_tail(®ion->list, &port->region_list); in devlink_port_region_create()
1145 devlink_nl_region_notify(region, NULL, DEVLINK_CMD_REGION_NEW); in devlink_port_region_create()
1148 return region; in devlink_port_region_create()
1157 * devl_region_destroy - destroy address region
1159 * @region: devlink region to destroy
1161 void devl_region_destroy(struct devlink_region *region) in devl_region_destroy() argument
1163 struct devlink *devlink = region->devlink; in devl_region_destroy()
1168 /* Free all snapshots of region */ in devl_region_destroy()
1169 mutex_lock(®ion->snapshot_lock); in devl_region_destroy()
1170 list_for_each_entry_safe(snapshot, ts, ®ion->snapshot_list, list) in devl_region_destroy()
1171 devlink_region_snapshot_del(region, snapshot); in devl_region_destroy()
1172 mutex_unlock(®ion->snapshot_lock); in devl_region_destroy()
1174 list_del(®ion->list); in devl_region_destroy()
1175 mutex_destroy(®ion->snapshot_lock); in devl_region_destroy()
1177 devlink_nl_region_notify(region, NULL, DEVLINK_CMD_REGION_DEL); in devl_region_destroy()
1178 kfree(region); in devl_region_destroy()
1183 * devlink_region_destroy - destroy address region
1185 * @region: devlink region to destroy
1189 void devlink_region_destroy(struct devlink_region *region) in devlink_region_destroy() argument
1191 struct devlink *devlink = region->devlink; in devlink_region_destroy()
1194 devl_region_destroy(region); in devlink_region_destroy()
1238 * This will add a new snapshot of a region. The snapshot
1239 * will be stored on the region struct and can be accessed
1241 * Multiple snapshots can be created on a region.
1244 * @region: devlink region of the snapshot
1248 int devlink_region_snapshot_create(struct devlink_region *region, in devlink_region_snapshot_create() argument
1253 mutex_lock(®ion->snapshot_lock); in devlink_region_snapshot_create()
1254 err = __devlink_region_snapshot_create(region, data, snapshot_id); in devlink_region_snapshot_create()
1255 mutex_unlock(®ion->snapshot_lock); in devlink_region_snapshot_create()