kprobe из tcp_retransmit_skb. вместо tcp_retransmit_skb @tcp_states я хочу kprobe __napi_schedule

В книге BPF Performance Tools есть реализация kprobe tcp_retransmit_skb. Я хочу сделать то же самое, но вместо tcp_retransmit_skb @tcp_states я хочу kprobe _napi_schedule и инвертировать перечисление NAPI_STATE* из include/linux/netdevice.h. Вот моя реализация вышеизложенного:

 1 #!/usr/local/bin/bpftrace
  2
  3 #include <linux/netdevice.h>
  4
  5 kprobe:__napi_schedule
  6 {
  7         $ns = (struct napi_struct *)arg0;
  8
  9         // Poll is scheduled
 10         @napi[1] = "NAPI_STATE_SCHED";
 11         @napi[2] = "NAPI_STATE_DISABLE";
 12         @napi[3] = "NAPI_STATE_NPSVC";
 13         @napi[4] = "NAPI_STATE_HASHED";
 14         @napi[5] = "NAPI_STATE_NO_BUSY_POLL";
 15
 16
 17         printf("-------------------\n");
 18         printf("\n");
 19         printf("__napi_schedule: %s pid: %d\n", comm, pid);
 20         printf("\n");
 21         $state = $ns->state;
 22         printf("$ns->state: %d\n", $state);
 23         $statestr = @napi[$state];
 24         printf("state is: %s\n", $statestr);
 25         clear(@napi);
 26         printf("--------------------\n");
 27 }

Когда я пытался запустить его, он ничего не показывает в моем printf о состоянии.

Результат:

...
__napi_schedule: tmux: server pid: 9003

$ns->state: 17
state is:
--------------------
-------------------

__napi_schedule: tmux: server pid: 9003

$ns->state: 17
state is:
--------------------
-------------------

__napi_schedule: tmux: server pid: 9003

$ns->state: 17
state is:
--------------------
...

1 ответ

$ns->state - битовый массив, поэтому значение 17 на самом деле (1 << NAPI_STATE_SCHED) | (1 << NAPI_STATE_HASHED).

Вам нужно будет пройтись по битам, чтобы проанализировать значение и отобразить эквивалентную строку.

Другие вопросы по тегам