kunit: add a convenience allocation wrapper for SKBs
authorBenjamin Berg <benjamin.berg@intel.com>
Wed, 20 Dec 2023 15:19:48 +0000 (16:19 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 3 Jan 2024 14:35:07 +0000 (15:35 +0100)
Add a simple convenience helper to allocate and zero fill an SKB for the
use by a kunit test. Also provide a way to free it again in case that
may be desirable.

This simply mirrors the kunit_kmalloc API.

Signed-off-by: Benjamin Berg <benjamin.berg@intel.com>
Reviewed-by: David Gow <davidgow@google.com>
Link: https://msgid.link/20231220151952.415232-3-benjamin@sipsolutions.net
[adjust file description as discussed]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/kunit/skbuff.h [new file with mode: 0644]

diff --git a/include/kunit/skbuff.h b/include/kunit/skbuff.h
new file mode 100644 (file)
index 0000000..44d1237
--- /dev/null
@@ -0,0 +1,56 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * KUnit resource management helpers for SKBs (skbuff).
+ *
+ * Copyright (C) 2023 Intel Corporation
+ */
+
+#ifndef _KUNIT_SKBUFF_H
+#define _KUNIT_SKBUFF_H
+
+#include <kunit/resource.h>
+#include <linux/skbuff.h>
+
+static void kunit_action_kfree_skb(void *p)
+{
+       kfree_skb((struct sk_buff *)p);
+}
+
+/**
+ * kunit_zalloc_skb() - Allocate and initialize a resource managed skb.
+ * @test: The test case to which the skb belongs
+ * @len: size to allocate
+ *
+ * Allocate a new struct sk_buff with GFP_KERNEL, zero fill the give length
+ * and add it as a resource to the kunit test for automatic cleanup.
+ *
+ * Returns: newly allocated SKB, or %NULL on error
+ */
+static inline struct sk_buff *kunit_zalloc_skb(struct kunit *test, int len,
+                                              gfp_t gfp)
+{
+       struct sk_buff *res = alloc_skb(len, GFP_KERNEL);
+
+       if (!res || skb_pad(res, len))
+               return NULL;
+
+       if (kunit_add_action_or_reset(test, kunit_action_kfree_skb, res))
+               return NULL;
+
+       return res;
+}
+
+/**
+ * kunit_kfree_skb() - Like kfree_skb except for allocations managed by KUnit.
+ * @test: The test case to which the resource belongs.
+ * @skb: The SKB to free.
+ */
+static inline void kunit_kfree_skb(struct kunit *test, struct sk_buff *skb)
+{
+       if (!skb)
+               return;
+
+       kunit_release_action(test, kunit_action_kfree_skb, (void *)skb);
+}
+
+#endif /* _KUNIT_SKBUFF_H */