|
40 | 40 | """ include/linux/sunrpc/sched.h """
|
41 | 41 |
|
42 | 42 |
|
43 |
| -class RpcTaskState(BitNumberFlags): |
| 43 | +class RpcTaskState_1(BitNumberFlags): |
| 44 | + RPC_TASK_RUNNING = 0 |
| 45 | + RPC_TASK_QUEUED = 1 |
| 46 | + RPC_TASK_ACTIVE = 2 |
| 47 | + |
| 48 | + |
| 49 | +# 729749bb8da1 SUNRPC: Don't hold the transport lock across socket copy operations |
| 50 | +class RpcTaskState_2(BitNumberFlags): |
44 | 51 | RPC_TASK_RUNNING = 0
|
45 | 52 | RPC_TASK_QUEUED = 1
|
46 | 53 | RPC_TASK_ACTIVE = 2
|
47 | 54 | RPC_TASK_MSG_RECV = 3
|
48 | 55 | RPC_TASK_MSG_RECV_WAIT = 4
|
49 | 56 |
|
50 | 57 |
|
| 58 | +# 7ebbbc6e7bd0 SUNRPC: Simplify identification of when the message send/receive is complete |
| 59 | +class RpcTaskState_3(BitNumberFlags): |
| 60 | + RPC_TASK_RUNNING = 0 |
| 61 | + RPC_TASK_QUEUED = 1 |
| 62 | + RPC_TASK_ACTIVE = 2 |
| 63 | + RPC_TASK_NEED_XMIT = 3 |
| 64 | + RPC_TASK_NEED_RECV = 4 |
| 65 | + RPC_TASK_MSG_RECV = 5 |
| 66 | + RPC_TASK_MSG_RECV_WAIT = 6 |
| 67 | + |
| 68 | + |
| 69 | +# cf9946cd6144 SUNRPC: Refactor the transport request pinning |
| 70 | +class RpcTaskState_4(BitNumberFlags): |
| 71 | + RPC_TASK_RUNNING = 0 |
| 72 | + RPC_TASK_QUEUED = 1 |
| 73 | + RPC_TASK_ACTIVE = 2 |
| 74 | + RPC_TASK_NEED_XMIT = 3 |
| 75 | + RPC_TASK_NEED_RECV = 4 |
| 76 | + RPC_TASK_MSG_PIN_WAIT = 5 |
| 77 | + |
| 78 | + |
| 79 | +# ae67bd3821bb SUNRPC: Fix up task signalling |
| 80 | +class RpcTaskState_5(BitNumberFlags): |
| 81 | + RPC_TASK_RUNNING = 0 |
| 82 | + RPC_TASK_QUEUED = 1 |
| 83 | + RPC_TASK_ACTIVE = 2 |
| 84 | + RPC_TASK_NEED_XMIT = 3 |
| 85 | + RPC_TASK_NEED_RECV = 4 |
| 86 | + RPC_TASK_MSG_PIN_WAIT = 5 |
| 87 | + RPC_TASK_SIGNALLED = 6 |
| 88 | + |
| 89 | + |
| 90 | +def does_func_exist(prog: drgn.Program, func: str) -> bool: |
| 91 | + try: |
| 92 | + prog.symbol(func) |
| 93 | + return True |
| 94 | + except LookupError: |
| 95 | + return False |
| 96 | + |
| 97 | + |
| 98 | +def decode_tk_runstate(prog: drgn.Program, task: Object) -> str: |
| 99 | + """ |
| 100 | + Given a rpc_task, return the string representation of tk_runstate |
| 101 | +
|
| 102 | + :param task: rpc_task object |
| 103 | + :returns: tk_runstate decoded as string. |
| 104 | + """ |
| 105 | + |
| 106 | + if does_func_exist(prog, "xprt_pin_rqst") is False: |
| 107 | + return RpcTaskState_1.decode(task.tk_runstate.value_()) |
| 108 | + elif does_func_exist(prog, "xprt_request_data_received") is False: |
| 109 | + return RpcTaskState_2.decode(task.tk_runstate.value_()) |
| 110 | + elif has_member(task.tk_rqstp, "rq_pin") is False: |
| 111 | + return RpcTaskState_3.decode(task.tk_runstate.value_()) |
| 112 | + elif does_func_exist(prog, "rpc_signal_task") is False: |
| 113 | + return RpcTaskState_4.decode(task.tk_runstate.value_()) |
| 114 | + else: |
| 115 | + return RpcTaskState_5.decode(task.tk_runstate.value_()) |
| 116 | + |
| 117 | + |
51 | 118 | """ include/linux/sunrpc/xprt.h """
|
52 | 119 |
|
53 | 120 |
|
@@ -397,10 +464,7 @@ def display_rpc_tasks(
|
397 | 464 |
|
398 | 465 | print(
|
399 | 466 | " tk_runstate: 0x%x (%s)"
|
400 |
| - % ( |
401 |
| - task.tk_runstate, |
402 |
| - RpcTaskState.decode(task.tk_runstate.value_()), |
403 |
| - ) |
| 467 | + % (task.tk_runstate, decode_tk_runstate(prog, task)) |
404 | 468 | )
|
405 | 469 | print(
|
406 | 470 | " tk_priority: %d tk_timeout(ticks): %d tk_timeouts(major): %d"
|
|
0 commit comments