From 77548e3e34ae292db4cfd4260661495e87610169 Mon Sep 17 00:00:00 2001 From: Konrad Rzeszutek Wilk Date: Fri, 8 Jan 2016 09:47:51 -0500 Subject: [PATCH] ipi_hog: Add an IPI test-case - where each IPI routine compresses/decompresses in a loop. This should be a good test-case for CPU intensive workload. Signed-off-by: Konrad Rzeszutek Wilk --- linux.config | 9 + root_image/drivers/Makefile | 1 + root_image/drivers/ipi_hog/Makefile | 37 ++ root_image/drivers/ipi_hog/ipi_hog.c | 507 +++++++++++++++++++++++++++ 4 files changed, 554 insertions(+) create mode 100644 root_image/drivers/ipi_hog/Makefile create mode 100644 root_image/drivers/ipi_hog/ipi_hog.c diff --git a/linux.config b/linux.config index f6f7b4c..4ac661a 100644 --- a/linux.config +++ b/linux.config @@ -925,3 +925,12 @@ CONFIG_X86_X2APIC=y # CONFIG_CTF is not set # CONFIG_DTRACE is not set + +# For ipi_hog test-case +CONFIG_DECOMPRESS_LZO=y +CONFIG_DECOMPRESS_LZ4=y + +CONFIG_CRYPTO_LZ4=y +CONFIG_LZ4_COMPRESS=y +CONFIG_LZO_COMPRESS=y + diff --git a/root_image/drivers/Makefile b/root_image/drivers/Makefile index 45d68e1..d4973d1 100644 --- a/root_image/drivers/Makefile +++ b/root_image/drivers/Makefile @@ -2,6 +2,7 @@ obj-m += dma_test/ obj-m += wb_to_wc/ obj-m += xen_diag/ obj-m += spinlock_hog/ +obj-m += ipi_hog/ obj-m += tmem_test/ .PHONY: distclean diff --git a/root_image/drivers/ipi_hog/Makefile b/root_image/drivers/ipi_hog/Makefile new file mode 100644 index 0000000..8f38345 --- /dev/null +++ b/root_image/drivers/ipi_hog/Makefile @@ -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 := ipi_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/ipi_hog/ipi_hog.c b/root_image/drivers/ipi_hog/ipi_hog.c new file mode 100644 index 0000000..6dcc4f3 --- /dev/null +++ b/root_image/drivers/ipi_hog/ipi_hog.c @@ -0,0 +1,507 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +MODULE_AUTHOR("Konrad Rzeszutek Wilk "); +MODULE_DESCRIPTION("ipi"); +MODULE_LICENSE("GPL"); +MODULE_VERSION("0.1"); +unsigned long loops = 500000; + + +module_param(loops, ulong, 0644); +MODULE_PARM_DESC(loops, "How many loops (default is 500000)"); + + +unsigned char magna_carta[] = { + 0xef, 0xbb, 0xbf, 0x4a, 0x4f, 0x48, 0x4e, 0x2c, 0x20, 0x62, 0x79, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x61, 0x63, 0x65, 0x20, 0x6f, 0x66, + 0x20, 0x47, 0x6f, 0x64, 0x20, 0x4b, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, + 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x4c, 0x6f, + 0x72, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x49, 0x72, 0x65, 0x6c, 0x61, 0x6e, + 0x64, 0x2c, 0x20, 0x44, 0x75, 0x6b, 0x65, 0x20, 0x6f, 0x66, 0x0d, 0x0a, + 0x4e, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x64, 0x79, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x41, 0x71, 0x75, 0x69, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x2c, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x20, 0x6f, 0x66, + 0x20, 0x41, 0x6e, 0x6a, 0x6f, 0x75, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x68, + 0x69, 0x73, 0x20, 0x61, 0x72, 0x63, 0x68, 0x62, 0x69, 0x73, 0x68, 0x6f, + 0x70, 0x73, 0x2c, 0x0d, 0x0a, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x73, + 0x2c, 0x20, 0x61, 0x62, 0x62, 0x6f, 0x74, 0x73, 0x2c, 0x20, 0x65, 0x61, + 0x72, 0x6c, 0x73, 0x2c, 0x20, 0x62, 0x61, 0x72, 0x6f, 0x6e, 0x73, 0x2c, + 0x20, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x63, 0x65, 0x73, 0x2c, 0x20, 0x66, + 0x6f, 0x72, 0x65, 0x73, 0x74, 0x65, 0x72, 0x73, 0x2c, 0x20, 0x73, 0x68, + 0x65, 0x72, 0x69, 0x66, 0x66, 0x73, 0x2c, 0x0d, 0x0a, 0x73, 0x74, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x73, 0x2c, 0x20, 0x73, 0x65, 0x72, 0x76, 0x61, + 0x6e, 0x74, 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x66, 0x66, 0x69, + 0x63, 0x69, 0x61, 0x6c, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6c, 0x6f, + 0x79, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x2c, 0x0d, 0x0a, 0x47, 0x72, 0x65, 0x65, 0x74, 0x69, 0x6e, 0x67, 0x2e, + 0x0d, 0x0a, 0x0d, 0x0a, 0x4b, 0x4e, 0x4f, 0x57, 0x20, 0x54, 0x48, 0x41, + 0x54, 0x20, 0x42, 0x45, 0x46, 0x4f, 0x52, 0x45, 0x20, 0x47, 0x4f, 0x44, + 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x72, 0x20, + 0x73, 0x6f, 0x75, 0x6c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x6f, + 0x73, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x72, 0x0d, 0x0a, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x68, 0x65, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x68, 0x6f, 0x6e, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x66, + 0x20, 0x47, 0x6f, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, + 0x61, 0x6c, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x6c, 0x79, 0x0d, 0x0a, 0x43, 0x68, + 0x75, 0x72, 0x63, 0x68, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x72, + 0x20, 0x6b, 0x69, 0x6e, 0x67, 0x64, 0x6f, 0x6d, 0x2c, 0x20, 0x61, 0x74, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x64, 0x76, 0x69, 0x63, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x72, 0x0d, 0x0a, 0x72, 0x65, 0x76, 0x65, + 0x72, 0x65, 0x6e, 0x64, 0x20, 0x66, 0x61, 0x74, 0x68, 0x65, 0x72, 0x73, + 0x20, 0x53, 0x74, 0x65, 0x70, 0x68, 0x65, 0x6e, 0x2c, 0x20, 0x61, 0x72, + 0x63, 0x68, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x20, + 0x43, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x62, 0x75, 0x72, 0x79, 0x2c, 0x20, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x6c, 0x6c, 0x0d, 0x0a, 0x45, 0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64, 0x2c, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x61, + 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x6c, + 0x79, 0x20, 0x52, 0x6f, 0x6d, 0x61, 0x6e, 0x20, 0x43, 0x68, 0x75, 0x72, + 0x63, 0x68, 0x2c, 0x20, 0x48, 0x65, 0x6e, 0x72, 0x79, 0x20, 0x61, 0x72, + 0x63, 0x68, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x0d, + 0x0a, 0x44, 0x75, 0x62, 0x6c, 0x69, 0x6e, 0x2c, 0x20, 0x57, 0x69, 0x6c, + 0x6c, 0x69, 0x61, 0x6d, 0x20, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20, + 0x6f, 0x66, 0x20, 0x4c, 0x6f, 0x6e, 0x64, 0x6f, 0x6e, 0x2c, 0x20, 0x50, + 0x65, 0x74, 0x65, 0x72, 0x20, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20, + 0x6f, 0x66, 0x20, 0x57, 0x69, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, + 0x72, 0x2c, 0x20, 0x4a, 0x6f, 0x63, 0x65, 0x6c, 0x69, 0x6e, 0x0d, 0x0a, + 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x42, 0x61, + 0x74, 0x68, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x47, 0x6c, 0x61, 0x73, 0x74, + 0x6f, 0x6e, 0x62, 0x75, 0x72, 0x79, 0x2c, 0x20, 0x48, 0x75, 0x67, 0x68, + 0x20, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x4c, + 0x69, 0x6e, 0x63, 0x6f, 0x6c, 0x6e, 0x2c, 0x20, 0x57, 0x61, 0x6c, 0x74, + 0x65, 0x72, 0x20, 0x42, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x0d, 0x0a, 0x6f, + 0x66, 0x20, 0x57, 0x6f, 0x72, 0x63, 0x65, 0x73, 0x74, 0x65, 0x72, 0x2c, + 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6d, 0x20, 0x62, 0x69, 0x73, + 0x68, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x43, 0x6f, 0x76, 0x65, 0x6e, + 0x74, 0x72, 0x79, 0x2c, 0x20, 0x42, 0x65, 0x6e, 0x65, 0x64, 0x69, 0x63, + 0x74, 0x20, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x20, 0x6f, 0x66, 0x0d, + 0x0a, 0x52, 0x6f, 0x63, 0x68, 0x65, 0x73, 0x74, 0x65, 0x72, 0x2c, 0x20, + 0x4d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x50, 0x61, 0x6e, 0x64, 0x75, + 0x6c, 0x66, 0x20, 0x73, 0x75, 0x62, 0x64, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x70, 0x61, 0x6c, + 0x20, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x2c, 0x0d, + 0x0a, 0x42, 0x72, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x41, 0x79, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x20, 0x6d, 0x61, 0x73, 0x74, 0x65, 0x72, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x6e, 0x69, 0x67, 0x68, + 0x74, 0x68, 0x6f, 0x6f, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x45, + 0x6e, 0x67, 0x6c, 0x61, 0x6e, 0x64, 0x2c, 0x0d, 0x0a, 0x57, 0x69, 0x6c, + 0x6c, 0x69, 0x61, 0x6d, 0x20, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, + 0x20, 0x65, 0x61, 0x72, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x50, 0x65, 0x6d, + 0x62, 0x72, 0x6f, 0x6b, 0x65, 0x2c, 0x20, 0x57, 0x69, 0x6c, 0x6c, 0x69, + 0x61, 0x6d, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x20, 0x6f, 0x66, 0x20, 0x53, + 0x61, 0x6c, 0x69, 0x73, 0x62, 0x75, 0x72, 0x79, 0x2c, 0x20, 0x57, 0x69, + 0x6c, 0x6c, 0x69, 0x61, 0x6d, 0x0d, 0x0a, 0x65, 0x61, 0x72, 0x6c, 0x20, + 0x6f, 0x66, 0x20, 0x57, 0x61, 0x72, 0x72, 0x65, 0x6e, 0x2c, 0x20, 0x57, + 0x69, 0x6c, 0x6c, 0x69, 0x61, 0x6d, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x20, + 0x6f, 0x66, 0x20, 0x41, 0x72, 0x75, 0x6e, 0x64, 0x65, 0x6c, 0x2c, 0x20, + 0x41, 0x6c, 0x61, 0x6e, 0x20, 0x64, 0x65, 0x20, 0x47, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x61, 0x79, 0x20, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x0d, 0x0a, 0x53, 0x63, 0x6f, 0x74, 0x6c, + 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x57, 0x61, 0x72, 0x69, 0x6e, 0x20, 0x46, + 0x69, 0x74, 0x7a, 0x20, 0x47, 0x65, 0x72, 0x61, 0x6c, 0x64, 0x2c, 0x20, + 0x50, 0x65, 0x74, 0x65, 0x72, 0x20, 0x46, 0x69, 0x74, 0x7a, 0x20, 0x48, + 0x65, 0x72, 0x62, 0x65, 0x72, 0x74, 0x2c, 0x20, 0x48, 0x75, 0x62, 0x65, + 0x72, 0x74, 0x20, 0x64, 0x65, 0x20, 0x42, 0x75, 0x72, 0x67, 0x68, 0x0d, + 0x0a, 0x73, 0x65, 0x6e, 0x65, 0x73, 0x63, 0x68, 0x61, 0x6c, 0x20, 0x6f, + 0x66, 0x20, 0x50, 0x6f, 0x69, 0x74, 0x6f, 0x75, 0x2c, 0x20, 0x48, 0x75, + 0x67, 0x68, 0x20, 0x64, 0x65, 0x20, 0x4e, 0x65, 0x76, 0x69, 0x6c, 0x6c, + 0x65, 0x2c, 0x20, 0x4d, 0x61, 0x74, 0x74, 0x68, 0x65, 0x77, 0x20, 0x46, + 0x69, 0x74, 0x7a, 0x20, 0x48, 0x65, 0x72, 0x62, 0x65, 0x72, 0x74, 0x2c, + 0x20, 0x54, 0x68, 0x6f, 0x6d, 0x61, 0x73, 0x0d, 0x0a, 0x42, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x2c, 0x20, 0x41, 0x6c, 0x61, 0x6e, 0x20, 0x42, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x2c, 0x20, 0x50, 0x68, 0x69, 0x6c, 0x69, 0x70, + 0x20, 0x44, 0x61, 0x75, 0x62, 0x65, 0x6e, 0x79, 0x2c, 0x20, 0x52, 0x6f, + 0x62, 0x65, 0x72, 0x74, 0x20, 0x64, 0x65, 0x20, 0x52, 0x6f, 0x70, 0x70, + 0x65, 0x6c, 0x65, 0x79, 0x2c, 0x20, 0x4a, 0x6f, 0x68, 0x6e, 0x20, 0x4d, + 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x2c, 0x0d, 0x0a, 0x4a, 0x6f, 0x68, + 0x6e, 0x20, 0x46, 0x69, 0x74, 0x7a, 0x20, 0x48, 0x75, 0x67, 0x68, 0x2c, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x6c, + 0x6f, 0x79, 0x61, 0x6c, 0x20, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x73, 0x3a, 0x0d, 0x0a, 0x0d, 0x0a, 0x28, 0x31, 0x29, 0x20, 0x46, 0x49, + 0x52, 0x53, 0x54, 0x2c, 0x20, 0x54, 0x48, 0x41, 0x54, 0x20, 0x57, 0x45, + 0x20, 0x48, 0x41, 0x56, 0x45, 0x20, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x45, + 0x44, 0x20, 0x54, 0x4f, 0x20, 0x47, 0x4f, 0x44, 0x2c, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x20, 0x63, 0x68, 0x61, 0x72, 0x74, 0x65, + 0x72, 0x0d, 0x0a, 0x68, 0x61, 0x76, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x68, 0x65, 0x69, + 0x72, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, + 0x75, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x45, 0x6e, 0x67, 0x6c, 0x69, 0x73, 0x68, 0x0d, 0x0a, + 0x43, 0x68, 0x75, 0x72, 0x63, 0x68, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x66, 0x72, 0x65, 0x65, 0x2c, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x68, 0x61, 0x76, 0x65, + 0x20, 0x69, 0x74, 0x73, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, + 0x75, 0x6e, 0x64, 0x69, 0x6d, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, + 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x73, 0x0d, 0x0a, 0x6c, + 0x69, 0x62, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x20, 0x75, 0x6e, 0x69, + 0x6d, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x20, 0x54, 0x68, 0x61, + 0x74, 0x20, 0x77, 0x65, 0x20, 0x77, 0x69, 0x73, 0x68, 0x20, 0x74, 0x68, + 0x69, 0x73, 0x20, 0x73, 0x6f, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, + 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2c, 0x20, 0x61, 0x70, + 0x70, 0x65, 0x61, 0x72, 0x73, 0x0d, 0x0a, 0x66, 0x72, 0x6f, 0x6d, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x61, 0x63, 0x74, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x6f, 0x77, 0x6e, + 0x20, 0x66, 0x72, 0x65, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x2c, 0x20, + 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x75, 0x74, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x0d, 0x0a, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x20, + 0x64, 0x69, 0x73, 0x70, 0x75, 0x74, 0x65, 0x20, 0x62, 0x65, 0x74, 0x77, + 0x65, 0x65, 0x6e, 0x20, 0x75, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, + 0x75, 0x72, 0x20, 0x62, 0x61, 0x72, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x77, + 0x65, 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x20, 0x61, 0x6e, + 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x20, + 0x62, 0x79, 0x0d, 0x0a, 0x63, 0x68, 0x61, 0x72, 0x74, 0x65, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x68, 0x75, 0x72, 0x63, + 0x68, 0x27, 0x73, 0x20, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x20, 0x2d, 0x20, 0x61, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, + 0x72, 0x65, 0x63, 0x6b, 0x6f, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, + 0x62, 0x65, 0x0d, 0x0a, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x6e, 0x65, 0x63, 0x65, + 0x73, 0x73, 0x69, 0x74, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, + 0x69, 0x74, 0x20, 0x2d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, 0x61, 0x75, + 0x73, 0x65, 0x64, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x20, + 0x62, 0x65, 0x0d, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, + 0x64, 0x20, 0x62, 0x79, 0x20, 0x50, 0x6f, 0x70, 0x65, 0x20, 0x49, 0x6e, + 0x6e, 0x6f, 0x63, 0x65, 0x6e, 0x74, 0x20, 0x49, 0x49, 0x49, 0x2e, 0x20, + 0x54, 0x68, 0x69, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x64, 0x6f, 0x6d, + 0x20, 0x77, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x62, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x20, 0x6f, 0x75, 0x72, 0x73, 0x65, 0x6c, + 0x76, 0x65, 0x73, 0x2c, 0x0d, 0x0a, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, + 0x73, 0x69, 0x72, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x6f, + 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x67, + 0x6f, 0x6f, 0x64, 0x20, 0x66, 0x61, 0x69, 0x74, 0x68, 0x20, 0x62, 0x79, + 0x20, 0x6f, 0x75, 0x72, 0x20, 0x68, 0x65, 0x69, 0x72, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x70, 0x65, 0x72, 0x70, 0x65, 0x74, 0x75, 0x69, 0x74, 0x79, + 0x2e, 0x0d, 0x0a, 0x0d, 0x0a, 0x54, 0x4f, 0x20, 0x41, 0x4c, 0x4c, 0x20, + 0x46, 0x52, 0x45, 0x45, 0x20, 0x4d, 0x45, 0x4e, 0x20, 0x4f, 0x46, 0x20, + 0x4f, 0x55, 0x52, 0x20, 0x4b, 0x49, 0x4e, 0x47, 0x44, 0x4f, 0x4d, 0x20, + 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, + 0x20, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x64, 0x2c, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x75, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x75, 0x72, + 0x0d, 0x0a, 0x68, 0x65, 0x69, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x65, 0x76, 0x65, 0x72, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x69, 0x62, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x20, + 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x6f, 0x75, 0x74, 0x20, + 0x62, 0x65, 0x6c, 0x6f, 0x77, 0x2c, 0x20, 0x74, 0x6f, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x0d, 0x0a, 0x6b, + 0x65, 0x65, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x6d, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x68, + 0x65, 0x69, 0x72, 0x73, 0x2c, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x75, 0x72, 0x20, 0x68, 0x65, 0x69, 0x72, + 0x73, 0x3a, 0x0d, 0x0a, 0x0d, 0x0a, 0x28, 0x32, 0x29, 0x20, 0x49, 0x66, + 0x20, 0x61, 0x6e, 0x79, 0x20, 0x65, 0x61, 0x72, 0x6c, 0x2c, 0x20, 0x62, + 0x61, 0x72, 0x6f, 0x6e, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x74, 0x68, + 0x65, 0x72, 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x20, 0x74, 0x68, + 0x61, 0x74, 0x20, 0x68, 0x6f, 0x6c, 0x64, 0x73, 0x20, 0x6c, 0x61, 0x6e, + 0x64, 0x73, 0x20, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x20, + 0x6f, 0x66, 0x0d, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x43, 0x72, 0x6f, 0x77, + 0x6e, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x6d, 0x69, 0x6c, 0x69, 0x74, + 0x61, 0x72, 0x79, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2c, + 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x64, 0x69, 0x65, 0x2c, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x61, 0x74, 0x20, 0x68, 0x69, 0x73, 0x20, 0x64, + 0x65, 0x61, 0x74, 0x68, 0x20, 0x68, 0x69, 0x73, 0x20, 0x68, 0x65, 0x69, + 0x72, 0x0d, 0x0a, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, + 0x6f, 0x66, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x61, 0x67, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x77, 0x65, 0x20, 0x61, 0x20, 0x60, 0x72, + 0x65, 0x6c, 0x69, 0x65, 0x66, 0x27, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x68, 0x65, 0x69, 0x72, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x68, + 0x61, 0x76, 0x65, 0x20, 0x68, 0x69, 0x73, 0x0d, 0x0a, 0x69, 0x6e, 0x68, + 0x65, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x6e, 0x20, + 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x61, 0x6e, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x73, + 0x63, 0x61, 0x6c, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x72, 0x65, 0x6c, + 0x69, 0x65, 0x66, 0x27, 0x2e, 0x20, 0x54, 0x68, 0x61, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x74, 0x6f, 0x0d, 0x0a, 0x73, 0x61, 0x79, 0x2c, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6f, 0x72, 0x20, 0x68, + 0x65, 0x69, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x65, + 0x61, 0x72, 0x6c, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x70, 0x61, + 0x79, 0x20, 0x31, 0x30, 0x30, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x20, 0x65, 0x61, 0x72, + 0x6c, 0x27, 0x73, 0x0d, 0x0a, 0x62, 0x61, 0x72, 0x6f, 0x6e, 0x79, 0x2c, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6f, 0x72, + 0x20, 0x68, 0x65, 0x69, 0x72, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x20, + 0x6b, 0x6e, 0x69, 0x67, 0x68, 0x74, 0x20, 0x31, 0x30, 0x30, 0x73, 0x2e, + 0x20, 0x61, 0x74, 0x20, 0x6d, 0x6f, 0x73, 0x74, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x6e, 0x74, 0x69, 0x72, 0x65, 0x0d, + 0x0a, 0x6b, 0x6e, 0x69, 0x67, 0x68, 0x74, 0x27, 0x73, 0x20, 0x60, 0x66, + 0x65, 0x65, 0x27, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x79, + 0x20, 0x6d, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6f, 0x77, + 0x65, 0x73, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x73, 0x68, 0x61, 0x6c, + 0x6c, 0x20, 0x70, 0x61, 0x79, 0x20, 0x6c, 0x65, 0x73, 0x73, 0x2c, 0x20, + 0x69, 0x6e, 0x0d, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x72, 0x64, 0x61, 0x6e, + 0x63, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x61, 0x6e, 0x63, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x75, 0x73, 0x61, 0x67, + 0x65, 0x20, 0x6f, 0x66, 0x20, 0x60, 0x66, 0x65, 0x65, 0x73, 0x27, 0x0d, + 0x0a, 0x0d, 0x0a, 0x28, 0x33, 0x29, 0x20, 0x42, 0x75, 0x74, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x69, 0x72, 0x20, 0x6f, + 0x66, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x20, 0x70, 0x65, 0x72, + 0x73, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, + 0x20, 0x61, 0x67, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x77, + 0x61, 0x72, 0x64, 0x2c, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x68, 0x65, + 0x0d, 0x0a, 0x63, 0x6f, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, + 0x67, 0x65, 0x20, 0x68, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, + 0x68, 0x61, 0x76, 0x65, 0x20, 0x68, 0x69, 0x73, 0x20, 0x69, 0x6e, 0x68, + 0x65, 0x72, 0x69, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x6f, 0x75, 0x74, 0x20, 0x60, 0x72, 0x65, 0x6c, 0x69, 0x65, 0x66, + 0x27, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x69, 0x6e, 0x65, 0x2e, 0x0d, 0x0a, + 0x0d, 0x0a, 0x28, 0x34, 0x29, 0x20, 0x54, 0x68, 0x65, 0x20, 0x67, 0x75, + 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, + 0x20, 0x68, 0x65, 0x69, 0x72, 0x20, 0x77, 0x68, 0x6f, 0x20, 0x69, 0x73, + 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x61, 0x67, 0x65, 0x20, 0x73, + 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x61, 0x6b, 0x65, 0x0d, 0x0a, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x69, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x72, + 0x65, 0x76, 0x65, 0x6e, 0x75, 0x65, 0x73, 0x2c, 0x20, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x64, 0x75, 0x65, 0x73, 0x2c, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x65, 0x75, 0x64, 0x61, 0x6c, 0x20, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x0d, 0x0a, 0x48, + 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x64, 0x6f, 0x20, 0x74, + 0x68, 0x69, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, + 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x72, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x6d, 0x65, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x2e, 0x20, 0x49, 0x66, 0x0d, 0x0a, 0x77, 0x65, + 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, + 0x73, 0x68, 0x69, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, 0x68, + 0x65, 0x72, 0x69, 0x66, 0x66, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x61, 0x6e, 0x79, 0x0d, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, + 0x20, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x20, + 0x74, 0x6f, 0x20, 0x75, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x75, 0x65, 0x73, 0x2c, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x69, + 0x74, 0x73, 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x0d, 0x0a, 0x6f, 0x72, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, + 0x65, 0x2c, 0x20, 0x77, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x65, + 0x78, 0x61, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x65, 0x6e, 0x73, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x68, + 0x69, 0x6d, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x0d, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x74, + 0x68, 0x79, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x72, 0x75, 0x64, 0x65, + 0x6e, 0x74, 0x20, 0x6d, 0x65, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x60, 0x66, 0x65, 0x65, 0x27, + 0x2c, 0x20, 0x77, 0x68, 0x6f, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x0d, + 0x0a, 0x62, 0x65, 0x20, 0x61, 0x6e, 0x73, 0x77, 0x65, 0x72, 0x61, 0x62, + 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x75, 0x73, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x75, 0x65, + 0x73, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x77, + 0x68, 0x6f, 0x6d, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, 0x76, 0x65, 0x0d, + 0x0a, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x6d, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x77, 0x65, 0x20, 0x68, 0x61, + 0x76, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x6f, 0x72, 0x20, + 0x73, 0x6f, 0x6c, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x6e, 0x79, 0x6f, + 0x6e, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x69, 0x61, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x6f, 0x66, 0x0d, 0x0a, + 0x73, 0x75, 0x63, 0x68, 0x20, 0x6c, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x68, 0x65, 0x20, 0x63, 0x61, 0x75, 0x73, 0x65, 0x73, + 0x20, 0x64, 0x65, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x6f, 0x72, 0x20, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x2c, 0x20, + 0x68, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x6c, 0x6f, 0x73, + 0x65, 0x20, 0x74, 0x68, 0x65, 0x0d, 0x0a, 0x67, 0x75, 0x61, 0x72, 0x64, + 0x69, 0x61, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x69, + 0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x69, 0x74, 0x20, 0x73, 0x68, + 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x68, 0x61, 0x6e, 0x64, 0x65, + 0x64, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x77, + 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x74, 0x68, 0x79, 0x20, 0x61, 0x6e, 0x64, + 0x0d, 0x0a, 0x70, 0x72, 0x75, 0x64, 0x65, 0x6e, 0x74, 0x20, 0x6d, 0x65, + 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, + 0x65, 0x20, 0x60, 0x66, 0x65, 0x65, 0x27, 0x2c, 0x20, 0x77, 0x68, 0x6f, + 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x69, + 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x6c, 0x79, 0x20, 0x61, 0x6e, 0x73, 0x77, + 0x65, 0x72, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x0d, 0x0a, 0x75, + 0x73, 0x2e, 0x0d, 0x0a, 0x0d, 0x0a, 0x28, 0x35, 0x29, 0x20, 0x46, 0x6f, + 0x72, 0x20, 0x73, 0x6f, 0x20, 0x6c, 0x6f, 0x6e, 0x67, 0x20, 0x61, 0x73, + 0x20, 0x61, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x20, + 0x68, 0x61, 0x73, 0x20, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, + 0x73, 0x68, 0x69, 0x70, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x75, 0x63, 0x68, + 0x20, 0x6c, 0x61, 0x6e, 0x64, 0x2c, 0x20, 0x68, 0x65, 0x20, 0x73, 0x68, + 0x61, 0x6c, 0x6c, 0x0d, 0x0a, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x6f, 0x75, 0x73, 0x65, 0x73, + 0x2c, 0x20, 0x70, 0x61, 0x72, 0x6b, 0x73, 0x2c, 0x20, 0x66, 0x69, 0x73, + 0x68, 0x20, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x73, 0x2c, + 0x20, 0x70, 0x6f, 0x6e, 0x64, 0x73, 0x2c, 0x20, 0x6d, 0x69, 0x6c, 0x6c, + 0x73, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x0d, 0x0a, 0x65, 0x76, 0x65, 0x72, + 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x65, 0x6c, 0x73, 0x65, 0x20, + 0x70, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x74, + 0x6f, 0x20, 0x69, 0x74, 0x2c, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x75, 0x65, 0x73, 0x20, + 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x64, 0x0d, + 0x0a, 0x69, 0x74, 0x73, 0x65, 0x6c, 0x66, 0x2e, 0x20, 0x57, 0x68, 0x65, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x69, 0x72, 0x20, 0x63, + 0x6f, 0x6d, 0x65, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x67, 0x65, 0x2c, + 0x20, 0x68, 0x65, 0x20, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x77, 0x68, + 0x6f, 0x6c, 0x65, 0x20, 0x6c, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x6f, 0x0d, + 0x0a, 0x68, 0x69, 0x6d, 0x2c, 0x20, 0x73, 0x74, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x6c, 0x6f, 0x75, 0x67, + 0x68, 0x20, 0x74, 0x65, 0x61, 0x6d, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x73, 0x75, 0x63, 0x68, 0x20, 0x69, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x00 +}; +unsigned int magna_carta_len = 4096; +struct arg { + unsigned int cpu; + void *private; + void *dst; + ssize_t dst_len; + void *src; + ssize_t src_len; + int err; + int line; +}; + +struct arg *args; +static void take_lock(void *_arg) +{ + struct arg *arg; + unsigned int cpu = smp_processor_id(); + ssize_t dst_len = PAGE_SIZE; + int err; + u8 *pos; + u8 csum, csum_decompress; + + arg = (struct arg *)_arg; + arg = &arg[cpu]; + if (arg->cpu != cpu) { + printk("%s on CPU%d got arg for CPU%d!\n", __func__, cpu, arg->cpu); + return; + } + csum = 0; + for (pos = (u8 *)arg->src; pos < (u8 *)arg->src + arg->src_len; pos++) + csum += *pos; + + arg->dst_len = 0; + err = lz4_compress(arg->src, args->src_len, arg->dst, &arg->dst_len, arg->private); + if (err) { + arg->err = err; + arg->line = __LINE__; + return; + } + memset(arg->src, 0, arg->src_len); + dst_len = arg->src_len; + err = lz4_decompress_unknownoutputsize(arg->dst, arg->dst_len, arg->src, &dst_len); + if (dst_len != arg->src_len) { + arg->err = err ? err : -ENOSPC; + arg->line = __LINE__; + printk("CPU%d, decompressed size=%zu, source size=%zu\n", cpu, dst_len, arg->dst_len); + return; + } + csum_decompress = 0; + for (pos = (u8 *)arg->src; pos < (u8 *)arg->src + arg->src_len; pos++) + csum_decompress += *pos; + + if (csum_decompress != csum) { + arg->err = -ENOSPC; + arg->line = __LINE__; + } +} +static int __init ipi_hog_init(void) +{ + + cycles_t start, end; + unsigned long long i; + unsigned int cpu; + int ret = -ENOMEM; + + args = kmalloc_array(num_online_cpus(), sizeof(struct arg), GFP_KERNEL); + if (!args) + return ret; + memset(args, 0, sizeof(struct arg) * num_online_cpus()); + ret = 0; + for_each_online_cpu(cpu) { + void *p; + + p = kzalloc(LZ4_MEM_COMPRESS, GFP_KERNEL); + if (!p) { + ret = -ENOMEM; + break; + } + args[cpu].line = 0; + args[cpu].cpu = cpu; + args[cpu].private = p; + args[cpu].err = 0; + p = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1); + if (!p) { + kfree(args[cpu].private); + ret = -ENOMEM; + break; + } + args[cpu].dst = p; + args[cpu].dst_len = 0; + p = kmalloc(PAGE_SIZE, GFP_KERNEL); + if (!p) { + kfree(args[cpu].private); + free_pages((unsigned long)args[cpu].dst, 1); + ret = -ENOMEM; + break; + } + memcpy(p, magna_carta, magna_carta_len); + args[cpu].src = p; + args[cpu].src_len = magna_carta_len; + } + if (ret) + goto exit; + + printk("START"); + start = get_cycles(); + if (xen_domain()) + HYPERVISOR_xen_version(0xDEADBEEF, NULL); + + for (i = 0; i < loops; i++ ) { + (void)smp_call_function(take_lock, args, 1); + for_each_online_cpu(cpu) { + if (args[cpu].err) { + printk("Error detected at CPU%d (%d), line=%d\n", + cpu, args[cpu].err, args[cpu].line); + i = loops; + break; + } + } + } + end = get_cycles(); + printk("END: cycles: %lld (%lld seconds)\n", (unsigned long long)end - start, ((unsigned long long)end- start) >> 30); + +exit: + for_each_online_cpu(cpu) { + if (args[cpu].err) + printk("CPU%d failed with err=%d, line=%d\n", + cpu, args[cpu].err, args[cpu].line); + if (memcmp(args[cpu].src, magna_carta, magna_carta_len)) { + printk("CPU%d compressed/decompressed funny. Have:\n", cpu); + printk("%s", (char *)args[cpu].src); + } + kfree(args[cpu].private); + kfree(args[cpu].src); + free_pages((unsigned long)args[cpu].dst, 1); + } + return -EIO; /* Just so we don't get loaded. */ +} +static void __exit ipi_hog_exit(void) +{ +} +module_init(ipi_hog_init); +module_exit(ipi_hog_exit); -- 2.39.5