--- /dev/null
+# Comment/uncomment the following line to disable/enable debugging
+#DEBUG = y
+
+# Add your debugging flag (or not) to CFLAGS
+ifeq ($(DEBUG),y)
+ DEBFLAGS = -O -g # "-O" is needed to expand inlines
+else
+ DEBFLAGS = -O2
+endif
+
+EXTRA_CFLAGS += $(DEBFLAGS) -I$(LDDINCDIR)
+
+ifneq ($(KERNELRELEASE),)
+# call from kernel build system
+
+obj-m := spinlock_hog.o
+
+else
+
+KERNELDIR ?= /lib/modules/$(shell uname -r)/build
+PWD := $(shell pwd)
+
+default:
+ $(MAKE) -C $(KERNELDIR) M=$(PWD) LDDINCDIR=$(PWD)/../include modules
+
+endif
+
+clean:
+ rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
+
+depend .depend dep:
+ $(CC) $(CFLAGS) -M *.c > .depend
+
+
+ifeq (.depend,$(wildcard .depend))
+include .depend
+endif
--- /dev/null
+#include <linux/module.h>
+#include <linux/init.h>
+#include <asm/tsc.h>
+#include <linux/spinlock.h>
+MODULE_AUTHOR("Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>");
+MODULE_DESCRIPTION("spinlock");
+MODULE_LICENSE("GPL");
+MODULE_VERSION("0.1");
+unsigned long loops = 10000000;
+
+
+module_param(loops, ulong, 0644);
+MODULE_PARM_DESC(loops, "How many loops (default is 10000000)");
+
+static DEFINE_SPINLOCK(lock);
+
+static void take_lock(void *arg)
+{
+ spin_lock(&lock);
+ spin_unlock(&lock);
+}
+static int __init spinlock_hog_init(void)
+{
+
+ cycles_t start, end;
+ unsigned long long i;
+
+ start = get_cycles();
+ for (i = 0; i < loops; i++ )
+ (void)smp_call_function(take_lock, NULL, 1);
+ end = get_cycles();
+ printk("cycles: %lld\n", (unsigned long long)end - start);
+ return -EIO; /* Just so we don't get loaded. */
+}
+static void __exit spinlock_hog_exit(void)
+{
+}
+module_init(spinlock_hog_init);
+module_exit(spinlock_hog_exit);