]> xenbits.xensource.com Git - xentesttools/bootstrap.git/commitdiff
spinlock_hog: A simple module that hogs all of the CPUs doing
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Fri, 19 Jul 2013 18:50:25 +0000 (14:50 -0400)
committerKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Fri, 19 Jul 2013 18:50:25 +0000 (14:50 -0400)
spinlock/unlock.

Will cause the 'softlockup' splat to show up.

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
root_image/drivers/Makefile
root_image/drivers/spinlock_hog/Makefile [new file with mode: 0644]
root_image/drivers/spinlock_hog/spinlock_hog.c [new file with mode: 0644]

index 22c40005111997cd2cfadfd030e9ef9135ba2008..209a3c3eb9eb7dd7a5f0eed86832924bdf9a66d9 100644 (file)
@@ -1,6 +1,7 @@
 obj-m += dma_test/
 obj-m += wb_to_wc/
 obj-m += xen_diag/
+obj-m += spinlock_hog/
 
 .PHONY:        distclean
 distclean:     clean
diff --git a/root_image/drivers/spinlock_hog/Makefile b/root_image/drivers/spinlock_hog/Makefile
new file mode 100644 (file)
index 0000000..aa3771f
--- /dev/null
@@ -0,0 +1,37 @@
+# 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
diff --git a/root_image/drivers/spinlock_hog/spinlock_hog.c b/root_image/drivers/spinlock_hog/spinlock_hog.c
new file mode 100644 (file)
index 0000000..040a154
--- /dev/null
@@ -0,0 +1,39 @@
+#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);