iterators.bpf.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright (c) 2020 Facebook */
  3. #include <linux/bpf.h>
  4. #include <bpf/bpf_helpers.h>
  5. #include <bpf/bpf_core_read.h>
  6. #pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record)
  7. struct seq_file;
  8. struct bpf_iter_meta {
  9. struct seq_file *seq;
  10. __u64 session_id;
  11. __u64 seq_num;
  12. };
  13. struct bpf_map {
  14. __u32 id;
  15. char name[16];
  16. __u32 max_entries;
  17. };
  18. struct bpf_iter__bpf_map {
  19. struct bpf_iter_meta *meta;
  20. struct bpf_map *map;
  21. };
  22. struct btf_type {
  23. __u32 name_off;
  24. };
  25. struct btf_header {
  26. __u32 str_len;
  27. };
  28. struct btf {
  29. const char *strings;
  30. struct btf_type **types;
  31. struct btf_header hdr;
  32. };
  33. struct bpf_prog_aux {
  34. __u32 id;
  35. char name[16];
  36. const char *attach_func_name;
  37. struct bpf_prog *dst_prog;
  38. struct bpf_func_info *func_info;
  39. struct btf *btf;
  40. };
  41. struct bpf_prog {
  42. struct bpf_prog_aux *aux;
  43. };
  44. struct bpf_iter__bpf_prog {
  45. struct bpf_iter_meta *meta;
  46. struct bpf_prog *prog;
  47. };
  48. #pragma clang attribute pop
  49. static const char *get_name(struct btf *btf, long btf_id, const char *fallback)
  50. {
  51. struct btf_type **types, *t;
  52. unsigned int name_off;
  53. const char *str;
  54. if (!btf)
  55. return fallback;
  56. str = btf->strings;
  57. types = btf->types;
  58. bpf_probe_read_kernel(&t, sizeof(t), types + btf_id);
  59. name_off = BPF_CORE_READ(t, name_off);
  60. if (name_off >= btf->hdr.str_len)
  61. return fallback;
  62. return str + name_off;
  63. }
  64. __s64 bpf_map_sum_elem_count(struct bpf_map *map) __ksym;
  65. SEC("iter/bpf_map")
  66. int dump_bpf_map(struct bpf_iter__bpf_map *ctx)
  67. {
  68. struct seq_file *seq = ctx->meta->seq;
  69. __u64 seq_num = ctx->meta->seq_num;
  70. struct bpf_map *map = ctx->map;
  71. if (!map)
  72. return 0;
  73. if (seq_num == 0)
  74. BPF_SEQ_PRINTF(seq, " id name max_entries cur_entries\n");
  75. BPF_SEQ_PRINTF(seq, "%4u %-16s %10d %10lld\n",
  76. map->id, map->name, map->max_entries,
  77. bpf_map_sum_elem_count(map));
  78. return 0;
  79. }
  80. SEC("iter/bpf_prog")
  81. int dump_bpf_prog(struct bpf_iter__bpf_prog *ctx)
  82. {
  83. struct seq_file *seq = ctx->meta->seq;
  84. __u64 seq_num = ctx->meta->seq_num;
  85. struct bpf_prog *prog = ctx->prog;
  86. struct bpf_prog_aux *aux;
  87. if (!prog)
  88. return 0;
  89. aux = prog->aux;
  90. if (seq_num == 0)
  91. BPF_SEQ_PRINTF(seq, " id name attached\n");
  92. BPF_SEQ_PRINTF(seq, "%4u %-16s %s %s\n", aux->id,
  93. get_name(aux->btf, aux->func_info[0].type_id, aux->name),
  94. aux->attach_func_name, aux->dst_prog->aux->name);
  95. return 0;
  96. }
  97. char LICENSE[] SEC("license") = "GPL";