#define pr_fmt(fmt) …
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/kmod.h>
#include <linux/printk.h>
#include <linux/kthread.h>
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/vmalloc.h>
#include <linux/slab.h>
#include <linux/device.h>
#define TEST_START_NUM_THREADS …
#define TEST_START_DRIVER …
#define TEST_START_TEST_FS …
#define TEST_START_TEST_CASE …
static bool force_init_test = …;
module_param(force_init_test, bool_enable_only, 0644);
MODULE_PARM_DESC(…) …;
static DEFINE_MUTEX(reg_dev_mutex);
static LIST_HEAD(reg_test_devs);
static int num_test_devs;
enum kmod_test_case { … };
struct test_config { … };
struct kmod_test_device;
struct kmod_test_device_info { … };
struct kmod_test_device { … };
static const char *test_case_str(enum kmod_test_case test_case)
{ … }
static struct miscdevice *dev_to_misc_dev(struct device *dev)
{ … }
static struct kmod_test_device *misc_dev_to_test_dev(struct miscdevice *misc_dev)
{ … }
static struct kmod_test_device *dev_to_test_dev(struct device *dev)
{ … }
static void kmod_test_done_check(struct kmod_test_device *test_dev,
unsigned int idx)
{ … }
static void test_kmod_put_module(struct kmod_test_device_info *info)
{ … }
static int run_request(void *data)
{ … }
static int tally_work_test(struct kmod_test_device_info *info)
{ … }
static void tally_up_work(struct kmod_test_device *test_dev)
{ … }
static int try_one_request(struct kmod_test_device *test_dev, unsigned int idx)
{ … }
static void test_dev_kmod_stop_tests(struct kmod_test_device *test_dev)
{ … }
static int try_requests(struct kmod_test_device *test_dev)
{ … }
static int run_test_driver(struct kmod_test_device *test_dev)
{ … }
static int run_test_fs_type(struct kmod_test_device *test_dev)
{ … }
static ssize_t config_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{ … }
static DEVICE_ATTR_RO(config);
static int __trigger_config_run(struct kmod_test_device *test_dev)
{ … }
static int trigger_config_run(struct kmod_test_device *test_dev)
{ … }
static ssize_t
trigger_config_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static DEVICE_ATTR_WO(trigger_config);
static int __kstrncpy(char **dst, const char *name, size_t count, gfp_t gfp)
{ … }
static int config_copy_test_driver_name(struct test_config *config,
const char *name,
size_t count)
{ … }
static int config_copy_test_fs(struct test_config *config, const char *name,
size_t count)
{ … }
static void __kmod_config_free(struct test_config *config)
{ … }
static void kmod_config_free(struct kmod_test_device *test_dev)
{ … }
static ssize_t config_test_driver_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static ssize_t config_test_show_str(struct mutex *config_mutex,
char *dst,
char *src)
{ … }
static ssize_t config_test_driver_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{ … }
static DEVICE_ATTR_RW(config_test_driver);
static ssize_t config_test_fs_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static ssize_t config_test_fs_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{ … }
static DEVICE_ATTR_RW(config_test_fs);
static int trigger_config_run_type(struct kmod_test_device *test_dev,
enum kmod_test_case test_case,
const char *test_str)
{ … }
static void free_test_dev_info(struct kmod_test_device *test_dev)
{ … }
static int kmod_config_sync_info(struct kmod_test_device *test_dev)
{ … }
#ifdef get_kmod_umh_limit
static unsigned int kmod_init_test_thread_limit(void)
{
return get_kmod_umh_limit();
}
#else
static unsigned int kmod_init_test_thread_limit(void)
{ … }
#endif
static int __kmod_config_init(struct kmod_test_device *test_dev)
{ … }
static ssize_t reset_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static DEVICE_ATTR_WO(reset);
static int test_dev_config_update_uint_sync(struct kmod_test_device *test_dev,
const char *buf, size_t size,
unsigned int *config,
int (*test_sync)(struct kmod_test_device *test_dev))
{ … }
static int test_dev_config_update_uint_range(struct kmod_test_device *test_dev,
const char *buf, size_t size,
unsigned int *config,
unsigned int min,
unsigned int max)
{ … }
static int test_dev_config_update_int(struct kmod_test_device *test_dev,
const char *buf, size_t size,
int *config)
{ … }
static ssize_t test_dev_config_show_int(struct kmod_test_device *test_dev,
char *buf,
int config)
{ … }
static ssize_t test_dev_config_show_uint(struct kmod_test_device *test_dev,
char *buf,
unsigned int config)
{ … }
static ssize_t test_result_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static ssize_t config_num_threads_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static ssize_t config_num_threads_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{ … }
static DEVICE_ATTR_RW(config_num_threads);
static ssize_t config_test_case_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{ … }
static ssize_t config_test_case_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{ … }
static DEVICE_ATTR_RW(config_test_case);
static ssize_t test_result_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{ … }
static DEVICE_ATTR_RW(test_result);
#define TEST_KMOD_DEV_ATTR(name) …
static struct attribute *test_dev_attrs[] = …;
ATTRIBUTE_GROUPS(…);
static int kmod_config_init(struct kmod_test_device *test_dev)
{ … }
static struct kmod_test_device *alloc_test_dev_kmod(int idx)
{ … }
static void free_test_dev_kmod(struct kmod_test_device *test_dev)
{ … }
static struct kmod_test_device *register_test_dev_kmod(void)
{ … }
static int __init test_kmod_init(void)
{ … }
late_initcall(test_kmod_init);
static
void unregister_test_dev_kmod(struct kmod_test_device *test_dev)
{ … }
static void __exit test_kmod_exit(void)
{ … }
module_exit(test_kmod_exit);
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;