summaryrefslogtreecommitdiff
path: root/internal/generate/classify_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/generate/classify_test.go')
-rw-r--r--internal/generate/classify_test.go14
1 files changed, 10 insertions, 4 deletions
diff --git a/internal/generate/classify_test.go b/internal/generate/classify_test.go
index 77e19d1..bebf85e 100644
--- a/internal/generate/classify_test.go
+++ b/internal/generate/classify_test.go
@@ -2276,10 +2276,16 @@ func TestClassifySchedGetattrPidNotFd(t *testing.T) {
// IPC like the futex_* shared-memory primitives (see family.go / family_test.go),
// - return classifies as UNCLASSIFIED (0/-1, no byte transfer).
//
-// NOTE: get_robust_list/set_robust_list are robust-futex bookkeeping and could
-// arguably sit with futex_* under IPC; that grouping question is tracked as a
-// follow-up rather than changed here, since the syscalls register/query a
-// per-thread pointer (like rseq) rather than operating on shared memory.
+// FAMILY DECISION (resolved): get_robust_list/set_robust_list stay FamilyMisc and
+// are NOT moved to FamilyIPC for "futex consistency". The boundary rule (spelled
+// out next to the futex block in family.go) is operation-vs-registration: a
+// syscall is IPC only if it PERFORMS the actual IPC/sync operation (futex
+// wait/wake/requeue, or an op on an IPC object). These two only register/query
+// the per-thread robust-futex list head pointer — per get_robust_list(2) the list
+// is "managed in user space: the kernel knows only about the location of the head"
+// — and never wait, wake, or touch the shared futex word. That is per-thread
+// bookkeeping, structurally identical to rseq, so they share rseq's Misc family.
+// The contrast assertion below (futex == IPC) pins both sides of the boundary.
func TestClassifyGetRobustListPidNotFd(t *testing.T) {
// Field layout mirrors the actual kernel tracepoint format for
// sys_enter_get_robust_list: int pid, struct robust_list_head **head_ptr,