diff --git a/Makefile b/Makefile index d51d582..14cbe97 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,8 @@ ifneq ($(KERNELRELEASE),) # kbuild part of makefile -obj-m := hello.o +obj-m := hello1.o hello2.o +ccflags-y := -I$(obj)/inc else # normal makefile KDIR ?= /lib/modules/`uname -r`/build diff --git a/hello.c b/hello1.c similarity index 79% rename from hello.c rename to hello1.c index 3692c5e..ac30d84 100644 --- a/hello.c +++ b/hello1.c @@ -40,48 +40,54 @@ MODULE_LICENSE("Dual BSD/GPL"); struct TimingList { struct TimingList *next; - ktime_t t; + ktime_t t_before; + ktime_t t_after; }; static unsigned int msg_count = 1; static struct TimingList *tl_head; -static void init_new_list(void) +static struct TimingList* write_first_node(void) { tl_head = kmalloc(sizeof(struct TimingList), GFP_KERNEL); - tl_head->next = NULL; - tl_head->t = ktime_get(); + + return tl_head; } -static void insert_new_time(void) +static struct TimingList* insert_next_node(struct TimingList *tail) { - struct TimingList *last_tl_node = tl_head; struct TimingList *new_tl_node = kmalloc(sizeof(struct TimingList), GFP_KERNEL); - while (last_tl_node->next != NULL) - last_tl_node = last_tl_node->next; - - + tail->next = new_tl_node; new_tl_node->next = NULL; - new_tl_node->t = ktime_get(); - last_tl_node->next = new_tl_node; + return new_tl_node; } -static void print_time(ktime_t *t) +static struct TimingList* add_new_node(struct TimingList *tail) { - printk(KERN_EMERG "%lld\n", *t); + if (tail == NULL) + return write_first_node(); + else + return insert_next_node(tail); } -static void destroy_list(void) +static void print_time_diff(struct TimingList *node) +{ + printk(KERN_EMERG "%lld\n", node->t_after - node->t_before); +} + +void destroy_list(void) { struct TimingList *curr_tl = tl_head; struct TimingList *next_tl = NULL; + tl_head = NULL; + while (curr_tl != NULL) { - print_time(&(curr_tl->t)); + print_time_diff(curr_tl); next_tl = curr_tl->next; kfree(curr_tl); @@ -89,18 +95,8 @@ static void destroy_list(void) } } -static void update_timing_list(void) -{ - if (tl_head == NULL) - init_new_list(); - else - insert_new_time(); -} - static int __init hello_init(void) { - int i; - if (msg_count > 10) { printk(KERN_EMERG "Error: msg_count too large (%d > 10)\n", msg_count); @@ -112,15 +108,23 @@ static int __init hello_init(void) msg_count); } - for (i = 0; i < msg_count; i++) { - update_timing_list(); - - printk(KERN_EMERG "Hello, world!\n"); - } - return 0; } +void print_hello(void) +{ + int i; + struct TimingList *current_tail = tl_head; + + for (i = 0; i < msg_count; i++) { + current_tail = add_new_node(current_tail); + + current_tail->t_before = ktime_get(); + printk(KERN_EMERG "Hello, world!\n"); + current_tail->t_after = ktime_get(); + } +} + static void __exit hello_exit(void) { destroy_list(); @@ -129,5 +133,8 @@ static void __exit hello_exit(void) module_param(msg_count, uint, 0444); MODULE_PARM_DESC(msg_count, "Amount of hello world outputs on load"); +EXPORT_SYMBOL(print_hello); +EXPORT_SYMBOL(destroy_list); + module_init(hello_init); module_exit(hello_exit); diff --git a/hello2.c b/hello2.c new file mode 100644 index 0000000..f24cf26 --- /dev/null +++ b/hello2.c @@ -0,0 +1,55 @@ + +/* + * Copyright (c) 2017, GlobalLogic Ukraine LLC + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the GlobalLogic. + * 4. Neither the name of the GlobalLogic nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY GLOBALLOGIC UKRAINE LLC ``AS IS`` AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL GLOBALLOGIC UKRAINE LLC BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include "hello1.h" + +MODULE_AUTHOR("Serhii Popovych "); +MODULE_DESCRIPTION("Hello, world in Linux Kernel Training"); +MODULE_LICENSE("Dual BSD/GPL"); + +static int __init hello_init(void) +{ + print_hello(); + return 0; +} + +static void __exit hello_exit(void) +{ + destroy_list(); +} + +module_init(hello_init); +module_exit(hello_exit); diff --git a/inc/hello1.h b/inc/hello1.h new file mode 100644 index 0000000..5766863 --- /dev/null +++ b/inc/hello1.h @@ -0,0 +1,2 @@ +void print_hello(void); +void destroy_list(void);