summaryrefslogtreecommitdiff
path: root/tools/perf/tests/fdarray.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/tests/fdarray.c')
-rw-r--r--tools/perf/tests/fdarray.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/tools/perf/tests/fdarray.c b/tools/perf/tests/fdarray.c
index 40983c3574b1..23860edb8ef0 100644
--- a/tools/perf/tests/fdarray.c
+++ b/tools/perf/tests/fdarray.c
@@ -80,6 +80,38 @@ static int test__fdarray__filter(struct test_suite *test __maybe_unused, int sub
goto out_delete;
}
+ fdarray__init_revents(fda, POLLHUP);
+ fda->priv[2].flags = fdarray_flag__nonfilterable;
+
+ pr_debug("\nfiltering all but fda->entries[2] (nonfilterable):");
+ fdarray__fprintf_prefix(fda, "before", stderr);
+
+ /*
+ * Note: fdarray__filter() in tools/lib/api/fd/array.c evaluates the
+ * fdarray_flag__nonfilterable flag at the very top of its loop via an
+ * early continue. Therefore, it completely skips all processing for this
+ * descriptor, guaranteeing its fd, events, and revents fields remain
+ * entirely untouched by the filter mask evaluation below it.
+ */
+ nr_fds = fdarray__filter(fda, POLLHUP, NULL, NULL);
+ fdarray__fprintf_prefix(fda, " after", stderr);
+
+ if (nr_fds != 0) {
+ pr_debug("\nfdarray__filter()=%d != 0, should be 0\n",
+ nr_fds);
+ goto out_delete;
+ }
+ if (fda->entries[2].fd == -1) {
+ pr_debug("\nfdarray__filter() illegally modified nonfilterable fd!");
+ goto out_delete;
+ }
+ if (fda->entries[2].revents != POLLHUP) {
+ pr_debug("\nfdarray__filter() illegally modified nonfilterable revents!");
+ goto out_delete;
+ }
+
+ fda->priv[2].flags = 0; /* reset flags */
+
pr_debug("\n");
err = 0;