summaryrefslogtreecommitdiff
path: root/internal/generate
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-18 18:47:02 +0300
committerPaul Buetow <paul@buetow.org>2026-05-18 18:47:02 +0300
commit5c13a7321502c4a5767be17ed48e7cdb576deab3 (patch)
treefe155a1f8492471165762f8cf22796947149020a /internal/generate
parent7fb497c435596a36c0fb0bd0ecae2a84793bcc70 (diff)
j6: defer mmsg byte classification
Diffstat (limited to 'internal/generate')
-rw-r--r--internal/generate/classify.go2
-rw-r--r--internal/generate/classify_test.go18
-rw-r--r--internal/generate/retclassify_test.go17
3 files changed, 31 insertions, 6 deletions
diff --git a/internal/generate/classify.go b/internal/generate/classify.go
index b96ee0d..7768ea7 100644
--- a/internal/generate/classify.go
+++ b/internal/generate/classify.go
@@ -169,7 +169,6 @@ var retClassifications = map[string]RetClassification{
"readlink": ReadClassified,
"readlinkat": ReadClassified,
"readv": ReadClassified,
- "recvmmsg": ReadClassified,
"recvmsg": ReadClassified,
"recvfrom": ReadClassified,
"syslog": ReadClassified,
@@ -184,7 +183,6 @@ var retClassifications = map[string]RetClassification{
"pwrite64": WriteClassified,
"pwritev": WriteClassified,
"pwritev2": WriteClassified,
- "sendmmsg": WriteClassified,
"sendmsg": WriteClassified,
"sendto": WriteClassified,
"write": WriteClassified,
diff --git a/internal/generate/classify_test.go b/internal/generate/classify_test.go
index 4dd216e..ea7d662 100644
--- a/internal/generate/classify_test.go
+++ b/internal/generate/classify_test.go
@@ -372,11 +372,27 @@ func TestClassifyPhaseAByteSyscallPairsAccepted(t *testing.T) {
}
}
+func TestBatchMessageSyscallPairsDeferByteClassification(t *testing.T) {
+ tests := []string{"sendmmsg", "recvmmsg"}
+ for i, name := range tests {
+ t.Run(name, func(t *testing.T) {
+ output := GenerateTracepointsC(phaseAFormats(name, 9100+i*2))
+ if strings.Contains(output, "Ignoring") || strings.Contains(output, "Skipping") {
+ t.Fatalf("syscall %s was not accepted:\n%s", name, output)
+ }
+ if !strings.Contains(output, "/// sys_exit_"+name+" is a struct ret_event (UNCLASSIFIED)") {
+ t.Fatalf("sys_exit_%s should be generated without byte classification:\n%s", name, output)
+ }
+ })
+ }
+}
+
func phaseAFormats(name string, enterID int) []Format {
enterFields := []Field{
{Type: "long", Name: "__syscall_nr"},
}
- if name == "sendto" || name == "recvfrom" || name == "sendmsg" || name == "recvmsg" {
+ if name == "sendto" || name == "recvfrom" || name == "sendmsg" || name == "recvmsg" ||
+ name == "sendmmsg" || name == "recvmmsg" {
enterFields = append(enterFields, Field{Type: "int", Name: "fd"})
}
diff --git a/internal/generate/retclassify_test.go b/internal/generate/retclassify_test.go
index 9a75a15..1c5b2ac 100644
--- a/internal/generate/retclassify_test.go
+++ b/internal/generate/retclassify_test.go
@@ -7,7 +7,7 @@ func TestClassifyRetRead(t *testing.T) {
"fgetxattr", "flistxattr", "getdents", "getdents64", "getxattr",
"lgetxattr", "listxattr", "llistxattr", "pread64", "preadv",
"preadv2", "process_vm_readv", "read", "readlink", "readlinkat",
- "readv", "recvmmsg", "recvmsg", "recvfrom", "syslog",
+ "readv", "recvmsg", "recvfrom", "syslog",
}
for _, name := range reads {
if got := ClassifyRet("sys_exit_" + name); got != ReadClassified {
@@ -19,7 +19,7 @@ func TestClassifyRetRead(t *testing.T) {
func TestClassifyRetWrite(t *testing.T) {
writes := []string{
"process_vm_writev", "pwrite64", "pwritev", "pwritev2",
- "sendmmsg", "sendmsg", "sendto", "write", "writev",
+ "sendmsg", "sendto", "write", "writev",
}
for _, name := range writes {
if got := ClassifyRet("sys_exit_" + name); got != WriteClassified {
@@ -43,7 +43,7 @@ func TestClassifyRetUnclassified(t *testing.T) {
unclassified := []string{
"openat", "close", "rename", "unlink", "fcntl", "dup", "dup2", "dup3",
"mkdir", "rmdir", "chmod", "chown", "chdir", "stat", "lseek",
- "truncate", "fallocate", "mmap", "fsync", "flock",
+ "truncate", "fallocate", "mmap", "fsync", "flock", "recvmmsg", "sendmmsg",
}
for _, name := range unclassified {
if got := ClassifyRet("sys_exit_" + name); got != Unclassified {
@@ -52,6 +52,17 @@ func TestClassifyRetUnclassified(t *testing.T) {
}
}
+func TestBatchMessageSyscallsDeferredFromRetByteClassification(t *testing.T) {
+ tests := []string{"recvmmsg", "sendmmsg"}
+ for _, name := range tests {
+ t.Run(name, func(t *testing.T) {
+ if got := ClassifyRet("sys_exit_" + name); got != Unclassified {
+ t.Fatalf("ClassifyRet(sys_exit_%s) = %q, want %q", name, got, Unclassified)
+ }
+ })
+ }
+}
+
func TestClassifyRetCaseInsensitive(t *testing.T) {
if got := ClassifyRet("sys_exit_READ"); got != ReadClassified {
t.Errorf("ClassifyRet(sys_exit_READ) = %q, want READ_CLASSIFIED", got)