kernel-5.4.10:ver.bump
This commit is contained in:
@@ -1,181 +0,0 @@
|
||||
|
||||
3rdparty/mkbuild.pl | 92 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
Documentation/3rdparty.txt | 76 +++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 168 insertions(+)
|
||||
|
||||
diff -Nurp linux-2.6.37/3rdparty/mkbuild.pl linux-2.6.37.3rdparty/3rdparty/mkbuild.pl
|
||||
--- linux-2.6.37/3rdparty/mkbuild.pl 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/3rdparty/mkbuild.pl 2004-04-23 14:59:03.000000000 +0300
|
||||
@@ -0,0 +1,92 @@
|
||||
+#!/usr/bin/perl -w
|
||||
+#
|
||||
+# Version 1.0
|
||||
+#
|
||||
+# Copyright 2001 Jeff Garzik <jgarzik@mandrakesoft.com>
|
||||
+# Copyright 2002 Juan Quintela <quintela@mandrakesoft.com>
|
||||
+# Copyright 2003 Nicolas Planel <nplanel@mandrakesoft.com>
|
||||
+#
|
||||
+# This software may be used and distributed according to the terms
|
||||
+# of the GNU General Public License, incorporated herein by reference.
|
||||
+#
|
||||
+#
|
||||
+# Run "mkbuild.pl"
|
||||
+#
|
||||
+# This program generates the following files
|
||||
+# Makefile
|
||||
+# Makefile.drivers
|
||||
+# Config.in
|
||||
+# using the information in the subdirs of this directory.
|
||||
+#
|
||||
+# subdirs need to have:
|
||||
+# a Config.in file
|
||||
+# a Makefile with a O_TARGET/L_TARGET targets
|
||||
+# The config.in should set a CONFIG_<module_dir_name> to m/y.
|
||||
+
|
||||
+use strict;
|
||||
+
|
||||
+opendir(THISDIR, ".");
|
||||
+# get dirs without . and .. garbage
|
||||
+my (@modules) = grep(!/\.\.?$/,grep(-d, readdir(THISDIR)));
|
||||
+closedir(THISDIR);
|
||||
+
|
||||
+generate_kconfig(@modules);
|
||||
+generate_makefile(@modules);
|
||||
+exit(0);
|
||||
+
|
||||
+##########################################################################
|
||||
+
|
||||
+sub generate_makefile {
|
||||
+ my (@modules) = @_;
|
||||
+
|
||||
+ local *F;
|
||||
+ open F, "> Makefile" or die "Cannot create new Makefile: $!\n";
|
||||
+ print F <<'EOM';
|
||||
+#
|
||||
+# THIS IS AN AUTOMATICALLY GENERATED FILE. DO NOT EDIT.
|
||||
+#
|
||||
+
|
||||
+EOM
|
||||
+ printf F "obj- := 3rdparty.o # Dummy rule to force built-in.o to be made\n";
|
||||
+ printf F "obj-\$(%s) += %s\n", to_CONFIG($_), $_ . '/' foreach @modules;
|
||||
+}
|
||||
+
|
||||
+sub generate_kconfig {
|
||||
+ my (@modules) = @_;
|
||||
+
|
||||
+ local *F;
|
||||
+ open F, "> Kconfig" or die "Cannot create Kconfig: $!\n";
|
||||
+ print F <<"EOM";
|
||||
+#
|
||||
+# THIS IS AN AUTOMATICALLY GENERATED FILE. DO NOT EDIT.
|
||||
+#
|
||||
+
|
||||
+menu "Unofficial 3rd party kernel additions"
|
||||
+
|
||||
+EOM
|
||||
+
|
||||
+ foreach (@modules) {
|
||||
+ die "No Kconfig in $_.\n" if ! -r "$_/Kconfig";
|
||||
+ print F "source 3rdparty/$_/Kconfig\n";
|
||||
+ }
|
||||
+ print F "\n\nendmenu\n";
|
||||
+}
|
||||
+
|
||||
+sub to_CONFIG {
|
||||
+ local $_ = $_[0];
|
||||
+ tr/a-z/A-Z/;
|
||||
+ s/[\-\. ]/_/g;
|
||||
+ "CONFIG_$_";
|
||||
+}
|
||||
+
|
||||
+sub find_target {
|
||||
+ my ($module_dir) = @_;
|
||||
+
|
||||
+ local *F;
|
||||
+ open(F, "$module_dir/Makefile") or die "$module_dir/Makefile: $!\n";
|
||||
+ while (<F>) {
|
||||
+ chomp;
|
||||
+ return $1 if (/[LO]_TARGET.*:=\s+(\S+)/);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
diff -Nurp linux-2.6.37/Documentation/3rdparty.txt linux-2.6.37.3rdparty/Documentation/3rdparty.txt
|
||||
--- linux-2.6.37/Documentation/3rdparty.txt 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/Documentation/3rdparty.txt 2003-11-22 01:07:26.000000000 +0200
|
||||
@@ -0,0 +1,76 @@
|
||||
+
|
||||
+Third-Party Kernel Source Module Support, or
|
||||
+an easy way to add modules to your kernel build.
|
||||
+
|
||||
+
|
||||
+
|
||||
+Vendors quite often add additional drivers and features to the kernel
|
||||
+which require nothing more than modifying Kconfig, Makefile, and
|
||||
+adding one or more files to a sub-directory. As a single discrete task,
|
||||
+this is not a problem. However, using patches to add modules to the
|
||||
+kernel very often results in patch conflicts, resulting in needless time
|
||||
+wastage as developers regenerate an otherwise working kernel patch.
|
||||
+
|
||||
+This is designed as a solution to these problems. It is NOT designed as
|
||||
+a replacement for the kernel build system, but merely as a tool for
|
||||
+vendors and system administrators to ease the pain of patch management.
|
||||
+
|
||||
+The key feature of this system is the distinct lack of patches. Drivers
|
||||
+are installed via unpacking a tarball.
|
||||
+
|
||||
+
|
||||
+
|
||||
+Adding a directory to the build (usually from a tarball)
|
||||
+--------------------------------------------------------
|
||||
+If a directory exists inside the 3rdparty sub-directory that contains a
|
||||
+proper Makefile, it can be added to the build. It also needs a
|
||||
+Kconfig file.
|
||||
+
|
||||
+ cd /usr/src/linux-2.4.3/3rdparty
|
||||
+ bzcat /tmp/my-driver2.tar.bz2 | tar xf - # creates "my2" dir
|
||||
+
|
||||
+
|
||||
+Limitations
|
||||
+-----------
|
||||
+There are some limitations to this system. This system is only
|
||||
+designed to support a very common case. If you find yourself running
|
||||
+into limitations (kernel build experts can spot them right off),
|
||||
+then you should probably be patching the kernel instead of using
|
||||
+mkbuild.pl for that particular module.
|
||||
+
|
||||
+FIXME: actually list the limitations
|
||||
+
|
||||
+
|
||||
+
|
||||
+Other notes
|
||||
+-----------
|
||||
+Link order is controlled by the order of mkbuild.pl executions.
|
||||
+
|
||||
+"make mrproper" will erase Makefile.meta, and empty Kconfig, Makefile,
|
||||
+and Makefile.drivers.
|
||||
+
|
||||
+IMPORTANT NOTE: Because this feature modifies the kernel's makefiles and
|
||||
+configuration system, you MUST complete all mkbuild.pl runs before
|
||||
+running any "make" command.
|
||||
+
|
||||
+Building in the 3rdparty dir
|
||||
+----------------------------
|
||||
+
|
||||
+If you use modules that:
|
||||
+ - are contained in one subdir with the name of the module
|
||||
+ - has a Makefile
|
||||
+ - has a Kconfig file
|
||||
+
|
||||
+The system calls the ./mkbuild.pl script. It will search for
|
||||
+subdirectories, and will try to build each of them as a module.
|
||||
+Things to note:
|
||||
+
|
||||
+ The dependencies will be done in a module called:
|
||||
+
|
||||
+ 3rdparty/<module_dir_name>/<module_name>
|
||||
+
|
||||
+depending of CONFIG_<module_name_in_uppercase>.
|
||||
+
|
||||
+<module_name> is the value of O_TARGET/L_TARGET.
|
||||
+
|
||||
+
|
||||
@@ -1,191 +0,0 @@
|
||||
|
||||
Include 3rdparty directory into the main build-system.
|
||||
|
||||
Original author is unknown.
|
||||
(Was either Juan Quintela or Jeff Garzik)
|
||||
|
||||
Signed-off-by: Luiz Fernando N. Capitulino <lcapitulino@mandriva.com.br>
|
||||
Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
Makefile | 2 +-
|
||||
arch/alpha/Kconfig | 1 +
|
||||
arch/ia64/Kconfig | 2 ++
|
||||
arch/mips/Kconfig | 2 ++
|
||||
arch/powerpc/Kconfig | 2 ++
|
||||
arch/sparc/Kconfig | 2 ++
|
||||
arch/x86/Kconfig | 2 ++
|
||||
scripts/kconfig/Makefile | 33 ++++++++++++++++++---------------
|
||||
8 files changed, 30 insertions(+), 16 deletions(-)
|
||||
|
||||
diff -Nurp linux-4.2.2/arch/alpha/Kconfig linux-4.2.2-3rd/arch/alpha/Kconfig
|
||||
--- linux-4.2.2/arch/alpha/Kconfig 2015-08-30 21:34:09.000000000 +0300
|
||||
+++ linux-4.2.2-3rd/arch/alpha/Kconfig 2015-09-29 23:02:44.024347272 +0300
|
||||
@@ -750,3 +750,4 @@ source "crypto/Kconfig"
|
||||
|
||||
source "lib/Kconfig"
|
||||
|
||||
+source "3rdparty/Kconfig"
|
||||
diff -Nurp linux-4.2.2/arch/ia64/Kconfig linux-4.2.2-3rd/arch/ia64/Kconfig
|
||||
--- linux-4.2.2/arch/ia64/Kconfig 2015-08-30 21:34:09.000000000 +0300
|
||||
+++ linux-4.2.2-3rd/arch/ia64/Kconfig 2015-09-29 23:02:44.024347272 +0300
|
||||
@@ -613,3 +613,5 @@ source "lib/Kconfig"
|
||||
|
||||
config IOMMU_HELPER
|
||||
def_bool (IA64_HP_ZX1 || IA64_HP_ZX1_SWIOTLB || IA64_GENERIC || SWIOTLB)
|
||||
+
|
||||
+source "3rdparty/Kconfig"
|
||||
diff -Nurp linux-4.2.2/arch/mips/Kconfig linux-4.2.2-3rd/arch/mips/Kconfig
|
||||
--- linux-4.2.2/arch/mips/Kconfig 2015-08-30 21:34:09.000000000 +0300
|
||||
+++ linux-4.2.2-3rd/arch/mips/Kconfig 2015-09-29 23:02:44.024347272 +0300
|
||||
@@ -2944,3 +2944,5 @@ source "crypto/Kconfig"
|
||||
source "lib/Kconfig"
|
||||
|
||||
source "arch/mips/kvm/Kconfig"
|
||||
+
|
||||
+source "3rdparty/Kconfig"
|
||||
diff -Nurp linux-4.2.2/arch/powerpc/Kconfig linux-4.2.2-3rd/arch/powerpc/Kconfig
|
||||
--- linux-4.2.2/arch/powerpc/Kconfig 2015-08-30 21:34:09.000000000 +0300
|
||||
+++ linux-4.2.2-3rd/arch/powerpc/Kconfig 2015-09-29 23:02:44.025347276 +0300
|
||||
@@ -1112,3 +1112,5 @@ config PPC_LIB_RHEAP
|
||||
source "arch/powerpc/kvm/Kconfig"
|
||||
|
||||
source "kernel/livepatch/Kconfig"
|
||||
+
|
||||
+source "3rdparty/Kconfig"
|
||||
diff -Nurp linux-4.2.2/arch/sparc/Kconfig linux-4.2.2-3rd/arch/sparc/Kconfig
|
||||
--- linux-4.2.2/arch/sparc/Kconfig 2015-08-30 21:34:09.000000000 +0300
|
||||
+++ linux-4.2.2-3rd/arch/sparc/Kconfig 2015-09-29 23:02:44.025347276 +0300
|
||||
@@ -569,3 +569,5 @@ source "security/Kconfig"
|
||||
source "crypto/Kconfig"
|
||||
|
||||
source "lib/Kconfig"
|
||||
+
|
||||
+source "3rdparty/Kconfig"
|
||||
diff -Nurp linux-4.2.2/arch/x86/Kconfig linux-4.2.2-3rd/arch/x86/Kconfig
|
||||
--- linux-4.2.2/arch/x86/Kconfig 2015-08-30 21:34:09.000000000 +0300
|
||||
+++ linux-4.2.2-3rd/arch/x86/Kconfig 2015-09-29 23:02:44.025347276 +0300
|
||||
@@ -2601,3 +2601,5 @@ source "crypto/Kconfig"
|
||||
source "arch/x86/kvm/Kconfig"
|
||||
|
||||
source "lib/Kconfig"
|
||||
+
|
||||
+source "3rdparty/Kconfig"
|
||||
diff -Nurp linux-4.2.2/Makefile linux-4.2.2-3rd/Makefile
|
||||
--- linux-4.2.2/Makefile 2015-09-29 22:13:44.743650710 +0300
|
||||
+++ linux-4.2.2-3rd/Makefile 2015-09-29 23:02:44.026347280 +0300
|
||||
@@ -546,7 +546,7 @@ scripts: scripts_basic include/config/au
|
||||
|
||||
# Objects we will link into vmlinux / subdirs we need to visit
|
||||
init-y := init/
|
||||
-drivers-y := drivers/ sound/ firmware/
|
||||
+drivers-y := drivers/ sound/ firmware/ 3rdparty/
|
||||
net-y := net/
|
||||
libs-y := lib/
|
||||
core-y := usr/
|
||||
diff -Nurp linux-4.14/scripts/kconfig/Makefile linux-4.14-3rd/scripts/kconfig/Makefile
|
||||
--- linux-4.14/scripts/kconfig/Makefile
|
||||
+++ linux-4.14-3rd/scripts/kconfig/Makefile
|
||||
@@ -19,28 +19,28 @@ endif
|
||||
# We need this, in case the user has it in its environment
|
||||
unexport CONFIG_
|
||||
|
||||
-xconfig: $(obj)/qconf
|
||||
+xconfig: $(obj)/qconf 3rdparty/Makefile
|
||||
$< $(silent) $(Kconfig)
|
||||
|
||||
-gconfig: $(obj)/gconf
|
||||
+gconfig: $(obj)/gconf 3rdparty/Makefile
|
||||
$< $(silent) $(Kconfig)
|
||||
|
||||
-menuconfig: $(obj)/mconf
|
||||
+menuconfig: $(obj)/mconf 3rdparty/Makefile
|
||||
$< $(silent) $(Kconfig)
|
||||
|
||||
-config: $(obj)/conf
|
||||
+config: $(obj)/conf 3rdparty/Makefile
|
||||
$< $(silent) --oldaskconfig $(Kconfig)
|
||||
|
||||
-nconfig: $(obj)/nconf
|
||||
+nconfig: $(obj)/nconf 3rdparty/Makefile
|
||||
$< $(silent) $(Kconfig)
|
||||
|
||||
-silentoldconfig: $(obj)/conf
|
||||
+silentoldconfig: $(obj)/conf 3rdparty/Makefile
|
||||
$(Q)mkdir -p include/config include/generated
|
||||
$(Q)test -e include/generated/autoksyms.h || \
|
||||
touch include/generated/autoksyms.h
|
||||
$< $(silent) --$@ $(Kconfig)
|
||||
|
||||
-localyesconfig localmodconfig: $(obj)/streamline_config.pl $(obj)/conf
|
||||
+localyesconfig localmodconfig: $(obj)/streamline_config.pl $(obj)/conf 3rdparty/Makefile
|
||||
$(Q)mkdir -p include/config include/generated
|
||||
$(Q)perl $< --$@ $(srctree) $(Kconfig) > .tmp.config
|
||||
$(Q)if [ -f .config ]; then \
|
||||
@@ -83,7 +83,7 @@ simple-targets := oldconfig allnoconfig
|
||||
alldefconfig randconfig listnewconfig olddefconfig
|
||||
PHONY += $(simple-targets)
|
||||
|
||||
-$(simple-targets): $(obj)/conf
|
||||
+$(simple-targets): $(obj)/conf 3rdparty/Makefile
|
||||
$< $(silent) --$@ $(Kconfig)
|
||||
|
||||
PHONY += oldnoconfig savedefconfig defconfig
|
||||
@@ -91,12 +91,12 @@ PHONY += oldnoconfig savedefconfig defco
|
||||
# oldnoconfig is an alias of olddefconfig, because people already are dependent
|
||||
# on its behavior (sets new symbols to their default value but not 'n') with the
|
||||
# counter-intuitive name.
|
||||
-oldnoconfig: olddefconfig
|
||||
+oldnoconfig: olddefconfig 3rdparty/Makefile
|
||||
|
||||
-savedefconfig: $(obj)/conf
|
||||
+savedefconfig: $(obj)/conf 3rdparty/Makefile
|
||||
$< $(silent) --$@=defconfig $(Kconfig)
|
||||
|
||||
-defconfig: $(obj)/conf
|
||||
+defconfig: $(obj)/conf 3rdparty/Makefile
|
||||
ifeq ($(KBUILD_DEFCONFIG),)
|
||||
$< $(silent) --defconfig $(Kconfig)
|
||||
else
|
||||
@@ -109,26 +109,26 @@ else
|
||||
endif
|
||||
endif
|
||||
|
||||
-%_defconfig: $(obj)/conf
|
||||
+%_defconfig: $(obj)/conf 3rdparty/Makefile
|
||||
$(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
|
||||
|
||||
configfiles=$(wildcard $(srctree)/kernel/configs/$@ $(srctree)/arch/$(SRCARCH)/configs/$@)
|
||||
|
||||
-%.config: $(obj)/conf
|
||||
+%.config: $(obj)/conf 3rdparty/Makefile
|
||||
$(if $(call configfiles),, $(error No configuration exists for this target on this architecture))
|
||||
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(configfiles)
|
||||
+$(Q)yes "" | $(MAKE) -f $(srctree)/Makefile oldconfig
|
||||
|
||||
PHONY += kvmconfig
|
||||
-kvmconfig: kvm_guest.config
|
||||
+kvmconfig: kvm_guest.config 3rdparty/Makefile
|
||||
@:
|
||||
|
||||
PHONY += xenconfig
|
||||
-xenconfig: xen.config
|
||||
+xenconfig: xen.config 3rdparty/Makefile
|
||||
@:
|
||||
|
||||
PHONY += tinyconfig
|
||||
-tinyconfig:
|
||||
+tinyconfig:
|
||||
$(Q)$(MAKE) -f $(srctree)/Makefile allnoconfig tiny.config
|
||||
|
||||
# Help text used by make help
|
||||
@@ -191,6 +191,9 @@ gconf-objs := gconf.o zconf.tab.o
|
||||
|
||||
hostprogs-y := conf nconf mconf kxgettext qconf gconf
|
||||
|
||||
+3rdparty/Makefile:
|
||||
+ pushd $(srctree)/3rdparty ; $(PERL) ./mkbuild.pl ; popd
|
||||
+
|
||||
clean-files := qconf.moc .tmp_qtcheck .tmp_gtkcheck
|
||||
clean-files += zconf.tab.c zconf.lex.c gconf.glade.h
|
||||
clean-files += config.pot linux.pot
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,20 +0,0 @@
|
||||
--- linux-2.6.35/3rdparty/acerhk/acerhk.c.orig 2010-10-03 12:50:33.000000000 +0000
|
||||
+++ linux-2.6.35/3rdparty/acerhk/acerhk.c 2010-10-03 13:13:22.093868410 +0000
|
||||
@@ -2730,7 +2730,7 @@ static void acerhk_proc_cleanup(void)
|
||||
|
||||
/* {{{ file operations */
|
||||
|
||||
-static int acerhk_ioctl( struct inode *inode, struct file *file,
|
||||
+static long acerhk_ioctl( struct inode *inode, struct file *file,
|
||||
unsigned int cmd, unsigned long arg )
|
||||
{
|
||||
int retval;
|
||||
@@ -2827,7 +2827,7 @@ static int acerhk_release( struct inode
|
||||
|
||||
static struct file_operations acerhk_fops = {
|
||||
owner: THIS_MODULE,
|
||||
- ioctl: acerhk_ioctl,
|
||||
+ unlocked_ioctl: acerhk_ioctl,
|
||||
open: acerhk_open,
|
||||
#ifdef ACERDEBUG
|
||||
write: acerhk_write,
|
||||
@@ -1,33 +0,0 @@
|
||||
CFLAGS use isn't allowed anymore with 2.6.24, we must use EXTRA_CFLAGS
|
||||
in its place
|
||||
|
||||
Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com>
|
||||
|
||||
--- linux-2.6.23/3rdparty/acerhk/Makefile.orig 2007-11-08 21:32:43.000000000 -0200
|
||||
+++ linux-2.6.23/3rdparty/acerhk/Makefile 2007-11-08 21:33:28.000000000 -0200
|
||||
@@ -14,7 +14,7 @@
|
||||
CONFIG_ACERHK?=m
|
||||
obj-$(CONFIG_ACERHK) += acerhk.o
|
||||
|
||||
-CFLAGS+=-c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe
|
||||
+EXTRA_CFLAGS+=-c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe
|
||||
INCLUDE=-I$(KERNELSRC)/include
|
||||
|
||||
ifeq ($(KERNELMAJOR), 2.6)
|
||||
@@ -41,13 +41,13 @@ acerhk.ko: $(SOURCE) acerhk.h
|
||||
$(MAKE) -C $(KERNELSRC) SUBDIRS=$(PWD) modules
|
||||
|
||||
acerhk.o: $(SOURCE) acerhk.h
|
||||
- $(CC) $(INCLUDE) $(CFLAGS) -DMODVERSIONS -DMODULE -D__KERNEL__ -o $(TARGET) $(SOURCE)
|
||||
+ $(CC) $(INCLUDE) $(EXTRA_CFLAGS) -DMODVERSIONS -DMODULE -D__KERNEL__ -o $(TARGET) $(SOURCE)
|
||||
|
||||
asm: $(SOURCE)
|
||||
ifeq ($(KERNELMAJOR), 2.6)
|
||||
- $(CC) $(INCLUDE) $(INCLUDE)/asm-i386/mach-default $(CFLAGS) -fverbose-asm -S -DMODVERSIONS -DMODULE -D__KERNEL__ $(SOURCE)
|
||||
+ $(CC) $(INCLUDE) $(INCLUDE)/asm-i386/mach-default $(EXTRA_CFLAGS) -fverbose-asm -S -DMODVERSIONS -DMODULE -D__KERNEL__ $(SOURCE)
|
||||
else
|
||||
- $(CC) $(INCLUDE) $(CFLAGS) -fverbose-asm -S -DMODVERSIONS -DMODULE -D__KERNEL__ $(SOURCE)
|
||||
+ $(CC) $(INCLUDE) $(EXTRA_CFLAGS) -fverbose-asm -S -DMODVERSIONS -DMODULE -D__KERNEL__ $(SOURCE)
|
||||
endif
|
||||
|
||||
clean:
|
||||
-22
@@ -1,22 +0,0 @@
|
||||
Fix acerhk build with FUNCTION_TRACER enabled.
|
||||
|
||||
Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
|
||||
---
|
||||
3rdparty/acerhk/Makefile | 5 ++++-
|
||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
||||
|
||||
diff -p -up linux-2.6.31/3rdparty/acerhk/Makefile.orig linux-2.6.31/3rdparty/acerhk/Makefile
|
||||
--- linux-2.6.31/3rdparty/acerhk/Makefile.orig 2009-10-02 16:39:06.000000000 -0300
|
||||
+++ linux-2.6.31/3rdparty/acerhk/Makefile 2009-10-02 16:45:13.000000000 -0300
|
||||
@@ -14,7 +14,10 @@
|
||||
CONFIG_ACERHK?=m
|
||||
obj-$(CONFIG_ACERHK) += acerhk.o
|
||||
|
||||
-EXTRA_CFLAGS+=-c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe
|
||||
+CFLAGS_acerhk.o += -c -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe
|
||||
+ifdef CONFIG_FUNCTION_TRACER
|
||||
+CFLAGS_REMOVE_acerhk.o = -pg
|
||||
+endif
|
||||
INCLUDE=-I$(KERNELSRC)/include
|
||||
|
||||
ifeq ($(KERNELMAJOR), 2.6)
|
||||
@@ -1,23 +0,0 @@
|
||||
|
||||
AUTOCONF_INCLUDED is not defined anymore in 2.6.38, so old include got exposed.
|
||||
|
||||
Fix by removing the offending bits.
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
3rdparty/acerhk/acerhk.c | 4 ----
|
||||
1 file changed, 4 deletions(-)
|
||||
|
||||
--- linux-2.6.38/3rdparty/acerhk/acerhk.c.orig 2011-03-20 13:57:32.000000000 +0200
|
||||
+++ linux-2.6.38/3rdparty/acerhk/acerhk.c 2011-03-20 15:00:45.768659568 +0200
|
||||
@@ -35,10 +35,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
-#ifndef AUTOCONF_INCLUDED
|
||||
-#include <linux/config.h>
|
||||
-#endif
|
||||
-
|
||||
/* This driver is heavily dependent on the architecture, don't let
|
||||
* anyone without an X86 machine use it. On laptops with AMD64
|
||||
* architecture this driver is only useable in 32 bit mode.
|
||||
@@ -1,37 +0,0 @@
|
||||
Fix Makefile and add Kconfig for the acerhk driver
|
||||
---
|
||||
3rdparty/acerhk/Kconfig | 8 8 + 0 - 0 !
|
||||
3rdparty/acerhk/Makefile | 6 3 + 3 - 0 !
|
||||
2 files changed, 11 insertions(+), 3 deletions(-)
|
||||
|
||||
Index: linux-2.6.21/3rdparty/acerhk/Makefile
|
||||
===================================================================
|
||||
--- linux-2.6.21.orig/3rdparty/acerhk/Makefile 2007-05-15 15:34:48.000000000 +0200
|
||||
+++ linux-2.6.21/3rdparty/acerhk/Makefile 2007-05-15 15:37:17.000000000 +0200
|
||||
@@ -1,10 +1,10 @@
|
||||
# change KERNELSRC to the location of your kernel build tree only if
|
||||
# autodetection does not work
|
||||
#KERNELSRC=/usr/src/linux
|
||||
-KERNELSRC?=/lib/modules/`uname -r`/build
|
||||
+#KERNELSRC?=/lib/modules/`uname -r`/build
|
||||
# Starting with 2.6.18, the kernel version is in utsrelease.h instead of version.h, accomodate both cases
|
||||
-KERNELVERSION=$(shell awk -F\" '/REL/ {print $$2}' $(shell grep -s -l REL $(KERNELSRC)/include/linux/version.h $(KERNELSRC)/include/linux/utsrelease.h))
|
||||
-KERNELMAJOR=$(shell echo $(KERNELVERSION)|head -c3)
|
||||
+#KERNELVERSION=$(shell awk -F\" '/REL/ {print $$2}' $(shell grep -s -l REL $(KERNELSRC)/include/linux/version.h $(KERNELSRC)/include/linux/utsrelease.h))
|
||||
+#KERNELMAJOR=$(shell echo $(KERNELVERSION)|head -c3)
|
||||
|
||||
# next line is for kernel 2.6, if you integrate the driver in the kernel tree
|
||||
# /usr/src/linux/drivers/acerhk - or something similar
|
||||
Index: linux-2.6.21/3rdparty/acerhk/Kconfig
|
||||
===================================================================
|
||||
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
|
||||
+++ linux-2.6.21/3rdparty/acerhk/Kconfig 2007-05-15 15:39:30.000000000 +0200
|
||||
@@ -0,0 +1,8 @@
|
||||
+config ACERHK
|
||||
+ tristate "Acerhk driver"
|
||||
+ depends on EXPERIMENTAL && X86
|
||||
+ ---help---
|
||||
+ This is an experimental acer keyboard driver for
|
||||
+ acer laptops. If you have a notebook with a ipw2X00
|
||||
+ wireless card, it allows you to turn off the rf_kill
|
||||
+
|
||||
@@ -1,67 +0,0 @@
|
||||
Updated for owner removal from struct proc_dir_entry (2.6.30)
|
||||
|
||||
Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
|
||||
|
||||
---
|
||||
3rdparty/acerhk/acerhk.c | 7 -------
|
||||
1 file changed, 7 deletions(-)
|
||||
|
||||
diff -p -up linux-2.6.29/3rdparty/acerhk/acerhk.c.orig linux-2.6.29/3rdparty/acerhk/acerhk.c
|
||||
--- linux-2.6.29/3rdparty/acerhk/acerhk.c.orig 2009-05-22 02:42:44.000000000 -0300
|
||||
+++ linux-2.6.29/3rdparty/acerhk/acerhk.c 2009-05-22 02:43:45.000000000 -0300
|
||||
@@ -2626,7 +2626,6 @@ static int acerhk_proc_init(void)
|
||||
printk(KERN_INFO"acerhk: could not create /proc/driver/acerhk\n");
|
||||
}
|
||||
else {
|
||||
- proc_acer_dir->owner = THIS_MODULE;
|
||||
/* now create several files, first general info ... */
|
||||
entry = create_proc_read_entry("info",
|
||||
0444, proc_acer_dir, acerhk_proc_info, NULL);
|
||||
@@ -2635,7 +2634,6 @@ static int acerhk_proc_init(void)
|
||||
remove_proc_entry("driver/acerhk", NULL);
|
||||
retval = 0;
|
||||
} else {
|
||||
- entry->owner = THIS_MODULE;
|
||||
/* ... last pressed key ... */
|
||||
entry = create_proc_read_entry("key",
|
||||
0444, proc_acer_dir, acerhk_proc_key, NULL);
|
||||
@@ -2645,7 +2643,6 @@ static int acerhk_proc_init(void)
|
||||
remove_proc_entry("driver/acerhk", NULL);
|
||||
retval = 0;
|
||||
} else {
|
||||
- entry->owner = THIS_MODULE;
|
||||
/* ... and led control file */
|
||||
entry = create_proc_entry("led", 0222, proc_acer_dir);
|
||||
if (entry == NULL) {
|
||||
@@ -2657,7 +2654,6 @@ static int acerhk_proc_init(void)
|
||||
}
|
||||
else {
|
||||
entry->write_proc = acerhk_proc_led;
|
||||
- entry->owner = THIS_MODULE;
|
||||
/* ... and wireless led controll file */
|
||||
entry = create_proc_entry("wirelessled", 0222, proc_acer_dir);
|
||||
if (entry == NULL) {
|
||||
@@ -2670,7 +2666,6 @@ static int acerhk_proc_init(void)
|
||||
}
|
||||
else {
|
||||
entry->write_proc = acerhk_proc_wirelessled;
|
||||
- entry->owner = THIS_MODULE;
|
||||
/* ... and bluetooth led controll file */
|
||||
entry = create_proc_entry("blueled", 0222, proc_acer_dir);
|
||||
if (entry == NULL) {
|
||||
@@ -2683,7 +2678,6 @@ static int acerhk_proc_init(void)
|
||||
retval = 0;
|
||||
} else {
|
||||
entry->write_proc = acerhk_proc_blueled;
|
||||
- entry->owner = THIS_MODULE;
|
||||
retval = 1;
|
||||
#ifdef ACERDEBUG
|
||||
/* add extra file for debugging purposes */
|
||||
@@ -2700,7 +2694,6 @@ static int acerhk_proc_init(void)
|
||||
}
|
||||
else {
|
||||
entry->write_proc = acerhk_proc_debug;
|
||||
- entry->owner = THIS_MODULE;
|
||||
retval = 1;
|
||||
}
|
||||
#endif
|
||||
@@ -1,47 +0,0 @@
|
||||
Fix Makefile and add Kconfig for the aes2501 driver.
|
||||
|
||||
Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com>
|
||||
|
||||
---
|
||||
linux-2.6.23/3rdparty/aes2501/Kconfig | 10 ++++++++++
|
||||
linux-2.6.23/3rdparty/aes2501/Makefile | 19 +------------------
|
||||
2 files changed, 11 insertions(+), 18 deletions(-)
|
||||
|
||||
diff -p -up linux-2.6.23/3rdparty/aes2501/Kconfig.orig linux-2.6.23/3rdparty/aes2501/Kconfig
|
||||
--- linux-2.6.23/3rdparty/aes2501/Kconfig.orig 2008-01-13 23:14:47.000000000 -0200
|
||||
+++ linux-2.6.23/3rdparty/aes2501/Kconfig 2008-01-13 23:35:21.000000000 -0200
|
||||
@@ -0,0 +1,10 @@
|
||||
+config AES2501
|
||||
+ tristate "AuthenTec AES2501 Fingerprint Sensor Driver"
|
||||
+ depends on USB
|
||||
+ default m
|
||||
+ ---help---
|
||||
+ Say Y here if you have a AuthenTec AES2501 Fingerprint
|
||||
+ Sensor device.
|
||||
+
|
||||
+ To compile this driver as a module, choose M here: the
|
||||
+ module will be called aes2501.
|
||||
diff -p -up linux-2.6.23/3rdparty/aes2501/Makefile.orig linux-2.6.23/3rdparty/aes2501/Makefile
|
||||
--- linux-2.6.23/3rdparty/aes2501/Makefile.orig 2008-01-13 23:14:36.000000000 -0200
|
||||
+++ linux-2.6.23/3rdparty/aes2501/Makefile 2008-01-13 23:21:33.000000000 -0200
|
||||
@@ -1,19 +1,2 @@
|
||||
-
|
||||
-obj-m := aes2501.o
|
||||
-
|
||||
-KERNELDIR ?= /lib/modules/$(shell uname -r)/build
|
||||
-
|
||||
-PWD := $(shell pwd)
|
||||
-
|
||||
-all: usertest
|
||||
- $(MAKE) -C $(KERNELDIR) M=$(PWD)
|
||||
-
|
||||
-usertest:
|
||||
- gcc -I. -o usertest usertest.c
|
||||
-
|
||||
-clean:
|
||||
- rm -f *.o *~ aes2501.ko aes2501.mod.c Module.symvers usertest
|
||||
- rm -rf .tmp_versions
|
||||
- rm -f .*.cmd
|
||||
-
|
||||
+obj-$(CONFIG_AES2501) := aes2501.o
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,21 +0,0 @@
|
||||
Prevent oops on module removal when we don't have the device available.
|
||||
|
||||
Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com>
|
||||
|
||||
---
|
||||
linux-2.6.23/3rdparty/aes2501/aes2501.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff -p -up linux-2.6.23/3rdparty/aes2501/aes2501.c.orig linux-2.6.23/3rdparty/aes2501/aes2501.c
|
||||
--- linux-2.6.23/3rdparty/aes2501/aes2501.c.orig 2008-01-13 23:37:38.000000000 -0200
|
||||
+++ linux-2.6.23/3rdparty/aes2501/aes2501.c 2008-01-13 23:38:26.000000000 -0200
|
||||
@@ -1616,7 +1616,8 @@ static int __init aes2501_init(void)
|
||||
|
||||
static void __exit aes2501_exit(void)
|
||||
{
|
||||
- _dev->stop_scan = 1;
|
||||
+ if (_dev)
|
||||
+ _dev->stop_scan = 1;
|
||||
destroy_workqueue(comm_queue);
|
||||
usb_deregister(&aes2501_driver);
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,43 +0,0 @@
|
||||
|
||||
last_rx is gone, most drivers does not really need/use it anyway.
|
||||
|
||||
Also, include signal.h to fix implicit deklaration of function ”signal_pending”
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
--- linux/3rdparty/ndiswrapper/ndis.c.orig 2016-10-09 18:45:08.027226096 +0300
|
||||
+++ linux/3rdparty/ndiswrapper/ndis.c 2017-08-04 00:09:49.264110609 +0300
|
||||
@@ -2258,7 +2258,6 @@ wstdcall void NdisMIndicateReceivePacket
|
||||
WARNING("empty packet ignored");
|
||||
continue;
|
||||
}
|
||||
- wnd->net_dev->last_rx = jiffies;
|
||||
/* get total number of bytes in packet */
|
||||
NdisGetFirstBufferFromPacketSafe(packet, &buffer, &virt,
|
||||
&length, &total_length,
|
||||
@@ -2346,7 +2345,6 @@ wstdcall void EthRxIndicateHandler(struc
|
||||
ERROR("nmb is NULL");
|
||||
EXIT3(return);
|
||||
}
|
||||
- wnd->net_dev->last_rx = jiffies;
|
||||
|
||||
if (look_ahead_size < packet_size) {
|
||||
struct ndis_packet *packet;
|
||||
@@ -2461,7 +2459,6 @@ wstdcall void NdisMTransferDataComplete(
|
||||
WARNING("illegal packet");
|
||||
EXIT3(return);
|
||||
}
|
||||
- wnd->net_dev->last_rx = jiffies;
|
||||
oob_data = NDIS_PACKET_OOB_DATA(packet);
|
||||
skb_size = sizeof(oob_data->header) + oob_data->look_ahead_size +
|
||||
bytes_txed;
|
||||
--- linux/3rdparty/ndiswrapper/ntoskernel.h.orig 2017-08-03 23:52:29.015367906 +0300
|
||||
+++ linux/3rdparty/ndiswrapper/ntoskernel.h 2017-08-04 00:17:41.334914691 +0300
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/sched.h>
|
||||
+#include <linux/sched/signal.h>
|
||||
#include <linux/usb.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <asm/mman.h>
|
||||
@@ -1,16 +0,0 @@
|
||||
|
||||
__GFP_REPEAT is now __GFP_RETRY_MAYFAIL
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
--- linux/3rdparty/ndiswrapper/ntoskernel.h.orig 2017-10-15 01:11:56.041892449 +0300
|
||||
+++ linux/3rdparty/ndiswrapper/ntoskernel.h 2017-10-15 01:11:06.159204294 +0300
|
||||
@@ -122,7 +122,7 @@ static cpumask_t cpumasks[NR_CPUS];
|
||||
|
||||
#define PCI_DMA_ALLOC_COHERENT(pci_dev,size,dma_handle) \
|
||||
dma_alloc_coherent(&pci_dev->dev,size,dma_handle, \
|
||||
- GFP_KERNEL | __GFP_REPEAT)
|
||||
+ GFP_KERNEL | __GFP_RETRY_MAYFAIL)
|
||||
#define PCI_DMA_FREE_COHERENT(pci_dev,size,cpu_addr,dma_handle) \
|
||||
dma_free_coherent(&pci_dev->dev,size,cpu_addr,dma_handle)
|
||||
#define PCI_DMA_MAP_SINGLE(pci_dev,addr,size,direction) \
|
||||
@@ -1,7 +0,0 @@
|
||||
--- linux-2.6.24.orig/3rdparty/ndiswrapper/Kconfig 1969-12-31 21:00:00.000000000 -0300
|
||||
+++ linux-2.6.24/3rdparty/ndiswrapper/Kconfig 2007-11-26 15:11:31.000000000 -0200
|
||||
@@ -0,0 +1,4 @@
|
||||
+
|
||||
+config NDISWRAPPER
|
||||
+ tristate "NDIS driver wrapper support"
|
||||
+ depends on PCI && USB && !X86_64_XEN
|
||||
-45
@@ -1,45 +0,0 @@
|
||||
--- linux-3.12.2-ndiswrapper-1.59/3rdparty/ndiswrapper/Makefile.orig 2013-11-28 21:42:10.000000000 +0200
|
||||
+++ linux-3.12.2-ndiswrapper-1.59/3rdparty/ndiswrapper/Makefile 2013-11-30 21:41:19.550504380 +0200
|
||||
@@ -9,24 +9,10 @@ DISTFILES = \
|
||||
winnt_types.h workqueue.c wrapmem.c wrapmem.h wrapndis.c wrapndis.h \
|
||||
wrapper.c wrapper.h
|
||||
|
||||
-# By default, we try to compile the modules for the currently running
|
||||
-# kernel. But it's the first approximation, as we will re-read the
|
||||
-# version from the kernel sources.
|
||||
-KVERS_UNAME ?= $(shell uname -r)
|
||||
-
|
||||
# KBUILD is the path to the Linux kernel build tree. It is usually the
|
||||
# same as the kernel source tree, except when the kernel was compiled in
|
||||
# a separate directory.
|
||||
-KBUILD ?= $(shell readlink -f /lib/modules/$(KVERS_UNAME)/build)
|
||||
-
|
||||
-ifeq (,$(KBUILD))
|
||||
-$(error Kernel build tree not found - please set KBUILD to configured kernel)
|
||||
-endif
|
||||
-
|
||||
-KCONFIG := $(KBUILD)/.config
|
||||
-ifeq (,$(wildcard $(KCONFIG)))
|
||||
-$(error No .config found in $(KBUILD), please set KBUILD to configured kernel)
|
||||
-endif
|
||||
+KBUILD ?= $(srctree)
|
||||
|
||||
ifneq (,$(wildcard $(KBUILD)/include/linux/version.h))
|
||||
ifneq (,$(wildcard $(KBUILD)/include/generated/uapi/linux/version.h))
|
||||
@@ -43,16 +29,9 @@ endif
|
||||
ifeq (,$(wildcard $(VERSION_H)))
|
||||
VERSION_H := $(KBUILD)/include/linux/version.h
|
||||
endif
|
||||
-ifeq (,$(wildcard $(VERSION_H)))
|
||||
-$(error Please run 'make modules_prepare' in $(KBUILD))
|
||||
-endif
|
||||
|
||||
KVERS := $(shell sed -ne 's/"//g;s/^\#define UTS_RELEASE //p' $(VERSION_H))
|
||||
|
||||
-ifeq (,$(KVERS))
|
||||
-$(error Cannot find UTS_RELEASE in $(VERSION_H), please report)
|
||||
-endif
|
||||
-
|
||||
INST_DIR = /lib/modules/$(KVERS)/misc
|
||||
|
||||
SRC_DIR=$(shell pwd)
|
||||
@@ -1,978 +0,0 @@
|
||||
3rdparty/rfswitch/FILES | 6
|
||||
3rdparty/rfswitch/ISSUES | 28 +++
|
||||
3rdparty/rfswitch/Kconfig | 22 ++
|
||||
3rdparty/rfswitch/LICENSE | 339 +++++++++++++++++++++++++++++++++++++++++++++
|
||||
3rdparty/rfswitch/Makefile | 119 +++++++++++++++
|
||||
3rdparty/rfswitch/README | 44 +++++
|
||||
3rdparty/rfswitch/av5100.c | 174 +++++++++++++++++++++++
|
||||
3rdparty/rfswitch/pbe5.c | 205 +++++++++++++++++++++++++++
|
||||
8 files changed, 937 insertions(+)
|
||||
diff -Nurp linux-2.6.37/3rdparty/rfswitch/av5100.c linux-2.6.37.3rdparty/3rdparty/rfswitch/av5100.c
|
||||
--- linux-2.6.37/3rdparty/rfswitch/av5100.c 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/3rdparty/rfswitch/av5100.c 2008-03-28 05:25:28.000000000 +0200
|
||||
@@ -0,0 +1,174 @@
|
||||
+/*******************************************************************************
|
||||
+
|
||||
+ Copyright(c) 2003 - 2004 Intel Corporation. All rights reserved.
|
||||
+
|
||||
+ This program is free software; you can redistribute it and/or modify it
|
||||
+ under the terms of version 2 of the GNU General Public License as
|
||||
+ published by the Free Software Foundation.
|
||||
+
|
||||
+ This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
+ more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU General Public License along with
|
||||
+ this program; if not, write to the Free Software Foundation, Inc., 59
|
||||
+ Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
+
|
||||
+ The full GNU General Public License is included in this distribution in the
|
||||
+ file called LICENSE.
|
||||
+
|
||||
+ Contact Information:
|
||||
+ James P. Ketrenos <ipw2100-admin@linux.intel.com>
|
||||
+ Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
|
||||
+
|
||||
+*******************************************************************************/
|
||||
+#include <linux/compiler.h>
|
||||
+#include <linux/errno.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/netdevice.h>
|
||||
+#include <linux/version.h>
|
||||
+#include <linux/proc_fs.h>
|
||||
+#include <linux/ioport.h>
|
||||
+#include <asm/uaccess.h>
|
||||
+#include <asm/io.h>
|
||||
+
|
||||
+
|
||||
+#define DRV_NAME "av5100"
|
||||
+#define DRV_VERSION "1.3"
|
||||
+#define DRV_DESCRIPTION "SW RF kill switch for Averatec 5100P"
|
||||
+#define DRV_COPYRIGHT "Copyright(c) 2003-2004 Intel Corporation"
|
||||
+
|
||||
+static int radio = 1;
|
||||
+
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
|
||||
+
|
||||
+MODULE_PARM(radio, "i");
|
||||
+
|
||||
+#else /* LINUX_VERSION_CODE < 2.6.0 */
|
||||
+
|
||||
+#include <linux/moduleparam.h>
|
||||
+module_param(radio, int, 1);
|
||||
+
|
||||
+#endif /* LINUX_VERSION_CODE < 2.6.0 */
|
||||
+
|
||||
+MODULE_PARM_DESC(radio, "controls state of radio (1=on, 0=off)");
|
||||
+
|
||||
+MODULE_DESCRIPTION(DRV_DESCRIPTION);
|
||||
+MODULE_AUTHOR(DRV_COPYRIGHT);
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
+#define AV5100_RADIO_ON (0xe0)
|
||||
+#define AV5100_RADIO_OFF (0xe1)
|
||||
+
|
||||
+static int av5100_radio = AV5100_RADIO_OFF;
|
||||
+
|
||||
+static void av5100_set_radio(int state)
|
||||
+{
|
||||
+ printk(KERN_INFO DRV_NAME ": Radio being turned %s\n",
|
||||
+ (state == AV5100_RADIO_ON) ? "ON" : "OFF");
|
||||
+ outl(0x80020800, 0xcf8);
|
||||
+ outb(0x6f, 0x0072);
|
||||
+ outl(0x1800ffff, 0x1184);
|
||||
+ outb(state, 0x00b2);
|
||||
+ av5100_radio = state;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * proc stuff
|
||||
+ */
|
||||
+static struct proc_dir_entry *dir_base = NULL;
|
||||
+
|
||||
+static int proc_set_radio(struct file *file, const char *buffer,
|
||||
+ unsigned long count, void *data)
|
||||
+{
|
||||
+ av5100_set_radio(buffer[0] == '0' ? AV5100_RADIO_OFF : AV5100_RADIO_ON);
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static int proc_get_radio(char *page, char **start, off_t offset,
|
||||
+ int count, int *eof, void *data)
|
||||
+{
|
||||
+ int len = 0;
|
||||
+
|
||||
+ len += snprintf(page, count, DRV_NAME ": %d\n",
|
||||
+ av5100_radio == AV5100_RADIO_OFF ? 0 : 1);
|
||||
+
|
||||
+ *eof = 1;
|
||||
+ return len;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void av5100_proc_cleanup(void)
|
||||
+{
|
||||
+ if (dir_base) {
|
||||
+ remove_proc_entry("radio", dir_base);
|
||||
+ remove_proc_entry(DRV_NAME, &proc_root);
|
||||
+ dir_base = NULL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int av5100_proc_init(void)
|
||||
+{
|
||||
+ struct proc_dir_entry *ent;
|
||||
+ int err = 0;
|
||||
+
|
||||
+ dir_base = create_proc_entry(DRV_NAME, S_IFDIR, &proc_root);
|
||||
+ if (dir_base == NULL) {
|
||||
+ printk(KERN_ERR DRV_NAME ": Unable to initialise /proc/"
|
||||
+ DRV_NAME "\n");
|
||||
+ err = -ENOMEM;
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ ent = create_proc_entry("radio", S_IFREG | S_IRUGO | S_IWUSR,
|
||||
+ dir_base);
|
||||
+ if (ent) {
|
||||
+ ent->read_proc = proc_get_radio;
|
||||
+ ent->write_proc = proc_set_radio;
|
||||
+ } else {
|
||||
+ printk(KERN_ERR
|
||||
+ "Unable to initialize /proc/" DRV_NAME "/radio\n");
|
||||
+ err = -ENOMEM;
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+ fail:
|
||||
+ av5100_proc_cleanup();
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * module stuff
|
||||
+ */
|
||||
+static int __init av5100_init(void)
|
||||
+{
|
||||
+ av5100_proc_init();
|
||||
+
|
||||
+ av5100_set_radio((radio == 1) ? AV5100_RADIO_ON : AV5100_RADIO_OFF);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void __exit av5100_exit(void)
|
||||
+{
|
||||
+ av5100_set_radio(AV5100_RADIO_OFF);
|
||||
+
|
||||
+ av5100_proc_cleanup();
|
||||
+}
|
||||
+
|
||||
+module_init(av5100_init);
|
||||
+module_exit(av5100_exit);
|
||||
+
|
||||
+/*
|
||||
+ 1 2 3 4 5 6 7
|
||||
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
|
||||
+*/
|
||||
diff -Nurp linux-2.6.37/3rdparty/rfswitch/FILES linux-2.6.37.3rdparty/3rdparty/rfswitch/FILES
|
||||
--- linux-2.6.37/3rdparty/rfswitch/FILES 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/3rdparty/rfswitch/FILES 2004-07-09 07:44:19.000000000 +0300
|
||||
@@ -0,0 +1,6 @@
|
||||
+Makefile Used for building on 2.4, 2.6, internally and exteranlly
|
||||
+
|
||||
+FILES This file
|
||||
+
|
||||
+av5100.c Averatec 5100P SW Switch Module
|
||||
+pbe5.c Packard Bell Easynote SW Switch Module
|
||||
diff -Nurp linux-2.6.37/3rdparty/rfswitch/ISSUES linux-2.6.37.3rdparty/3rdparty/rfswitch/ISSUES
|
||||
--- linux-2.6.37/3rdparty/rfswitch/ISSUES 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/3rdparty/rfswitch/ISSUES 2004-07-09 07:43:22.000000000 +0300
|
||||
@@ -0,0 +1,28 @@
|
||||
+
|
||||
+ISSUES
|
||||
+------------ ----- ----- ---- --- -- -
|
||||
+
|
||||
+No packets! - RF kill switch
|
||||
+
|
||||
+If the module loads, but no packets are transferred you may have a SW based
|
||||
+radio kill switch. All laptops have some capability to disable the radio
|
||||
+via a button or switch. On some laptops that switch is physically tied to the
|
||||
+IPW2100; simply toggling the switch should enable the radio.
|
||||
+
|
||||
+On other laptops, the switch is a button that when pressed requires some
|
||||
+software driver to send some hardware command to some other piece of hardware
|
||||
+on the laptop, that then controls the radio. The driver currently has support
|
||||
+for the Averatec 5100P laptop's SW switch. Support will be added for other
|
||||
+laptop vendors as we become aware of them and figure out how to enable the
|
||||
+radio.
|
||||
+
|
||||
+To know if the radio is being disabled via the RF switch, perform the following:
|
||||
+
|
||||
+% cat /proc/net/ipw2100/eth1/state
|
||||
+Radio is disabled by RF switch
|
||||
+
|
||||
+If it says that, then your RF switch is currently disabling the radio. The
|
||||
+driver doesn't currently support switching back to the on state if you have a
|
||||
+physical RF switch (the radio may turn on and packets will work, but the proc
|
||||
+entry won't be updated)
|
||||
+
|
||||
diff -Nurp linux-2.6.37/3rdparty/rfswitch/Kconfig linux-2.6.37.3rdparty/3rdparty/rfswitch/Kconfig
|
||||
--- linux-2.6.37/3rdparty/rfswitch/Kconfig 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/3rdparty/rfswitch/Kconfig 2008-05-27 23:39:10.000000000 +0300
|
||||
@@ -0,0 +1,22 @@
|
||||
+menu "RF Switch"
|
||||
+ depends on EXPERIMENTAL
|
||||
+
|
||||
+config RFSWITCH
|
||||
+ tristate "RF Switch"
|
||||
+ depends on EXPERIMENTAL
|
||||
+
|
||||
+config AVERATEC_5100P
|
||||
+ tristate "averatec 5100P driver"
|
||||
+ depends on RFSWITCH
|
||||
+ ---help---
|
||||
+ This is an experimental driver for the wireless switch
|
||||
+ of some laptops (usefull with some ipw2x00 cards)
|
||||
+
|
||||
+config PACKARDBELL_E5
|
||||
+ tristate "pbe5 driver"
|
||||
+ depends on RFSWITCH
|
||||
+ ---help---
|
||||
+ This is an experimental driver for the wireless switch
|
||||
+ of some laptops (usefull with some ipw2x00 cards)
|
||||
+
|
||||
+endmenu
|
||||
diff -Nurp linux-2.6.37/3rdparty/rfswitch/LICENSE linux-2.6.37.3rdparty/3rdparty/rfswitch/LICENSE
|
||||
--- linux-2.6.37/3rdparty/rfswitch/LICENSE 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/3rdparty/rfswitch/LICENSE 2004-07-09 07:43:22.000000000 +0300
|
||||
@@ -0,0 +1,339 @@
|
||||
+
|
||||
+"This software program is licensed subject to the GNU General Public License
|
||||
+(GPL). Version 2, June 1991, available at
|
||||
+<http://www.fsf.org/copyleft/gpl.html>"
|
||||
+
|
||||
+GNU General Public License
|
||||
+
|
||||
+Version 2, June 1991
|
||||
+
|
||||
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
||||
+59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
|
||||
+
|
||||
+Everyone is permitted to copy and distribute verbatim copies of this license
|
||||
+document, but changing it is not allowed.
|
||||
+
|
||||
+Preamble
|
||||
+
|
||||
+The licenses for most software are designed to take away your freedom to
|
||||
+share and change it. By contrast, the GNU General Public License is intended
|
||||
+to guarantee your freedom to share and change free software--to make sure
|
||||
+the software is free for all its users. This General Public License applies
|
||||
+to most of the Free Software Foundation's software and to any other program
|
||||
+whose authors commit to using it. (Some other Free Software Foundation
|
||||
+software is covered by the GNU Library General Public License instead.) You
|
||||
+can apply it to your programs, too.
|
||||
+
|
||||
+When we speak of free software, we are referring to freedom, not price. Our
|
||||
+General Public Licenses are designed to make sure that you have the freedom
|
||||
+to distribute copies of free software (and charge for this service if you
|
||||
+wish), that you receive source code or can get it if you want it, that you
|
||||
+can change the software or use pieces of it in new free programs; and that
|
||||
+you know you can do these things.
|
||||
+
|
||||
+To protect your rights, we need to make restrictions that forbid anyone to
|
||||
+deny you these rights or to ask you to surrender the rights. These
|
||||
+restrictions translate to certain responsibilities for you if you distribute
|
||||
+copies of the software, or if you modify it.
|
||||
+
|
||||
+For example, if you distribute copies of such a program, whether gratis or
|
||||
+for a fee, you must give the recipients all the rights that you have. You
|
||||
+must make sure that they, too, receive or can get the source code. And you
|
||||
+must show them these terms so they know their rights.
|
||||
+
|
||||
+We protect your rights with two steps: (1) copyright the software, and (2)
|
||||
+offer you this license which gives you legal permission to copy, distribute
|
||||
+and/or modify the software.
|
||||
+
|
||||
+Also, for each author's protection and ours, we want to make certain that
|
||||
+everyone understands that there is no warranty for this free software. If
|
||||
+the software is modified by someone else and passed on, we want its
|
||||
+recipients to know that what they have is not the original, so that any
|
||||
+problems introduced by others will not reflect on the original authors'
|
||||
+reputations.
|
||||
+
|
||||
+Finally, any free program is threatened constantly by software patents. We
|
||||
+wish to avoid the danger that redistributors of a free program will
|
||||
+individually obtain patent licenses, in effect making the program
|
||||
+proprietary. To prevent this, we have made it clear that any patent must be
|
||||
+licensed for everyone's free use or not licensed at all.
|
||||
+
|
||||
+The precise terms and conditions for copying, distribution and modification
|
||||
+follow.
|
||||
+
|
||||
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
+
|
||||
+0. This License applies to any program or other work which contains a notice
|
||||
+ placed by the copyright holder saying it may be distributed under the
|
||||
+ terms of this General Public License. The "Program", below, refers to any
|
||||
+ such program or work, and a "work based on the Program" means either the
|
||||
+ Program or any derivative work under copyright law: that is to say, a
|
||||
+ work containing the Program or a portion of it, either verbatim or with
|
||||
+ modifications and/or translated into another language. (Hereinafter,
|
||||
+ translation is included without limitation in the term "modification".)
|
||||
+ Each licensee is addressed as "you".
|
||||
+
|
||||
+ Activities other than copying, distribution and modification are not
|
||||
+ covered by this License; they are outside its scope. The act of running
|
||||
+ the Program is not restricted, and the output from the Program is covered
|
||||
+ only if its contents constitute a work based on the Program (independent
|
||||
+ of having been made by running the Program). Whether that is true depends
|
||||
+ on what the Program does.
|
||||
+
|
||||
+1. You may copy and distribute verbatim copies of the Program's source code
|
||||
+ as you receive it, in any medium, provided that you conspicuously and
|
||||
+ appropriately publish on each copy an appropriate copyright notice and
|
||||
+ disclaimer of warranty; keep intact all the notices that refer to this
|
||||
+ License and to the absence of any warranty; and give any other recipients
|
||||
+ of the Program a copy of this License along with the Program.
|
||||
+
|
||||
+ You may charge a fee for the physical act of transferring a copy, and you
|
||||
+ may at your option offer warranty protection in exchange for a fee.
|
||||
+
|
||||
+2. You may modify your copy or copies of the Program or any portion of it,
|
||||
+ thus forming a work based on the Program, and copy and distribute such
|
||||
+ modifications or work under the terms of Section 1 above, provided that
|
||||
+ you also meet all of these conditions:
|
||||
+
|
||||
+ * a) You must cause the modified files to carry prominent notices stating
|
||||
+ that you changed the files and the date of any change.
|
||||
+
|
||||
+ * b) You must cause any work that you distribute or publish, that in
|
||||
+ whole or in part contains or is derived from the Program or any part
|
||||
+ thereof, to be licensed as a whole at no charge to all third parties
|
||||
+ under the terms of this License.
|
||||
+
|
||||
+ * c) If the modified program normally reads commands interactively when
|
||||
+ run, you must cause it, when started running for such interactive
|
||||
+ use in the most ordinary way, to print or display an announcement
|
||||
+ including an appropriate copyright notice and a notice that there is
|
||||
+ no warranty (or else, saying that you provide a warranty) and that
|
||||
+ users may redistribute the program under these conditions, and
|
||||
+ telling the user how to view a copy of this License. (Exception: if
|
||||
+ the Program itself is interactive but does not normally print such
|
||||
+ an announcement, your work based on the Program is not required to
|
||||
+ print an announcement.)
|
||||
+
|
||||
+ These requirements apply to the modified work as a whole. If identifiable
|
||||
+ sections of that work are not derived from the Program, and can be
|
||||
+ reasonably considered independent and separate works in themselves, then
|
||||
+ this License, and its terms, do not apply to those sections when you
|
||||
+ distribute them as separate works. But when you distribute the same
|
||||
+ sections as part of a whole which is a work based on the Program, the
|
||||
+ distribution of the whole must be on the terms of this License, whose
|
||||
+ permissions for other licensees extend to the entire whole, and thus to
|
||||
+ each and every part regardless of who wrote it.
|
||||
+
|
||||
+ Thus, it is not the intent of this section to claim rights or contest
|
||||
+ your rights to work written entirely by you; rather, the intent is to
|
||||
+ exercise the right to control the distribution of derivative or
|
||||
+ collective works based on the Program.
|
||||
+
|
||||
+ In addition, mere aggregation of another work not based on the Program
|
||||
+ with the Program (or with a work based on the Program) on a volume of a
|
||||
+ storage or distribution medium does not bring the other work under the
|
||||
+ scope of this License.
|
||||
+
|
||||
+3. You may copy and distribute the Program (or a work based on it, under
|
||||
+ Section 2) in object code or executable form under the terms of Sections
|
||||
+ 1 and 2 above provided that you also do one of the following:
|
||||
+
|
||||
+ * a) Accompany it with the complete corresponding machine-readable source
|
||||
+ code, which must be distributed under the terms of Sections 1 and 2
|
||||
+ above on a medium customarily used for software interchange; or,
|
||||
+
|
||||
+ * b) Accompany it with a written offer, valid for at least three years,
|
||||
+ to give any third party, for a charge no more than your cost of
|
||||
+ physically performing source distribution, a complete machine-
|
||||
+ readable copy of the corresponding source code, to be distributed
|
||||
+ under the terms of Sections 1 and 2 above on a medium customarily
|
||||
+ used for software interchange; or,
|
||||
+
|
||||
+ * c) Accompany it with the information you received as to the offer to
|
||||
+ distribute corresponding source code. (This alternative is allowed
|
||||
+ only for noncommercial distribution and only if you received the
|
||||
+ program in object code or executable form with such an offer, in
|
||||
+ accord with Subsection b above.)
|
||||
+
|
||||
+ The source code for a work means the preferred form of the work for
|
||||
+ making modifications to it. For an executable work, complete source code
|
||||
+ means all the source code for all modules it contains, plus any
|
||||
+ associated interface definition files, plus the scripts used to control
|
||||
+ compilation and installation of the executable. However, as a special
|
||||
+ exception, the source code distributed need not include anything that is
|
||||
+ normally distributed (in either source or binary form) with the major
|
||||
+ components (compiler, kernel, and so on) of the operating system on which
|
||||
+ the executable runs, unless that component itself accompanies the
|
||||
+ executable.
|
||||
+
|
||||
+ If distribution of executable or object code is made by offering access
|
||||
+ to copy from a designated place, then offering equivalent access to copy
|
||||
+ the source code from the same place counts as distribution of the source
|
||||
+ code, even though third parties are not compelled to copy the source
|
||||
+ along with the object code.
|
||||
+
|
||||
+4. You may not copy, modify, sublicense, or distribute the Program except as
|
||||
+ expressly provided under this License. Any attempt otherwise to copy,
|
||||
+ modify, sublicense or distribute the Program is void, and will
|
||||
+ automatically terminate your rights under this License. However, parties
|
||||
+ who have received copies, or rights, from you under this License will not
|
||||
+ have their licenses terminated so long as such parties remain in full
|
||||
+ compliance.
|
||||
+
|
||||
+5. You are not required to accept this License, since you have not signed
|
||||
+ it. However, nothing else grants you permission to modify or distribute
|
||||
+ the Program or its derivative works. These actions are prohibited by law
|
||||
+ if you do not accept this License. Therefore, by modifying or
|
||||
+ distributing the Program (or any work based on the Program), you
|
||||
+ indicate your acceptance of this License to do so, and all its terms and
|
||||
+ conditions for copying, distributing or modifying the Program or works
|
||||
+ based on it.
|
||||
+
|
||||
+6. Each time you redistribute the Program (or any work based on the
|
||||
+ Program), the recipient automatically receives a license from the
|
||||
+ original licensor to copy, distribute or modify the Program subject to
|
||||
+ these terms and conditions. You may not impose any further restrictions
|
||||
+ on the recipients' exercise of the rights granted herein. You are not
|
||||
+ responsible for enforcing compliance by third parties to this License.
|
||||
+
|
||||
+7. If, as a consequence of a court judgment or allegation of patent
|
||||
+ infringement or for any other reason (not limited to patent issues),
|
||||
+ conditions are imposed on you (whether by court order, agreement or
|
||||
+ otherwise) that contradict the conditions of this License, they do not
|
||||
+ excuse you from the conditions of this License. If you cannot distribute
|
||||
+ so as to satisfy simultaneously your obligations under this License and
|
||||
+ any other pertinent obligations, then as a consequence you may not
|
||||
+ distribute the Program at all. For example, if a patent license would
|
||||
+ not permit royalty-free redistribution of the Program by all those who
|
||||
+ receive copies directly or indirectly through you, then the only way you
|
||||
+ could satisfy both it and this License would be to refrain entirely from
|
||||
+ distribution of the Program.
|
||||
+
|
||||
+ If any portion of this section is held invalid or unenforceable under any
|
||||
+ particular circumstance, the balance of the section is intended to apply
|
||||
+ and the section as a whole is intended to apply in other circumstances.
|
||||
+
|
||||
+ It is not the purpose of this section to induce you to infringe any
|
||||
+ patents or other property right claims or to contest validity of any
|
||||
+ such claims; this section has the sole purpose of protecting the
|
||||
+ integrity of the free software distribution system, which is implemented
|
||||
+ by public license practices. Many people have made generous contributions
|
||||
+ to the wide range of software distributed through that system in
|
||||
+ reliance on consistent application of that system; it is up to the
|
||||
+ author/donor to decide if he or she is willing to distribute software
|
||||
+ through any other system and a licensee cannot impose that choice.
|
||||
+
|
||||
+ This section is intended to make thoroughly clear what is believed to be
|
||||
+ a consequence of the rest of this License.
|
||||
+
|
||||
+8. If the distribution and/or use of the Program is restricted in certain
|
||||
+ countries either by patents or by copyrighted interfaces, the original
|
||||
+ copyright holder who places the Program under this License may add an
|
||||
+ explicit geographical distribution limitation excluding those countries,
|
||||
+ so that distribution is permitted only in or among countries not thus
|
||||
+ excluded. In such case, this License incorporates the limitation as if
|
||||
+ written in the body of this License.
|
||||
+
|
||||
+9. The Free Software Foundation may publish revised and/or new versions of
|
||||
+ the General Public License from time to time. Such new versions will be
|
||||
+ similar in spirit to the present version, but may differ in detail to
|
||||
+ address new problems or concerns.
|
||||
+
|
||||
+ Each version is given a distinguishing version number. If the Program
|
||||
+ specifies a version number of this License which applies to it and "any
|
||||
+ later version", you have the option of following the terms and
|
||||
+ conditions either of that version or of any later version published by
|
||||
+ the Free Software Foundation. If the Program does not specify a version
|
||||
+ number of this License, you may choose any version ever published by the
|
||||
+ Free Software Foundation.
|
||||
+
|
||||
+10. If you wish to incorporate parts of the Program into other free programs
|
||||
+ whose distribution conditions are different, write to the author to ask
|
||||
+ for permission. For software which is copyrighted by the Free Software
|
||||
+ Foundation, write to the Free Software Foundation; we sometimes make
|
||||
+ exceptions for this. Our decision will be guided by the two goals of
|
||||
+ preserving the free status of all derivatives of our free software and
|
||||
+ of promoting the sharing and reuse of software generally.
|
||||
+
|
||||
+ NO WARRANTY
|
||||
+
|
||||
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||
+ FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||
+ OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
|
||||
+ PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
|
||||
+ EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
|
||||
+ ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
|
||||
+ YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
|
||||
+ NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
+
|
||||
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
+ WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
|
||||
+ REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
|
||||
+ DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
|
||||
+ DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM
|
||||
+ (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
|
||||
+ INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF
|
||||
+ THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
|
||||
+ OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||
+
|
||||
+END OF TERMS AND CONDITIONS
|
||||
+
|
||||
+How to Apply These Terms to Your New Programs
|
||||
+
|
||||
+If you develop a new program, and you want it to be of the greatest
|
||||
+possible use to the public, the best way to achieve this is to make it free
|
||||
+software which everyone can redistribute and change under these terms.
|
||||
+
|
||||
+To do so, attach the following notices to the program. It is safest to
|
||||
+attach them to the start of each source file to most effectively convey the
|
||||
+exclusion of warranty; and each file should have at least the "copyright"
|
||||
+line and a pointer to where the full notice is found.
|
||||
+
|
||||
+one line to give the program's name and an idea of what it does.
|
||||
+Copyright (C) yyyy name of author
|
||||
+
|
||||
+This program is free software; you can redistribute it and/or modify it
|
||||
+under the terms of the GNU General Public License as published by the Free
|
||||
+Software Foundation; either version 2 of the License, or (at your option)
|
||||
+any later version.
|
||||
+
|
||||
+This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
+more details.
|
||||
+
|
||||
+You should have received a copy of the GNU General Public License along with
|
||||
+this program; if not, write to the Free Software Foundation, Inc., 59
|
||||
+Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
+
|
||||
+Also add information on how to contact you by electronic and paper mail.
|
||||
+
|
||||
+If the program is interactive, make it output a short notice like this when
|
||||
+it starts in an interactive mode:
|
||||
+
|
||||
+Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
|
||||
+with ABSOLUTELY NO WARRANTY; for details type 'show w'. This is free
|
||||
+software, and you are welcome to redistribute it under certain conditions;
|
||||
+type 'show c' for details.
|
||||
+
|
||||
+The hypothetical commands 'show w' and 'show c' should show the appropriate
|
||||
+parts of the General Public License. Of course, the commands you use may be
|
||||
+called something other than 'show w' and 'show c'; they could even be
|
||||
+mouse-clicks or menu items--whatever suits your program.
|
||||
+
|
||||
+You should also get your employer (if you work as a programmer) or your
|
||||
+school, if any, to sign a "copyright disclaimer" for the program, if
|
||||
+necessary. Here is a sample; alter the names:
|
||||
+
|
||||
+Yoyodyne, Inc., hereby disclaims all copyright interest in the program
|
||||
+'Gnomovision' (which makes passes at compilers) written by James Hacker.
|
||||
+
|
||||
+signature of Ty Coon, 1 April 1989
|
||||
+Ty Coon, President of Vice
|
||||
+
|
||||
+This General Public License does not permit incorporating your program into
|
||||
+proprietary programs. If your program is a subroutine library, you may
|
||||
+consider it more useful to permit linking proprietary applications with the
|
||||
+library. If this is what you want to do, use the GNU Library General Public
|
||||
+License instead of this License.
|
||||
diff -Nurp linux-2.6.37/3rdparty/rfswitch/Makefile linux-2.6.37.3rdparty/3rdparty/rfswitch/Makefile
|
||||
--- linux-2.6.37/3rdparty/rfswitch/Makefile 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/3rdparty/rfswitch/Makefile 2008-03-28 05:17:16.000000000 +0200
|
||||
@@ -0,0 +1,119 @@
|
||||
+#
|
||||
+# Makefile for the SW RF Switch kernel modules
|
||||
+#
|
||||
+# NOTE: This make file can serve as both an external Makefile (launched
|
||||
+# directly by the user), or as the sub-dir Makefile used by the kernel
|
||||
+# build system.
|
||||
+
|
||||
+
|
||||
+CONFIG_AVERATEC_5100P=m
|
||||
+CONFIG_PACKARDBELL_E5=m
|
||||
+
|
||||
+
|
||||
+
|
||||
+list-m :=
|
||||
+list-$(CONFIG_AVERATEC_5100P) += av5100
|
||||
+list-$(CONFIG_PACKARDBELL_E5) += pbe5
|
||||
+
|
||||
+
|
||||
+obj-$(CONFIG_AVERATEC_5100P) += av5100.o
|
||||
+obj-$(CONFIG_PACKARDBELL_E5) += pbe5.o
|
||||
+
|
||||
+#
|
||||
+# Begin dual Makefile mode here. First we provide support for when we
|
||||
+# are being invoked by the kernel build system
|
||||
+#
|
||||
+ifneq ($(KERNELRELEASE),)
|
||||
+
|
||||
+ifneq ($(PATCHLEVEL),6) # If we are not on a 2.6, then do 2.4 specific things
|
||||
+
|
||||
+O_TARGET := rfswitch.o
|
||||
+
|
||||
+include $(TOPDIR)/Rules.make
|
||||
+
|
||||
+endif # End if 2.4 specific settings
|
||||
+
|
||||
+else
|
||||
+# Here we begin the portion that is executed if the user invoked this Makefile
|
||||
+# directly.
|
||||
+
|
||||
+# KSRC should be set to the path to your sources
|
||||
+# modules are installed into KMISC
|
||||
+KVER := $(shell uname -r)
|
||||
+KSRC := /lib/modules/$(KVER)/build
|
||||
+KMISC := /lib/modules/$(KVER)/kernel/drivers/net/wireless/
|
||||
+
|
||||
+# KSRC_OUTPUT should be overridden if you are using a 2.6 kernel that
|
||||
+# has it's output sent elsewhere via KBUILD_OUTPUT= or O=
|
||||
+KSRC_OUTPUT := $(KSRC)
|
||||
+
|
||||
+# If we find Rules.make, we can assume we're using the old 2.4 style building
|
||||
+OLDMAKE=$(wildcard $(KSRC)/Rules.make)
|
||||
+PWD=$(shell pwd)
|
||||
+
|
||||
+VERFILE := $(KSRC_OUTPUT)/include/linux/version.h
|
||||
+KERNELRELEASE := $(shell \
|
||||
+ if [ -r $(VERFILE) ]; then \
|
||||
+ (cat $(VERFILE); echo UTS_RELEASE) | \
|
||||
+ $(CC) -I$(KSRC_OUTPUT) $(CFLAGS) -E - | \
|
||||
+ tail -n 1 | \
|
||||
+ xargs echo; \
|
||||
+ else \
|
||||
+ uname -r; \
|
||||
+ fi)
|
||||
+
|
||||
+MODPATH := $(DESTDIR)/lib/modules/$(KERNELRELEASE)
|
||||
+
|
||||
+all: modules
|
||||
+
|
||||
+clean:
|
||||
+ rm -f *.mod.c *.mod *.o *.ko .*.cmd .*.flags Modules.symvers
|
||||
+ rm -rf $(PWD)/tmp
|
||||
+
|
||||
+
|
||||
+ifeq ($(OLDMAKE),)
|
||||
+
|
||||
+TMP=$(PWD)/tmp
|
||||
+MODVERDIR=$(TMP)/.tmp_versions
|
||||
+
|
||||
+modules:
|
||||
+ifdef ($(KSRC_OUTPUT)/.tmp_versions)
|
||||
+ mkdir -p $(MODVERDIR)
|
||||
+ -cp $(KSRC_OUTPUT)/.tmp_versions/*.mod $(MODVERDIR)
|
||||
+endif
|
||||
+ifeq ($(KSRC),$(KSRC_OUTPUT)) # We're not outputting elsewhere
|
||||
+ifdef ($(KSRC)/.tmp_versions)
|
||||
+ -cp $(KSRC)/.tmp_versions/*.mod $(MODVERDIR)
|
||||
+endif
|
||||
+ $(MAKE) -C $(KSRC) SUBDIRS=$(PWD) MODVERDIR=$(MODVERDIR) modules
|
||||
+else # We've got a kernel with seperate output, copy the config, and use O=
|
||||
+ mkdir -p $(TMP)
|
||||
+ cp $(KSRC_OUTPUT)/.config $(TMP)
|
||||
+ $(MAKE) -C $(KSRC) SUBDIRS=$(PWD) MODVERDIR=$(MODVERDIR) O=$(PWD)/tmp modules
|
||||
+endif
|
||||
+
|
||||
+install: modules
|
||||
+ install -d $(KMISC)
|
||||
+ install -m 644 -c $(addsuffix .ko,$(list-m)) $(KMISC)
|
||||
+ /sbin/depmod -a
|
||||
+
|
||||
+
|
||||
+else # We're on 2.4, and things are slightly different
|
||||
+
|
||||
+modules:
|
||||
+ $(MAKE) -C $(KSRC) SUBDIRS=$(PWD) BUILD_DIR=$(PWD) modules
|
||||
+
|
||||
+install: modules
|
||||
+ install -d $(KMISC)
|
||||
+ install -m 644 -c $(addsuffix .o,$(list-m)) $(KMISC)
|
||||
+ /sbin/depmod -a
|
||||
+
|
||||
+endif
|
||||
+
|
||||
+uninstall:
|
||||
+ cd $(KMISC)
|
||||
+ rm -rf $(addsuffix .ko,$(list-m))
|
||||
+ cd -
|
||||
+ /sbin/depmod -a
|
||||
+
|
||||
+endif
|
||||
diff -Nurp linux-2.6.37/3rdparty/rfswitch/pbe5.c linux-2.6.37.3rdparty/3rdparty/rfswitch/pbe5.c
|
||||
--- linux-2.6.37/3rdparty/rfswitch/pbe5.c 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/3rdparty/rfswitch/pbe5.c 2008-03-28 05:25:16.000000000 +0200
|
||||
@@ -0,0 +1,205 @@
|
||||
+/*******************************************************************************
|
||||
+
|
||||
+ This program is free software; you can redistribute it and/or modify it
|
||||
+ under the terms of version 2 of the GNU General Public License as
|
||||
+ published by the Free Software Foundation.
|
||||
+
|
||||
+ This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
+ more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU General Public License along with
|
||||
+ this program; if not, write to the Free Software Foundation, Inc., 59
|
||||
+ Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
+
|
||||
+ The full GNU General Public License is included in this distribution in the
|
||||
+ file called LICENSE.
|
||||
+
|
||||
+ Author:
|
||||
+ Pedro Ramalhais <pmr09313@students.fct.unl.pt>
|
||||
+
|
||||
+ Based on:
|
||||
+ av5100.c from http://ipw2100.sourceforge.net/
|
||||
+
|
||||
+*******************************************************************************/
|
||||
+
|
||||
+#include <linux/compiler.h>
|
||||
+#include <linux/errno.h>
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/netdevice.h>
|
||||
+#include <linux/version.h>
|
||||
+#include <linux/proc_fs.h>
|
||||
+#include <linux/ioport.h>
|
||||
+#include <asm/uaccess.h>
|
||||
+#include <asm/io.h>
|
||||
+
|
||||
+#define DRV_NAME "pbe5"
|
||||
+#define DRV_VERSION "1.3"
|
||||
+#define DRV_DESCRIPTION "SW RF kill switch for Packard Bell EasyNote E5"
|
||||
+#define DRV_AUTHOR "Pedro Ramalhais"
|
||||
+#define DRV_LICENSE "GPL"
|
||||
+
|
||||
+static int radio = 1;
|
||||
+
|
||||
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
|
||||
+
|
||||
+MODULE_PARM(radio, "i");
|
||||
+
|
||||
+#else /* LINUX_VERSION_CODE < 2.6.0 */
|
||||
+
|
||||
+#include <linux/moduleparam.h>
|
||||
+module_param(radio, int, 1);
|
||||
+
|
||||
+#endif /* LINUX_VERSION_CODE < 2.6.0 */
|
||||
+
|
||||
+MODULE_PARM_DESC(radio, "controls state of radio (1=on, 0=off)");
|
||||
+
|
||||
+MODULE_DESCRIPTION(DRV_DESCRIPTION);
|
||||
+MODULE_AUTHOR(DRV_AUTHOR);
|
||||
+MODULE_LICENSE(DRV_LICENSE);
|
||||
+
|
||||
+/*
|
||||
+ * NOTE: These values were obtained from disassembling the Icon.exe program
|
||||
+ * installed in the Packard Bell EasyNote E5 laptop. The names were guessed,
|
||||
+ * so don't rely on them.
|
||||
+ */
|
||||
+#define PBE5_PORT_TOGGLE 0x0b3
|
||||
+#define PBE5_VALUE_TOGGLE_ON 0x01
|
||||
+#define PBE5_VALUE_TOGGLE_OFF 0x00
|
||||
+#define PBE5_PORT_APPLY 0x0b2
|
||||
+#define PBE5_VALUE_APPLY 0xef
|
||||
+
|
||||
+// Some "booleans" =;-)
|
||||
+#define PBE5_RADIO_OFF 0
|
||||
+#define PBE5_RADIO_ON 1
|
||||
+
|
||||
+static int pbe5_radio_status = PBE5_RADIO_ON;
|
||||
+
|
||||
+unsigned char pbe5_get_radio(void)
|
||||
+{
|
||||
+ unsigned char val = 0x00;
|
||||
+
|
||||
+ val = inb(PBE5_PORT_TOGGLE);
|
||||
+
|
||||
+ return val;
|
||||
+}
|
||||
+
|
||||
+static void pbe5_set_radio(int state_set)
|
||||
+{
|
||||
+ pbe5_radio_status = pbe5_get_radio();
|
||||
+
|
||||
+ if (pbe5_radio_status != state_set) {
|
||||
+ // Set the radio toggle register
|
||||
+ outb(PBE5_VALUE_TOGGLE_ON, PBE5_PORT_TOGGLE);
|
||||
+ // Commit the radio toggle register value
|
||||
+ outb(PBE5_VALUE_APPLY, PBE5_PORT_APPLY);
|
||||
+ // Update the radio status
|
||||
+ pbe5_radio_status = pbe5_get_radio();
|
||||
+
|
||||
+ printk(KERN_INFO DRV_NAME ": Radio turned %s\n",
|
||||
+ (state_set == PBE5_RADIO_ON) ? "ON" : "OFF");
|
||||
+ } else {
|
||||
+ printk(KERN_INFO DRV_NAME ": Radio already %s\n",
|
||||
+ (state_set == PBE5_RADIO_ON) ? "ON" : "OFF");
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/*
|
||||
+ * proc stuff
|
||||
+ */
|
||||
+static struct proc_dir_entry *dir_base = NULL;
|
||||
+
|
||||
+static int proc_set_radio(struct file *file, const char *buffer,
|
||||
+ unsigned long count, void *data)
|
||||
+{
|
||||
+ pbe5_set_radio(buffer[0] == '0' ? PBE5_RADIO_OFF : PBE5_RADIO_ON);
|
||||
+
|
||||
+ return count;
|
||||
+}
|
||||
+
|
||||
+static int proc_get_radio(char *page, char **start, off_t offset,
|
||||
+ int count, int *eof, void *data)
|
||||
+{
|
||||
+ int len = 0;
|
||||
+
|
||||
+ len += snprintf(page, count, DRV_NAME ": %d\n",
|
||||
+ pbe5_radio_status == PBE5_RADIO_OFF ? 0 : 1);
|
||||
+
|
||||
+ *eof = 1;
|
||||
+ return len;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static void pbe5_proc_cleanup(void)
|
||||
+{
|
||||
+ if (dir_base) {
|
||||
+ remove_proc_entry("radio", dir_base);
|
||||
+ remove_proc_entry(DRV_NAME, &proc_root);
|
||||
+ dir_base = NULL;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+
|
||||
+static int pbe5_proc_init(void)
|
||||
+{
|
||||
+ struct proc_dir_entry *ent;
|
||||
+ int err = 0;
|
||||
+
|
||||
+ dir_base = create_proc_entry(DRV_NAME, S_IFDIR, &proc_root);
|
||||
+ if (dir_base == NULL) {
|
||||
+ printk(KERN_ERR DRV_NAME ": Unable to initialise /proc/"
|
||||
+ DRV_NAME "\n");
|
||||
+ err = -ENOMEM;
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+
|
||||
+ ent = create_proc_entry("radio", S_IFREG | S_IRUGO | S_IWUSR,
|
||||
+ dir_base);
|
||||
+ if (ent) {
|
||||
+ ent->read_proc = proc_get_radio;
|
||||
+ ent->write_proc = proc_set_radio;
|
||||
+ } else {
|
||||
+ printk(KERN_ERR
|
||||
+ "Unable to initialize /proc/" DRV_NAME "/radio\n");
|
||||
+ err = -ENOMEM;
|
||||
+ goto fail;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+ fail:
|
||||
+ pbe5_proc_cleanup();
|
||||
+ return err;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * module stuff
|
||||
+ */
|
||||
+static int __init pbe5_init(void)
|
||||
+{
|
||||
+ pbe5_proc_init();
|
||||
+
|
||||
+ pbe5_set_radio((radio == 1) ? PBE5_RADIO_ON : PBE5_RADIO_OFF);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void __exit pbe5_exit(void)
|
||||
+{
|
||||
+ pbe5_set_radio(PBE5_RADIO_OFF);
|
||||
+
|
||||
+ pbe5_proc_cleanup();
|
||||
+}
|
||||
+
|
||||
+module_init(pbe5_init);
|
||||
+module_exit(pbe5_exit);
|
||||
+
|
||||
+/*
|
||||
+ 1 2 3 4 5 6 7
|
||||
+12345678901234567890123456789012345678901234567890123456789012345678901234567890
|
||||
+*/
|
||||
diff -Nurp linux-2.6.37/3rdparty/rfswitch/README linux-2.6.37.3rdparty/3rdparty/rfswitch/README
|
||||
--- linux-2.6.37/3rdparty/rfswitch/README 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/3rdparty/rfswitch/README 2004-07-09 17:26:20.000000000 +0300
|
||||
@@ -0,0 +1,44 @@
|
||||
+Radio Kill Switch
|
||||
+------------ ----- ----- ---- --- -- -
|
||||
+Most laptops provide the ability for the user to physically disable the radio.
|
||||
+Some vendors have implemented this as a physical switch that requires no
|
||||
+software to turn the radio off and on. On other laptops, however, the switch
|
||||
+is controlled through a button being pressed and a software driver then making
|
||||
+calls to turn the radio off and on. This is referred to as a "software based
|
||||
+RF kill switch"
|
||||
+
|
||||
+Currently this project provides modules for controlling the software RF kill
|
||||
+switch on the Averatec 5100P and Packard Bell EasyNote E5. The code may work
|
||||
+on other laptops, but these are the only models on which it has been tested.
|
||||
+
|
||||
+To determine if you have a system that might be compatible with one of the
|
||||
+provided SW RF Kill switch modules, you can run:
|
||||
+
|
||||
+
|
||||
+ To check for the Packard Bell (to use module pbe) --
|
||||
+
|
||||
+ % dd if=/dev/mem bs=1 skip=983040 count=65535 2>/dev/null | strings | egrep "NEW-PC|Insyde Software MobilePRO BIOS"
|
||||
+
|
||||
+ To check for the Averatec (to use module av5100) --
|
||||
+
|
||||
+ % dd if=/dev/mem bs=1 skip=983040 count=65535 2>/dev/null | strings | egrep "AVERATEC"
|
||||
+
|
||||
+If you have one of those laptop models you can imply loading the av5100/pbe5
|
||||
+module and the radio will be toggled on and off. In addition, you can turn
|
||||
+the driver on and off by writing either a 1 or 0 to /proc/av5100/radio or
|
||||
+/proc/pbe5/radio. If you automatically load the av5100/pbe5 module when your
|
||||
+system boots, you may wish to use the radio module parameter to control the
|
||||
+state of the radio upon loading:
|
||||
+
|
||||
+ modprobe av5100 radio=0
|
||||
+ modprobe pbe5 radio=0
|
||||
+
|
||||
+results in the module loading with the radio turned off. You can then turn the
|
||||
+radio on by:
|
||||
+
|
||||
+ echo 1 > /proc/av5100/radio
|
||||
+ echo 1 > /proc/pbe5/radio
|
||||
+
|
||||
+If you have a SW RF kill switch and can not use one of the above modules,
|
||||
+please join us on IRC (irc.freenode.net) on channel #ipw2100 and someone may
|
||||
+be able to help.
|
||||
@@ -1,19 +0,0 @@
|
||||
|
||||
fix build with 3.0
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
3rdparty/rfswitch/Makefile | 2 --
|
||||
1 file changed, 2 deletions(-)
|
||||
|
||||
--- a/3rdparty/rfswitch/Makefile.orig 2011-07-15 02:37:27.000000000 +0300
|
||||
+++ a/3rdparty/rfswitch/Makefile 2011-07-15 13:47:10.463914526 +0300
|
||||
@@ -29,8 +29,6 @@ ifneq ($(PATCHLEVEL),6) # If we are not
|
||||
|
||||
O_TARGET := rfswitch.o
|
||||
|
||||
-include $(TOPDIR)/Rules.make
|
||||
-
|
||||
endif # End if 2.4 specific settings
|
||||
|
||||
else
|
||||
@@ -1,51 +0,0 @@
|
||||
Remove 'proc_root' usage
|
||||
|
||||
Commit c74c120a21d87b0b6925ada5830d8cac21e852d9 (Linus's tree) removed
|
||||
the export of 'proc_root' variable, because you can create on the proc's
|
||||
root directory by passing NULL where you would pass 'proc_root'.
|
||||
|
||||
Signed-off-by: Luiz Fernando N. Capitulino <lcapitulino@mandriva.com.br>
|
||||
Index: linux-2.6.25/3rdparty/rfswitch/av5100.c
|
||||
===================================================================
|
||||
--- linux-2.6.25.orig/3rdparty/rfswitch/av5100.c
|
||||
+++ linux-2.6.25/3rdparty/rfswitch/av5100.c
|
||||
@@ -107,7 +107,7 @@ static void av5100_proc_cleanup(void)
|
||||
{
|
||||
if (dir_base) {
|
||||
remove_proc_entry("radio", dir_base);
|
||||
- remove_proc_entry(DRV_NAME, &proc_root);
|
||||
+ remove_proc_entry(DRV_NAME, NULL);
|
||||
dir_base = NULL;
|
||||
}
|
||||
}
|
||||
@@ -118,7 +118,7 @@ static int av5100_proc_init(void)
|
||||
struct proc_dir_entry *ent;
|
||||
int err = 0;
|
||||
|
||||
- dir_base = create_proc_entry(DRV_NAME, S_IFDIR, &proc_root);
|
||||
+ dir_base = create_proc_entry(DRV_NAME, S_IFDIR, NULL);
|
||||
if (dir_base == NULL) {
|
||||
printk(KERN_ERR DRV_NAME ": Unable to initialise /proc/"
|
||||
DRV_NAME "\n");
|
||||
Index: linux-2.6.25/3rdparty/rfswitch/pbe5.c
|
||||
===================================================================
|
||||
--- linux-2.6.25.orig/3rdparty/rfswitch/pbe5.c
|
||||
+++ linux-2.6.25/3rdparty/rfswitch/pbe5.c
|
||||
@@ -138,7 +138,7 @@ static void pbe5_proc_cleanup(void)
|
||||
{
|
||||
if (dir_base) {
|
||||
remove_proc_entry("radio", dir_base);
|
||||
- remove_proc_entry(DRV_NAME, &proc_root);
|
||||
+ remove_proc_entry(DRV_NAME, NULL);
|
||||
dir_base = NULL;
|
||||
}
|
||||
}
|
||||
@@ -149,7 +149,7 @@ static int pbe5_proc_init(void)
|
||||
struct proc_dir_entry *ent;
|
||||
int err = 0;
|
||||
|
||||
- dir_base = create_proc_entry(DRV_NAME, S_IFDIR, &proc_root);
|
||||
+ dir_base = create_proc_entry(DRV_NAME, S_IFDIR, NULL);
|
||||
if (dir_base == NULL) {
|
||||
printk(KERN_ERR DRV_NAME ": Unable to initialise /proc/"
|
||||
DRV_NAME "\n");
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,189 +0,0 @@
|
||||
3rdparty/viahss/Kconfig | 14 +++++++
|
||||
3rdparty/viahss/Makefile | 3 +
|
||||
3rdparty/viahss/README.html | 68 ++++++++++++++++++++++++++++++++++++
|
||||
3rdparty/viahss/viahss.c | 83 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 168 insertions(+)
|
||||
diff -Nurp linux-2.6.37/3rdparty/viahss/Kconfig linux-2.6.37.3rdparty/3rdparty/viahss/Kconfig
|
||||
--- linux-2.6.37/3rdparty/viahss/Kconfig 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/3rdparty/viahss/Kconfig 2003-12-01 01:53:51.000000000 +0200
|
||||
@@ -0,0 +1,14 @@
|
||||
+config VIAHSS
|
||||
+ tristate "VIA High Speed Serial"
|
||||
+ depends on SERIAL_CORE && m
|
||||
+ ---help---
|
||||
+ VIA High Speed Serial is a little kernel module (1 KB) which enables
|
||||
+ high speed serial port modes of VIA VT82C686A or VT82C686B
|
||||
+ southbridge-equipped motherboards. With this module, you can use the
|
||||
+ serial port at 230400 bit/s so that you can get the full 128000 bit/s
|
||||
+ from ISDN-TA. The module has been tested with both 686A and 686B
|
||||
+ chipsets.
|
||||
+
|
||||
+ To compile this driver as a module, choose M here: the
|
||||
+ module will be called viahss.
|
||||
+
|
||||
diff -Nurp linux-2.6.37/3rdparty/viahss/Makefile linux-2.6.37.3rdparty/3rdparty/viahss/Makefile
|
||||
--- linux-2.6.37/3rdparty/viahss/Makefile 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/3rdparty/viahss/Makefile 2003-12-01 01:43:23.000000000 +0200
|
||||
@@ -0,0 +1,3 @@
|
||||
+
|
||||
+obj-$(CONFIG_VIAHSS) += viahss.o
|
||||
+
|
||||
diff -Nurp linux-2.6.37/3rdparty/viahss/README.html linux-2.6.37.3rdparty/3rdparty/viahss/README.html
|
||||
--- linux-2.6.37/3rdparty/viahss/README.html 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/3rdparty/viahss/README.html 2003-12-01 01:58:23.000000000 +0200
|
||||
@@ -0,0 +1,68 @@
|
||||
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
+<html>
|
||||
+<head>
|
||||
+ <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
|
||||
+ <title>High speed serial port for VIA VT82C686 chipsets for linux</title>
|
||||
+</head>
|
||||
+<body>
|
||||
+<H3>Setting the serial port speed over 115,200bps</H3>
|
||||
+<br>
|
||||
+If you have motherboard which has VIA VT82C686A or VT82C686B chipset
|
||||
+you can set serial ports in high speed mode with this kernel module.
|
||||
+I use module with external ISDN-TA and haven't had any problems
|
||||
+so far but I cannot guarantee that you won't have buffer overflows if
|
||||
+you use full 230K or 460K speed all the time (FIFO's are still 16550A size).
|
||||
+ISDN with two channels maxes out at 128 Kb which means that it doesn't
|
||||
+really stress serial ports at 230400. Unlike SHSMOD-patches you don't have
|
||||
+to patch serial driver and module takes only 1KB of memory when it's
|
||||
+loaded which should leave enough room for other programs. It should
|
||||
+be also possible to make this work from userspace but accessing
|
||||
+pci devices is so much easier from kernel.
|
||||
+
|
||||
+<H3>How to use module</H3>
|
||||
+Get the <A href=http://www.kati.fi/viahss/viahss-0.92.tar.gz>package</A>
|
||||
+and compile it using included makefiles.
|
||||
+<H3>For 2.4</H3>
|
||||
+If you have kernel in some other location than /usr/src/linux edit Makefile
|
||||
+before compiling. You can also install module with "make install". After
|
||||
+you have loaded module in kernel (use modprobe or insmod) you can set serial
|
||||
+ports to use high speed modes with setserial.<br>
|
||||
+<H3>For 2.5/2.6</H3>
|
||||
+Copy Makefile-2.6 on top of Makefile and do make. After loading module set
|
||||
+serial speed with setserial. (NOTE: This gives a warning on depracated
|
||||
+method).
|
||||
+
|
||||
+<br>
|
||||
+# setserial /dev/ttyS0 spd_cust divisor 0x8002
|
||||
+<br><br>
|
||||
+which sets COM1: speed to 230400. With 0x8001 you should get 460800
|
||||
+but I haven't tested it. If you want to use COM2: use ttyS1 instead of ttyS0.
|
||||
+
|
||||
+After this you should set program which you are using to use 38400 bps
|
||||
+speed which is now actually 230K or 460K. For more information check
|
||||
+setserial man page (spd_cust).
|
||||
+
|
||||
+You can use serial port work as normal if you do<br>
|
||||
+<br>
|
||||
+# setserial /dev/ttyS0 spd_normal <br><br>
|
||||
+After this you can also remove viahss module with rmmod if you need to. Module doesn't intefere with normal serial port usage so you can leave
|
||||
+it loaded if you don't need that extra 1KB which module uses.
|
||||
+<H3>Download</H3>
|
||||
+<A href=http://www.kati.fi/viahss/viahss-0.92.tar.gz>viahss-0.92.tar.gz</A>
|
||||
+
|
||||
+<H3>Acknowledgments</H3>
|
||||
+
|
||||
+Thanks to Kimmo Rintala for help with divisor settings.<br>
|
||||
+I also like to thank Jeff Garzik for help with VIA datasheets.<br>
|
||||
+Port to 2.5/2.6 by Kingsly John with the help of <A href=http://lwn.net>LWN</A>
|
||||
+
|
||||
+<H3>Version History</H3>
|
||||
+0.90 First release<br>
|
||||
+0.91 Fixed Makefile <br>
|
||||
+0.92 Fixed for 2.5/2.6<br>
|
||||
+
|
||||
+<H3>Contact</H3>
|
||||
+
|
||||
+You can reach me by email: <A href=mailto:jrauti@iki.fi>jrauti@iki.fi</A>
|
||||
+</body>
|
||||
+</html>
|
||||
diff -Nurp linux-2.6.37/3rdparty/viahss/viahss.c linux-2.6.37.3rdparty/3rdparty/viahss/viahss.c
|
||||
--- linux-2.6.37/3rdparty/viahss/viahss.c 1970-01-01 02:00:00.000000000 +0200
|
||||
+++ linux-2.6.37.3rdparty/3rdparty/viahss/viahss.c 2003-07-17 09:49:59.000000000 +0300
|
||||
@@ -0,0 +1,83 @@
|
||||
+/*
|
||||
+ * VIA VT 82c686[AB] high speed serial port enabler
|
||||
+ * Version 0.92
|
||||
+ * Copyright (c) 2000-2001 Juhani Rautiainen <jrauti@iki.fi>
|
||||
+ *
|
||||
+ * 0.92:
|
||||
+ * Ported to 2.5/2.6 by Kingsly John
|
||||
+ * - Corrected locking (no more cli() and sti())
|
||||
+ * - New makefile
|
||||
+ *
|
||||
+ * Can be freely distributed and used under the terms of the GNU GPL.
|
||||
+*/
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/config.h>
|
||||
+#include <linux/version.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/pci.h>
|
||||
+
|
||||
+const unsigned short confindex=0x3F0,confdata=0x3F1;
|
||||
+const unsigned char spcidx=0xEE;
|
||||
+
|
||||
+spinlock_t driver_lock = SPIN_LOCK_UNLOCKED;
|
||||
+
|
||||
+static int __init viahss_init(void)
|
||||
+{
|
||||
+ struct pci_dev *pcidev = NULL;
|
||||
+ unsigned char confval,val;
|
||||
+ pcidev = pci_find_device (PCI_VENDOR_ID_VIA,PCI_DEVICE_ID_VIA_82C686,NULL);
|
||||
+ if (pcidev) {
|
||||
+ spin_lock_irq(&driver_lock);
|
||||
+ /* start config */
|
||||
+ pci_read_config_byte(pcidev,0x85,&confval);
|
||||
+ confval |= 0x2;
|
||||
+ pci_write_config_byte (pcidev, 0x85,confval);
|
||||
+ /* activate high speed bits */
|
||||
+ outb(spcidx,confindex); /* set index */
|
||||
+ val = (unsigned char) inb(confdata);
|
||||
+ val |= 0xC0; /* both ports on high speed*/
|
||||
+ outb (spcidx,confindex);
|
||||
+ outb (val,confdata);
|
||||
+ /*stop config*/
|
||||
+ confval &= ~0x2;
|
||||
+ pci_write_config_byte(pcidev, 0x85, confval);
|
||||
+ spin_unlock_irq(&driver_lock);
|
||||
+ printk (KERN_INFO "VIA VT82C686[AB] serial port high speed enabled\n");
|
||||
+ }
|
||||
+ else {
|
||||
+ printk (KERN_INFO "Couldn't locate VIA chipset\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void __exit viahss_exit(void)
|
||||
+{
|
||||
+ struct pci_dev *pcidev = NULL;
|
||||
+ unsigned char confval,val;
|
||||
+ pcidev = pci_find_device (PCI_VENDOR_ID_VIA,PCI_DEVICE_ID_VIA_82C686,NULL);
|
||||
+ if (pcidev) {
|
||||
+ spin_lock_irq(&driver_lock);
|
||||
+ /* start config */
|
||||
+ pci_read_config_byte(pcidev,0x85,&confval);
|
||||
+ confval |= 0x2;
|
||||
+ pci_write_config_byte (pcidev, 0x85,confval);
|
||||
+ /* activate high speed bits */
|
||||
+ outb(spcidx,confindex); /* set index */
|
||||
+ val = (unsigned char) inb(confdata);
|
||||
+ val &= ~0xC0; /* both ports off high speed*/
|
||||
+ outb (spcidx,confindex);
|
||||
+ outb (val,confdata);
|
||||
+ /*stop config*/
|
||||
+ confval &= ~0x2;
|
||||
+ pci_write_config_byte(pcidev, 0x85, confval);
|
||||
+ spin_unlock_irq(&driver_lock);
|
||||
+ printk (KERN_INFO "VIA VT82C686[AB] serial port high speed disabled\n");
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+module_init(viahss_init);
|
||||
+module_exit(viahss_exit);
|
||||
+MODULE_DESCRIPTION("VIA VT82C686[AB] high speed serial port enabler");
|
||||
+MODULE_AUTHOR("Juhani Rautiainen <jrauti@iki.fi>");
|
||||
@@ -1,20 +0,0 @@
|
||||
--- linux-2.6.35-rc6-git-mnb0.1/3rdparty/viahss/viahss.c.orig 2010-07-30 21:17:30.000000000 +0300
|
||||
+++ linux-2.6.35-rc6-git-mnb0.1/3rdparty/viahss/viahss.c 2010-07-30 23:10:21.324978822 +0300
|
||||
@@ -25,7 +25,7 @@ static int __init viahss_init(void)
|
||||
{
|
||||
struct pci_dev *pcidev = NULL;
|
||||
unsigned char confval,val;
|
||||
- pcidev = pci_find_device (PCI_VENDOR_ID_VIA,PCI_DEVICE_ID_VIA_82C686,NULL);
|
||||
+ pcidev = pci_get_device (PCI_VENDOR_ID_VIA,PCI_DEVICE_ID_VIA_82C686,NULL);
|
||||
if (pcidev) {
|
||||
spin_lock_irq(&driver_lock);
|
||||
/* start config */
|
||||
@@ -55,7 +55,7 @@ static void __exit viahss_exit(void)
|
||||
{
|
||||
struct pci_dev *pcidev = NULL;
|
||||
unsigned char confval,val;
|
||||
- pcidev = pci_find_device (PCI_VENDOR_ID_VIA,PCI_DEVICE_ID_VIA_82C686,NULL);
|
||||
+ pcidev = pci_get_device (PCI_VENDOR_ID_VIA,PCI_DEVICE_ID_VIA_82C686,NULL);
|
||||
if (pcidev) {
|
||||
spin_lock_irq(&driver_lock);
|
||||
/* start config */
|
||||
@@ -1,19 +0,0 @@
|
||||
|
||||
fix build with 3.0
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
3rdparty/viahss/viahss.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
--- a/3rdparty/viahss/viahss.c.orig 2011-07-15 02:37:27.000000000 +0300
|
||||
+++ a/3rdparty/viahss/viahss.c 2011-07-15 13:48:13.204291256 +0300
|
||||
@@ -19,7 +19,7 @@
|
||||
const unsigned short confindex=0x3F0,confdata=0x3F1;
|
||||
const unsigned char spcidx=0xEE;
|
||||
|
||||
-spinlock_t driver_lock = SPIN_LOCK_UNLOCKED;
|
||||
+DEFINE_SPINLOCK(driver_lock);
|
||||
|
||||
static int __init viahss_init(void)
|
||||
{
|
||||
@@ -1,18 +0,0 @@
|
||||
linux/config.h is gone in 2.6.21
|
||||
|
||||
---
|
||||
3rdparty/viahss/viahss.c | 1 0 + 1 - 0 !
|
||||
1 files changed, 1 deletion(-)
|
||||
|
||||
Index: linux-2.6.21/3rdparty/viahss/viahss.c
|
||||
===================================================================
|
||||
--- linux-2.6.21.orig/3rdparty/viahss/viahss.c 2003-07-17 08:49:59.000000000 +0200
|
||||
+++ linux-2.6.21/3rdparty/viahss/viahss.c 2007-05-14 17:06:56.000000000 +0200
|
||||
@@ -12,7 +12,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
-#include <linux/config.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
@@ -1,7 +0,0 @@
|
||||
--- linux-2.6.25/3rdparty/viahss/viahss.c.orig 2008-06-28 22:50:05.000000000 +0300
|
||||
+++ linux-2.6.25/3rdparty/viahss/viahss.c 2008-06-29 14:26:55.000000000 +0300
|
||||
@@ -80,3 +80,4 @@ module_init(viahss_init);
|
||||
module_exit(viahss_exit);
|
||||
MODULE_DESCRIPTION("VIA VT82C686[AB] high speed serial port enabler");
|
||||
MODULE_AUTHOR("Juhani Rautiainen <jrauti@iki.fi>");
|
||||
+MODULE_LICENSE("GPL");
|
||||
@@ -1,3 +0,0 @@
|
||||
# Mageia SVN does not like binaries in /packages tree
|
||||
# it can still be used for out ov svn builds
|
||||
|
||||
-40
@@ -1,40 +0,0 @@
|
||||
From 61f9738d65094a6b18d22c7beb6bb8c3dc0606b9 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 26 Oct 2015 15:20:46 +0100
|
||||
Subject: [PATCH] ACPI / video: Add a quirk to force acpi-video backlight on
|
||||
Dell XPS L421X
|
||||
|
||||
Just like the Dell XPS 15 (L521X) the Dell XPS 14 (L421X) needs to use
|
||||
the acpi-video backlight interface rather then the native one for backlight
|
||||
control to work, add a quirk for this.
|
||||
|
||||
Link: https://bugzilla.redhat.com/show_bug.cgi?id=1272633
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
---
|
||||
drivers/acpi/video_detect.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c
|
||||
index 0d3a384..daaf1c4 100644
|
||||
--- a/drivers/acpi/video_detect.c
|
||||
+++ b/drivers/acpi/video_detect.c
|
||||
@@ -233,6 +233,15 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
|
||||
},
|
||||
},
|
||||
{
|
||||
+ /* https://bugzilla.redhat.com/show_bug.cgi?id=1272633 */
|
||||
+ .callback = video_detect_force_video,
|
||||
+ .ident = "Dell XPS14 L421X",
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
+ DMI_MATCH(DMI_PRODUCT_NAME, "XPS L421X"),
|
||||
+ },
|
||||
+ },
|
||||
+ {
|
||||
/* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */
|
||||
.callback = video_detect_force_video,
|
||||
.ident = "Dell XPS15 L521X",
|
||||
--
|
||||
2.3.10
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
From 84ecc2f6eb1cb12e6d44818f94fa49b50f06e6ac Mon Sep 17 00:00:00 2001
|
||||
From: Gen Zhang <blackgod016574@gmail.com>
|
||||
Date: Thu, 23 May 2019 08:34:52 +0800
|
||||
Subject: consolemap: Fix a memory leaking bug in drivers/tty/vt/consolemap.c
|
||||
|
||||
In function con_insert_unipair(), when allocation for p2 and p1[n]
|
||||
fails, ENOMEM is returned, but previously allocated p1 is not freed,
|
||||
remains as leaking memory. Thus we should free p1 as well when this
|
||||
allocation fails.
|
||||
|
||||
Signed-off-by: Gen Zhang <blackgod016574@gmail.com>
|
||||
Reviewed-by: Kees Cook <keescook@chromium.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/tty/vt/consolemap.c | 6 +++++-
|
||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/tty/vt/consolemap.c b/drivers/tty/vt/consolemap.c
|
||||
index b28aa0d289f8..79fcc96cc7c0 100644
|
||||
--- a/drivers/tty/vt/consolemap.c
|
||||
+++ b/drivers/tty/vt/consolemap.c
|
||||
@@ -489,7 +489,11 @@ con_insert_unipair(struct uni_pagedir *p, u_short unicode, u_short fontpos)
|
||||
p2 = p1[n = (unicode >> 6) & 0x1f];
|
||||
if (!p2) {
|
||||
p2 = p1[n] = kmalloc_array(64, sizeof(u16), GFP_KERNEL);
|
||||
- if (!p2) return -ENOMEM;
|
||||
+ if (!p2) {
|
||||
+ kfree(p1);
|
||||
+ p->uni_pgdir[n] = NULL;
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
memset(p2, 0xff, 64*sizeof(u16)); /* No glyphs for the characters (yet) */
|
||||
}
|
||||
|
||||
--
|
||||
cgit 1.2-0.3.lf.el7
|
||||
|
||||
-34
@@ -1,34 +0,0 @@
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Subject: [PATCH 2/2] PCI: Add function 1 DMA alias quirk for Highpoint RocketRAID 644L
|
||||
Date: Fri, 2 Mar 2018 11:36:33 +0100
|
||||
|
||||
The Highpoint RocketRAID 644L uses a Marvel 88SE9235 controller, as with
|
||||
other Marvel controllers this needs a function 1 DMA alias quirk.
|
||||
|
||||
Note the RocketRAID 642L uses the same Marvel 88SE9235 controller and
|
||||
already is listed with a function 1 DMA alias quirk.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1534106
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
drivers/pci/quirks.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
|
||||
index 8b14bd326d4a..46d47bd6ca1f 100644
|
||||
--- a/drivers/pci/quirks.c
|
||||
+++ b/drivers/pci/quirks.c
|
||||
@@ -3908,6 +3908,8 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_MARVELL_EXT, 0x9230,
|
||||
quirk_dma_func1_alias);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TTI, 0x0642,
|
||||
quirk_dma_func1_alias);
|
||||
+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TTI, 0x0645,
|
||||
+ quirk_dma_func1_alias);
|
||||
/* https://bugs.gentoo.org/show_bug.cgi?id=497630 */
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_JMICRON,
|
||||
PCI_DEVICE_ID_JMICRON_JMB388_ESD,
|
||||
--
|
||||
2.14.3
|
||||
|
||||
|
||||
-32
@@ -1,32 +0,0 @@
|
||||
From 88299efb05387c2c94120fdc9661aab2ec3a1ad8 Mon Sep 17 00:00:00 2001
|
||||
From: Thomas Backlund <tmb@mageia.org>
|
||||
Date: Fri, 3 Apr 2015 00:10:34 +0259
|
||||
Subject: [PATCH] Revert "cpufreq: pcc: Enable autoload of pcc-cpufreq for ACPI
|
||||
processors"
|
||||
|
||||
This reverts commit 7e7e8fe69820c6fa31395dbbd8e348e3c69cd2a9.
|
||||
---
|
||||
drivers/cpufreq/pcc-cpufreq.c | 7 -------
|
||||
1 file changed, 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/cpufreq/pcc-cpufreq.c b/drivers/cpufreq/pcc-cpufreq.c
|
||||
index 2a0d589..4d2c8e8 100644
|
||||
--- a/drivers/cpufreq/pcc-cpufreq.c
|
||||
+++ b/drivers/cpufreq/pcc-cpufreq.c
|
||||
@@ -603,13 +603,6 @@ static void __exit pcc_cpufreq_exit(void)
|
||||
free_percpu(pcc_cpu_info);
|
||||
}
|
||||
|
||||
-static const struct acpi_device_id processor_device_ids[] = {
|
||||
- {ACPI_PROCESSOR_OBJECT_HID, },
|
||||
- {ACPI_PROCESSOR_DEVICE_HID, },
|
||||
- {},
|
||||
-};
|
||||
-MODULE_DEVICE_TABLE(acpi, processor_device_ids);
|
||||
-
|
||||
MODULE_AUTHOR("Matthew Garrett, Naga Chumbalkar");
|
||||
MODULE_VERSION(PCC_VERSION);
|
||||
MODULE_DESCRIPTION("Processor Clocking Control interface driver");
|
||||
--
|
||||
2.3.1
|
||||
|
||||
-28
@@ -1,28 +0,0 @@
|
||||
Subject: CLEVO M360S acpi irq workaround
|
||||
|
||||
Some Hardware vendor use CLEVO M360S Laptop OEM.
|
||||
This acpi IRQ routing is not correct. we use normal IRQ routing for default.
|
||||
|
||||
Signed-off-by: Go Taniguchi <go@turbolinux.co.jp>
|
||||
|
||||
---
|
||||
arch/x86/kernel/acpi/boot.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
--- a/arch/x86/kernel/acpi/boot.c
|
||||
+++ b/arch/x86/kernel/acpi/boot.c
|
||||
@@ -1615,6 +1615,14 @@ static struct dmi_system_id __initdata a
|
||||
},
|
||||
},
|
||||
{
|
||||
+ .callback = disable_acpi_irq,
|
||||
+ .ident = "CLEVO M360S",
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "CLEVO Co."),
|
||||
+ DMI_MATCH(DMI_PRODUCT_NAME, "M360S"),
|
||||
+ },
|
||||
+ },
|
||||
+ {
|
||||
/*
|
||||
* Latest BIOS for IBM 600E (1.16) has bad pcinum
|
||||
* for LPC bridge, which is needed for the PCI
|
||||
-49
@@ -1,49 +0,0 @@
|
||||
From: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||
Subject: [PATCH] ACPI / EC: Restore polling during noirq suspend/resume phases
|
||||
Date: Fri, 09 Feb 2018 22:55:28 +0100
|
||||
|
||||
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
|
||||
Commit 662591461c4b (ACPI / EC: Drop EC noirq hooks to fix a
|
||||
regression) modified the ACPI EC driver so that it doesn't switch
|
||||
over to busy polling mode during noirq stages of system suspend and
|
||||
resume in an attempt to fix an issue resulting from that behavior.
|
||||
|
||||
However, that modification introduced a system resume regression on
|
||||
Thinkpad X240, so make the EC driver switch over to the polling mode
|
||||
during noirq stages of system suspend and resume again, which
|
||||
effectively reverts the problematic commit.
|
||||
|
||||
Fixes: 662591461c4b (ACPI / EC: Drop EC noirq hooks to fix a regression)
|
||||
Link: https://bugzilla.kernel.org/show_bug.cgi?id=197863
|
||||
Reported-by: Markus Demleitner <m@tfiu.de>
|
||||
Tested-by: Markus Demleitner <m@tfiu.de>
|
||||
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
---
|
||||
drivers/acpi/ec.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
Index: linux-pm/drivers/acpi/ec.c
|
||||
===================================================================
|
||||
--- linux-pm.orig/drivers/acpi/ec.c
|
||||
+++ linux-pm/drivers/acpi/ec.c
|
||||
@@ -1927,6 +1927,9 @@ static int acpi_ec_suspend_noirq(struct
|
||||
ec->reference_count >= 1)
|
||||
acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_DISABLE);
|
||||
|
||||
+ if (acpi_sleep_no_ec_events())
|
||||
+ acpi_ec_enter_noirq(ec);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1934,6 +1937,9 @@ static int acpi_ec_resume_noirq(struct d
|
||||
{
|
||||
struct acpi_ec *ec = acpi_driver_data(to_acpi_device(dev));
|
||||
|
||||
+ if (acpi_sleep_no_ec_events())
|
||||
+ acpi_ec_leave_noirq(ec);
|
||||
+
|
||||
if (ec_no_wakeup && test_bit(EC_FLAGS_STARTED, &ec->flags) &&
|
||||
ec->reference_count >= 1)
|
||||
acpi_set_gpe(NULL, ec->gpe, ACPI_GPE_ENABLE);
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
Limit Clevo M720SR to C2, going to C3 makes the machine freeze. This
|
||||
needs more investigation, sis chipset/bios problem may be?
|
||||
|
||||
Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com>
|
||||
|
||||
---
|
||||
drivers/acpi/processor_idle.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
--- linux-2.6.33-rc8-git4-t2/drivers/acpi/processor_idle.c.orig 2010-02-20 12:45:35.000000000 +0200
|
||||
+++ linux-2.6.33-rc8-git4-t2/drivers/acpi/processor_idle.c 2010-02-20 12:53:39.679099592 +0200
|
||||
@@ -110,6 +110,9 @@ static struct dmi_system_id __cpuinitdat
|
||||
DMI_MATCH(DMI_BIOS_VENDOR,"Phoenix Technologies LTD"),
|
||||
DMI_MATCH(DMI_BIOS_VERSION,"SHE845M0.86C.0013.D.0302131307")},
|
||||
(void *)2},
|
||||
+ { set_max_cstate, "Clevo M720SR", {
|
||||
+ DMI_MATCH(DMI_BIOS_VENDOR,"Phoenix Technologies LTD"),
|
||||
+ DMI_MATCH(DMI_PRODUCT_NAME,"M720SR")}, (void *)2},
|
||||
{ set_max_cstate, "Pavilion zv5000", {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME,"Pavilion zv5000 (DS502A#ABA)")},
|
||||
-46
@@ -1,46 +0,0 @@
|
||||
From 863204cfdae98626a92535ac928ad79f4d6b74ff Mon Sep 17 00:00:00 2001
|
||||
From: Arnd Bergmann <arnd@arndb.de>
|
||||
Date: Wed, 6 Dec 2017 14:17:17 +0100
|
||||
Subject: [PATCH] ARM: omap2: hide omap3_save_secure_ram on non-OMAP3 builds
|
||||
|
||||
In configurations without CONFIG_OMAP3 but with secure RAM support,
|
||||
we now run into a link failure:
|
||||
|
||||
arch/arm/mach-omap2/omap-secure.o: In function `omap3_save_secure_ram':
|
||||
omap-secure.c:(.text+0x130): undefined reference to `save_secure_ram_context'
|
||||
|
||||
The omap3_save_secure_ram() function is only called from the OMAP34xx
|
||||
power management code, so we can simply hide that function in the
|
||||
appropriate #ifdef.
|
||||
|
||||
Fixes: d09220a887f7 ("ARM: OMAP2+: Fix SRAM virt to phys translation for save_secure_ram_context")
|
||||
Acked-by: Tony Lindgren <tony@atomide.com>
|
||||
Tested-by: Dan Murphy <dmurphy@ti.com>
|
||||
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
||||
---
|
||||
arch/arm/mach-omap2/omap-secure.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/arch/arm/mach-omap2/omap-secure.c b/arch/arm/mach-omap2/omap-secure.c
|
||||
index 9ff92050053c..fa7f308c9027 100644
|
||||
--- a/arch/arm/mach-omap2/omap-secure.c
|
||||
+++ b/arch/arm/mach-omap2/omap-secure.c
|
||||
@@ -73,6 +73,7 @@ phys_addr_t omap_secure_ram_mempool_base(void)
|
||||
return omap_secure_memblock_base;
|
||||
}
|
||||
|
||||
+#if defined(CONFIG_ARCH_OMAP3) && defined(CONFIG_PM)
|
||||
u32 omap3_save_secure_ram(void __iomem *addr, int size)
|
||||
{
|
||||
u32 ret;
|
||||
@@ -91,6 +92,7 @@ u32 omap3_save_secure_ram(void __iomem *addr, int size)
|
||||
|
||||
return ret;
|
||||
}
|
||||
+#endif
|
||||
|
||||
/**
|
||||
* rx51_secure_dispatcher: Routine to dispatch secure PPA API calls
|
||||
--
|
||||
2.16.2
|
||||
|
||||
-37
@@ -1,37 +0,0 @@
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Subject: [PATCH 1/2] ahci: Add PCI-id for the Highpoint Rocketraid 644L card
|
||||
Date: Fri, 2 Mar 2018 11:36:32 +0100
|
||||
|
||||
Like the Highpoint Rocketraid 642L and cards using a Marvel 88SE9235
|
||||
controller in general, this RAID card also supports AHCI mode and short
|
||||
of a custom driver, this is the only way to make it work under Linux.
|
||||
|
||||
Note that even though the card is called to 644L, it has a product-id
|
||||
of 0x0645.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1534106
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
drivers/ata/ahci.c | 4 +++-
|
||||
1 file changed, 3 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
|
||||
index 355a95a83a34..1ff17799769d 100644
|
||||
--- a/drivers/ata/ahci.c
|
||||
+++ b/drivers/ata/ahci.c
|
||||
@@ -550,7 +550,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
.driver_data = board_ahci_yes_fbs },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_MARVELL_EXT, 0x9230),
|
||||
.driver_data = board_ahci_yes_fbs },
|
||||
- { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0642),
|
||||
+ { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0642), /* highpoint rocketraid 642L */
|
||||
+ .driver_data = board_ahci_yes_fbs },
|
||||
+ { PCI_DEVICE(PCI_VENDOR_ID_TTI, 0x0645), /* highpoint rocketraid 644L */
|
||||
.driver_data = board_ahci_yes_fbs },
|
||||
|
||||
/* Promise */
|
||||
--
|
||||
2.14.3
|
||||
|
||||
|
||||
-34
@@ -1,34 +0,0 @@
|
||||
>From 9f04e51293b130474504216a477bb2a73cbf59e1 Mon Sep 17 00:00:00 2001
|
||||
From: Anssi Hannula <anssi.hannula@iki.fi>
|
||||
Date: Thu, 22 Mar 2012 22:29:11 +0200
|
||||
Subject: [PATCH] ata: prefer ata drivers over ide drivers when both are built
|
||||
|
||||
Currently the old IDE drivers are preferred over ATA drivers when both
|
||||
are built, since ide/ is listed first in drivers/Makefile and therefore
|
||||
the IDE drivers end up before ATA drivers in modules.order which is used
|
||||
by depmod/modprobe for module ordering.
|
||||
|
||||
Change it so that ATA drivers are preferred over IDE driver by moving
|
||||
the ide/ entry under ata/ in drivers/Makefile.
|
||||
|
||||
Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
|
||||
---
|
||||
drivers/Makefile | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/Makefile b/drivers/Makefile
|
||||
index 932e8bf..e8df3d0 100644
|
||||
--- a/drivers/Makefile
|
||||
+++ b/drivers/Makefile
|
||||
@@ -69,10 +69,10 @@ obj-$(CONFIG_LIBNVDIMM) += nvdimm/
|
||||
obj-$(CONFIG_DMA_SHARED_BUFFER) += dma-buf/
|
||||
obj-$(CONFIG_NUBUS) += nubus/
|
||||
obj-y += macintosh/
|
||||
-obj-$(CONFIG_IDE) += ide/
|
||||
obj-$(CONFIG_SCSI) += scsi/
|
||||
obj-y += nvme/
|
||||
obj-$(CONFIG_ATA) += ata/
|
||||
+obj-$(CONFIG_IDE) += ide/
|
||||
obj-$(CONFIG_TARGET_CORE) += target/
|
||||
obj-$(CONFIG_MTD) += mtd/
|
||||
obj-$(CONFIG_SPI) += spi/
|
||||
-107
@@ -1,107 +0,0 @@
|
||||
From 614822f81f606e0064acdae11d9ec1efd3db4190 Mon Sep 17 00:00:00 2001
|
||||
From: Luca Miccio <lucmiccio@gmail.com>
|
||||
Date: Mon, 13 Nov 2017 07:34:08 +0100
|
||||
Subject: [PATCH] block, bfq: add missing invocations of
|
||||
bfqg_stats_update_io_add/remove
|
||||
|
||||
bfqg_stats_update_io_add and bfqg_stats_update_io_remove are to be
|
||||
invoked, respectively, when an I/O request enters and when an I/O
|
||||
request exits the scheduler. Unfortunately, bfq does not fully comply
|
||||
with this scheme, because it does not invoke these functions for
|
||||
requests that are inserted into or extracted from its priority
|
||||
dispatch list. This commit fixes this mistake.
|
||||
|
||||
Tested-by: Lee Tibbert <lee.tibbert@gmail.com>
|
||||
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Luca Miccio <lucmiccio@gmail.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 21 ++++++++++++++++++---
|
||||
1 file changed, 18 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 889a8549d97f..91703eba63f0 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -1359,7 +1359,6 @@ static void bfq_bfqq_handle_idle_busy_switch(struct bfq_data *bfqd,
|
||||
bfqq->ttime.last_end_request +
|
||||
bfqd->bfq_slice_idle * 3;
|
||||
|
||||
- bfqg_stats_update_io_add(bfqq_group(RQ_BFQQ(rq)), bfqq, rq->cmd_flags);
|
||||
|
||||
/*
|
||||
* bfqq deserves to be weight-raised if:
|
||||
@@ -1633,7 +1632,6 @@ static void bfq_remove_request(struct request_queue *q,
|
||||
if (rq->cmd_flags & REQ_META)
|
||||
bfqq->meta_pending--;
|
||||
|
||||
- bfqg_stats_update_io_remove(bfqq_group(bfqq), rq->cmd_flags);
|
||||
}
|
||||
|
||||
static bool bfq_bio_merge(struct blk_mq_hw_ctx *hctx, struct bio *bio)
|
||||
@@ -1746,6 +1744,7 @@ static void bfq_requests_merged(struct request_queue *q, struct request *rq,
|
||||
bfqq->next_rq = rq;
|
||||
|
||||
bfq_remove_request(q, next);
|
||||
+ bfqg_stats_update_io_remove(bfqq_group(bfqq), next->cmd_flags);
|
||||
|
||||
spin_unlock_irq(&bfqq->bfqd->lock);
|
||||
end:
|
||||
@@ -3700,6 +3699,9 @@ static struct request *bfq_dispatch_request(struct blk_mq_hw_ctx *hctx)
|
||||
spin_lock_irq(&bfqd->lock);
|
||||
|
||||
rq = __bfq_dispatch_request(hctx);
|
||||
+ if (rq && RQ_BFQQ(rq))
|
||||
+ bfqg_stats_update_io_remove(bfqq_group(RQ_BFQQ(rq)),
|
||||
+ rq->cmd_flags);
|
||||
spin_unlock_irq(&bfqd->lock);
|
||||
|
||||
return rq;
|
||||
@@ -4224,6 +4226,7 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
{
|
||||
struct request_queue *q = hctx->queue;
|
||||
struct bfq_data *bfqd = q->elevator->elevator_data;
|
||||
+ struct bfq_queue *bfqq = RQ_BFQQ(rq);
|
||||
|
||||
spin_lock_irq(&bfqd->lock);
|
||||
if (blk_mq_sched_try_insert_merge(q, rq)) {
|
||||
@@ -4243,6 +4246,12 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
list_add_tail(&rq->queuelist, &bfqd->dispatch);
|
||||
} else {
|
||||
__bfq_insert_request(bfqd, rq);
|
||||
+ /*
|
||||
+ * Update bfqq, because, if a queue merge has occurred
|
||||
+ * in __bfq_insert_request, then rq has been
|
||||
+ * redirected into a new queue.
|
||||
+ */
|
||||
+ bfqq = RQ_BFQQ(rq);
|
||||
|
||||
if (rq_mergeable(rq)) {
|
||||
elv_rqhash_add(q, rq);
|
||||
@@ -4251,6 +4260,9 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
}
|
||||
}
|
||||
|
||||
+ if (bfqq)
|
||||
+ bfqg_stats_update_io_add(bfqq_group(bfqq), bfqq, rq->cmd_flags);
|
||||
+
|
||||
spin_unlock_irq(&bfqd->lock);
|
||||
}
|
||||
|
||||
@@ -4428,8 +4440,11 @@ static void bfq_finish_request(struct request *rq)
|
||||
* lock is held.
|
||||
*/
|
||||
|
||||
- if (!RB_EMPTY_NODE(&rq->rb_node))
|
||||
+ if (!RB_EMPTY_NODE(&rq->rb_node)) {
|
||||
bfq_remove_request(rq->q, rq);
|
||||
+ bfqg_stats_update_io_remove(bfqq_group(bfqq),
|
||||
+ rq->cmd_flags);
|
||||
+ }
|
||||
bfq_put_rq_priv_body(bfqq);
|
||||
}
|
||||
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-41
@@ -1,41 +0,0 @@
|
||||
From 05e90283561648301e30232fe0c91bd345ceba03 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Wed, 20 Dec 2017 12:38:31 +0100
|
||||
Subject: [PATCH] block, bfq: add missing rq_pos_tree update on rq removal
|
||||
|
||||
If two processes do I/O close to each other, then BFQ merges the
|
||||
bfq_queues associated with these processes, to get a more sequential
|
||||
I/O, and thus a higher throughput. In this respect, to detect whether
|
||||
two processes are doing I/O close to each other, BFQ keeps a list of
|
||||
the head-of-line I/O requests of all active bfq_queues. The list is
|
||||
ordered by initial sectors, and implemented through a red-black tree
|
||||
(rq_pos_tree).
|
||||
|
||||
Unfortunately, the update of the rq_pos_tree was incomplete, because
|
||||
the tree was not updated on the removal of the head-of-line I/O
|
||||
request of a bfq_queue, in case the queue did not remain empty. This
|
||||
commit adds the missing update.
|
||||
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Angelo Ruocco <angeloruocco90@gmail.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 0f48583b9380..fa395a260a23 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -1627,6 +1627,8 @@ static void bfq_remove_request(struct request_queue *q,
|
||||
rb_erase(&bfqq->pos_node, bfqq->pos_root);
|
||||
bfqq->pos_root = NULL;
|
||||
}
|
||||
+ } else {
|
||||
+ bfq_pos_tree_add_move(bfqd, bfqq);
|
||||
}
|
||||
|
||||
if (rq->cmd_flags & REQ_META)
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-224
@@ -1,224 +0,0 @@
|
||||
From a7877390614770965a6925dfed79cbd3eeeb61e0 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Wed, 7 Feb 2018 22:19:20 +0100
|
||||
Subject: [PATCH] block, bfq: add requeue-request hook
|
||||
|
||||
Commit 'a6a252e64914 ("blk-mq-sched: decide how to handle flush rq via
|
||||
RQF_FLUSH_SEQ")' makes all non-flush re-prepared requests for a device
|
||||
be re-inserted into the active I/O scheduler for that device. As a
|
||||
consequence, I/O schedulers may get the same request inserted again,
|
||||
even several times, without a finish_request invoked on that request
|
||||
before each re-insertion.
|
||||
|
||||
This fact is the cause of the failure reported in [1]. For an I/O
|
||||
scheduler, every re-insertion of the same re-prepared request is
|
||||
equivalent to the insertion of a new request. For schedulers like
|
||||
mq-deadline or kyber, this fact causes no harm. In contrast, it
|
||||
confuses a stateful scheduler like BFQ, which keeps state for an I/O
|
||||
request, until the finish_request hook is invoked on the request. In
|
||||
particular, BFQ may get stuck, waiting forever for the number of
|
||||
request dispatches, of the same request, to be balanced by an equal
|
||||
number of request completions (while there will be one completion for
|
||||
that request). In this state, BFQ may refuse to serve I/O requests
|
||||
from other bfq_queues. The hang reported in [1] then follows.
|
||||
|
||||
However, the above re-prepared requests undergo a requeue, thus the
|
||||
requeue_request hook of the active elevator is invoked for these
|
||||
requests, if set. This commit then addresses the above issue by
|
||||
properly implementing the hook requeue_request in BFQ.
|
||||
|
||||
[1] https://marc.info/?l=linux-block&m=151211117608676
|
||||
|
||||
Reported-by: Ivan Kozik <ivan@ludios.org>
|
||||
Reported-by: Alban Browaeys <alban.browaeys@gmail.com>
|
||||
Tested-by: Mike Galbraith <efault@gmx.de>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Serena Ziviani <ziviani.serena@gmail.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 107 ++++++++++++++++++++++++++++++++++++++++------------
|
||||
1 file changed, 82 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 47e6ec7427c4..aeca22d91101 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -3823,24 +3823,26 @@ static struct request *__bfq_dispatch_request(struct blk_mq_hw_ctx *hctx)
|
||||
}
|
||||
|
||||
/*
|
||||
- * We exploit the bfq_finish_request hook to decrement
|
||||
- * rq_in_driver, but bfq_finish_request will not be
|
||||
- * invoked on this request. So, to avoid unbalance,
|
||||
- * just start this request, without incrementing
|
||||
- * rq_in_driver. As a negative consequence,
|
||||
- * rq_in_driver is deceptively lower than it should be
|
||||
- * while this request is in service. This may cause
|
||||
- * bfq_schedule_dispatch to be invoked uselessly.
|
||||
+ * We exploit the bfq_finish_requeue_request hook to
|
||||
+ * decrement rq_in_driver, but
|
||||
+ * bfq_finish_requeue_request will not be invoked on
|
||||
+ * this request. So, to avoid unbalance, just start
|
||||
+ * this request, without incrementing rq_in_driver. As
|
||||
+ * a negative consequence, rq_in_driver is deceptively
|
||||
+ * lower than it should be while this request is in
|
||||
+ * service. This may cause bfq_schedule_dispatch to be
|
||||
+ * invoked uselessly.
|
||||
*
|
||||
* As for implementing an exact solution, the
|
||||
- * bfq_finish_request hook, if defined, is probably
|
||||
- * invoked also on this request. So, by exploiting
|
||||
- * this hook, we could 1) increment rq_in_driver here,
|
||||
- * and 2) decrement it in bfq_finish_request. Such a
|
||||
- * solution would let the value of the counter be
|
||||
- * always accurate, but it would entail using an extra
|
||||
- * interface function. This cost seems higher than the
|
||||
- * benefit, being the frequency of non-elevator-private
|
||||
+ * bfq_finish_requeue_request hook, if defined, is
|
||||
+ * probably invoked also on this request. So, by
|
||||
+ * exploiting this hook, we could 1) increment
|
||||
+ * rq_in_driver here, and 2) decrement it in
|
||||
+ * bfq_finish_requeue_request. Such a solution would
|
||||
+ * let the value of the counter be always accurate,
|
||||
+ * but it would entail using an extra interface
|
||||
+ * function. This cost seems higher than the benefit,
|
||||
+ * being the frequency of non-elevator-private
|
||||
* requests very low.
|
||||
*/
|
||||
goto start_rq;
|
||||
@@ -4515,6 +4517,8 @@ static inline void bfq_update_insert_stats(struct request_queue *q,
|
||||
unsigned int cmd_flags) {}
|
||||
#endif
|
||||
|
||||
+static void bfq_prepare_request(struct request *rq, struct bio *bio);
|
||||
+
|
||||
static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
bool at_head)
|
||||
{
|
||||
@@ -4541,6 +4545,18 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
else
|
||||
list_add_tail(&rq->queuelist, &bfqd->dispatch);
|
||||
} else {
|
||||
+ if (WARN_ON_ONCE(!bfqq)) {
|
||||
+ /*
|
||||
+ * This should never happen. Most likely rq is
|
||||
+ * a requeued regular request, being
|
||||
+ * re-inserted without being first
|
||||
+ * re-prepared. Do a prepare, to avoid
|
||||
+ * failure.
|
||||
+ */
|
||||
+ bfq_prepare_request(rq, rq->bio);
|
||||
+ bfqq = RQ_BFQQ(rq);
|
||||
+ }
|
||||
+
|
||||
idle_timer_disabled = __bfq_insert_request(bfqd, rq);
|
||||
/*
|
||||
* Update bfqq, because, if a queue merge has occurred
|
||||
@@ -4697,22 +4713,44 @@ static void bfq_completed_request(struct bfq_queue *bfqq, struct bfq_data *bfqd)
|
||||
bfq_schedule_dispatch(bfqd);
|
||||
}
|
||||
|
||||
-static void bfq_finish_request_body(struct bfq_queue *bfqq)
|
||||
+static void bfq_finish_requeue_request_body(struct bfq_queue *bfqq)
|
||||
{
|
||||
bfqq->allocated--;
|
||||
|
||||
bfq_put_queue(bfqq);
|
||||
}
|
||||
|
||||
-static void bfq_finish_request(struct request *rq)
|
||||
+/*
|
||||
+ * Handle either a requeue or a finish for rq. The things to do are
|
||||
+ * the same in both cases: all references to rq are to be dropped. In
|
||||
+ * particular, rq is considered completed from the point of view of
|
||||
+ * the scheduler.
|
||||
+ */
|
||||
+static void bfq_finish_requeue_request(struct request *rq)
|
||||
{
|
||||
- struct bfq_queue *bfqq;
|
||||
+ struct bfq_queue *bfqq = RQ_BFQQ(rq);
|
||||
struct bfq_data *bfqd;
|
||||
|
||||
- if (!rq->elv.icq)
|
||||
+ /*
|
||||
+ * Requeue and finish hooks are invoked in blk-mq without
|
||||
+ * checking whether the involved request is actually still
|
||||
+ * referenced in the scheduler. To handle this fact, the
|
||||
+ * following two checks make this function exit in case of
|
||||
+ * spurious invocations, for which there is nothing to do.
|
||||
+ *
|
||||
+ * First, check whether rq has nothing to do with an elevator.
|
||||
+ */
|
||||
+ if (unlikely(!(rq->rq_flags & RQF_ELVPRIV)))
|
||||
+ return;
|
||||
+
|
||||
+ /*
|
||||
+ * rq either is not associated with any icq, or is an already
|
||||
+ * requeued request that has not (yet) been re-inserted into
|
||||
+ * a bfq_queue.
|
||||
+ */
|
||||
+ if (!rq->elv.icq || !bfqq)
|
||||
return;
|
||||
|
||||
- bfqq = RQ_BFQQ(rq);
|
||||
bfqd = bfqq->bfqd;
|
||||
|
||||
if (rq->rq_flags & RQF_STARTED)
|
||||
@@ -4727,13 +4765,14 @@ static void bfq_finish_request(struct request *rq)
|
||||
spin_lock_irqsave(&bfqd->lock, flags);
|
||||
|
||||
bfq_completed_request(bfqq, bfqd);
|
||||
- bfq_finish_request_body(bfqq);
|
||||
+ bfq_finish_requeue_request_body(bfqq);
|
||||
|
||||
spin_unlock_irqrestore(&bfqd->lock, flags);
|
||||
} else {
|
||||
/*
|
||||
* Request rq may be still/already in the scheduler,
|
||||
- * in which case we need to remove it. And we cannot
|
||||
+ * in which case we need to remove it (this should
|
||||
+ * never happen in case of requeue). And we cannot
|
||||
* defer such a check and removal, to avoid
|
||||
* inconsistencies in the time interval from the end
|
||||
* of this function to the start of the deferred work.
|
||||
@@ -4748,9 +4787,26 @@ static void bfq_finish_request(struct request *rq)
|
||||
bfqg_stats_update_io_remove(bfqq_group(bfqq),
|
||||
rq->cmd_flags);
|
||||
}
|
||||
- bfq_finish_request_body(bfqq);
|
||||
+ bfq_finish_requeue_request_body(bfqq);
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * Reset private fields. In case of a requeue, this allows
|
||||
+ * this function to correctly do nothing if it is spuriously
|
||||
+ * invoked again on this same request (see the check at the
|
||||
+ * beginning of the function). Probably, a better general
|
||||
+ * design would be to prevent blk-mq from invoking the requeue
|
||||
+ * or finish hooks of an elevator, for a request that is not
|
||||
+ * referred by that elevator.
|
||||
+ *
|
||||
+ * Resetting the following fields would break the
|
||||
+ * request-insertion logic if rq is re-inserted into a bfq
|
||||
+ * internal queue, without a re-preparation. Here we assume
|
||||
+ * that re-insertions of requeued requests, without
|
||||
+ * re-preparation, can happen only for pass_through or at_head
|
||||
+ * requests (which are not re-inserted into bfq internal
|
||||
+ * queues).
|
||||
+ */
|
||||
rq->elv.priv[0] = NULL;
|
||||
rq->elv.priv[1] = NULL;
|
||||
}
|
||||
@@ -5426,7 +5482,8 @@ static struct elevator_type iosched_bfq_mq = {
|
||||
.ops.mq = {
|
||||
.limit_depth = bfq_limit_depth,
|
||||
.prepare_request = bfq_prepare_request,
|
||||
- .finish_request = bfq_finish_request,
|
||||
+ .requeue_request = bfq_finish_requeue_request,
|
||||
+ .finish_request = bfq_finish_requeue_request,
|
||||
.exit_icq = bfq_exit_icq,
|
||||
.insert_requests = bfq_insert_requests,
|
||||
.dispatch_request = bfq_dispatch_request,
|
||||
--
|
||||
2.16.1
|
||||
|
||||
-163
@@ -1,163 +0,0 @@
|
||||
From 3e2bdd6dff239afd8386e8758eee69ad61e5a3d6 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Thu, 21 Sep 2017 11:04:01 +0200
|
||||
Subject: [PATCH] block, bfq: check and switch back to interactive wr also on
|
||||
queue split
|
||||
|
||||
As already explained in the message of commit "block, bfq: fix
|
||||
wrong init of saved start time for weight raising", if a soft
|
||||
real-time weight-raising period happens to be nested in a larger
|
||||
interactive weight-raising period, then BFQ restores the interactive
|
||||
weight raising at the end of the soft real-time weight raising. In
|
||||
particular, BFQ checks whether the latter has ended only on request
|
||||
dispatches.
|
||||
|
||||
Unfortunately, the above scheme fails to restore interactive weight
|
||||
raising in the following corner case: if a bfq_queue, say Q,
|
||||
1) Is merged with another bfq_queue while it is in a nested soft
|
||||
real-time weight-raising period. The weight-raising state of Q is
|
||||
then saved, and not considered any longer until a split occurs.
|
||||
2) Is split from the other bfq_queue(s) at a time instant when its
|
||||
soft real-time weight raising is already finished.
|
||||
On the split, while resuming the previous, soft real-time
|
||||
weight-raised state of the bfq_queue Q, BFQ checks whether the
|
||||
current soft real-time weight-raising period is actually over. If so,
|
||||
BFQ switches weight raising off for Q, *without* checking whether the
|
||||
soft real-time period was actually nested in a non-yet-finished
|
||||
interactive weight-raising period.
|
||||
|
||||
This commit addresses this issue by adding the above missing check in
|
||||
bfq_queue splits, and restoring interactive weight raising if needed.
|
||||
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Tested-by: Angelo Ruocco <angeloruocco90@gmail.com>
|
||||
Tested-by: Mirko Montanari <mirkomontanari91@gmail.com>
|
||||
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
Tested-by: Lee Tibbert <lee.tibbert@gmail.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 87 ++++++++++++++++++++++++++++++-----------------------
|
||||
1 file changed, 49 insertions(+), 38 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index c25955c25e03..33b63bc4a64b 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -724,6 +724,44 @@ static void bfq_updated_next_req(struct bfq_data *bfqd,
|
||||
}
|
||||
}
|
||||
|
||||
+static unsigned int bfq_wr_duration(struct bfq_data *bfqd)
|
||||
+{
|
||||
+ u64 dur;
|
||||
+
|
||||
+ if (bfqd->bfq_wr_max_time > 0)
|
||||
+ return bfqd->bfq_wr_max_time;
|
||||
+
|
||||
+ dur = bfqd->RT_prod;
|
||||
+ do_div(dur, bfqd->peak_rate);
|
||||
+
|
||||
+ /*
|
||||
+ * Limit duration between 3 and 13 seconds. Tests show that
|
||||
+ * higher values than 13 seconds often yield the opposite of
|
||||
+ * the desired result, i.e., worsen responsiveness by letting
|
||||
+ * non-interactive and non-soft-real-time applications
|
||||
+ * preserve weight raising for a too long time interval.
|
||||
+ *
|
||||
+ * On the other end, lower values than 3 seconds make it
|
||||
+ * difficult for most interactive tasks to complete their jobs
|
||||
+ * before weight-raising finishes.
|
||||
+ */
|
||||
+ if (dur > msecs_to_jiffies(13000))
|
||||
+ dur = msecs_to_jiffies(13000);
|
||||
+ else if (dur < msecs_to_jiffies(3000))
|
||||
+ dur = msecs_to_jiffies(3000);
|
||||
+
|
||||
+ return dur;
|
||||
+}
|
||||
+
|
||||
+/* switch back from soft real-time to interactive weight raising */
|
||||
+static void switch_back_to_interactive_wr(struct bfq_queue *bfqq,
|
||||
+ struct bfq_data *bfqd)
|
||||
+{
|
||||
+ bfqq->wr_coeff = bfqd->bfq_wr_coeff;
|
||||
+ bfqq->wr_cur_max_time = bfq_wr_duration(bfqd);
|
||||
+ bfqq->last_wr_start_finish = bfqq->wr_start_at_switch_to_srt;
|
||||
+}
|
||||
+
|
||||
static void
|
||||
bfq_bfqq_resume_state(struct bfq_queue *bfqq, struct bfq_data *bfqd,
|
||||
struct bfq_io_cq *bic, bool bfq_already_existing)
|
||||
@@ -750,10 +788,16 @@ bfq_bfqq_resume_state(struct bfq_queue *bfqq, struct bfq_data *bfqd,
|
||||
if (bfqq->wr_coeff > 1 && (bfq_bfqq_in_large_burst(bfqq) ||
|
||||
time_is_before_jiffies(bfqq->last_wr_start_finish +
|
||||
bfqq->wr_cur_max_time))) {
|
||||
- bfq_log_bfqq(bfqq->bfqd, bfqq,
|
||||
- "resume state: switching off wr");
|
||||
-
|
||||
- bfqq->wr_coeff = 1;
|
||||
+ if (bfqq->wr_cur_max_time == bfqd->bfq_wr_rt_max_time &&
|
||||
+ !bfq_bfqq_in_large_burst(bfqq) &&
|
||||
+ time_is_after_eq_jiffies(bfqq->wr_start_at_switch_to_srt +
|
||||
+ bfq_wr_duration(bfqd))) {
|
||||
+ switch_back_to_interactive_wr(bfqq, bfqd);
|
||||
+ } else {
|
||||
+ bfqq->wr_coeff = 1;
|
||||
+ bfq_log_bfqq(bfqq->bfqd, bfqq,
|
||||
+ "resume state: switching off wr");
|
||||
+ }
|
||||
}
|
||||
|
||||
/* make sure weight will be updated, however we got here */
|
||||
@@ -1173,35 +1217,6 @@ static bool bfq_bfqq_update_budg_for_activation(struct bfq_data *bfqd,
|
||||
return wr_or_deserves_wr;
|
||||
}
|
||||
|
||||
-static unsigned int bfq_wr_duration(struct bfq_data *bfqd)
|
||||
-{
|
||||
- u64 dur;
|
||||
-
|
||||
- if (bfqd->bfq_wr_max_time > 0)
|
||||
- return bfqd->bfq_wr_max_time;
|
||||
-
|
||||
- dur = bfqd->RT_prod;
|
||||
- do_div(dur, bfqd->peak_rate);
|
||||
-
|
||||
- /*
|
||||
- * Limit duration between 3 and 13 seconds. Tests show that
|
||||
- * higher values than 13 seconds often yield the opposite of
|
||||
- * the desired result, i.e., worsen responsiveness by letting
|
||||
- * non-interactive and non-soft-real-time applications
|
||||
- * preserve weight raising for a too long time interval.
|
||||
- *
|
||||
- * On the other end, lower values than 3 seconds make it
|
||||
- * difficult for most interactive tasks to complete their jobs
|
||||
- * before weight-raising finishes.
|
||||
- */
|
||||
- if (dur > msecs_to_jiffies(13000))
|
||||
- dur = msecs_to_jiffies(13000);
|
||||
- else if (dur < msecs_to_jiffies(3000))
|
||||
- dur = msecs_to_jiffies(3000);
|
||||
-
|
||||
- return dur;
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* Return the farthest future time instant according to jiffies
|
||||
* macros.
|
||||
@@ -3501,11 +3516,7 @@ static void bfq_update_wr_data(struct bfq_data *bfqd, struct bfq_queue *bfqq)
|
||||
bfq_wr_duration(bfqd)))
|
||||
bfq_bfqq_end_wr(bfqq);
|
||||
else {
|
||||
- /* switch back to interactive wr */
|
||||
- bfqq->wr_coeff = bfqd->bfq_wr_coeff;
|
||||
- bfqq->wr_cur_max_time = bfq_wr_duration(bfqd);
|
||||
- bfqq->last_wr_start_finish =
|
||||
- bfqq->wr_start_at_switch_to_srt;
|
||||
+ switch_back_to_interactive_wr(bfqq, bfqd);
|
||||
bfqq->entity.prio_changed = 1;
|
||||
}
|
||||
}
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-48
@@ -1,48 +0,0 @@
|
||||
From 1be6e8a964ee9aa8d4daac523ce29e5f486dd756 Mon Sep 17 00:00:00 2001
|
||||
From: Angelo Ruocco <angeloruocco90@gmail.com>
|
||||
Date: Wed, 20 Dec 2017 12:38:32 +0100
|
||||
Subject: [PATCH] block, bfq: check low_latency flag in bfq_bfqq_save_state()
|
||||
|
||||
A just-created bfq_queue will certainly be deemed as interactive on
|
||||
the arrival of its first I/O request, if the low_latency flag is
|
||||
set. Yet, if the queue is merged with another queue on the arrival of
|
||||
its first I/O request, it will not have the chance to be flagged as
|
||||
interactive. Nevertheless, if the queue is then split soon enough, it
|
||||
has to be flagged as interactive after the split.
|
||||
|
||||
To handle this early-merge scenario correctly, BFQ saves the state of
|
||||
the queue, on the merge, as if the latter had already been deemed
|
||||
interactive. So, if the queue is split soon, it will get
|
||||
weight-raised, because the previous state of the queue is resumed on
|
||||
the split.
|
||||
|
||||
Unfortunately, in the act of saving the state of the newly-created
|
||||
queue, BFQ doesn't check whether the low_latency flag is set, and this
|
||||
causes early-merged queues to be then weight-raised, on queue splits,
|
||||
even if low_latency is off. This commit addresses this problem by
|
||||
adding the missing check.
|
||||
|
||||
Signed-off-by: Angelo Ruocco <angeloruocco90@gmail.com>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index fa395a260a23..2cf395daee80 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -2064,7 +2064,8 @@ static void bfq_bfqq_save_state(struct bfq_queue *bfqq)
|
||||
bic->saved_in_large_burst = bfq_bfqq_in_large_burst(bfqq);
|
||||
bic->was_in_burst_list = !hlist_unhashed(&bfqq->burst_list_node);
|
||||
if (unlikely(bfq_bfqq_just_created(bfqq) &&
|
||||
- !bfq_bfqq_in_large_burst(bfqq))) {
|
||||
+ !bfq_bfqq_in_large_burst(bfqq) &&
|
||||
+ bfqq->bfqd->low_latency)) {
|
||||
/*
|
||||
* bfqq being merged right after being created: bfqq
|
||||
* would have deserved interactive weight raising, but
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-206
@@ -1,206 +0,0 @@
|
||||
From a34b024448eb71b0e51ad011fa1862236e366034 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Fri, 15 Dec 2017 07:23:12 +0100
|
||||
Subject: [PATCH] block, bfq: consider also past I/O in soft real-time
|
||||
detection
|
||||
|
||||
BFQ privileges the I/O of soft real-time applications, such as video
|
||||
players, to guarantee to these application a high bandwidth and a low
|
||||
latency. In this respect, it is not easy to correctly detect when an
|
||||
application is soft real-time. A particularly nasty false positive is
|
||||
that of an I/O-bound application that occasionally happens to meet all
|
||||
requirements to be deemed as soft real-time. After being detected as
|
||||
soft real-time, such an application monopolizes the device. Fortunately,
|
||||
BFQ will realize soon that the application is actually not soft
|
||||
real-time and suspend every privilege. Yet, the application may happen
|
||||
again to be wrongly detected as soft real-time, and so on.
|
||||
|
||||
As highlighted by our tests, this problem causes BFQ to occasionally
|
||||
fail to guarantee a high responsiveness, in the presence of heavy
|
||||
background I/O workloads. The reason is that the background workload
|
||||
happens to be detected as soft real-time, more or less frequently,
|
||||
during the execution of the interactive task under test. To give an
|
||||
idea, because of this problem, Libreoffice Writer occasionally takes 8
|
||||
seconds, instead of 3, to start up, if there are sequential reads and
|
||||
writes in the background, on a Kingston SSDNow V300.
|
||||
|
||||
This commit addresses this issue by leveraging the following facts.
|
||||
|
||||
The reason why some applications are detected as soft real-time despite
|
||||
all BFQ checks to avoid false positives, is simply that, during high
|
||||
CPU or storage-device load, I/O-bound applications may happen to do
|
||||
I/O slowly enough to meet all soft real-time requirements, and pass
|
||||
all BFQ extra checks. Yet, this happens only for limited time periods:
|
||||
slow-speed time intervals are usually interspersed between other time
|
||||
intervals during which these applications do I/O at a very high speed.
|
||||
To exploit these facts, this commit introduces a little change, in the
|
||||
detection of soft real-time behavior, to systematically consider also
|
||||
the recent past: the higher the speed was in the recent past, the
|
||||
later next I/O should arrive for the application to be considered as
|
||||
soft real-time. At the beginning of a slow-speed interval, the minimum
|
||||
arrival time allowed for the next I/O usually happens to still be so
|
||||
high, to fall *after* the end of the slow-speed period itself. As a
|
||||
consequence, the application does not risk to be deemed as soft
|
||||
real-time during the slow-speed interval. Then, during the next
|
||||
high-speed interval, the application cannot, evidently, be deemed as
|
||||
soft real-time (exactly because of its speed), and so on.
|
||||
|
||||
This extra filtering proved to be rather effective: in the above test,
|
||||
the frequency of false positives became so low that the start-up time
|
||||
was 3 seconds in all iterations (apart from occasional outliers,
|
||||
caused by page-cache-management issues, which are out of the scope of
|
||||
this commit, and cannot be solved by an I/O scheduler).
|
||||
|
||||
Tested-by: Lee Tibbert <lee.tibbert@gmail.com>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Angelo Ruocco <angeloruocco90@gmail.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 115 ++++++++++++++++++++++++++++++++++++----------------
|
||||
1 file changed, 81 insertions(+), 34 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 9625550b2f85..e33c5c4c9856 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -2940,45 +2940,87 @@ static bool bfq_bfqq_is_slow(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
||||
* whereas soft_rt_next_start is set to infinity for applications that do
|
||||
* not.
|
||||
*
|
||||
- * Unfortunately, even a greedy application may happen to behave in an
|
||||
- * isochronous way if the CPU load is high. In fact, the application may
|
||||
- * stop issuing requests while the CPUs are busy serving other processes,
|
||||
- * then restart, then stop again for a while, and so on. In addition, if
|
||||
- * the disk achieves a low enough throughput with the request pattern
|
||||
- * issued by the application (e.g., because the request pattern is random
|
||||
- * and/or the device is slow), then the application may meet the above
|
||||
- * bandwidth requirement too. To prevent such a greedy application to be
|
||||
- * deemed as soft real-time, a further rule is used in the computation of
|
||||
- * soft_rt_next_start: soft_rt_next_start must be higher than the current
|
||||
- * time plus the maximum time for which the arrival of a request is waited
|
||||
- * for when a sync queue becomes idle, namely bfqd->bfq_slice_idle.
|
||||
- * This filters out greedy applications, as the latter issue instead their
|
||||
- * next request as soon as possible after the last one has been completed
|
||||
- * (in contrast, when a batch of requests is completed, a soft real-time
|
||||
- * application spends some time processing data).
|
||||
+ * Unfortunately, even a greedy (i.e., I/O-bound) application may
|
||||
+ * happen to meet, occasionally or systematically, both the above
|
||||
+ * bandwidth and isochrony requirements. This may happen at least in
|
||||
+ * the following circumstances. First, if the CPU load is high. The
|
||||
+ * application may stop issuing requests while the CPUs are busy
|
||||
+ * serving other processes, then restart, then stop again for a while,
|
||||
+ * and so on. The other circumstances are related to the storage
|
||||
+ * device: the storage device is highly loaded or reaches a low-enough
|
||||
+ * throughput with the I/O of the application (e.g., because the I/O
|
||||
+ * is random and/or the device is slow). In all these cases, the
|
||||
+ * I/O of the application may be simply slowed down enough to meet
|
||||
+ * the bandwidth and isochrony requirements. To reduce the probability
|
||||
+ * that greedy applications are deemed as soft real-time in these
|
||||
+ * corner cases, a further rule is used in the computation of
|
||||
+ * soft_rt_next_start: the return value of this function is forced to
|
||||
+ * be higher than the maximum between the following two quantities.
|
||||
*
|
||||
- * Unfortunately, the last filter may easily generate false positives if
|
||||
- * only bfqd->bfq_slice_idle is used as a reference time interval and one
|
||||
- * or both the following cases occur:
|
||||
- * 1) HZ is so low that the duration of a jiffy is comparable to or higher
|
||||
- * than bfqd->bfq_slice_idle. This happens, e.g., on slow devices with
|
||||
- * HZ=100.
|
||||
+ * (a) Current time plus: (1) the maximum time for which the arrival
|
||||
+ * of a request is waited for when a sync queue becomes idle,
|
||||
+ * namely bfqd->bfq_slice_idle, and (2) a few extra jiffies. We
|
||||
+ * postpone for a moment the reason for adding a few extra
|
||||
+ * jiffies; we get back to it after next item (b). Lower-bounding
|
||||
+ * the return value of this function with the current time plus
|
||||
+ * bfqd->bfq_slice_idle tends to filter out greedy applications,
|
||||
+ * because the latter issue their next request as soon as possible
|
||||
+ * after the last one has been completed. In contrast, a soft
|
||||
+ * real-time application spends some time processing data, after a
|
||||
+ * batch of its requests has been completed.
|
||||
+ *
|
||||
+ * (b) Current value of bfqq->soft_rt_next_start. As pointed out
|
||||
+ * above, greedy applications may happen to meet both the
|
||||
+ * bandwidth and isochrony requirements under heavy CPU or
|
||||
+ * storage-device load. In more detail, in these scenarios, these
|
||||
+ * applications happen, only for limited time periods, to do I/O
|
||||
+ * slowly enough to meet all the requirements described so far,
|
||||
+ * including the filtering in above item (a). These slow-speed
|
||||
+ * time intervals are usually interspersed between other time
|
||||
+ * intervals during which these applications do I/O at a very high
|
||||
+ * speed. Fortunately, exactly because of the high speed of the
|
||||
+ * I/O in the high-speed intervals, the values returned by this
|
||||
+ * function happen to be so high, near the end of any such
|
||||
+ * high-speed interval, to be likely to fall *after* the end of
|
||||
+ * the low-speed time interval that follows. These high values are
|
||||
+ * stored in bfqq->soft_rt_next_start after each invocation of
|
||||
+ * this function. As a consequence, if the last value of
|
||||
+ * bfqq->soft_rt_next_start is constantly used to lower-bound the
|
||||
+ * next value that this function may return, then, from the very
|
||||
+ * beginning of a low-speed interval, bfqq->soft_rt_next_start is
|
||||
+ * likely to be constantly kept so high that any I/O request
|
||||
+ * issued during the low-speed interval is considered as arriving
|
||||
+ * to soon for the application to be deemed as soft
|
||||
+ * real-time. Then, in the high-speed interval that follows, the
|
||||
+ * application will not be deemed as soft real-time, just because
|
||||
+ * it will do I/O at a high speed. And so on.
|
||||
+ *
|
||||
+ * Getting back to the filtering in item (a), in the following two
|
||||
+ * cases this filtering might be easily passed by a greedy
|
||||
+ * application, if the reference quantity was just
|
||||
+ * bfqd->bfq_slice_idle:
|
||||
+ * 1) HZ is so low that the duration of a jiffy is comparable to or
|
||||
+ * higher than bfqd->bfq_slice_idle. This happens, e.g., on slow
|
||||
+ * devices with HZ=100. The time granularity may be so coarse
|
||||
+ * that the approximation, in jiffies, of bfqd->bfq_slice_idle
|
||||
+ * is rather lower than the exact value.
|
||||
* 2) jiffies, instead of increasing at a constant rate, may stop increasing
|
||||
* for a while, then suddenly 'jump' by several units to recover the lost
|
||||
* increments. This seems to happen, e.g., inside virtual machines.
|
||||
- * To address this issue, we do not use as a reference time interval just
|
||||
- * bfqd->bfq_slice_idle, but bfqd->bfq_slice_idle plus a few jiffies. In
|
||||
- * particular we add the minimum number of jiffies for which the filter
|
||||
- * seems to be quite precise also in embedded systems and KVM/QEMU virtual
|
||||
- * machines.
|
||||
+ * To address this issue, in the filtering in (a) we do not use as a
|
||||
+ * reference time interval just bfqd->bfq_slice_idle, but
|
||||
+ * bfqd->bfq_slice_idle plus a few jiffies. In particular, we add the
|
||||
+ * minimum number of jiffies for which the filter seems to be quite
|
||||
+ * precise also in embedded systems and KVM/QEMU virtual machines.
|
||||
*/
|
||||
static unsigned long bfq_bfqq_softrt_next_start(struct bfq_data *bfqd,
|
||||
struct bfq_queue *bfqq)
|
||||
{
|
||||
- return max(bfqq->last_idle_bklogged +
|
||||
- HZ * bfqq->service_from_backlogged /
|
||||
- bfqd->bfq_wr_max_softrt_rate,
|
||||
- jiffies + nsecs_to_jiffies(bfqq->bfqd->bfq_slice_idle) + 4);
|
||||
+ return max3(bfqq->soft_rt_next_start,
|
||||
+ bfqq->last_idle_bklogged +
|
||||
+ HZ * bfqq->service_from_backlogged /
|
||||
+ bfqd->bfq_wr_max_softrt_rate,
|
||||
+ jiffies + nsecs_to_jiffies(bfqq->bfqd->bfq_slice_idle) + 4);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -4014,10 +4056,15 @@ static void bfq_init_bfqq(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
||||
bfqq->split_time = bfq_smallest_from_now();
|
||||
|
||||
/*
|
||||
- * Set to the value for which bfqq will not be deemed as
|
||||
- * soft rt when it becomes backlogged.
|
||||
+ * To not forget the possibly high bandwidth consumed by a
|
||||
+ * process/queue in the recent past,
|
||||
+ * bfq_bfqq_softrt_next_start() returns a value at least equal
|
||||
+ * to the current value of bfqq->soft_rt_next_start (see
|
||||
+ * comments on bfq_bfqq_softrt_next_start). Set
|
||||
+ * soft_rt_next_start to now, to mean that bfqq has consumed
|
||||
+ * no bandwidth so far.
|
||||
*/
|
||||
- bfqq->soft_rt_next_start = bfq_greatest_from_now();
|
||||
+ bfqq->soft_rt_next_start = jiffies;
|
||||
|
||||
/* first request is almost certainly seeky */
|
||||
bfqq->seek_history = 1;
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-82
@@ -1,82 +0,0 @@
|
||||
From 7cb04004fa371a626c1a5ebe6d977f70285759ed Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Thu, 21 Sep 2017 11:04:03 +0200
|
||||
Subject: [PATCH] block, bfq: decrease burst size when queues in burst exit
|
||||
|
||||
If many queues belonging to the same group happen to be created
|
||||
shortly after each other, then the concurrent processes associated
|
||||
with these queues have typically a common goal, and they get it done
|
||||
as soon as possible if not hampered by device idling. Examples are
|
||||
processes spawned by git grep, or by systemd during boot. As for
|
||||
device idling, this mechanism is currently necessary for weight
|
||||
raising to succeed in its goal: privileging I/O. In view of these
|
||||
facts, BFQ does not provide the above queues with either weight
|
||||
raising or device idling.
|
||||
|
||||
On the other hand, a burst of queue creations may be caused also by
|
||||
the start-up of a complex application. In this case, these queues need
|
||||
usually to be served one after the other, and as quickly as possible,
|
||||
to maximise responsiveness. Therefore, in this case the best strategy
|
||||
is to weight-raise all the queues created during the burst, i.e., the
|
||||
exact opposite of the strategy for the above case.
|
||||
|
||||
To distinguish between the two cases, BFQ uses an empirical burst-size
|
||||
threshold, found through extensive tests and monitoring of daily
|
||||
usage. Only large bursts, i.e., burst with a size above this
|
||||
threshold, are considered as generated by a high number of parallel
|
||||
processes. In this respect, upstart-based boot proved to be rather
|
||||
hard to detect as generating a large burst of queue creations, because
|
||||
with upstart most of the queues created in a burst exit *before* the
|
||||
next queues in the same burst are created. To address this issue, I
|
||||
changed the burst-detection mechanism so as to not decrease the size
|
||||
of the current burst even if one of the queues in the burst is
|
||||
eliminated.
|
||||
|
||||
Unfortunately, this missing decrease causes false positives on very
|
||||
fast systems: on the start-up of a complex application, such as
|
||||
libreoffice writer, so many queues are created, served and exited
|
||||
shortly after each other, that a large burst of queue creations is
|
||||
wrongly detected as occurring. These false positives just disappear if
|
||||
the size of a burst is decreased when one of the queues in the burst
|
||||
exits. This commit restores the missing burst-size decrease, relying
|
||||
of the fact that upstart is apparently unlikely to be used on systems
|
||||
running this and future versions of the kernel.
|
||||
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Mauro Andreolini <mauro.andreolini@unimore.it>
|
||||
Signed-off-by: Angelo Ruocco <angeloruocco90@gmail.com>
|
||||
Tested-by: Mirko Montanari <mirkomontanari91@gmail.com>
|
||||
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
Tested-by: Lee Tibbert <lee.tibbert@gmail.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 12 +++---------
|
||||
1 file changed, 3 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 115747fe43c8..70f9177c4f5b 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -3725,16 +3725,10 @@ void bfq_put_queue(struct bfq_queue *bfqq)
|
||||
if (bfqq->ref)
|
||||
return;
|
||||
|
||||
- if (bfq_bfqq_sync(bfqq))
|
||||
- /*
|
||||
- * The fact that this queue is being destroyed does not
|
||||
- * invalidate the fact that this queue may have been
|
||||
- * activated during the current burst. As a consequence,
|
||||
- * although the queue does not exist anymore, and hence
|
||||
- * needs to be removed from the burst list if there,
|
||||
- * the burst size has not to be decremented.
|
||||
- */
|
||||
+ if (bfq_bfqq_sync(bfqq) && !hlist_unhashed(&bfqq->burst_list_node)) {
|
||||
hlist_del_init(&bfqq->burst_list_node);
|
||||
+ bfqq->bfqd->burst_size--;
|
||||
+ }
|
||||
|
||||
kmem_cache_free(bfq_pool, bfqq);
|
||||
#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-91
@@ -1,91 +0,0 @@
|
||||
From 8993d445df388e3541f48920a2353cfc904b220a Mon Sep 17 00:00:00 2001
|
||||
From: Chiara Bruschi <bruschi.chiara@outlook.it>
|
||||
Date: Mon, 18 Dec 2017 16:21:59 +0000
|
||||
Subject: [PATCH] block, bfq: fix occurrences of request finish method's old
|
||||
name
|
||||
|
||||
Commit '7b9e93616399' ("blk-mq-sched: unify request finished methods")
|
||||
changed the old name of current bfq_finish_request method, but left it
|
||||
unchanged elsewhere in the code (related comments, part of function
|
||||
name bfq_put_rq_priv_body).
|
||||
|
||||
This commit fixes all occurrences of the old name of this method by
|
||||
changing them into the current name.
|
||||
|
||||
Fixes: 7b9e93616399 ("blk-mq-sched: unify request finished methods")
|
||||
Reviewed-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Federico Motta <federico@willer.it>
|
||||
Signed-off-by: Chiara Bruschi <bruschi.chiara@outlook.it>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 26 +++++++++++++-------------
|
||||
1 file changed, 13 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 5e6f837f663e..f352b1677143 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -3684,8 +3684,8 @@ static struct request *__bfq_dispatch_request(struct blk_mq_hw_ctx *hctx)
|
||||
}
|
||||
|
||||
/*
|
||||
- * We exploit the put_rq_private hook to decrement
|
||||
- * rq_in_driver, but put_rq_private will not be
|
||||
+ * We exploit the bfq_finish_request hook to decrement
|
||||
+ * rq_in_driver, but bfq_finish_request will not be
|
||||
* invoked on this request. So, to avoid unbalance,
|
||||
* just start this request, without incrementing
|
||||
* rq_in_driver. As a negative consequence,
|
||||
@@ -3694,14 +3694,14 @@ static struct request *__bfq_dispatch_request(struct blk_mq_hw_ctx *hctx)
|
||||
* bfq_schedule_dispatch to be invoked uselessly.
|
||||
*
|
||||
* As for implementing an exact solution, the
|
||||
- * put_request hook, if defined, is probably invoked
|
||||
- * also on this request. So, by exploiting this hook,
|
||||
- * we could 1) increment rq_in_driver here, and 2)
|
||||
- * decrement it in put_request. Such a solution would
|
||||
- * let the value of the counter be always accurate,
|
||||
- * but it would entail using an extra interface
|
||||
- * function. This cost seems higher than the benefit,
|
||||
- * being the frequency of non-elevator-private
|
||||
+ * bfq_finish_request hook, if defined, is probably
|
||||
+ * invoked also on this request. So, by exploiting
|
||||
+ * this hook, we could 1) increment rq_in_driver here,
|
||||
+ * and 2) decrement it in bfq_finish_request. Such a
|
||||
+ * solution would let the value of the counter be
|
||||
+ * always accurate, but it would entail using an extra
|
||||
+ * interface function. This cost seems higher than the
|
||||
+ * benefit, being the frequency of non-elevator-private
|
||||
* requests very low.
|
||||
*/
|
||||
goto start_rq;
|
||||
@@ -4558,7 +4558,7 @@ static void bfq_completed_request(struct bfq_queue *bfqq, struct bfq_data *bfqd)
|
||||
bfq_schedule_dispatch(bfqd);
|
||||
}
|
||||
|
||||
-static void bfq_put_rq_priv_body(struct bfq_queue *bfqq)
|
||||
+static void bfq_finish_request_body(struct bfq_queue *bfqq)
|
||||
{
|
||||
bfqq->allocated--;
|
||||
|
||||
@@ -4588,7 +4588,7 @@ static void bfq_finish_request(struct request *rq)
|
||||
spin_lock_irqsave(&bfqd->lock, flags);
|
||||
|
||||
bfq_completed_request(bfqq, bfqd);
|
||||
- bfq_put_rq_priv_body(bfqq);
|
||||
+ bfq_finish_request_body(bfqq);
|
||||
|
||||
spin_unlock_irqrestore(&bfqd->lock, flags);
|
||||
} else {
|
||||
@@ -4609,7 +4609,7 @@ static void bfq_finish_request(struct request *rq)
|
||||
bfqg_stats_update_io_remove(bfqq_group(bfqq),
|
||||
rq->cmd_flags);
|
||||
}
|
||||
- bfq_put_rq_priv_body(bfqq);
|
||||
+ bfq_finish_request_body(bfqq);
|
||||
}
|
||||
|
||||
rq->elv.priv[0] = NULL;
|
||||
--
|
||||
2.16.1
|
||||
|
||||
-141
@@ -1,141 +0,0 @@
|
||||
From 99fead8d38e5302b1be9403d4de815ce9174a3df Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Mon, 9 Oct 2017 13:11:23 +0200
|
||||
Subject: [PATCH] block, bfq: fix unbalanced decrements of burst size
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
The commit "block, bfq: decrease burst size when queues in burst
|
||||
exit" introduced the decrement of burst_size on the removal of a
|
||||
bfq_queue from the burst list. Unfortunately, this decrement can
|
||||
happen to be performed even when burst size is already equal to 0,
|
||||
because of unbalanced decrements. A description follows of the cause
|
||||
of these unbalanced decrements, namely a wrong assumption, and of the
|
||||
way how this wrong assumption leads to unbalanced decrements.
|
||||
|
||||
The wrong assumption is that a bfq_queue can exit only if the process
|
||||
associated with the bfq_queue has exited. This is false, because a
|
||||
bfq_queue, say Q, may exit also as a consequence of a merge with
|
||||
another bfq_queue. In this case, Q exits because the I/O of its
|
||||
associated process has been redirected to another bfq_queue.
|
||||
|
||||
The decrement unbalance occurs because Q may then be re-created after
|
||||
a split, and added back to the current burst list, *without*
|
||||
incrementing burst_size. burst_size is not incremented because Q is
|
||||
not a new bfq_queue added to the burst list, but a bfq_queue only
|
||||
temporarily removed from the list, and, before the commit "bfq-sq,
|
||||
bfq-mq: decrease burst size when queues in burst exit", burst_size was
|
||||
not decremented when Q was removed.
|
||||
|
||||
This commit addresses this issue by just checking whether the exiting
|
||||
bfq_queue is a merged bfq_queue, and, in that case, not decrementing
|
||||
burst_size. Unfortunately, this still leaves room for unbalanced
|
||||
decrements, in the following rarer case: on a split, the bfq_queue
|
||||
happens to be inserted into a different burst list than that it was
|
||||
removed from when merged. If this happens, the number of elements in
|
||||
the new burst list becomes higher than burst_size (by one). When the
|
||||
bfq_queue then exits, it is of course not in a merged state any
|
||||
longer, thus burst_size is decremented, which results in an unbalanced
|
||||
decrement. To handle this sporadic, unlucky case in a simple way,
|
||||
this commit also checks that burst_size is larger than 0 before
|
||||
decrementing it.
|
||||
|
||||
Finally, this commit removes an useless, extra check: the check that
|
||||
the bfq_queue is sync, performed before checking whether the bfq_queue
|
||||
is in the burst list. This extra check is redundant, because only sync
|
||||
bfq_queues can be inserted into the burst list.
|
||||
|
||||
Fixes: 7cb04004fa37 ("block, bfq: decrease burst size when queues in burst exit")
|
||||
Reported-by: Philip Müller <philm@manjaro.org>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Angelo Ruocco <angeloruocco90@gmail.com>
|
||||
Tested-by: Philip Müller <philm@manjaro.org>
|
||||
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
Tested-by: Lee Tibbert <lee.tibbert@gmail.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 57 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 261f98695910..889a8549d97f 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -3726,9 +3726,36 @@ void bfq_put_queue(struct bfq_queue *bfqq)
|
||||
if (bfqq->ref)
|
||||
return;
|
||||
|
||||
- if (bfq_bfqq_sync(bfqq) && !hlist_unhashed(&bfqq->burst_list_node)) {
|
||||
+ if (!hlist_unhashed(&bfqq->burst_list_node)) {
|
||||
hlist_del_init(&bfqq->burst_list_node);
|
||||
- bfqq->bfqd->burst_size--;
|
||||
+ /*
|
||||
+ * Decrement also burst size after the removal, if the
|
||||
+ * process associated with bfqq is exiting, and thus
|
||||
+ * does not contribute to the burst any longer. This
|
||||
+ * decrement helps filter out false positives of large
|
||||
+ * bursts, when some short-lived process (often due to
|
||||
+ * the execution of commands by some service) happens
|
||||
+ * to start and exit while a complex application is
|
||||
+ * starting, and thus spawning several processes that
|
||||
+ * do I/O (and that *must not* be treated as a large
|
||||
+ * burst, see comments on bfq_handle_burst).
|
||||
+ *
|
||||
+ * In particular, the decrement is performed only if:
|
||||
+ * 1) bfqq is not a merged queue, because, if it is,
|
||||
+ * then this free of bfqq is not triggered by the exit
|
||||
+ * of the process bfqq is associated with, but exactly
|
||||
+ * by the fact that bfqq has just been merged.
|
||||
+ * 2) burst_size is greater than 0, to handle
|
||||
+ * unbalanced decrements. Unbalanced decrements may
|
||||
+ * happen in te following case: bfqq is inserted into
|
||||
+ * the current burst list--without incrementing
|
||||
+ * bust_size--because of a split, but the current
|
||||
+ * burst list is not the burst list bfqq belonged to
|
||||
+ * (see comments on the case of a split in
|
||||
+ * bfq_set_request).
|
||||
+ */
|
||||
+ if (bfqq->bic && bfqq->bfqd->burst_size > 0)
|
||||
+ bfqq->bfqd->burst_size--;
|
||||
}
|
||||
|
||||
kmem_cache_free(bfq_pool, bfqq);
|
||||
@@ -4460,6 +4487,34 @@ static struct bfq_queue *bfq_get_bfqq_handle_split(struct bfq_data *bfqd,
|
||||
else {
|
||||
bfq_clear_bfqq_in_large_burst(bfqq);
|
||||
if (bic->was_in_burst_list)
|
||||
+ /*
|
||||
+ * If bfqq was in the current
|
||||
+ * burst list before being
|
||||
+ * merged, then we have to add
|
||||
+ * it back. And we do not need
|
||||
+ * to increase burst_size, as
|
||||
+ * we did not decrement
|
||||
+ * burst_size when we removed
|
||||
+ * bfqq from the burst list as
|
||||
+ * a consequence of a merge
|
||||
+ * (see comments in
|
||||
+ * bfq_put_queue). In this
|
||||
+ * respect, it would be rather
|
||||
+ * costly to know whether the
|
||||
+ * current burst list is still
|
||||
+ * the same burst list from
|
||||
+ * which bfqq was removed on
|
||||
+ * the merge. To avoid this
|
||||
+ * cost, if bfqq was in a
|
||||
+ * burst list, then we add
|
||||
+ * bfqq to the current burst
|
||||
+ * list without any further
|
||||
+ * check. This can cause
|
||||
+ * inappropriate insertions,
|
||||
+ * but rarely enough to not
|
||||
+ * harm the detection of large
|
||||
+ * bursts significantly.
|
||||
+ */
|
||||
hlist_add_head(&bfqq->burst_list_node,
|
||||
&bfqd->burst_list);
|
||||
}
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-146
@@ -1,146 +0,0 @@
|
||||
From 4baa8bb13f41307f3eb62fe91f93a1a798ebef53 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Thu, 21 Sep 2017 11:04:00 +0200
|
||||
Subject: [PATCH] block, bfq: fix wrong init of saved start time for weight
|
||||
raising
|
||||
|
||||
This commit fixes a bug that causes bfq to fail to guarantee a high
|
||||
responsiveness on some drives, if there is heavy random read+write I/O
|
||||
in the background. More precisely, such a failure allowed this bug to
|
||||
be found [1], but the bug may well cause other yet unreported
|
||||
anomalies.
|
||||
|
||||
BFQ raises the weight of the bfq_queues associated with soft real-time
|
||||
applications, to privilege the I/O, and thus reduce latency, for these
|
||||
applications. This mechanism is named soft-real-time weight raising in
|
||||
BFQ. A soft real-time period may happen to be nested into an
|
||||
interactive weight raising period, i.e., it may happen that, when a
|
||||
bfq_queue switches to a soft real-time weight-raised state, the
|
||||
bfq_queue is already being weight-raised because deemed interactive
|
||||
too. In this case, BFQ saves in a special variable
|
||||
wr_start_at_switch_to_srt, the time instant when the interactive
|
||||
weight-raising period started for the bfq_queue, i.e., the time
|
||||
instant when BFQ started to deem the bfq_queue interactive. This value
|
||||
is then used to check whether the interactive weight-raising period
|
||||
would still be in progress when the soft real-time weight-raising
|
||||
period ends. If so, interactive weight raising is restored for the
|
||||
bfq_queue. This restore is useful, in particular, because it prevents
|
||||
bfq_queues from losing their interactive weight raising prematurely,
|
||||
as a consequence of spurious, short-lived soft real-time
|
||||
weight-raising periods caused by wrong detections as soft real-time.
|
||||
|
||||
If, instead, a bfq_queue switches to soft-real-time weight raising
|
||||
while it *is not* already in an interactive weight-raising period,
|
||||
then the variable wr_start_at_switch_to_srt has no meaning during the
|
||||
following soft real-time weight-raising period. Unfortunately the
|
||||
handling of this case is wrong in BFQ: not only the variable is not
|
||||
flagged somehow as meaningless, but it is also set to the time when
|
||||
the switch to soft real-time weight-raising occurs. This may cause an
|
||||
interactive weight-raising period to be considered mistakenly as still
|
||||
in progress, and thus a spurious interactive weight-raising period to
|
||||
start for the bfq_queue, at the end of the soft-real-time
|
||||
weight-raising period. In particular the spurious interactive
|
||||
weight-raising period will be considered as still in progress, if the
|
||||
soft-real-time weight-raising period does not last very long. The
|
||||
bfq_queue will then be wrongly privileged and, if I/O bound, will
|
||||
unjustly steal bandwidth to truly interactive or soft real-time
|
||||
bfq_queues, harming responsiveness and low latency.
|
||||
|
||||
This commit fixes this issue by just setting wr_start_at_switch_to_srt
|
||||
to minus infinity (farthest past time instant according to jiffies
|
||||
macros): when the soft-real-time weight-raising period ends, certainly
|
||||
no interactive weight-raising period will be considered as still in
|
||||
progress.
|
||||
|
||||
[1] Background I/O Type: Random - Background I/O mix: Reads and writes
|
||||
- Application to start: LibreOffice Writer in
|
||||
http://www.phoronix.com/scan.php?page=news_item&px=Linux-4.13-IO-Laptop
|
||||
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Angelo Ruocco <angeloruocco90@gmail.com>
|
||||
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
Tested-by: Lee Tibbert <lee.tibbert@gmail.com>
|
||||
Tested-by: Mirko Montanari <mirkomontanari91@gmail.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 50 +++++++++++++++++++++++++++++++-------------------
|
||||
1 file changed, 31 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index a4783da90ba8..c25955c25e03 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -1202,6 +1202,24 @@ static unsigned int bfq_wr_duration(struct bfq_data *bfqd)
|
||||
return dur;
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * Return the farthest future time instant according to jiffies
|
||||
+ * macros.
|
||||
+ */
|
||||
+static unsigned long bfq_greatest_from_now(void)
|
||||
+{
|
||||
+ return jiffies + MAX_JIFFY_OFFSET;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Return the farthest past time instant according to jiffies
|
||||
+ * macros.
|
||||
+ */
|
||||
+static unsigned long bfq_smallest_from_now(void)
|
||||
+{
|
||||
+ return jiffies - MAX_JIFFY_OFFSET;
|
||||
+}
|
||||
+
|
||||
static void bfq_update_bfqq_wr_on_rq_arrival(struct bfq_data *bfqd,
|
||||
struct bfq_queue *bfqq,
|
||||
unsigned int old_wr_coeff,
|
||||
@@ -1216,7 +1234,19 @@ static void bfq_update_bfqq_wr_on_rq_arrival(struct bfq_data *bfqd,
|
||||
bfqq->wr_coeff = bfqd->bfq_wr_coeff;
|
||||
bfqq->wr_cur_max_time = bfq_wr_duration(bfqd);
|
||||
} else {
|
||||
- bfqq->wr_start_at_switch_to_srt = jiffies;
|
||||
+ /*
|
||||
+ * No interactive weight raising in progress
|
||||
+ * here: assign minus infinity to
|
||||
+ * wr_start_at_switch_to_srt, to make sure
|
||||
+ * that, at the end of the soft-real-time
|
||||
+ * weight raising periods that is starting
|
||||
+ * now, no interactive weight-raising period
|
||||
+ * may be wrongly considered as still in
|
||||
+ * progress (and thus actually started by
|
||||
+ * mistake).
|
||||
+ */
|
||||
+ bfqq->wr_start_at_switch_to_srt =
|
||||
+ bfq_smallest_from_now();
|
||||
bfqq->wr_coeff = bfqd->bfq_wr_coeff *
|
||||
BFQ_SOFTRT_WEIGHT_FACTOR;
|
||||
bfqq->wr_cur_max_time =
|
||||
@@ -2897,24 +2927,6 @@ static unsigned long bfq_bfqq_softrt_next_start(struct bfq_data *bfqd,
|
||||
jiffies + nsecs_to_jiffies(bfqq->bfqd->bfq_slice_idle) + 4);
|
||||
}
|
||||
|
||||
-/*
|
||||
- * Return the farthest future time instant according to jiffies
|
||||
- * macros.
|
||||
- */
|
||||
-static unsigned long bfq_greatest_from_now(void)
|
||||
-{
|
||||
- return jiffies + MAX_JIFFY_OFFSET;
|
||||
-}
|
||||
-
|
||||
-/*
|
||||
- * Return the farthest past time instant according to jiffies
|
||||
- * macros.
|
||||
- */
|
||||
-static unsigned long bfq_smallest_from_now(void)
|
||||
-{
|
||||
- return jiffies - MAX_JIFFY_OFFSET;
|
||||
-}
|
||||
-
|
||||
/**
|
||||
* bfq_bfqq_expire - expire a queue.
|
||||
* @bfqd: device owning the queue.
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-68
@@ -1,68 +0,0 @@
|
||||
From f0ba5ea2fe45c0ad24a7dedae84a97f7aa046494 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Wed, 20 Dec 2017 17:27:36 +0100
|
||||
Subject: [PATCH] block, bfq: increase threshold to deem I/O as random
|
||||
|
||||
If two processes do I/O close to each other, i.e., are cooperating
|
||||
processes in BFQ (and CFQ'S) nomenclature, then BFQ merges their
|
||||
associated bfq_queues, so as to get sequential I/O from the union of
|
||||
the I/O requests of the processes, and thus reach a higher
|
||||
throughput. A merged queue is then split if its I/O stops being
|
||||
sequential. In this respect, BFQ deems the I/O of a bfq_queue as
|
||||
(mostly) sequential only if less than 4 I/O requests are random, out
|
||||
of the last 32 requests inserted into the queue.
|
||||
|
||||
Unfortunately, extensive testing (with the interleaved_io benchmark of
|
||||
the S suite [1], and with real applications spawning cooperating
|
||||
processes) has clearly shown that, with such a low threshold, only a
|
||||
rather low I/O throughput may be reached when several cooperating
|
||||
processes do I/O. In particular, the outcome of each test run was
|
||||
bimodal: if queue merging occurred and was stable during the test,
|
||||
then the throughput was close to the peak rate of the storage device,
|
||||
otherwise the throughput was arbitrarily low (usually around 1/10 of
|
||||
the peak rate with a rotational device). The probability to get the
|
||||
unlucky outcomes grew with the number of cooperating processes: it was
|
||||
already significant with 5 processes, and close to one with 7 or more
|
||||
processes.
|
||||
|
||||
The cause of the low throughput in the unlucky runs was that the
|
||||
merged queues containing the I/O of these cooperating processes were
|
||||
soon split, because they contained more random I/O requests than those
|
||||
tolerated by the 4/32 threshold, but
|
||||
- that I/O would have however allowed the storage device to reach
|
||||
peak throughput or almost peak throughput;
|
||||
- in contrast, the I/O of these processes, if served individually
|
||||
(from separate queues) yielded a rather low throughput.
|
||||
|
||||
So we repeated our tests with increasing values of the threshold,
|
||||
until we found the minimum value (19) for which we obtained maximum
|
||||
throughput, reliably, with at least up to 9 cooperating
|
||||
processes. Then we checked that the use of that higher threshold value
|
||||
did not cause any regression for any other benchmark in the suite [1].
|
||||
This commit raises the threshold to such a higher value.
|
||||
|
||||
[1] https://github.com/Algodev-github/S
|
||||
|
||||
Signed-off-by: Angelo Ruocco <angeloruocco90@gmail.com>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index bcb6d21baf12..0f48583b9380 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -178,7 +178,7 @@ static struct kmem_cache *bfq_pool;
|
||||
#define BFQQ_SEEK_THR (sector_t)(8 * 100)
|
||||
#define BFQQ_SECT_THR_NONROT (sector_t)(2 * 32)
|
||||
#define BFQQ_CLOSE_THR (sector_t)(8 * 1024)
|
||||
-#define BFQQ_SEEKY(bfqq) (hweight32(bfqq->seek_history) > 32/8)
|
||||
+#define BFQQ_SEEKY(bfqq) (hweight32(bfqq->seek_history) > 19)
|
||||
|
||||
/* Min number of samples required to perform peak-rate update */
|
||||
#define BFQ_RATE_MIN_SAMPLES 32
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-34
@@ -1,34 +0,0 @@
|
||||
From 8abef10b3de1144cfe968f454946f13eb1ac3d0a Mon Sep 17 00:00:00 2001
|
||||
From: Jens Axboe <axboe@kernel.dk>
|
||||
Date: Tue, 9 Jan 2018 12:20:51 -0700
|
||||
Subject: [PATCH] bfq-iosched: don't call bfqg_and_blkg_put for
|
||||
!CONFIG_BFQ_GROUP_IOSCHED
|
||||
|
||||
It's not available if we don't have group io scheduling set, and
|
||||
there's no need to call it.
|
||||
|
||||
Fixes: 0d52af590552 ("block, bfq: release oom-queue ref to root group on exit")
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 7c0b7f60811c..5e6f837f663e 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -4893,10 +4893,10 @@ static void bfq_exit_queue(struct elevator_queue *e)
|
||||
|
||||
hrtimer_cancel(&bfqd->idle_slice_timer);
|
||||
|
||||
+#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
/* release oom-queue reference to root group */
|
||||
bfqg_and_blkg_put(bfqd->root_group);
|
||||
|
||||
-#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
blkcg_deactivate_policy(bfqd->queue, &blkcg_policy_bfq);
|
||||
#else
|
||||
spin_lock_irq(&bfqd->lock);
|
||||
--
|
||||
2.16.1
|
||||
|
||||
-186
@@ -1,186 +0,0 @@
|
||||
From 7b8fa3b900a087bc03b11329a92398fde563ba37 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Wed, 20 Dec 2017 12:38:33 +0100
|
||||
Subject: [PATCH] block, bfq: let a queue be merged only shortly after starting
|
||||
I/O
|
||||
|
||||
In BFQ and CFQ, two processes are said to be cooperating if they do
|
||||
I/O in such a way that the union of their I/O requests yields a
|
||||
sequential I/O pattern. To get such a sequential I/O pattern out of
|
||||
the non-sequential pattern of each cooperating process, BFQ and CFQ
|
||||
merge the queues associated with these processes. In more detail,
|
||||
cooperating processes, and thus their associated queues, usually
|
||||
start, or restart, to do I/O shortly after each other. This is the
|
||||
case, e.g., for the I/O threads of KVM/QEMU and of the dump
|
||||
utility. Basing on this assumption, this commit allows a bfq_queue to
|
||||
be merged only during a short time interval (100ms) after it starts,
|
||||
or re-starts, to do I/O. This filtering provides two important
|
||||
benefits.
|
||||
|
||||
First, it greatly reduces the probability that two non-cooperating
|
||||
processes have their queues merged by mistake, if they just happen to
|
||||
do I/O close to each other for a short time interval. These spurious
|
||||
merges cause loss of service guarantees. A low-weight bfq_queue may
|
||||
unjustly get more than its expected share of the throughput: if such a
|
||||
low-weight queue is merged with a high-weight queue, then the I/O for
|
||||
the low-weight queue is served as if the queue had a high weight. This
|
||||
may damage other high-weight queues unexpectedly. For instance,
|
||||
because of this issue, lxterminal occasionally took 7.5 seconds to
|
||||
start, instead of 6.5 seconds, when some sequential readers and
|
||||
writers did I/O in the background on a FUJITSU MHX2300BT HDD. The
|
||||
reason is that the bfq_queues associated with some of the readers or
|
||||
the writers were merged with the high-weight queues of some processes
|
||||
that had to do some urgent but little I/O. The readers then exploited
|
||||
the inherited high weight for all or most of their I/O, during the
|
||||
start-up of terminal. The filtering introduced by this commit
|
||||
eliminated any outlier caused by spurious queue merges in our start-up
|
||||
time tests.
|
||||
|
||||
This filtering also provides a little boost of the throughput
|
||||
sustainable by BFQ: 3-4%, depending on the CPU. The reason is that,
|
||||
once a bfq_queue cannot be merged any longer, this commit makes BFQ
|
||||
stop updating the data needed to handle merging for the queue.
|
||||
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Angelo Ruocco <angeloruocco90@gmail.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 57 ++++++++++++++++++++++++++++++++++++++++++-----------
|
||||
block/bfq-iosched.h | 2 ++
|
||||
block/bfq-wf2q.c | 4 ++++
|
||||
3 files changed, 52 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 2cf395daee80..7066d90f09df 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -166,6 +166,20 @@ static const int bfq_async_charge_factor = 10;
|
||||
/* Default timeout values, in jiffies, approximating CFQ defaults. */
|
||||
const int bfq_timeout = HZ / 8;
|
||||
|
||||
+/*
|
||||
+ * Time limit for merging (see comments in bfq_setup_cooperator). Set
|
||||
+ * to the slowest value that, in our tests, proved to be effective in
|
||||
+ * removing false positives, while not causing true positives to miss
|
||||
+ * queue merging.
|
||||
+ *
|
||||
+ * As can be deduced from the low time limit below, queue merging, if
|
||||
+ * successful, happens at the very beggining of the I/O of the involved
|
||||
+ * cooperating processes, as a consequence of the arrival of the very
|
||||
+ * first requests from each cooperator. After that, there is very
|
||||
+ * little chance to find cooperators.
|
||||
+ */
|
||||
+static const unsigned long bfq_merge_time_limit = HZ/10;
|
||||
+
|
||||
static struct kmem_cache *bfq_pool;
|
||||
|
||||
/* Below this threshold (in ns), we consider thinktime immediate. */
|
||||
@@ -444,6 +458,13 @@ bfq_rq_pos_tree_lookup(struct bfq_data *bfqd, struct rb_root *root,
|
||||
return bfqq;
|
||||
}
|
||||
|
||||
+static bool bfq_too_late_for_merging(struct bfq_queue *bfqq)
|
||||
+{
|
||||
+ return bfqq->service_from_backlogged > 0 &&
|
||||
+ time_is_before_jiffies(bfqq->first_IO_time +
|
||||
+ bfq_merge_time_limit);
|
||||
+}
|
||||
+
|
||||
void bfq_pos_tree_add_move(struct bfq_data *bfqd, struct bfq_queue *bfqq)
|
||||
{
|
||||
struct rb_node **p, *parent;
|
||||
@@ -454,6 +475,14 @@ void bfq_pos_tree_add_move(struct bfq_data *bfqd, struct bfq_queue *bfqq)
|
||||
bfqq->pos_root = NULL;
|
||||
}
|
||||
|
||||
+ /*
|
||||
+ * bfqq cannot be merged any longer (see comments in
|
||||
+ * bfq_setup_cooperator): no point in adding bfqq into the
|
||||
+ * position tree.
|
||||
+ */
|
||||
+ if (bfq_too_late_for_merging(bfqq))
|
||||
+ return;
|
||||
+
|
||||
if (bfq_class_idle(bfqq))
|
||||
return;
|
||||
if (!bfqq->next_rq)
|
||||
@@ -1935,6 +1964,9 @@ bfq_setup_merge(struct bfq_queue *bfqq, struct bfq_queue *new_bfqq)
|
||||
static bool bfq_may_be_close_cooperator(struct bfq_queue *bfqq,
|
||||
struct bfq_queue *new_bfqq)
|
||||
{
|
||||
+ if (bfq_too_late_for_merging(new_bfqq))
|
||||
+ return false;
|
||||
+
|
||||
if (bfq_class_idle(bfqq) || bfq_class_idle(new_bfqq) ||
|
||||
(bfqq->ioprio_class != new_bfqq->ioprio_class))
|
||||
return false;
|
||||
@@ -2003,6 +2035,20 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
||||
{
|
||||
struct bfq_queue *in_service_bfqq, *new_bfqq;
|
||||
|
||||
+ /*
|
||||
+ * Prevent bfqq from being merged if it has been created too
|
||||
+ * long ago. The idea is that true cooperating processes, and
|
||||
+ * thus their associated bfq_queues, are supposed to be
|
||||
+ * created shortly after each other. This is the case, e.g.,
|
||||
+ * for KVM/QEMU and dump I/O threads. Basing on this
|
||||
+ * assumption, the following filtering greatly reduces the
|
||||
+ * probability that two non-cooperating processes, which just
|
||||
+ * happen to do close I/O for some short time interval, have
|
||||
+ * their queues merged by mistake.
|
||||
+ */
|
||||
+ if (bfq_too_late_for_merging(bfqq))
|
||||
+ return NULL;
|
||||
+
|
||||
if (bfqq->new_bfqq)
|
||||
return bfqq->new_bfqq;
|
||||
|
||||
@@ -3002,17 +3048,6 @@ void bfq_bfqq_expire(struct bfq_data *bfqd,
|
||||
*/
|
||||
slow = bfq_bfqq_is_slow(bfqd, bfqq, compensate, reason, &delta);
|
||||
|
||||
- /*
|
||||
- * Increase service_from_backlogged before next statement,
|
||||
- * because the possible next invocation of
|
||||
- * bfq_bfqq_charge_time would likely inflate
|
||||
- * entity->service. In contrast, service_from_backlogged must
|
||||
- * contain real service, to enable the soft real-time
|
||||
- * heuristic to correctly compute the bandwidth consumed by
|
||||
- * bfqq.
|
||||
- */
|
||||
- bfqq->service_from_backlogged += entity->service;
|
||||
-
|
||||
/*
|
||||
* As above explained, charge slow (typically seeky) and
|
||||
* timed-out queues with the time and not the service
|
||||
diff --git a/block/bfq-iosched.h b/block/bfq-iosched.h
|
||||
index 91c4390903a1..5d47b58d5fc8 100644
|
||||
--- a/block/bfq-iosched.h
|
||||
+++ b/block/bfq-iosched.h
|
||||
@@ -344,6 +344,8 @@ struct bfq_queue {
|
||||
unsigned long wr_start_at_switch_to_srt;
|
||||
|
||||
unsigned long split_time; /* time of last split */
|
||||
+
|
||||
+ unsigned long first_IO_time; /* time of first I/O for this queue */
|
||||
};
|
||||
|
||||
/**
|
||||
diff --git a/block/bfq-wf2q.c b/block/bfq-wf2q.c
|
||||
index e495d3f9b4b0..4456eda34e48 100644
|
||||
--- a/block/bfq-wf2q.c
|
||||
+++ b/block/bfq-wf2q.c
|
||||
@@ -835,6 +835,10 @@ void bfq_bfqq_served(struct bfq_queue *bfqq, int served)
|
||||
struct bfq_entity *entity = &bfqq->entity;
|
||||
struct bfq_service_tree *st;
|
||||
|
||||
+ if (!bfqq->service_from_backlogged)
|
||||
+ bfqq->first_IO_time = jiffies;
|
||||
+
|
||||
+ bfqq->service_from_backlogged += served;
|
||||
for_each_entity(entity) {
|
||||
st = bfq_entity_service_tree(entity);
|
||||
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-89
@@ -1,89 +0,0 @@
|
||||
From 894df937e06a56ed6f054a75a416aff84147c5a2 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Thu, 21 Sep 2017 11:04:02 +0200
|
||||
Subject: [PATCH] block, bfq: let early-merged queues be weight-raised on split
|
||||
too
|
||||
|
||||
A just-created bfq_queue, say Q, may happen to be merged with another
|
||||
bfq_queue on the very first invocation of the function
|
||||
__bfq_insert_request. In such a case, even if Q would clearly deserve
|
||||
interactive weight raising (as it has just been created), the function
|
||||
bfq_add_request does not make it to be invoked for Q, and thus to
|
||||
activate weight raising for Q. As a consequence, when the state of Q
|
||||
is saved for a possible future restore, after a split of Q from the
|
||||
other bfq_queue(s), such a state happens to be (unjustly)
|
||||
non-weight-raised. Then the bfq_queue will not enjoy any weight
|
||||
raising on the split, even if should still be in an interactive
|
||||
weight-raising period when the split occurs.
|
||||
|
||||
This commit solves this problem as follows, for a just-created
|
||||
bfq_queue that is being early-merged: it stores directly, in the saved
|
||||
state of the bfq_queue, the weight-raising state that would have been
|
||||
assigned to the bfq_queue if not early-merged.
|
||||
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Tested-by: Angelo Ruocco <angeloruocco90@gmail.com>
|
||||
Tested-by: Mirko Montanari <mirkomontanari91@gmail.com>
|
||||
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
Tested-by: Lee Tibbert <lee.tibbert@gmail.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 28 +++++++++++++++++++++++-----
|
||||
1 file changed, 23 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 33b63bc4a64b..115747fe43c8 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -2061,10 +2061,27 @@ static void bfq_bfqq_save_state(struct bfq_queue *bfqq)
|
||||
bic->saved_IO_bound = bfq_bfqq_IO_bound(bfqq);
|
||||
bic->saved_in_large_burst = bfq_bfqq_in_large_burst(bfqq);
|
||||
bic->was_in_burst_list = !hlist_unhashed(&bfqq->burst_list_node);
|
||||
- bic->saved_wr_coeff = bfqq->wr_coeff;
|
||||
- bic->saved_wr_start_at_switch_to_srt = bfqq->wr_start_at_switch_to_srt;
|
||||
- bic->saved_last_wr_start_finish = bfqq->last_wr_start_finish;
|
||||
- bic->saved_wr_cur_max_time = bfqq->wr_cur_max_time;
|
||||
+ if (unlikely(bfq_bfqq_just_created(bfqq) &&
|
||||
+ !bfq_bfqq_in_large_burst(bfqq))) {
|
||||
+ /*
|
||||
+ * bfqq being merged right after being created: bfqq
|
||||
+ * would have deserved interactive weight raising, but
|
||||
+ * did not make it to be set in a weight-raised state,
|
||||
+ * because of this early merge. Store directly the
|
||||
+ * weight-raising state that would have been assigned
|
||||
+ * to bfqq, so that to avoid that bfqq unjustly fails
|
||||
+ * to enjoy weight raising if split soon.
|
||||
+ */
|
||||
+ bic->saved_wr_coeff = bfqq->bfqd->bfq_wr_coeff;
|
||||
+ bic->saved_wr_cur_max_time = bfq_wr_duration(bfqq->bfqd);
|
||||
+ bic->saved_last_wr_start_finish = jiffies;
|
||||
+ } else {
|
||||
+ bic->saved_wr_coeff = bfqq->wr_coeff;
|
||||
+ bic->saved_wr_start_at_switch_to_srt =
|
||||
+ bfqq->wr_start_at_switch_to_srt;
|
||||
+ bic->saved_last_wr_start_finish = bfqq->last_wr_start_finish;
|
||||
+ bic->saved_wr_cur_max_time = bfqq->wr_cur_max_time;
|
||||
+ }
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -4150,7 +4167,6 @@ static void __bfq_insert_request(struct bfq_data *bfqd, struct request *rq)
|
||||
new_bfqq->allocated++;
|
||||
bfqq->allocated--;
|
||||
new_bfqq->ref++;
|
||||
- bfq_clear_bfqq_just_created(bfqq);
|
||||
/*
|
||||
* If the bic associated with the process
|
||||
* issuing this request still points to bfqq
|
||||
@@ -4162,6 +4178,8 @@ static void __bfq_insert_request(struct bfq_data *bfqd, struct request *rq)
|
||||
if (bic_to_bfqq(RQ_BIC(rq), 1) == bfqq)
|
||||
bfq_merge_bfqqs(bfqd, RQ_BIC(rq),
|
||||
bfqq, new_bfqq);
|
||||
+
|
||||
+ bfq_clear_bfqq_just_created(bfqq);
|
||||
/*
|
||||
* rq is about to be enqueued into new_bfqq,
|
||||
* release rq reference on bfqq
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-202
@@ -1,202 +0,0 @@
|
||||
From 8a8747dc01cee6f92a52c03ba686e9f60cb46c87 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Sat, 13 Jan 2018 12:05:18 +0100
|
||||
Subject: [PATCH] block, bfq: limit sectors served with interactive weight
|
||||
raising
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
To maximise responsiveness, BFQ raises the weight, and performs device
|
||||
idling, for bfq_queues associated with processes deemed as
|
||||
interactive. In particular, weight raising has a maximum duration,
|
||||
equal to the time needed to start a large application. If a
|
||||
weight-raised process goes on doing I/O beyond this maximum duration,
|
||||
it loses weight-raising.
|
||||
|
||||
This mechanism is evidently vulnerable to the following false
|
||||
positives: I/O-bound applications that will go on doing I/O for much
|
||||
longer than the duration of weight-raising. These applications have
|
||||
basically no benefit from being weight-raised at the beginning of
|
||||
their I/O. On the opposite end, while being weight-raised, these
|
||||
applications
|
||||
a) unjustly steal throughput to applications that may truly need
|
||||
low latency;
|
||||
b) make BFQ uselessly perform device idling; device idling results
|
||||
in loss of device throughput with most flash-based storage, and may
|
||||
increase latencies when used purposelessly.
|
||||
|
||||
This commit adds a countermeasure to reduce both the above
|
||||
problems. To introduce this countermeasure, we provide the following
|
||||
extra piece of information (full details in the comments added by this
|
||||
commit). During the start-up of the large application used as a
|
||||
reference to set the duration of weight-raising, involved processes
|
||||
transfer at most ~110K sectors each. Accordingly, a process initially
|
||||
deemed as interactive has no right to be weight-raised any longer,
|
||||
once transferred 110K sectors or more.
|
||||
|
||||
Basing on this consideration, this commit early-ends weight-raising
|
||||
for a bfq_queue if the latter happens to have received an amount of
|
||||
service at least equal to 110K sectors (actually, a little bit more,
|
||||
to keep a safety margin). I/O-bound applications that reach a high
|
||||
throughput, such as file copy, get to this threshold much before the
|
||||
allowed weight-raising period finishes. Thus this early ending of
|
||||
weight-raising reduces the amount of time during which these
|
||||
applications cause the problems described above.
|
||||
|
||||
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++------
|
||||
block/bfq-iosched.h | 5 ++++
|
||||
block/bfq-wf2q.c | 3 ++
|
||||
3 files changed, 80 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index a7ab0cb50733..47e6ec7427c4 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -209,15 +209,17 @@ static struct kmem_cache *bfq_pool;
|
||||
* interactive applications automatically, using the following formula:
|
||||
* duration = (R / r) * T, where r is the peak rate of the device, and
|
||||
* R and T are two reference parameters.
|
||||
- * In particular, R is the peak rate of the reference device (see below),
|
||||
- * and T is a reference time: given the systems that are likely to be
|
||||
- * installed on the reference device according to its speed class, T is
|
||||
- * about the maximum time needed, under BFQ and while reading two files in
|
||||
- * parallel, to load typical large applications on these systems.
|
||||
- * In practice, the slower/faster the device at hand is, the more/less it
|
||||
- * takes to load applications with respect to the reference device.
|
||||
- * Accordingly, the longer/shorter BFQ grants weight raising to interactive
|
||||
- * applications.
|
||||
+ * In particular, R is the peak rate of the reference device (see
|
||||
+ * below), and T is a reference time: given the systems that are
|
||||
+ * likely to be installed on the reference device according to its
|
||||
+ * speed class, T is about the maximum time needed, under BFQ and
|
||||
+ * while reading two files in parallel, to load typical large
|
||||
+ * applications on these systems (see the comments on
|
||||
+ * max_service_from_wr below, for more details on how T is obtained).
|
||||
+ * In practice, the slower/faster the device at hand is, the more/less
|
||||
+ * it takes to load applications with respect to the reference device.
|
||||
+ * Accordingly, the longer/shorter BFQ grants weight raising to
|
||||
+ * interactive applications.
|
||||
*
|
||||
* BFQ uses four different reference pairs (R, T), depending on:
|
||||
* . whether the device is rotational or non-rotational;
|
||||
@@ -254,6 +256,60 @@ static int T_slow[2];
|
||||
static int T_fast[2];
|
||||
static int device_speed_thresh[2];
|
||||
|
||||
+/*
|
||||
+ * BFQ uses the above-detailed, time-based weight-raising mechanism to
|
||||
+ * privilege interactive tasks. This mechanism is vulnerable to the
|
||||
+ * following false positives: I/O-bound applications that will go on
|
||||
+ * doing I/O for much longer than the duration of weight
|
||||
+ * raising. These applications have basically no benefit from being
|
||||
+ * weight-raised at the beginning of their I/O. On the opposite end,
|
||||
+ * while being weight-raised, these applications
|
||||
+ * a) unjustly steal throughput to applications that may actually need
|
||||
+ * low latency;
|
||||
+ * b) make BFQ uselessly perform device idling; device idling results
|
||||
+ * in loss of device throughput with most flash-based storage, and may
|
||||
+ * increase latencies when used purposelessly.
|
||||
+ *
|
||||
+ * BFQ tries to reduce these problems, by adopting the following
|
||||
+ * countermeasure. To introduce this countermeasure, we need first to
|
||||
+ * finish explaining how the duration of weight-raising for
|
||||
+ * interactive tasks is computed.
|
||||
+ *
|
||||
+ * For a bfq_queue deemed as interactive, the duration of weight
|
||||
+ * raising is dynamically adjusted, as a function of the estimated
|
||||
+ * peak rate of the device, so as to be equal to the time needed to
|
||||
+ * execute the 'largest' interactive task we benchmarked so far. By
|
||||
+ * largest task, we mean the task for which each involved process has
|
||||
+ * to do more I/O than for any of the other tasks we benchmarked. This
|
||||
+ * reference interactive task is the start-up of LibreOffice Writer,
|
||||
+ * and in this task each process/bfq_queue needs to have at most ~110K
|
||||
+ * sectors transferred.
|
||||
+ *
|
||||
+ * This last piece of information enables BFQ to reduce the actual
|
||||
+ * duration of weight-raising for at least one class of I/O-bound
|
||||
+ * applications: those doing sequential or quasi-sequential I/O. An
|
||||
+ * example is file copy. In fact, once started, the main I/O-bound
|
||||
+ * processes of these applications usually consume the above 110K
|
||||
+ * sectors in much less time than the processes of an application that
|
||||
+ * is starting, because these I/O-bound processes will greedily devote
|
||||
+ * almost all their CPU cycles only to their target,
|
||||
+ * throughput-friendly I/O operations. This is even more true if BFQ
|
||||
+ * happens to be underestimating the device peak rate, and thus
|
||||
+ * overestimating the duration of weight raising. But, according to
|
||||
+ * our measurements, once transferred 110K sectors, these processes
|
||||
+ * have no right to be weight-raised any longer.
|
||||
+ *
|
||||
+ * Basing on the last consideration, BFQ ends weight-raising for a
|
||||
+ * bfq_queue if the latter happens to have received an amount of
|
||||
+ * service at least equal to the following constant. The constant is
|
||||
+ * set to slightly more than 110K, to have a minimum safety margin.
|
||||
+ *
|
||||
+ * This early ending of weight-raising reduces the amount of time
|
||||
+ * during which interactive false positives cause the two problems
|
||||
+ * described at the beginning of these comments.
|
||||
+ */
|
||||
+static const unsigned long max_service_from_wr = 120000;
|
||||
+
|
||||
#define RQ_BIC(rq) icq_to_bic((rq)->elv.priv[0])
|
||||
#define RQ_BFQQ(rq) ((rq)->elv.priv[1])
|
||||
|
||||
@@ -1352,6 +1408,7 @@ static void bfq_update_bfqq_wr_on_rq_arrival(struct bfq_data *bfqd,
|
||||
if (old_wr_coeff == 1 && wr_or_deserves_wr) {
|
||||
/* start a weight-raising period */
|
||||
if (interactive) {
|
||||
+ bfqq->service_from_wr = 0;
|
||||
bfqq->wr_coeff = bfqd->bfq_wr_coeff;
|
||||
bfqq->wr_cur_max_time = bfq_wr_duration(bfqd);
|
||||
} else {
|
||||
@@ -3665,6 +3722,12 @@ static void bfq_update_wr_data(struct bfq_data *bfqd, struct bfq_queue *bfqq)
|
||||
bfqq->entity.prio_changed = 1;
|
||||
}
|
||||
}
|
||||
+ if (bfqq->wr_coeff > 1 &&
|
||||
+ bfqq->wr_cur_max_time != bfqd->bfq_wr_rt_max_time &&
|
||||
+ bfqq->service_from_wr > max_service_from_wr) {
|
||||
+ /* see comments on max_service_from_wr */
|
||||
+ bfq_bfqq_end_wr(bfqq);
|
||||
+ }
|
||||
}
|
||||
/*
|
||||
* To improve latency (for this or other queues), immediately
|
||||
diff --git a/block/bfq-iosched.h b/block/bfq-iosched.h
|
||||
index fcd941008127..350c39ae2896 100644
|
||||
--- a/block/bfq-iosched.h
|
||||
+++ b/block/bfq-iosched.h
|
||||
@@ -337,6 +337,11 @@ struct bfq_queue {
|
||||
* last transition from idle to backlogged.
|
||||
*/
|
||||
unsigned long service_from_backlogged;
|
||||
+ /*
|
||||
+ * Cumulative service received from the @bfq_queue since its
|
||||
+ * last transition to weight-raised state.
|
||||
+ */
|
||||
+ unsigned long service_from_wr;
|
||||
|
||||
/*
|
||||
* Value of wr start time when switching to soft rt
|
||||
diff --git a/block/bfq-wf2q.c b/block/bfq-wf2q.c
|
||||
index 4456eda34e48..4498c43245e2 100644
|
||||
--- a/block/bfq-wf2q.c
|
||||
+++ b/block/bfq-wf2q.c
|
||||
@@ -838,6 +838,9 @@ void bfq_bfqq_served(struct bfq_queue *bfqq, int served)
|
||||
if (!bfqq->service_from_backlogged)
|
||||
bfqq->first_IO_time = jiffies;
|
||||
|
||||
+ if (bfqq->wr_coeff > 1)
|
||||
+ bfqq->service_from_wr += served;
|
||||
+
|
||||
bfqq->service_from_backlogged += served;
|
||||
for_each_entity(entity) {
|
||||
st = bfq_entity_service_tree(entity);
|
||||
--
|
||||
2.16.1
|
||||
|
||||
-162
@@ -1,162 +0,0 @@
|
||||
From a52a69ea89dc12e6f4572f554940789c1ab23c7a Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Sat, 13 Jan 2018 12:05:17 +0100
|
||||
Subject: [PATCH] block, bfq: limit tags for writes and async I/O
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Asynchronous I/O can easily starve synchronous I/O (both sync reads
|
||||
and sync writes), by consuming all request tags. Similarly, storms of
|
||||
synchronous writes, such as those that sync(2) may trigger, can starve
|
||||
synchronous reads. In their turn, these two problems may also cause
|
||||
BFQ to loose control on latency for interactive and soft real-time
|
||||
applications. For example, on a PLEXTOR PX-256M5S SSD, LibreOffice
|
||||
Writer takes 0.6 seconds to start if the device is idle, but it takes
|
||||
more than 45 seconds (!) if there are sequential writes in the
|
||||
background.
|
||||
|
||||
This commit addresses this issue by limiting the maximum percentage of
|
||||
tags that asynchronous I/O requests and synchronous write requests can
|
||||
consume. In particular, this commit grants a higher threshold to
|
||||
synchronous writes, to prevent the latter from being starved by
|
||||
asynchronous I/O.
|
||||
|
||||
According to the above test, LibreOffice Writer now starts in about
|
||||
1.2 seconds on average, regardless of the background workload, and
|
||||
apart from some rare outlier. To check this improvement, run, e.g.,
|
||||
sudo ./comm_startup_lat.sh bfq 5 5 seq 10 "lowriter --terminate_after_init"
|
||||
for the comm_startup_lat benchmark in the S suite [1].
|
||||
|
||||
[1] https://github.com/Algodev-github/S
|
||||
|
||||
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||
block/bfq-iosched.h | 12 +++++++++
|
||||
2 files changed, 89 insertions(+)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index f352b1677143..a7ab0cb50733 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -417,6 +417,82 @@ static struct request *bfq_choose_req(struct bfq_data *bfqd,
|
||||
}
|
||||
}
|
||||
|
||||
+/*
|
||||
+ * See the comments on bfq_limit_depth for the purpose of
|
||||
+ * the depths set in the function.
|
||||
+ */
|
||||
+static void bfq_update_depths(struct bfq_data *bfqd, struct sbitmap_queue *bt)
|
||||
+{
|
||||
+ bfqd->sb_shift = bt->sb.shift;
|
||||
+
|
||||
+ /*
|
||||
+ * In-word depths if no bfq_queue is being weight-raised:
|
||||
+ * leaving 25% of tags only for sync reads.
|
||||
+ *
|
||||
+ * In next formulas, right-shift the value
|
||||
+ * (1U<<bfqd->sb_shift), instead of computing directly
|
||||
+ * (1U<<(bfqd->sb_shift - something)), to be robust against
|
||||
+ * any possible value of bfqd->sb_shift, without having to
|
||||
+ * limit 'something'.
|
||||
+ */
|
||||
+ /* no more than 50% of tags for async I/O */
|
||||
+ bfqd->word_depths[0][0] = max((1U<<bfqd->sb_shift)>>1, 1U);
|
||||
+ /*
|
||||
+ * no more than 75% of tags for sync writes (25% extra tags
|
||||
+ * w.r.t. async I/O, to prevent async I/O from starving sync
|
||||
+ * writes)
|
||||
+ */
|
||||
+ bfqd->word_depths[0][1] = max(((1U<<bfqd->sb_shift) * 3)>>2, 1U);
|
||||
+
|
||||
+ /*
|
||||
+ * In-word depths in case some bfq_queue is being weight-
|
||||
+ * raised: leaving ~63% of tags for sync reads. This is the
|
||||
+ * highest percentage for which, in our tests, application
|
||||
+ * start-up times didn't suffer from any regression due to tag
|
||||
+ * shortage.
|
||||
+ */
|
||||
+ /* no more than ~18% of tags for async I/O */
|
||||
+ bfqd->word_depths[1][0] = max(((1U<<bfqd->sb_shift) * 3)>>4, 1U);
|
||||
+ /* no more than ~37% of tags for sync writes (~20% extra tags) */
|
||||
+ bfqd->word_depths[1][1] = max(((1U<<bfqd->sb_shift) * 6)>>4, 1U);
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Async I/O can easily starve sync I/O (both sync reads and sync
|
||||
+ * writes), by consuming all tags. Similarly, storms of sync writes,
|
||||
+ * such as those that sync(2) may trigger, can starve sync reads.
|
||||
+ * Limit depths of async I/O and sync writes so as to counter both
|
||||
+ * problems.
|
||||
+ */
|
||||
+static void bfq_limit_depth(unsigned int op, struct blk_mq_alloc_data *data)
|
||||
+{
|
||||
+ struct blk_mq_tags *tags = blk_mq_tags_from_data(data);
|
||||
+ struct bfq_data *bfqd = data->q->elevator->elevator_data;
|
||||
+ struct sbitmap_queue *bt;
|
||||
+
|
||||
+ if (op_is_sync(op) && !op_is_write(op))
|
||||
+ return;
|
||||
+
|
||||
+ if (data->flags & BLK_MQ_REQ_RESERVED) {
|
||||
+ if (unlikely(!tags->nr_reserved_tags)) {
|
||||
+ WARN_ON_ONCE(1);
|
||||
+ return;
|
||||
+ }
|
||||
+ bt = &tags->breserved_tags;
|
||||
+ } else
|
||||
+ bt = &tags->bitmap_tags;
|
||||
+
|
||||
+ if (unlikely(bfqd->sb_shift != bt->sb.shift))
|
||||
+ bfq_update_depths(bfqd, bt);
|
||||
+
|
||||
+ data->shallow_depth =
|
||||
+ bfqd->word_depths[!!bfqd->wr_busy_queues][op_is_sync(op)];
|
||||
+
|
||||
+ bfq_log(bfqd, "[%s] wr_busy %d sync %d depth %u",
|
||||
+ __func__, bfqd->wr_busy_queues, op_is_sync(op),
|
||||
+ data->shallow_depth);
|
||||
+}
|
||||
+
|
||||
static struct bfq_queue *
|
||||
bfq_rq_pos_tree_lookup(struct bfq_data *bfqd, struct rb_root *root,
|
||||
sector_t sector, struct rb_node **ret_parent,
|
||||
@@ -5285,6 +5361,7 @@ static struct elv_fs_entry bfq_attrs[] = {
|
||||
|
||||
static struct elevator_type iosched_bfq_mq = {
|
||||
.ops.mq = {
|
||||
+ .limit_depth = bfq_limit_depth,
|
||||
.prepare_request = bfq_prepare_request,
|
||||
.finish_request = bfq_finish_request,
|
||||
.exit_icq = bfq_exit_icq,
|
||||
diff --git a/block/bfq-iosched.h b/block/bfq-iosched.h
|
||||
index 5d47b58d5fc8..fcd941008127 100644
|
||||
--- a/block/bfq-iosched.h
|
||||
+++ b/block/bfq-iosched.h
|
||||
@@ -629,6 +629,18 @@ struct bfq_data {
|
||||
struct bfq_io_cq *bio_bic;
|
||||
/* bfqq associated with the task issuing current bio for merging */
|
||||
struct bfq_queue *bio_bfqq;
|
||||
+
|
||||
+ /*
|
||||
+ * Cached sbitmap shift, used to compute depth limits in
|
||||
+ * bfq_update_depths.
|
||||
+ */
|
||||
+ unsigned int sb_shift;
|
||||
+
|
||||
+ /*
|
||||
+ * Depth limits used in bfq_limit_depth (see comments on the
|
||||
+ * function)
|
||||
+ */
|
||||
+ unsigned int word_depths[2][2];
|
||||
};
|
||||
|
||||
enum bfqq_state_flags {
|
||||
--
|
||||
2.16.1
|
||||
|
||||
-467
@@ -1,467 +0,0 @@
|
||||
From a33801e8b4735b8d473f963e5854172f9cde3e8b Mon Sep 17 00:00:00 2001
|
||||
From: Luca Miccio <lucmiccio@gmail.com>
|
||||
Date: Mon, 13 Nov 2017 07:34:10 +0100
|
||||
Subject: [PATCH] block, bfq: move debug blkio stats behind
|
||||
CONFIG_DEBUG_BLK_CGROUP
|
||||
|
||||
BFQ currently creates, and updates, its own instance of the whole
|
||||
set of blkio statistics that cfq creates. Yet, from the comments
|
||||
of Tejun Heo in [1], it turned out that most of these statistics
|
||||
are meant/useful only for debugging. This commit makes BFQ create
|
||||
the latter, debugging statistics only if the option
|
||||
CONFIG_DEBUG_BLK_CGROUP is set.
|
||||
|
||||
By doing so, this commit also enables BFQ to enjoy a high perfomance
|
||||
boost. The reason is that, if CONFIG_DEBUG_BLK_CGROUP is not set, then
|
||||
BFQ has to update far fewer statistics, and, in particular, not the
|
||||
heaviest to update. To give an idea of the benefits, if
|
||||
CONFIG_DEBUG_BLK_CGROUP is not set, then, on an Intel i7-4850HQ, and
|
||||
with 8 threads doing random I/O in parallel on null_blk (configured
|
||||
with 0 latency), the throughput of BFQ grows from 310 to 400 KIOPS
|
||||
(+30%). We have measured similar or even much higher boosts with other
|
||||
CPUs: e.g., +45% with an ARM CortexTM-A53 Octa-core. Our results have
|
||||
been obtained and can be reproduced very easily with the script in [1].
|
||||
|
||||
[1] https://www.spinics.net/lists/linux-block/msg18943.html
|
||||
|
||||
Suggested-by: Tejun Heo <tj@kernel.org>
|
||||
Suggested-by: Ulf Hansson <ulf.hansson@linaro.org>
|
||||
Tested-by: Lee Tibbert <lee.tibbert@gmail.com>
|
||||
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
Signed-off-by: Luca Miccio <lucmiccio@gmail.com>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
Documentation/block/bfq-iosched.txt | 38 +++++++--
|
||||
block/bfq-cgroup.c | 148 ++++++++++++++++++++----------------
|
||||
block/bfq-iosched.c | 14 ++--
|
||||
block/bfq-iosched.h | 4 +-
|
||||
4 files changed, 125 insertions(+), 79 deletions(-)
|
||||
|
||||
diff --git a/Documentation/block/bfq-iosched.txt b/Documentation/block/bfq-iosched.txt
|
||||
index 7fad6c061470..8d8d8f06cab2 100644
|
||||
--- a/Documentation/block/bfq-iosched.txt
|
||||
+++ b/Documentation/block/bfq-iosched.txt
|
||||
@@ -20,12 +20,22 @@ for that device, by setting low_latency to 0. See Section 3 for
|
||||
details on how to configure BFQ for the desired tradeoff between
|
||||
latency and throughput, or on how to maximize throughput.
|
||||
|
||||
-BFQ has a non-null overhead, which limits the maximum IOPS that the
|
||||
-CPU can process for a device scheduled with BFQ. To give an idea of
|
||||
-the limits on slow or average CPUs, here are BFQ limits for three
|
||||
-different CPUs, on, respectively, an average laptop, an old desktop,
|
||||
-and a cheap embedded system, in case full hierarchical support is
|
||||
-enabled (i.e., CONFIG_BFQ_GROUP_IOSCHED is set):
|
||||
+BFQ has a non-null overhead, which limits the maximum IOPS that a CPU
|
||||
+can process for a device scheduled with BFQ. To give an idea of the
|
||||
+limits on slow or average CPUs, here are, first, the limits of BFQ for
|
||||
+three different CPUs, on, respectively, an average laptop, an old
|
||||
+desktop, and a cheap embedded system, in case full hierarchical
|
||||
+support is enabled (i.e., CONFIG_BFQ_GROUP_IOSCHED is set), but
|
||||
+CONFIG_DEBUG_BLK_CGROUP is not set (Section 4-2):
|
||||
+- Intel i7-4850HQ: 400 KIOPS
|
||||
+- AMD A8-3850: 250 KIOPS
|
||||
+- ARM CortexTM-A53 Octa-core: 80 KIOPS
|
||||
+
|
||||
+If CONFIG_DEBUG_BLK_CGROUP is set (and of course full hierarchical
|
||||
+support is enabled), then the sustainable throughput with BFQ
|
||||
+decreases, because all blkio.bfq* statistics are created and updated
|
||||
+(Section 4-2). For BFQ, this leads to the following maximum
|
||||
+sustainable throughputs, on the same systems as above:
|
||||
- Intel i7-4850HQ: 310 KIOPS
|
||||
- AMD A8-3850: 200 KIOPS
|
||||
- ARM CortexTM-A53 Octa-core: 56 KIOPS
|
||||
@@ -505,6 +515,22 @@ BFQ-specific files is "blkio.bfq." or "io.bfq." For example, the group
|
||||
parameter to set the weight of a group with BFQ is blkio.bfq.weight
|
||||
or io.bfq.weight.
|
||||
|
||||
+As for cgroups-v1 (blkio controller), the exact set of stat files
|
||||
+created, and kept up-to-date by bfq, depends on whether
|
||||
+CONFIG_DEBUG_BLK_CGROUP is set. If it is set, then bfq creates all
|
||||
+the stat files documented in
|
||||
+Documentation/cgroup-v1/blkio-controller.txt. If, instead,
|
||||
+CONFIG_DEBUG_BLK_CGROUP is not set, then bfq creates only the files
|
||||
+blkio.bfq.io_service_bytes
|
||||
+blkio.bfq.io_service_bytes_recursive
|
||||
+blkio.bfq.io_serviced
|
||||
+blkio.bfq.io_serviced_recursive
|
||||
+
|
||||
+The value of CONFIG_DEBUG_BLK_CGROUP greatly influences the maximum
|
||||
+throughput sustainable with bfq, because updating the blkio.bfq.*
|
||||
+stats is rather costly, especially for some of the stats enabled by
|
||||
+CONFIG_DEBUG_BLK_CGROUP.
|
||||
+
|
||||
Parameters to set
|
||||
-----------------
|
||||
|
||||
diff --git a/block/bfq-cgroup.c b/block/bfq-cgroup.c
|
||||
index ceefb9a706d6..da1525ec4c87 100644
|
||||
--- a/block/bfq-cgroup.c
|
||||
+++ b/block/bfq-cgroup.c
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
#include "bfq-iosched.h"
|
||||
|
||||
-#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
|
||||
/* bfqg stats flags */
|
||||
enum bfqg_stats_flags {
|
||||
@@ -152,6 +152,57 @@ void bfqg_stats_update_avg_queue_size(struct bfq_group *bfqg)
|
||||
bfqg_stats_update_group_wait_time(stats);
|
||||
}
|
||||
|
||||
+void bfqg_stats_update_io_add(struct bfq_group *bfqg, struct bfq_queue *bfqq,
|
||||
+ unsigned int op)
|
||||
+{
|
||||
+ blkg_rwstat_add(&bfqg->stats.queued, op, 1);
|
||||
+ bfqg_stats_end_empty_time(&bfqg->stats);
|
||||
+ if (!(bfqq == ((struct bfq_data *)bfqg->bfqd)->in_service_queue))
|
||||
+ bfqg_stats_set_start_group_wait_time(bfqg, bfqq_group(bfqq));
|
||||
+}
|
||||
+
|
||||
+void bfqg_stats_update_io_remove(struct bfq_group *bfqg, unsigned int op)
|
||||
+{
|
||||
+ blkg_rwstat_add(&bfqg->stats.queued, op, -1);
|
||||
+}
|
||||
+
|
||||
+void bfqg_stats_update_io_merged(struct bfq_group *bfqg, unsigned int op)
|
||||
+{
|
||||
+ blkg_rwstat_add(&bfqg->stats.merged, op, 1);
|
||||
+}
|
||||
+
|
||||
+void bfqg_stats_update_completion(struct bfq_group *bfqg, uint64_t start_time,
|
||||
+ uint64_t io_start_time, unsigned int op)
|
||||
+{
|
||||
+ struct bfqg_stats *stats = &bfqg->stats;
|
||||
+ unsigned long long now = sched_clock();
|
||||
+
|
||||
+ if (time_after64(now, io_start_time))
|
||||
+ blkg_rwstat_add(&stats->service_time, op,
|
||||
+ now - io_start_time);
|
||||
+ if (time_after64(io_start_time, start_time))
|
||||
+ blkg_rwstat_add(&stats->wait_time, op,
|
||||
+ io_start_time - start_time);
|
||||
+}
|
||||
+
|
||||
+#else /* CONFIG_BFQ_GROUP_IOSCHED && CONFIG_DEBUG_BLK_CGROUP */
|
||||
+
|
||||
+void bfqg_stats_update_io_add(struct bfq_group *bfqg, struct bfq_queue *bfqq,
|
||||
+ unsigned int op) { }
|
||||
+void bfqg_stats_update_io_remove(struct bfq_group *bfqg, unsigned int op) { }
|
||||
+void bfqg_stats_update_io_merged(struct bfq_group *bfqg, unsigned int op) { }
|
||||
+void bfqg_stats_update_completion(struct bfq_group *bfqg, uint64_t start_time,
|
||||
+ uint64_t io_start_time, unsigned int op) { }
|
||||
+void bfqg_stats_update_dequeue(struct bfq_group *bfqg) { }
|
||||
+void bfqg_stats_set_start_empty_time(struct bfq_group *bfqg) { }
|
||||
+void bfqg_stats_update_idle_time(struct bfq_group *bfqg) { }
|
||||
+void bfqg_stats_set_start_idle_time(struct bfq_group *bfqg) { }
|
||||
+void bfqg_stats_update_avg_queue_size(struct bfq_group *bfqg) { }
|
||||
+
|
||||
+#endif /* CONFIG_BFQ_GROUP_IOSCHED && CONFIG_DEBUG_BLK_CGROUP */
|
||||
+
|
||||
+#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+
|
||||
/*
|
||||
* blk-cgroup policy-related handlers
|
||||
* The following functions help in converting between blk-cgroup
|
||||
@@ -229,42 +280,10 @@ void bfqg_and_blkg_put(struct bfq_group *bfqg)
|
||||
blkg_put(bfqg_to_blkg(bfqg));
|
||||
}
|
||||
|
||||
-void bfqg_stats_update_io_add(struct bfq_group *bfqg, struct bfq_queue *bfqq,
|
||||
- unsigned int op)
|
||||
-{
|
||||
- blkg_rwstat_add(&bfqg->stats.queued, op, 1);
|
||||
- bfqg_stats_end_empty_time(&bfqg->stats);
|
||||
- if (!(bfqq == ((struct bfq_data *)bfqg->bfqd)->in_service_queue))
|
||||
- bfqg_stats_set_start_group_wait_time(bfqg, bfqq_group(bfqq));
|
||||
-}
|
||||
-
|
||||
-void bfqg_stats_update_io_remove(struct bfq_group *bfqg, unsigned int op)
|
||||
-{
|
||||
- blkg_rwstat_add(&bfqg->stats.queued, op, -1);
|
||||
-}
|
||||
-
|
||||
-void bfqg_stats_update_io_merged(struct bfq_group *bfqg, unsigned int op)
|
||||
-{
|
||||
- blkg_rwstat_add(&bfqg->stats.merged, op, 1);
|
||||
-}
|
||||
-
|
||||
-void bfqg_stats_update_completion(struct bfq_group *bfqg, uint64_t start_time,
|
||||
- uint64_t io_start_time, unsigned int op)
|
||||
-{
|
||||
- struct bfqg_stats *stats = &bfqg->stats;
|
||||
- unsigned long long now = sched_clock();
|
||||
-
|
||||
- if (time_after64(now, io_start_time))
|
||||
- blkg_rwstat_add(&stats->service_time, op,
|
||||
- now - io_start_time);
|
||||
- if (time_after64(io_start_time, start_time))
|
||||
- blkg_rwstat_add(&stats->wait_time, op,
|
||||
- io_start_time - start_time);
|
||||
-}
|
||||
-
|
||||
/* @stats = 0 */
|
||||
static void bfqg_stats_reset(struct bfqg_stats *stats)
|
||||
{
|
||||
+#ifdef CONFIG_DEBUG_BLK_CGROUP
|
||||
/* queued stats shouldn't be cleared */
|
||||
blkg_rwstat_reset(&stats->merged);
|
||||
blkg_rwstat_reset(&stats->service_time);
|
||||
@@ -276,6 +295,7 @@ static void bfqg_stats_reset(struct bfqg_stats *stats)
|
||||
blkg_stat_reset(&stats->group_wait_time);
|
||||
blkg_stat_reset(&stats->idle_time);
|
||||
blkg_stat_reset(&stats->empty_time);
|
||||
+#endif
|
||||
}
|
||||
|
||||
/* @to += @from */
|
||||
@@ -284,6 +304,7 @@ static void bfqg_stats_add_aux(struct bfqg_stats *to, struct bfqg_stats *from)
|
||||
if (!to || !from)
|
||||
return;
|
||||
|
||||
+#ifdef CONFIG_DEBUG_BLK_CGROUP
|
||||
/* queued stats shouldn't be cleared */
|
||||
blkg_rwstat_add_aux(&to->merged, &from->merged);
|
||||
blkg_rwstat_add_aux(&to->service_time, &from->service_time);
|
||||
@@ -296,6 +317,7 @@ static void bfqg_stats_add_aux(struct bfqg_stats *to, struct bfqg_stats *from)
|
||||
blkg_stat_add_aux(&to->group_wait_time, &from->group_wait_time);
|
||||
blkg_stat_add_aux(&to->idle_time, &from->idle_time);
|
||||
blkg_stat_add_aux(&to->empty_time, &from->empty_time);
|
||||
+#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -342,6 +364,7 @@ void bfq_init_entity(struct bfq_entity *entity, struct bfq_group *bfqg)
|
||||
|
||||
static void bfqg_stats_exit(struct bfqg_stats *stats)
|
||||
{
|
||||
+#ifdef CONFIG_DEBUG_BLK_CGROUP
|
||||
blkg_rwstat_exit(&stats->merged);
|
||||
blkg_rwstat_exit(&stats->service_time);
|
||||
blkg_rwstat_exit(&stats->wait_time);
|
||||
@@ -353,10 +376,12 @@ static void bfqg_stats_exit(struct bfqg_stats *stats)
|
||||
blkg_stat_exit(&stats->group_wait_time);
|
||||
blkg_stat_exit(&stats->idle_time);
|
||||
blkg_stat_exit(&stats->empty_time);
|
||||
+#endif
|
||||
}
|
||||
|
||||
static int bfqg_stats_init(struct bfqg_stats *stats, gfp_t gfp)
|
||||
{
|
||||
+#ifdef CONFIG_DEBUG_BLK_CGROUP
|
||||
if (blkg_rwstat_init(&stats->merged, gfp) ||
|
||||
blkg_rwstat_init(&stats->service_time, gfp) ||
|
||||
blkg_rwstat_init(&stats->wait_time, gfp) ||
|
||||
@@ -371,6 +396,7 @@ static int bfqg_stats_init(struct bfqg_stats *stats, gfp_t gfp)
|
||||
bfqg_stats_exit(stats);
|
||||
return -ENOMEM;
|
||||
}
|
||||
+#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -887,6 +913,7 @@ static ssize_t bfq_io_set_weight(struct kernfs_open_file *of,
|
||||
return bfq_io_set_weight_legacy(of_css(of), NULL, weight);
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_DEBUG_BLK_CGROUP
|
||||
static int bfqg_print_stat(struct seq_file *sf, void *v)
|
||||
{
|
||||
blkcg_print_blkgs(sf, css_to_blkcg(seq_css(sf)), blkg_prfill_stat,
|
||||
@@ -991,6 +1018,7 @@ static int bfqg_print_avg_queue_size(struct seq_file *sf, void *v)
|
||||
0, false);
|
||||
return 0;
|
||||
}
|
||||
+#endif /* CONFIG_DEBUG_BLK_CGROUP */
|
||||
|
||||
struct bfq_group *bfq_create_group_hierarchy(struct bfq_data *bfqd, int node)
|
||||
{
|
||||
@@ -1028,15 +1056,6 @@ struct cftype bfq_blkcg_legacy_files[] = {
|
||||
},
|
||||
|
||||
/* statistics, covers only the tasks in the bfqg */
|
||||
- {
|
||||
- .name = "bfq.time",
|
||||
- .private = offsetof(struct bfq_group, stats.time),
|
||||
- .seq_show = bfqg_print_stat,
|
||||
- },
|
||||
- {
|
||||
- .name = "bfq.sectors",
|
||||
- .seq_show = bfqg_print_stat_sectors,
|
||||
- },
|
||||
{
|
||||
.name = "bfq.io_service_bytes",
|
||||
.private = (unsigned long)&blkcg_policy_bfq,
|
||||
@@ -1047,6 +1066,16 @@ struct cftype bfq_blkcg_legacy_files[] = {
|
||||
.private = (unsigned long)&blkcg_policy_bfq,
|
||||
.seq_show = blkg_print_stat_ios,
|
||||
},
|
||||
+#ifdef CONFIG_DEBUG_BLK_CGROUP
|
||||
+ {
|
||||
+ .name = "bfq.time",
|
||||
+ .private = offsetof(struct bfq_group, stats.time),
|
||||
+ .seq_show = bfqg_print_stat,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "bfq.sectors",
|
||||
+ .seq_show = bfqg_print_stat_sectors,
|
||||
+ },
|
||||
{
|
||||
.name = "bfq.io_service_time",
|
||||
.private = offsetof(struct bfq_group, stats.service_time),
|
||||
@@ -1067,17 +1096,9 @@ struct cftype bfq_blkcg_legacy_files[] = {
|
||||
.private = offsetof(struct bfq_group, stats.queued),
|
||||
.seq_show = bfqg_print_rwstat,
|
||||
},
|
||||
+#endif /* CONFIG_DEBUG_BLK_CGROUP */
|
||||
|
||||
/* the same statictics which cover the bfqg and its descendants */
|
||||
- {
|
||||
- .name = "bfq.time_recursive",
|
||||
- .private = offsetof(struct bfq_group, stats.time),
|
||||
- .seq_show = bfqg_print_stat_recursive,
|
||||
- },
|
||||
- {
|
||||
- .name = "bfq.sectors_recursive",
|
||||
- .seq_show = bfqg_print_stat_sectors_recursive,
|
||||
- },
|
||||
{
|
||||
.name = "bfq.io_service_bytes_recursive",
|
||||
.private = (unsigned long)&blkcg_policy_bfq,
|
||||
@@ -1088,6 +1109,16 @@ struct cftype bfq_blkcg_legacy_files[] = {
|
||||
.private = (unsigned long)&blkcg_policy_bfq,
|
||||
.seq_show = blkg_print_stat_ios_recursive,
|
||||
},
|
||||
+#ifdef CONFIG_DEBUG_BLK_CGROUP
|
||||
+ {
|
||||
+ .name = "bfq.time_recursive",
|
||||
+ .private = offsetof(struct bfq_group, stats.time),
|
||||
+ .seq_show = bfqg_print_stat_recursive,
|
||||
+ },
|
||||
+ {
|
||||
+ .name = "bfq.sectors_recursive",
|
||||
+ .seq_show = bfqg_print_stat_sectors_recursive,
|
||||
+ },
|
||||
{
|
||||
.name = "bfq.io_service_time_recursive",
|
||||
.private = offsetof(struct bfq_group, stats.service_time),
|
||||
@@ -1132,6 +1163,7 @@ struct cftype bfq_blkcg_legacy_files[] = {
|
||||
.private = offsetof(struct bfq_group, stats.dequeue),
|
||||
.seq_show = bfqg_print_stat,
|
||||
},
|
||||
+#endif /* CONFIG_DEBUG_BLK_CGROUP */
|
||||
{ } /* terminate */
|
||||
};
|
||||
|
||||
@@ -1147,18 +1179,6 @@ struct cftype bfq_blkg_files[] = {
|
||||
|
||||
#else /* CONFIG_BFQ_GROUP_IOSCHED */
|
||||
|
||||
-void bfqg_stats_update_io_add(struct bfq_group *bfqg, struct bfq_queue *bfqq,
|
||||
- unsigned int op) { }
|
||||
-void bfqg_stats_update_io_remove(struct bfq_group *bfqg, unsigned int op) { }
|
||||
-void bfqg_stats_update_io_merged(struct bfq_group *bfqg, unsigned int op) { }
|
||||
-void bfqg_stats_update_completion(struct bfq_group *bfqg, uint64_t start_time,
|
||||
- uint64_t io_start_time, unsigned int op) { }
|
||||
-void bfqg_stats_update_dequeue(struct bfq_group *bfqg) { }
|
||||
-void bfqg_stats_set_start_empty_time(struct bfq_group *bfqg) { }
|
||||
-void bfqg_stats_update_idle_time(struct bfq_group *bfqg) { }
|
||||
-void bfqg_stats_set_start_idle_time(struct bfq_group *bfqg) { }
|
||||
-void bfqg_stats_update_avg_queue_size(struct bfq_group *bfqg) { }
|
||||
-
|
||||
void bfq_bfqq_move(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
||||
struct bfq_group *bfqg) {}
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 69e05f861daf..bcb6d21baf12 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -3693,14 +3693,14 @@ static struct request *bfq_dispatch_request(struct blk_mq_hw_ctx *hctx)
|
||||
{
|
||||
struct bfq_data *bfqd = hctx->queue->elevator->elevator_data;
|
||||
struct request *rq;
|
||||
-#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
struct bfq_queue *in_serv_queue, *bfqq;
|
||||
bool waiting_rq, idle_timer_disabled;
|
||||
#endif
|
||||
|
||||
spin_lock_irq(&bfqd->lock);
|
||||
|
||||
-#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
in_serv_queue = bfqd->in_service_queue;
|
||||
waiting_rq = in_serv_queue && bfq_bfqq_wait_request(in_serv_queue);
|
||||
|
||||
@@ -3714,7 +3714,7 @@ static struct request *bfq_dispatch_request(struct blk_mq_hw_ctx *hctx)
|
||||
#endif
|
||||
spin_unlock_irq(&bfqd->lock);
|
||||
|
||||
-#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
bfqq = rq ? RQ_BFQQ(rq) : NULL;
|
||||
if (!idle_timer_disabled && !bfqq)
|
||||
return rq;
|
||||
@@ -4281,7 +4281,7 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
{
|
||||
struct request_queue *q = hctx->queue;
|
||||
struct bfq_data *bfqd = q->elevator->elevator_data;
|
||||
-#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
struct bfq_queue *bfqq = RQ_BFQQ(rq);
|
||||
bool idle_timer_disabled = false;
|
||||
unsigned int cmd_flags;
|
||||
@@ -4304,7 +4304,7 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
else
|
||||
list_add_tail(&rq->queuelist, &bfqd->dispatch);
|
||||
} else {
|
||||
-#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
idle_timer_disabled = __bfq_insert_request(bfqd, rq);
|
||||
/*
|
||||
* Update bfqq, because, if a queue merge has occurred
|
||||
@@ -4323,7 +4323,7 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
}
|
||||
}
|
||||
|
||||
-#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
/*
|
||||
* Cache cmd_flags before releasing scheduler lock, because rq
|
||||
* may disappear afterwards (for example, because of a request
|
||||
@@ -4333,7 +4333,7 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
#endif
|
||||
spin_unlock_irq(&bfqd->lock);
|
||||
|
||||
-#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
if (!bfqq)
|
||||
return;
|
||||
/*
|
||||
diff --git a/block/bfq-iosched.h b/block/bfq-iosched.h
|
||||
index ac0809c72c98..91c4390903a1 100644
|
||||
--- a/block/bfq-iosched.h
|
||||
+++ b/block/bfq-iosched.h
|
||||
@@ -689,7 +689,7 @@ enum bfqq_expiration {
|
||||
};
|
||||
|
||||
struct bfqg_stats {
|
||||
-#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
/* number of ios merged */
|
||||
struct blkg_rwstat merged;
|
||||
/* total time spent on device in ns, may not be accurate w/ queueing */
|
||||
@@ -717,7 +717,7 @@ struct bfqg_stats {
|
||||
uint64_t start_idle_time;
|
||||
uint64_t start_empty_time;
|
||||
uint16_t flags;
|
||||
-#endif /* CONFIG_BFQ_GROUP_IOSCHED */
|
||||
+#endif /* CONFIG_BFQ_GROUP_IOSCHED && CONFIG_DEBUG_BLK_CGROUP */
|
||||
};
|
||||
|
||||
#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-67
@@ -1,67 +0,0 @@
|
||||
From 52257ffbfcaf58d247b13fb148e27ed17c33e526 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Tue, 9 Jan 2018 10:27:58 +0100
|
||||
Subject: [PATCH] block, bfq: put async queues for root bfq groups too
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
For each pair [device for which bfq is selected as I/O scheduler,
|
||||
group in blkio/io], bfq maintains a corresponding bfq group. Each such
|
||||
bfq group contains a set of async queues, with each async queue
|
||||
created on demand, i.e., when some I/O request arrives for it. On
|
||||
creation, an async queue gets an extra reference, to make sure that
|
||||
the queue is not freed as long as its bfq group exists. Accordingly,
|
||||
to allow the queue to be freed after the group exited, this extra
|
||||
reference must released on group exit.
|
||||
|
||||
The above holds also for a bfq root group, i.e., for the bfq group
|
||||
corresponding to the root blkio/io root for a given device. Yet, by
|
||||
mistake, the references to the existing async queues of a root group
|
||||
are not released when the latter exits. This causes a memory leak when
|
||||
the instance of bfq for a given device exits. In a similar vein,
|
||||
bfqg_stats_xfer_dead is not executed for a root group.
|
||||
|
||||
This commit fixes bfq_pd_offline so that the latter executes the above
|
||||
missing operations for a root group too.
|
||||
|
||||
Reported-by: Holger Hoffstätte <holger@applied-asynchrony.com>
|
||||
Reported-by: Guoqing Jiang <gqjiang@suse.com>
|
||||
Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
|
||||
Signed-off-by: Davide Ferrari <davideferrari8@gmail.com>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-cgroup.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-cgroup.c b/block/bfq-cgroup.c
|
||||
index da1525ec4c87..d819dc77fe65 100644
|
||||
--- a/block/bfq-cgroup.c
|
||||
+++ b/block/bfq-cgroup.c
|
||||
@@ -775,10 +775,11 @@ static void bfq_pd_offline(struct blkg_policy_data *pd)
|
||||
unsigned long flags;
|
||||
int i;
|
||||
|
||||
+ spin_lock_irqsave(&bfqd->lock, flags);
|
||||
+
|
||||
if (!entity) /* root group */
|
||||
- return;
|
||||
+ goto put_async_queues;
|
||||
|
||||
- spin_lock_irqsave(&bfqd->lock, flags);
|
||||
/*
|
||||
* Empty all service_trees belonging to this group before
|
||||
* deactivating the group itself.
|
||||
@@ -809,6 +810,8 @@ static void bfq_pd_offline(struct blkg_policy_data *pd)
|
||||
}
|
||||
|
||||
__bfq_deactivate_entity(entity, false);
|
||||
+
|
||||
+put_async_queues:
|
||||
bfq_put_async_queues(bfqd, bfqg);
|
||||
|
||||
spin_unlock_irqrestore(&bfqd->lock, flags);
|
||||
--
|
||||
2.16.1
|
||||
|
||||
-39
@@ -1,39 +0,0 @@
|
||||
From 0d52af590552473666da5b6111e7182d6cd23f92 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Tue, 9 Jan 2018 10:27:59 +0100
|
||||
Subject: [PATCH] block, bfq: release oom-queue ref to root group on exit
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
On scheduler init, a reference to the root group, and a reference to
|
||||
its corresponding blkg are taken for the oom queue. Yet these
|
||||
references are not released on scheduler exit, which prevents these
|
||||
objects from be freed. This commit adds the missing reference
|
||||
releases.
|
||||
|
||||
Reported-by: Davide Ferrari <davideferrari8@gmail.com>
|
||||
Tested-by: Holger Hoffstätte <holger@applied-asynchrony.com>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 7bd789da7a29..7c0b7f60811c 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -4893,6 +4893,9 @@ static void bfq_exit_queue(struct elevator_queue *e)
|
||||
|
||||
hrtimer_cancel(&bfqd->idle_slice_timer);
|
||||
|
||||
+ /* release oom-queue reference to root group */
|
||||
+ bfqg_and_blkg_put(bfqd->root_group);
|
||||
+
|
||||
#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
blkcg_deactivate_policy(bfqd->queue, &blkcg_policy_bfq);
|
||||
#else
|
||||
--
|
||||
2.16.1
|
||||
|
||||
-225
@@ -1,225 +0,0 @@
|
||||
From 9b25bd0368d562d1929059e8eb9de4102567b923 Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Mon, 4 Dec 2017 11:42:05 +0100
|
||||
Subject: [PATCH] block, bfq: remove batches of confusing ifdefs
|
||||
|
||||
Commit a33801e8b473 ("block, bfq: move debug blkio stats behind
|
||||
CONFIG_DEBUG_BLK_CGROUP") introduced two batches of confusing ifdefs:
|
||||
one reported in [1], plus a similar one in another function. This
|
||||
commit removes both batches, in the way suggested in [1].
|
||||
|
||||
[1] https://www.spinics.net/lists/linux-block/msg20043.html
|
||||
|
||||
Fixes: a33801e8b473 ("block, bfq: move debug blkio stats behind CONFIG_DEBUG_BLK_CGROUP")
|
||||
Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
Tested-by: Luca Miccio <lucmiccio@gmail.com>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 127 +++++++++++++++++++++++++++++-----------------------
|
||||
1 file changed, 72 insertions(+), 55 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index e33c5c4c9856..7bd789da7a29 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -3743,35 +3743,16 @@ static struct request *__bfq_dispatch_request(struct blk_mq_hw_ctx *hctx)
|
||||
return rq;
|
||||
}
|
||||
|
||||
-static struct request *bfq_dispatch_request(struct blk_mq_hw_ctx *hctx)
|
||||
-{
|
||||
- struct bfq_data *bfqd = hctx->queue->elevator->elevator_data;
|
||||
- struct request *rq;
|
||||
#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
- struct bfq_queue *in_serv_queue, *bfqq;
|
||||
- bool waiting_rq, idle_timer_disabled;
|
||||
-#endif
|
||||
-
|
||||
- spin_lock_irq(&bfqd->lock);
|
||||
-
|
||||
-#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
- in_serv_queue = bfqd->in_service_queue;
|
||||
- waiting_rq = in_serv_queue && bfq_bfqq_wait_request(in_serv_queue);
|
||||
-
|
||||
- rq = __bfq_dispatch_request(hctx);
|
||||
-
|
||||
- idle_timer_disabled =
|
||||
- waiting_rq && !bfq_bfqq_wait_request(in_serv_queue);
|
||||
-
|
||||
-#else
|
||||
- rq = __bfq_dispatch_request(hctx);
|
||||
-#endif
|
||||
- spin_unlock_irq(&bfqd->lock);
|
||||
+static void bfq_update_dispatch_stats(struct request_queue *q,
|
||||
+ struct request *rq,
|
||||
+ struct bfq_queue *in_serv_queue,
|
||||
+ bool idle_timer_disabled)
|
||||
+{
|
||||
+ struct bfq_queue *bfqq = rq ? RQ_BFQQ(rq) : NULL;
|
||||
|
||||
-#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
- bfqq = rq ? RQ_BFQQ(rq) : NULL;
|
||||
if (!idle_timer_disabled && !bfqq)
|
||||
- return rq;
|
||||
+ return;
|
||||
|
||||
/*
|
||||
* rq and bfqq are guaranteed to exist until this function
|
||||
@@ -3786,7 +3767,7 @@ static struct request *bfq_dispatch_request(struct blk_mq_hw_ctx *hctx)
|
||||
* In addition, the following queue lock guarantees that
|
||||
* bfqq_group(bfqq) exists as well.
|
||||
*/
|
||||
- spin_lock_irq(hctx->queue->queue_lock);
|
||||
+ spin_lock_irq(q->queue_lock);
|
||||
if (idle_timer_disabled)
|
||||
/*
|
||||
* Since the idle timer has been disabled,
|
||||
@@ -3805,9 +3786,37 @@ static struct request *bfq_dispatch_request(struct blk_mq_hw_ctx *hctx)
|
||||
bfqg_stats_set_start_empty_time(bfqg);
|
||||
bfqg_stats_update_io_remove(bfqg, rq->cmd_flags);
|
||||
}
|
||||
- spin_unlock_irq(hctx->queue->queue_lock);
|
||||
+ spin_unlock_irq(q->queue_lock);
|
||||
+}
|
||||
+#else
|
||||
+static inline void bfq_update_dispatch_stats(struct request_queue *q,
|
||||
+ struct request *rq,
|
||||
+ struct bfq_queue *in_serv_queue,
|
||||
+ bool idle_timer_disabled) {}
|
||||
#endif
|
||||
|
||||
+static struct request *bfq_dispatch_request(struct blk_mq_hw_ctx *hctx)
|
||||
+{
|
||||
+ struct bfq_data *bfqd = hctx->queue->elevator->elevator_data;
|
||||
+ struct request *rq;
|
||||
+ struct bfq_queue *in_serv_queue;
|
||||
+ bool waiting_rq, idle_timer_disabled;
|
||||
+
|
||||
+ spin_lock_irq(&bfqd->lock);
|
||||
+
|
||||
+ in_serv_queue = bfqd->in_service_queue;
|
||||
+ waiting_rq = in_serv_queue && bfq_bfqq_wait_request(in_serv_queue);
|
||||
+
|
||||
+ rq = __bfq_dispatch_request(hctx);
|
||||
+
|
||||
+ idle_timer_disabled =
|
||||
+ waiting_rq && !bfq_bfqq_wait_request(in_serv_queue);
|
||||
+
|
||||
+ spin_unlock_irq(&bfqd->lock);
|
||||
+
|
||||
+ bfq_update_dispatch_stats(hctx->queue, rq, in_serv_queue,
|
||||
+ idle_timer_disabled);
|
||||
+
|
||||
return rq;
|
||||
}
|
||||
|
||||
@@ -4335,16 +4344,46 @@ static bool __bfq_insert_request(struct bfq_data *bfqd, struct request *rq)
|
||||
return idle_timer_disabled;
|
||||
}
|
||||
|
||||
+#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
+static void bfq_update_insert_stats(struct request_queue *q,
|
||||
+ struct bfq_queue *bfqq,
|
||||
+ bool idle_timer_disabled,
|
||||
+ unsigned int cmd_flags)
|
||||
+{
|
||||
+ if (!bfqq)
|
||||
+ return;
|
||||
+
|
||||
+ /*
|
||||
+ * bfqq still exists, because it can disappear only after
|
||||
+ * either it is merged with another queue, or the process it
|
||||
+ * is associated with exits. But both actions must be taken by
|
||||
+ * the same process currently executing this flow of
|
||||
+ * instructions.
|
||||
+ *
|
||||
+ * In addition, the following queue lock guarantees that
|
||||
+ * bfqq_group(bfqq) exists as well.
|
||||
+ */
|
||||
+ spin_lock_irq(q->queue_lock);
|
||||
+ bfqg_stats_update_io_add(bfqq_group(bfqq), bfqq, cmd_flags);
|
||||
+ if (idle_timer_disabled)
|
||||
+ bfqg_stats_update_idle_time(bfqq_group(bfqq));
|
||||
+ spin_unlock_irq(q->queue_lock);
|
||||
+}
|
||||
+#else
|
||||
+static inline void bfq_update_insert_stats(struct request_queue *q,
|
||||
+ struct bfq_queue *bfqq,
|
||||
+ bool idle_timer_disabled,
|
||||
+ unsigned int cmd_flags) {}
|
||||
+#endif
|
||||
+
|
||||
static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
bool at_head)
|
||||
{
|
||||
struct request_queue *q = hctx->queue;
|
||||
struct bfq_data *bfqd = q->elevator->elevator_data;
|
||||
-#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
struct bfq_queue *bfqq = RQ_BFQQ(rq);
|
||||
bool idle_timer_disabled = false;
|
||||
unsigned int cmd_flags;
|
||||
-#endif
|
||||
|
||||
spin_lock_irq(&bfqd->lock);
|
||||
if (blk_mq_sched_try_insert_merge(q, rq)) {
|
||||
@@ -4363,7 +4402,6 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
else
|
||||
list_add_tail(&rq->queuelist, &bfqd->dispatch);
|
||||
} else {
|
||||
-#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
idle_timer_disabled = __bfq_insert_request(bfqd, rq);
|
||||
/*
|
||||
* Update bfqq, because, if a queue merge has occurred
|
||||
@@ -4371,9 +4409,6 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
* redirected into a new queue.
|
||||
*/
|
||||
bfqq = RQ_BFQQ(rq);
|
||||
-#else
|
||||
- __bfq_insert_request(bfqd, rq);
|
||||
-#endif
|
||||
|
||||
if (rq_mergeable(rq)) {
|
||||
elv_rqhash_add(q, rq);
|
||||
@@ -4382,35 +4417,17 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
}
|
||||
}
|
||||
|
||||
-#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
/*
|
||||
* Cache cmd_flags before releasing scheduler lock, because rq
|
||||
* may disappear afterwards (for example, because of a request
|
||||
* merge).
|
||||
*/
|
||||
cmd_flags = rq->cmd_flags;
|
||||
-#endif
|
||||
+
|
||||
spin_unlock_irq(&bfqd->lock);
|
||||
|
||||
-#if defined(CONFIG_BFQ_GROUP_IOSCHED) && defined(CONFIG_DEBUG_BLK_CGROUP)
|
||||
- if (!bfqq)
|
||||
- return;
|
||||
- /*
|
||||
- * bfqq still exists, because it can disappear only after
|
||||
- * either it is merged with another queue, or the process it
|
||||
- * is associated with exits. But both actions must be taken by
|
||||
- * the same process currently executing this flow of
|
||||
- * instruction.
|
||||
- *
|
||||
- * In addition, the following queue lock guarantees that
|
||||
- * bfqq_group(bfqq) exists as well.
|
||||
- */
|
||||
- spin_lock_irq(q->queue_lock);
|
||||
- bfqg_stats_update_io_add(bfqq_group(bfqq), bfqq, cmd_flags);
|
||||
- if (idle_timer_disabled)
|
||||
- bfqg_stats_update_idle_time(bfqq_group(bfqq));
|
||||
- spin_unlock_irq(q->queue_lock);
|
||||
-#endif
|
||||
+ bfq_update_insert_stats(q, bfqq, idle_timer_disabled,
|
||||
+ cmd_flags);
|
||||
}
|
||||
|
||||
static void bfq_insert_requests(struct blk_mq_hw_ctx *hctx,
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-112
@@ -1,112 +0,0 @@
|
||||
From 4403e4e467c365b4189e3e3d3ad35cf67b8c36ed Mon Sep 17 00:00:00 2001
|
||||
From: Angelo Ruocco <angeloruocco90@gmail.com>
|
||||
Date: Wed, 20 Dec 2017 12:38:34 +0100
|
||||
Subject: [PATCH] block, bfq: remove superfluous check in queue-merging setup
|
||||
|
||||
When two or more processes do I/O in a way that the their requests are
|
||||
sequential in respect to one another, BFQ merges the bfq_queues associated
|
||||
with the processes. This way the overall I/O pattern becomes sequential,
|
||||
and thus there is a boost in througput.
|
||||
These cooperating processes usually start or restart to do I/O shortly
|
||||
after each other. So, in order to avoid merging non-cooperating processes,
|
||||
BFQ ensures that none of these queues has been in weight raising for too
|
||||
long.
|
||||
|
||||
In this respect, from commit "block, bfq-sq, bfq-mq: let a queue be merged
|
||||
only shortly after being created", BFQ checks whether any queue (and not
|
||||
only weight-raised ones) is doing I/O continuously from too long to be
|
||||
merged.
|
||||
|
||||
This new additional check makes the first one useless: a queue doing
|
||||
I/O from long enough, if being weight-raised, is also a queue in
|
||||
weight raising for too long to be merged. Accordingly, this commit
|
||||
removes the first check.
|
||||
|
||||
Signed-off-by: Angelo Ruocco <angeloruocco90@gmail.com>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
block/bfq-iosched.c | 36 +++++-------------------------------
|
||||
1 file changed, 5 insertions(+), 31 deletions(-)
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 7066d90f09df..9625550b2f85 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -1990,20 +1990,6 @@ static bool bfq_may_be_close_cooperator(struct bfq_queue *bfqq,
|
||||
return true;
|
||||
}
|
||||
|
||||
-/*
|
||||
- * If this function returns true, then bfqq cannot be merged. The idea
|
||||
- * is that true cooperation happens very early after processes start
|
||||
- * to do I/O. Usually, late cooperations are just accidental false
|
||||
- * positives. In case bfqq is weight-raised, such false positives
|
||||
- * would evidently degrade latency guarantees for bfqq.
|
||||
- */
|
||||
-static bool wr_from_too_long(struct bfq_queue *bfqq)
|
||||
-{
|
||||
- return bfqq->wr_coeff > 1 &&
|
||||
- time_is_before_jiffies(bfqq->last_wr_start_finish +
|
||||
- msecs_to_jiffies(100));
|
||||
-}
|
||||
-
|
||||
/*
|
||||
* Attempt to schedule a merge of bfqq with the currently in-service
|
||||
* queue or with a close queue among the scheduled queues. Return
|
||||
@@ -2017,11 +2003,6 @@ static bool wr_from_too_long(struct bfq_queue *bfqq)
|
||||
* to maintain. Besides, in such a critical condition as an out of memory,
|
||||
* the benefits of queue merging may be little relevant, or even negligible.
|
||||
*
|
||||
- * Weight-raised queues can be merged only if their weight-raising
|
||||
- * period has just started. In fact cooperating processes are usually
|
||||
- * started together. Thus, with this filter we avoid false positives
|
||||
- * that would jeopardize low-latency guarantees.
|
||||
- *
|
||||
* WARNING: queue merging may impair fairness among non-weight raised
|
||||
* queues, for at least two reasons: 1) the original weight of a
|
||||
* merged queue may change during the merged state, 2) even being the
|
||||
@@ -2052,9 +2033,7 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
||||
if (bfqq->new_bfqq)
|
||||
return bfqq->new_bfqq;
|
||||
|
||||
- if (!io_struct ||
|
||||
- wr_from_too_long(bfqq) ||
|
||||
- unlikely(bfqq == &bfqd->oom_bfqq))
|
||||
+ if (!io_struct || unlikely(bfqq == &bfqd->oom_bfqq))
|
||||
return NULL;
|
||||
|
||||
/* If there is only one backlogged queue, don't search. */
|
||||
@@ -2063,12 +2042,9 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
||||
|
||||
in_service_bfqq = bfqd->in_service_queue;
|
||||
|
||||
- if (!in_service_bfqq || in_service_bfqq == bfqq
|
||||
- || wr_from_too_long(in_service_bfqq) ||
|
||||
- unlikely(in_service_bfqq == &bfqd->oom_bfqq))
|
||||
- goto check_scheduled;
|
||||
-
|
||||
- if (bfq_rq_close_to_sector(io_struct, request, bfqd->last_position) &&
|
||||
+ if (in_service_bfqq && in_service_bfqq != bfqq &&
|
||||
+ likely(in_service_bfqq != &bfqd->oom_bfqq) &&
|
||||
+ bfq_rq_close_to_sector(io_struct, request, bfqd->last_position) &&
|
||||
bfqq->entity.parent == in_service_bfqq->entity.parent &&
|
||||
bfq_may_be_close_cooperator(bfqq, in_service_bfqq)) {
|
||||
new_bfqq = bfq_setup_merge(bfqq, in_service_bfqq);
|
||||
@@ -2080,12 +2056,10 @@ bfq_setup_cooperator(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
||||
* queues. The only thing we need is that the bio/request is not
|
||||
* NULL, as we need it to establish whether a cooperator exists.
|
||||
*/
|
||||
-check_scheduled:
|
||||
new_bfqq = bfq_find_close_cooperator(bfqd, bfqq,
|
||||
bfq_io_struct_pos(io_struct, request));
|
||||
|
||||
- if (new_bfqq && !wr_from_too_long(new_bfqq) &&
|
||||
- likely(new_bfqq != &bfqd->oom_bfqq) &&
|
||||
+ if (new_bfqq && likely(new_bfqq != &bfqd->oom_bfqq) &&
|
||||
bfq_may_be_close_cooperator(bfqq, new_bfqq))
|
||||
return bfq_setup_merge(bfqq, new_bfqq);
|
||||
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-283
@@ -1,283 +0,0 @@
|
||||
From 24bfd19bb7890255693ee5cb6dc100d8d215d00b Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Mon, 13 Nov 2017 07:34:09 +0100
|
||||
Subject: [PATCH] block, bfq: update blkio stats outside the scheduler lock
|
||||
|
||||
bfq invokes various blkg_*stats_* functions to update the statistics
|
||||
contained in the special files blkio.bfq.* in the blkio controller
|
||||
groups, i.e., the I/O accounting related to the proportional-share
|
||||
policy provided by bfq. The execution of these functions takes a
|
||||
considerable percentage, about 40%, of the total per-request execution
|
||||
time of bfq (i.e., of the sum of the execution time of all the bfq
|
||||
functions that have to be executed to process an I/O request from its
|
||||
creation to its destruction). This reduces the request-processing
|
||||
rate sustainable by bfq noticeably, even on a multicore CPU. In fact,
|
||||
the bfq functions that invoke blkg_*stats_* functions cannot be
|
||||
executed in parallel with the rest of the code of bfq, because both
|
||||
are executed under the same same per-device scheduler lock.
|
||||
|
||||
To reduce this slowdown, this commit moves, wherever possible, the
|
||||
invocation of these functions (more precisely, of the bfq functions
|
||||
that invoke blkg_*stats_* functions) outside the critical sections
|
||||
protected by the scheduler lock.
|
||||
|
||||
With this change, and with all blkio.bfq.* statistics enabled, the
|
||||
throughput grows, e.g., from 250 to 310 KIOPS (+25%) on an Intel
|
||||
i7-4850HQ, in case of 8 threads doing random I/O in parallel on
|
||||
null_blk, with the latter configured with 0 latency. We obtained the
|
||||
same or higher throughput boosts, up to +30%, with other processors
|
||||
(some figures are reported in the documentation). For our tests, we
|
||||
used the script [1], with which our results can be easily reproduced.
|
||||
|
||||
NOTE. This commit still protects the invocation of blkg_*stats_*
|
||||
functions with the request_queue lock, because the group these
|
||||
functions are invoked on may otherwise disappear before or while these
|
||||
functions are executed. Fortunately, tests without even this lock
|
||||
show, by difference, that the serialization caused by this lock has a
|
||||
little impact (at most ~5% of throughput reduction).
|
||||
|
||||
[1] https://github.com/Algodev-github/IOSpeed
|
||||
|
||||
Tested-by: Lee Tibbert <lee.tibbert@gmail.com>
|
||||
Tested-by: Oleksandr Natalenko <oleksandr@natalenko.name>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Luca Miccio <lucmiccio@gmail.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
Documentation/block/bfq-iosched.txt | 6 +-
|
||||
block/bfq-iosched.c | 110 ++++++++++++++++++++++++++++++++----
|
||||
block/bfq-wf2q.c | 1 -
|
||||
3 files changed, 102 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/Documentation/block/bfq-iosched.txt b/Documentation/block/bfq-iosched.txt
|
||||
index 7a9361508157..7fad6c061470 100644
|
||||
--- a/Documentation/block/bfq-iosched.txt
|
||||
+++ b/Documentation/block/bfq-iosched.txt
|
||||
@@ -26,9 +26,9 @@ the limits on slow or average CPUs, here are BFQ limits for three
|
||||
different CPUs, on, respectively, an average laptop, an old desktop,
|
||||
and a cheap embedded system, in case full hierarchical support is
|
||||
enabled (i.e., CONFIG_BFQ_GROUP_IOSCHED is set):
|
||||
-- Intel i7-4850HQ: 250 KIOPS
|
||||
-- AMD A8-3850: 170 KIOPS
|
||||
-- ARM CortexTM-A53 Octa-core: 45 KIOPS
|
||||
+- Intel i7-4850HQ: 310 KIOPS
|
||||
+- AMD A8-3850: 200 KIOPS
|
||||
+- ARM CortexTM-A53 Octa-core: 56 KIOPS
|
||||
|
||||
BFQ works for multi-queue devices too.
|
||||
|
||||
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
|
||||
index 91703eba63f0..69e05f861daf 100644
|
||||
--- a/block/bfq-iosched.c
|
||||
+++ b/block/bfq-iosched.c
|
||||
@@ -2228,7 +2228,6 @@ static void __bfq_set_in_service_queue(struct bfq_data *bfqd,
|
||||
struct bfq_queue *bfqq)
|
||||
{
|
||||
if (bfqq) {
|
||||
- bfqg_stats_update_avg_queue_size(bfqq_group(bfqq));
|
||||
bfq_clear_bfqq_fifo_expire(bfqq);
|
||||
|
||||
bfqd->budgets_assigned = (bfqd->budgets_assigned * 7 + 256) / 8;
|
||||
@@ -3469,7 +3468,6 @@ static struct bfq_queue *bfq_select_queue(struct bfq_data *bfqd)
|
||||
*/
|
||||
bfq_clear_bfqq_wait_request(bfqq);
|
||||
hrtimer_try_to_cancel(&bfqd->idle_slice_timer);
|
||||
- bfqg_stats_update_idle_time(bfqq_group(bfqq));
|
||||
}
|
||||
goto keep_queue;
|
||||
}
|
||||
@@ -3695,15 +3693,67 @@ static struct request *bfq_dispatch_request(struct blk_mq_hw_ctx *hctx)
|
||||
{
|
||||
struct bfq_data *bfqd = hctx->queue->elevator->elevator_data;
|
||||
struct request *rq;
|
||||
+#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+ struct bfq_queue *in_serv_queue, *bfqq;
|
||||
+ bool waiting_rq, idle_timer_disabled;
|
||||
+#endif
|
||||
|
||||
spin_lock_irq(&bfqd->lock);
|
||||
|
||||
+#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+ in_serv_queue = bfqd->in_service_queue;
|
||||
+ waiting_rq = in_serv_queue && bfq_bfqq_wait_request(in_serv_queue);
|
||||
+
|
||||
+ rq = __bfq_dispatch_request(hctx);
|
||||
+
|
||||
+ idle_timer_disabled =
|
||||
+ waiting_rq && !bfq_bfqq_wait_request(in_serv_queue);
|
||||
+
|
||||
+#else
|
||||
rq = __bfq_dispatch_request(hctx);
|
||||
- if (rq && RQ_BFQQ(rq))
|
||||
- bfqg_stats_update_io_remove(bfqq_group(RQ_BFQQ(rq)),
|
||||
- rq->cmd_flags);
|
||||
+#endif
|
||||
spin_unlock_irq(&bfqd->lock);
|
||||
|
||||
+#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+ bfqq = rq ? RQ_BFQQ(rq) : NULL;
|
||||
+ if (!idle_timer_disabled && !bfqq)
|
||||
+ return rq;
|
||||
+
|
||||
+ /*
|
||||
+ * rq and bfqq are guaranteed to exist until this function
|
||||
+ * ends, for the following reasons. First, rq can be
|
||||
+ * dispatched to the device, and then can be completed and
|
||||
+ * freed, only after this function ends. Second, rq cannot be
|
||||
+ * merged (and thus freed because of a merge) any longer,
|
||||
+ * because it has already started. Thus rq cannot be freed
|
||||
+ * before this function ends, and, since rq has a reference to
|
||||
+ * bfqq, the same guarantee holds for bfqq too.
|
||||
+ *
|
||||
+ * In addition, the following queue lock guarantees that
|
||||
+ * bfqq_group(bfqq) exists as well.
|
||||
+ */
|
||||
+ spin_lock_irq(hctx->queue->queue_lock);
|
||||
+ if (idle_timer_disabled)
|
||||
+ /*
|
||||
+ * Since the idle timer has been disabled,
|
||||
+ * in_serv_queue contained some request when
|
||||
+ * __bfq_dispatch_request was invoked above, which
|
||||
+ * implies that rq was picked exactly from
|
||||
+ * in_serv_queue. Thus in_serv_queue == bfqq, and is
|
||||
+ * therefore guaranteed to exist because of the above
|
||||
+ * arguments.
|
||||
+ */
|
||||
+ bfqg_stats_update_idle_time(bfqq_group(in_serv_queue));
|
||||
+ if (bfqq) {
|
||||
+ struct bfq_group *bfqg = bfqq_group(bfqq);
|
||||
+
|
||||
+ bfqg_stats_update_avg_queue_size(bfqg);
|
||||
+ bfqg_stats_set_start_empty_time(bfqg);
|
||||
+ bfqg_stats_update_io_remove(bfqg, rq->cmd_flags);
|
||||
+ }
|
||||
+ spin_unlock_irq(hctx->queue->queue_lock);
|
||||
+#endif
|
||||
+
|
||||
return rq;
|
||||
}
|
||||
|
||||
@@ -4161,7 +4211,6 @@ static void bfq_rq_enqueued(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
||||
*/
|
||||
bfq_clear_bfqq_wait_request(bfqq);
|
||||
hrtimer_try_to_cancel(&bfqd->idle_slice_timer);
|
||||
- bfqg_stats_update_idle_time(bfqq_group(bfqq));
|
||||
|
||||
/*
|
||||
* The queue is not empty, because a new request just
|
||||
@@ -4176,10 +4225,12 @@ static void bfq_rq_enqueued(struct bfq_data *bfqd, struct bfq_queue *bfqq,
|
||||
}
|
||||
}
|
||||
|
||||
-static void __bfq_insert_request(struct bfq_data *bfqd, struct request *rq)
|
||||
+/* returns true if it causes the idle timer to be disabled */
|
||||
+static bool __bfq_insert_request(struct bfq_data *bfqd, struct request *rq)
|
||||
{
|
||||
struct bfq_queue *bfqq = RQ_BFQQ(rq),
|
||||
*new_bfqq = bfq_setup_cooperator(bfqd, bfqq, rq, true);
|
||||
+ bool waiting, idle_timer_disabled = false;
|
||||
|
||||
if (new_bfqq) {
|
||||
if (bic_to_bfqq(RQ_BIC(rq), 1) != bfqq)
|
||||
@@ -4213,12 +4264,16 @@ static void __bfq_insert_request(struct bfq_data *bfqd, struct request *rq)
|
||||
bfqq = new_bfqq;
|
||||
}
|
||||
|
||||
+ waiting = bfqq && bfq_bfqq_wait_request(bfqq);
|
||||
bfq_add_request(rq);
|
||||
+ idle_timer_disabled = waiting && !bfq_bfqq_wait_request(bfqq);
|
||||
|
||||
rq->fifo_time = ktime_get_ns() + bfqd->bfq_fifo_expire[rq_is_sync(rq)];
|
||||
list_add_tail(&rq->queuelist, &bfqq->fifo);
|
||||
|
||||
bfq_rq_enqueued(bfqd, bfqq, rq);
|
||||
+
|
||||
+ return idle_timer_disabled;
|
||||
}
|
||||
|
||||
static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
@@ -4226,7 +4281,11 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
{
|
||||
struct request_queue *q = hctx->queue;
|
||||
struct bfq_data *bfqd = q->elevator->elevator_data;
|
||||
+#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
struct bfq_queue *bfqq = RQ_BFQQ(rq);
|
||||
+ bool idle_timer_disabled = false;
|
||||
+ unsigned int cmd_flags;
|
||||
+#endif
|
||||
|
||||
spin_lock_irq(&bfqd->lock);
|
||||
if (blk_mq_sched_try_insert_merge(q, rq)) {
|
||||
@@ -4245,13 +4304,17 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
else
|
||||
list_add_tail(&rq->queuelist, &bfqd->dispatch);
|
||||
} else {
|
||||
- __bfq_insert_request(bfqd, rq);
|
||||
+#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+ idle_timer_disabled = __bfq_insert_request(bfqd, rq);
|
||||
/*
|
||||
* Update bfqq, because, if a queue merge has occurred
|
||||
* in __bfq_insert_request, then rq has been
|
||||
* redirected into a new queue.
|
||||
*/
|
||||
bfqq = RQ_BFQQ(rq);
|
||||
+#else
|
||||
+ __bfq_insert_request(bfqd, rq);
|
||||
+#endif
|
||||
|
||||
if (rq_mergeable(rq)) {
|
||||
elv_rqhash_add(q, rq);
|
||||
@@ -4260,10 +4323,35 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
|
||||
}
|
||||
}
|
||||
|
||||
- if (bfqq)
|
||||
- bfqg_stats_update_io_add(bfqq_group(bfqq), bfqq, rq->cmd_flags);
|
||||
-
|
||||
+#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+ /*
|
||||
+ * Cache cmd_flags before releasing scheduler lock, because rq
|
||||
+ * may disappear afterwards (for example, because of a request
|
||||
+ * merge).
|
||||
+ */
|
||||
+ cmd_flags = rq->cmd_flags;
|
||||
+#endif
|
||||
spin_unlock_irq(&bfqd->lock);
|
||||
+
|
||||
+#ifdef CONFIG_BFQ_GROUP_IOSCHED
|
||||
+ if (!bfqq)
|
||||
+ return;
|
||||
+ /*
|
||||
+ * bfqq still exists, because it can disappear only after
|
||||
+ * either it is merged with another queue, or the process it
|
||||
+ * is associated with exits. But both actions must be taken by
|
||||
+ * the same process currently executing this flow of
|
||||
+ * instruction.
|
||||
+ *
|
||||
+ * In addition, the following queue lock guarantees that
|
||||
+ * bfqq_group(bfqq) exists as well.
|
||||
+ */
|
||||
+ spin_lock_irq(q->queue_lock);
|
||||
+ bfqg_stats_update_io_add(bfqq_group(bfqq), bfqq, cmd_flags);
|
||||
+ if (idle_timer_disabled)
|
||||
+ bfqg_stats_update_idle_time(bfqq_group(bfqq));
|
||||
+ spin_unlock_irq(q->queue_lock);
|
||||
+#endif
|
||||
}
|
||||
|
||||
static void bfq_insert_requests(struct blk_mq_hw_ctx *hctx,
|
||||
diff --git a/block/bfq-wf2q.c b/block/bfq-wf2q.c
|
||||
index 414ba686a847..e495d3f9b4b0 100644
|
||||
--- a/block/bfq-wf2q.c
|
||||
+++ b/block/bfq-wf2q.c
|
||||
@@ -843,7 +843,6 @@ void bfq_bfqq_served(struct bfq_queue *bfqq, int served)
|
||||
st->vtime += bfq_delta(served, st->wsum);
|
||||
bfq_forget_idle(st);
|
||||
}
|
||||
- bfqg_stats_set_start_empty_time(bfqq_group(bfqq));
|
||||
bfq_log_bfqq(bfqq->bfqd, bfqq, "bfqq_served %d secs", served);
|
||||
}
|
||||
|
||||
--
|
||||
2.15.1
|
||||
|
||||
-21
@@ -1,21 +0,0 @@
|
||||
|
||||
Disable floppy autoloading as it makes systems without real hw,
|
||||
but that has the pnp headers hang.
|
||||
|
||||
See https://bugs.mageia.org/show_bug.cgi?id=4696
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
diff -Nurp linux-3.3.3-rc1/drivers/block/floppy.c.orig linux-3.3.3-rc1/drivers/block/floppy.c
|
||||
--- linux-3.3.3-rc1/drivers/block/floppy.c.orig 2012-03-19 01:15:34.000000000 +0200
|
||||
+++ linux-3.3.3-rc1/drivers/block/floppy.c 2012-04-22 02:58:10.238498303 +0300
|
||||
@@ -4621,8 +4621,7 @@ static const struct pnp_device_id floppy
|
||||
{"PNP0700", 0},
|
||||
{}
|
||||
};
|
||||
-
|
||||
-MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
|
||||
+/* MODULE_DEVICE_TABLE(pnp, floppy_pnpids); */
|
||||
|
||||
#else
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
|
||||
agp/intel: add new host bridge id for Q57 system
|
||||
|
||||
Add new Host Bridge ID found on a Q57 based system from Positivo. I
|
||||
don't know what abbreviation id for this would be best, may be Q_HB
|
||||
instead of UNKNOWN currently used would be better.
|
||||
|
||||
Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
|
||||
|
||||
[ rebased for 3.8-rc3 /tmb ]
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
Removed the parts of the patch that are already applied in the kernel by
|
||||
the commit 67384fe3fd450536342330f684ea1f7dcaef8130:
|
||||
"char/agp: add another Ironlake host bridge"
|
||||
|
||||
Rediffed for kernel 3.10.24.
|
||||
|
||||
Signed-off-by: Eugene A. Shatokhin <eugene.shatokhin@rosalab.ru>
|
||||
|
||||
drivers/char/agp/intel-gtt.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff -Nurp linux-3.8-rc3/drivers/char/agp/intel-gtt.c linux-3.8-rc3.q57/drivers/char/agp/intel-gtt.c
|
||||
--- linux-3.8-rc3/drivers/char/agp/intel-gtt.c 2013-01-10 08:17:09.690594184 +0200
|
||||
+++ linux-3.8-rc3.q57/drivers/char/agp/intel-gtt.c 2013-01-10 08:38:56.649888839 +0200
|
||||
@@ -1303,6 +1303,8 @@ static const struct intel_gtt_driver_des
|
||||
&g4x_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_IRONLAKE_D_IG,
|
||||
"HD Graphics", &ironlake_gtt_driver },
|
||||
+ { PCI_DEVICE_ID_INTEL_IRONLAKE_D2_HB,
|
||||
+ "HD Graphics", &ironlake_gtt_driver },
|
||||
{ PCI_DEVICE_ID_INTEL_IRONLAKE_M_IG,
|
||||
"HD Graphics", &ironlake_gtt_driver },
|
||||
{ 0, NULL, NULL }
|
||||
@@ -1,74 +0,0 @@
|
||||
|
||||
Makefile | 18 +++++-------------
|
||||
scripts/kconfig/Makefile | 4 ----
|
||||
2 files changed, 5 insertions(+), 17 deletions(-)
|
||||
|
||||
diff -Nurp linux-5.4.orig/Makefile linux-5.4/Makefile
|
||||
--- linux-5.4.orig/Makefile 2019-11-30 23:06:49.394199628 +0200
|
||||
+++ linux-5.4/Makefile 2019-11-30 23:08:00.927203318 +0200
|
||||
@@ -1093,8 +1093,7 @@ include/config/kernel.release: FORCE
|
||||
# Carefully list dependencies so we do not try to build scripts twice
|
||||
# in parallel
|
||||
PHONY += scripts
|
||||
-scripts: scripts_basic scripts_dtc
|
||||
- $(Q)$(MAKE) $(build)=$(@)
|
||||
+scripts:
|
||||
|
||||
# Things we need to do before we recursively start building the kernel
|
||||
# or the modules are listed in "prepare".
|
||||
@@ -1112,7 +1111,7 @@ prepare0: archprepare
|
||||
$(Q)$(MAKE) $(build)=.
|
||||
|
||||
# All the preparing..
|
||||
-prepare: prepare0 prepare-objtool
|
||||
+prepare:
|
||||
|
||||
# Support for using generic headers in asm-generic
|
||||
asm-generic := -f $(srctree)/scripts/Makefile.asm-generic obj
|
||||
@@ -1363,15 +1362,8 @@ CLEAN_DIRS += include/ksym
|
||||
CLEAN_FILES += modules.builtin.modinfo
|
||||
|
||||
# Directories & files removed with 'make mrproper'
|
||||
-MRPROPER_DIRS += include/config include/generated \
|
||||
- arch/$(SRCARCH)/include/generated .tmp_objdiff \
|
||||
- debian/ snap/ tar-install/
|
||||
-MRPROPER_FILES += .config .config.old .version \
|
||||
- Module.symvers \
|
||||
- signing_key.pem signing_key.priv signing_key.x509 \
|
||||
- x509.genkey extra_certificates signing_key.x509.keyid \
|
||||
- signing_key.x509.signer vmlinux-gdb.py \
|
||||
- *.spec
|
||||
+MRPROPER_DIRS += ""
|
||||
+MRPROPER_FILES += ""
|
||||
|
||||
# Directories & files removed with 'make distclean'
|
||||
DISTCLEAN_DIRS +=
|
||||
@@ -1394,7 +1386,7 @@ clean: archclean vmlinuxclean
|
||||
#
|
||||
mrproper: rm-dirs := $(wildcard $(MRPROPER_DIRS))
|
||||
mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
|
||||
-mrproper-dirs := $(addprefix _mrproper_,scripts)
|
||||
+mrproper-dirs := $(addprefix _mrproper_,scripts)
|
||||
|
||||
PHONY += $(mrproper-dirs) mrproper
|
||||
$(mrproper-dirs):
|
||||
diff -Nurp linux-5.4.orig/scripts/kconfig/Makefile linux-5.4/scripts/kconfig/Makefile
|
||||
--- linux-5.4.orig/scripts/kconfig/Makefile 2019-11-25 02:32:01.000000000 +0200
|
||||
+++ linux-5.4/scripts/kconfig/Makefile 2019-11-30 23:07:24.957201462 +0200
|
||||
@@ -24,16 +24,12 @@ endif
|
||||
unexport CONFIG_
|
||||
|
||||
xconfig: $(obj)/qconf
|
||||
- $< $(silent) $(Kconfig)
|
||||
|
||||
gconfig: $(obj)/gconf
|
||||
- $< $(silent) $(Kconfig)
|
||||
|
||||
menuconfig: $(obj)/mconf
|
||||
- $< $(silent) $(Kconfig)
|
||||
|
||||
config: $(obj)/conf
|
||||
- $< $(silent) --oldaskconfig $(Kconfig)
|
||||
|
||||
nconfig: $(obj)/nconf
|
||||
$< $(silent) $(Kconfig)
|
||||
@@ -1,21 +0,0 @@
|
||||
|
||||
This patch adds module aliases for matching the old dm-raid45 patch
|
||||
by heinzm@redhat.com carried by kernel-tmb series in order to make
|
||||
sure there is an upgrade path.
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
drivers/md/dm-raid.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
--- linux/drivers/md/dm-raid.c.orig
|
||||
+++ linux/drivers/md/dm-raid.c
|
||||
@@ -3689,6 +3689,8 @@ MODULE_ALIAS("dm-raid10");
|
||||
MODULE_ALIAS("dm-raid4");
|
||||
MODULE_ALIAS("dm-raid5");
|
||||
MODULE_ALIAS("dm-raid6");
|
||||
+MODULE_ALIAS("dm-raid45");
|
||||
+MODULE_ALIAS("dm-raid4-5");
|
||||
MODULE_AUTHOR("Neil Brown <dm-devel@redhat.com>");
|
||||
MODULE_AUTHOR("Heinz Mauelshagen <dm-devel@redhat.com>");
|
||||
MODULE_LICENSE("GPL");
|
||||
-61
@@ -1,61 +0,0 @@
|
||||
From 68017e5d87a2477d40476f1a0a06f202ee79316b Mon Sep 17 00:00:00 2001
|
||||
From: Paolo Valente <paolo.valente@linaro.org>
|
||||
Date: Mon, 13 Nov 2017 07:34:07 +0100
|
||||
Subject: [PATCH] doc, block, bfq: update max IOPS sustainable with BFQ
|
||||
|
||||
We have investigated more deeply the performance of BFQ, in terms of
|
||||
number of IOPS that can be processed by the CPU when BFQ is used as
|
||||
I/O scheduler. In more detail, using the script [1], we have measured
|
||||
the number of IOPS reached on top of a null block device configured
|
||||
with zero latency, as a function of the workload (sequential read,
|
||||
sequential write, random read, random write) and of the system (we
|
||||
considered desktops, laptops and embedded systems).
|
||||
|
||||
Basing on the resulting figures, with this commit we update the
|
||||
current, conservative IOPS range reported in BFQ documentation. In
|
||||
particular, the documentation now reports, for each of three different
|
||||
systems, the lowest number of IOPS obtained for that system with the
|
||||
above test (namely, the value obtained with the workload leading to
|
||||
the lowest IOPS).
|
||||
|
||||
[1] https://github.com/Algodev-github/IOSpeed
|
||||
|
||||
Reviewed-by: Lee Tibbert <lee.tibbert@gmail.com>
|
||||
Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
|
||||
Signed-off-by: Luca Miccio <lucmiccio@gmail.com>
|
||||
Signed-off-by: Jens Axboe <axboe@kernel.dk>
|
||||
---
|
||||
Documentation/block/bfq-iosched.txt | 17 +++++++++++------
|
||||
1 file changed, 11 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/Documentation/block/bfq-iosched.txt b/Documentation/block/bfq-iosched.txt
|
||||
index 3d6951d63489..7a9361508157 100644
|
||||
--- a/Documentation/block/bfq-iosched.txt
|
||||
+++ b/Documentation/block/bfq-iosched.txt
|
||||
@@ -20,12 +20,17 @@ for that device, by setting low_latency to 0. See Section 3 for
|
||||
details on how to configure BFQ for the desired tradeoff between
|
||||
latency and throughput, or on how to maximize throughput.
|
||||
|
||||
-On average CPUs, the current version of BFQ can handle devices
|
||||
-performing at most ~30K IOPS; at most ~50 KIOPS on faster CPUs. As a
|
||||
-reference, 30-50 KIOPS correspond to very high bandwidths with
|
||||
-sequential I/O (e.g., 8-12 GB/s if I/O requests are 256 KB large), and
|
||||
-to 120-200 MB/s with 4KB random I/O. BFQ is currently being tested on
|
||||
-multi-queue devices too.
|
||||
+BFQ has a non-null overhead, which limits the maximum IOPS that the
|
||||
+CPU can process for a device scheduled with BFQ. To give an idea of
|
||||
+the limits on slow or average CPUs, here are BFQ limits for three
|
||||
+different CPUs, on, respectively, an average laptop, an old desktop,
|
||||
+and a cheap embedded system, in case full hierarchical support is
|
||||
+enabled (i.e., CONFIG_BFQ_GROUP_IOSCHED is set):
|
||||
+- Intel i7-4850HQ: 250 KIOPS
|
||||
+- AMD A8-3850: 170 KIOPS
|
||||
+- ARM CortexTM-A53 Octa-core: 45 KIOPS
|
||||
+
|
||||
+BFQ works for multi-queue devices too.
|
||||
|
||||
The table of contents follow. Impatients can just jump to Section 3.
|
||||
|
||||
--
|
||||
2.13.6
|
||||
|
||||
-29
@@ -1,29 +0,0 @@
|
||||
|
||||
This patch adds missing module aliases for the old ieee1394 stack
|
||||
to make it easier for endusers.
|
||||
|
||||
Note: firewire-sbp2 and firewire-ohci already contains the needed aliases.
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
diff -Nurp linux-2.6.38.4/drivers/firewire/core-transaction.c linux-2.6.38.4.fw/drivers/firewire/core-transaction.c
|
||||
--- linux-2.6.38.4/drivers/firewire/core-transaction.c 2011-03-15 03:20:32.000000000 +0200
|
||||
+++ linux-2.6.38.4.fw/drivers/firewire/core-transaction.c 2011-04-22 16:22:28.461386738 +0300
|
||||
@@ -1174,6 +1174,9 @@ static struct fw_address_handler registe
|
||||
MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>");
|
||||
MODULE_DESCRIPTION("Core IEEE1394 transaction logic");
|
||||
MODULE_LICENSE("GPL");
|
||||
+MODULE_ALIAS("ieee1394");
|
||||
+MODULE_ALIAS("raw1394");
|
||||
+MODULE_ALIAS("video1394");
|
||||
|
||||
static const u32 vendor_textual_descriptor[] = {
|
||||
/* textual descriptor leaf () */
|
||||
diff -Nurp linux-2.6.38.4/drivers/firewire/net.c linux-2.6.38.4.fw/drivers/firewire/net.c
|
||||
--- linux-2.6.38.4/drivers/firewire/net.c 2011-03-15 03:20:32.000000000 +0200
|
||||
+++ linux-2.6.38.4.fw/drivers/firewire/net.c 2011-04-22 16:20:34.008883920 +0300
|
||||
@@ -1719,3 +1719,4 @@ MODULE_AUTHOR("Jay Fenlason <fenlason@re
|
||||
MODULE_DESCRIPTION("IP over IEEE1394 as per RFC 2734/3146");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DEVICE_TABLE(ieee1394, fwnet_id_table);
|
||||
+MODULE_ALIAS("eth1394");
|
||||
@@ -1,431 +0,0 @@
|
||||
|
||||
fs/aufs/Kconfig | 2 +-
|
||||
fs/dcache.c | 2 ++
|
||||
fs/exec.c | 1 +
|
||||
fs/fcntl.c | 1 +
|
||||
fs/file_table.c | 4 ++++
|
||||
fs/inode.c | 1 +
|
||||
fs/namespace.c | 2 ++
|
||||
fs/notify/group.c | 4 ++++
|
||||
fs/notify/mark.c | 4 ++++
|
||||
fs/open.c | 2 ++
|
||||
fs/read_write.c | 4 ++++
|
||||
fs/splice.c | 2 ++
|
||||
fs/sync.c | 1 +
|
||||
fs/xattr.c | 1 +
|
||||
kernel/task_work.c | 1 +
|
||||
security/commoncap.c | 2 ++
|
||||
security/device_cgroup.c | 2 ++
|
||||
security/security.c | 10 ++++++++++
|
||||
18 files changed, 45 insertions(+), 1 deletion(-)
|
||||
|
||||
diff -Nurp linux-4.14.14-aufs/fs/aufs/Kconfig linux-4.14.14-aufs.mod/fs/aufs/Kconfig
|
||||
--- linux-4.14.14-aufs/fs/aufs/Kconfig 2018-01-17 11:17:42.191975391 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/aufs/Kconfig 2018-01-17 11:18:22.784556755 +0200
|
||||
@@ -1,6 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
config AUFS_FS
|
||||
- bool "Aufs (Advanced multi layered unification filesystem) support"
|
||||
+ tristate "Aufs (Advanced multi layered unification filesystem) support"
|
||||
help
|
||||
Aufs is a stackable unification filesystem such as Unionfs,
|
||||
which unifies several directories and provides a merged single
|
||||
diff -Nurp linux-4.14.14-aufs/fs/dcache.c linux-4.14.14-aufs.mod/fs/dcache.c
|
||||
--- linux-4.14.14-aufs/fs/dcache.c 2018-01-17 11:17:42.200975519 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/dcache.c 2018-01-17 11:18:22.784556755 +0200
|
||||
@@ -1305,6 +1305,7 @@ rename_retry:
|
||||
seq = 1;
|
||||
goto again;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(d_walk);
|
||||
|
||||
struct check_mount {
|
||||
struct vfsmount *mnt;
|
||||
@@ -2894,6 +2895,7 @@ void d_exchange(struct dentry *dentry1,
|
||||
|
||||
write_sequnlock(&rename_lock);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(d_exchange);
|
||||
|
||||
/**
|
||||
* d_ancestor - search for an ancestor
|
||||
diff -Nurp linux-4.14.14-aufs/fs/exec.c linux-4.14.14-aufs.mod/fs/exec.c
|
||||
--- linux-4.14.14-aufs/fs/exec.c 2018-01-17 11:08:18.957908605 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/exec.c 2018-01-17 11:18:22.785556770 +0200
|
||||
@@ -109,6 +109,7 @@ bool path_noexec(const struct path *path
|
||||
return (path->mnt->mnt_flags & MNT_NOEXEC) ||
|
||||
(path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(path_noexec);
|
||||
|
||||
#ifdef CONFIG_USELIB
|
||||
/*
|
||||
diff -Nurp linux-4.14.14-aufs/fs/fcntl.c linux-4.14.14-aufs.mod/fs/fcntl.c
|
||||
--- linux-4.14.14-aufs/fs/fcntl.c 2018-01-17 11:17:42.200975519 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/fcntl.c 2018-01-17 11:18:22.785556770 +0200
|
||||
@@ -85,6 +85,7 @@ int setfl(int fd, struct file * filp, un
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(setfl);
|
||||
|
||||
static void f_modown(struct file *filp, struct pid *pid, enum pid_type type,
|
||||
int force)
|
||||
diff -Nurp linux-4.14.14-aufs/fs/file_table.c linux-4.14.14-aufs.mod/fs/file_table.c
|
||||
--- linux-4.14.14-aufs/fs/file_table.c 2017-11-12 20:46:13.000000000 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/file_table.c 2018-01-17 11:18:22.785556770 +0200
|
||||
@@ -148,6 +148,7 @@ over:
|
||||
}
|
||||
return ERR_PTR(-ENFILE);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(get_empty_filp);
|
||||
|
||||
/**
|
||||
* alloc_file - allocate and initialize a 'struct file'
|
||||
@@ -258,6 +259,7 @@ void flush_delayed_fput(void)
|
||||
{
|
||||
delayed_fput(NULL);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(flush_delayed_fput);
|
||||
|
||||
static DECLARE_DELAYED_WORK(delayed_fput_work, delayed_fput);
|
||||
|
||||
@@ -300,6 +302,7 @@ void __fput_sync(struct file *file)
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(fput);
|
||||
+EXPORT_SYMBOL_GPL(__fput_sync);
|
||||
|
||||
void put_filp(struct file *file)
|
||||
{
|
||||
@@ -308,6 +311,7 @@ void put_filp(struct file *file)
|
||||
file_free(file);
|
||||
}
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(put_filp);
|
||||
|
||||
void __init files_init(void)
|
||||
{
|
||||
diff -Nurp linux-4.14.14-aufs/fs/inode.c linux-4.14.14-aufs.mod/fs/inode.c
|
||||
--- linux-4.14.14-aufs/fs/inode.c 2018-01-17 11:17:42.200975519 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/inode.c 2018-01-17 11:18:22.785556770 +0200
|
||||
@@ -1664,6 +1664,7 @@ int update_time(struct inode *inode, str
|
||||
|
||||
return update_time(inode, time, flags);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(update_time);
|
||||
|
||||
/**
|
||||
* touch_atime - update the access time
|
||||
diff -Nurp linux-4.14.14-aufs/fs/namespace.c linux-4.14.14-aufs.mod/fs/namespace.c
|
||||
--- linux-4.14.14-aufs/fs/namespace.c 2018-01-17 11:17:42.201975534 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/namespace.c 2018-01-17 11:18:22.785556770 +0200
|
||||
@@ -517,6 +517,7 @@ void __mnt_drop_write(struct vfsmount *m
|
||||
mnt_dec_writers(real_mount(mnt));
|
||||
preempt_enable();
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(__mnt_drop_write);
|
||||
|
||||
/**
|
||||
* mnt_drop_write - give up write access to a mount
|
||||
@@ -1887,6 +1888,7 @@ int iterate_mounts(int (*f)(struct vfsmo
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(iterate_mounts);
|
||||
|
||||
static void cleanup_group_ids(struct mount *mnt, struct mount *end)
|
||||
{
|
||||
diff -Nurp linux-4.14.14-aufs/fs/notify/group.c linux-4.14.14-aufs.mod/fs/notify/group.c
|
||||
--- linux-4.14.14-aufs/fs/notify/group.c 2017-11-12 20:46:13.000000000 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/notify/group.c 2018-01-17 11:18:22.786556784 +0200
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <linux/srcu.h>
|
||||
#include <linux/rculist.h>
|
||||
#include <linux/wait.h>
|
||||
+#include <linux/module.h>
|
||||
|
||||
#include <linux/fsnotify_backend.h>
|
||||
#include "fsnotify.h"
|
||||
@@ -109,6 +110,7 @@ void fsnotify_get_group(struct fsnotify_
|
||||
{
|
||||
atomic_inc(&group->refcnt);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(fsnotify_get_group);
|
||||
|
||||
/*
|
||||
* Drop a reference to a group. Free it if it's through.
|
||||
@@ -118,6 +120,7 @@ void fsnotify_put_group(struct fsnotify_
|
||||
if (atomic_dec_and_test(&group->refcnt))
|
||||
fsnotify_final_destroy_group(group);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(fsnotify_put_group);
|
||||
|
||||
/*
|
||||
* Create a new fsnotify_group and hold a reference for the group returned.
|
||||
@@ -147,6 +150,7 @@ struct fsnotify_group *fsnotify_alloc_gr
|
||||
|
||||
return group;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(fsnotify_alloc_group);
|
||||
|
||||
int fsnotify_fasync(int fd, struct file *file, int on)
|
||||
{
|
||||
diff -Nurp linux-4.14.14-aufs/fs/notify/mark.c linux-4.14.14-aufs.mod/fs/notify/mark.c
|
||||
--- linux-4.14.14-aufs/fs/notify/mark.c 2018-01-17 11:08:18.963908691 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/notify/mark.c 2018-01-17 11:18:22.786556784 +0200
|
||||
@@ -124,6 +124,7 @@ static void __fsnotify_recalc_mask(struc
|
||||
else if (conn->flags & FSNOTIFY_OBJ_TYPE_VFSMOUNT)
|
||||
real_mount(conn->mnt)->mnt_fsnotify_mask = new_mask;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(fsnotify_put_mark);
|
||||
|
||||
/*
|
||||
* Calculate mask of events for a list of marks. The caller must make sure
|
||||
@@ -271,6 +272,7 @@ static bool fsnotify_get_mark_safe(struc
|
||||
}
|
||||
return false;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(fsnotify_destroy_mark);
|
||||
|
||||
/*
|
||||
* Puts marks and wakes up group destruction if necessary.
|
||||
@@ -428,6 +430,7 @@ int fsnotify_compare_groups(struct fsnot
|
||||
return 1;
|
||||
return -1;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(fsnotify_add_mark);
|
||||
|
||||
static int fsnotify_attach_connector_to_object(
|
||||
struct fsnotify_mark_connector __rcu **connp,
|
||||
@@ -557,6 +560,7 @@ out_err:
|
||||
spin_unlock(&mark->lock);
|
||||
return err;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(fsnotify_init_mark);
|
||||
|
||||
/*
|
||||
* Attach an initialized mark to a given group and fs object.
|
||||
diff -Nurp linux-4.14.14-aufs/fs/open.c linux-4.14.14-aufs.mod/fs/open.c
|
||||
--- linux-4.14.14-aufs/fs/open.c 2017-11-12 20:46:13.000000000 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/open.c 2018-01-17 11:18:22.786556784 +0200
|
||||
@@ -64,6 +64,7 @@ int do_truncate(struct dentry *dentry, l
|
||||
inode_unlock(dentry->d_inode);
|
||||
return ret;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(do_truncate);
|
||||
|
||||
long vfs_truncate(const struct path *path, loff_t length)
|
||||
{
|
||||
@@ -691,6 +692,7 @@ int open_check_o_direct(struct file *f)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(open_check_o_direct);
|
||||
|
||||
static int do_dentry_open(struct file *f,
|
||||
struct inode *inode,
|
||||
diff -Nurp linux-4.14.14-aufs/fs/read_write.c linux-4.14.14-aufs.mod/fs/read_write.c
|
||||
--- linux-4.14.14-aufs/fs/read_write.c 2018-01-17 11:17:42.201975534 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/read_write.c 2018-01-17 11:18:22.790556841 +0200
|
||||
@@ -454,6 +454,7 @@ ssize_t vfs_read(struct file *file, char
|
||||
|
||||
return ret;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(vfs_read);
|
||||
|
||||
static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
|
||||
{
|
||||
@@ -494,6 +495,7 @@ vfs_readf_t vfs_readf(struct file *file)
|
||||
return new_sync_read;
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(vfs_readf);
|
||||
|
||||
vfs_writef_t vfs_writef(struct file *file)
|
||||
{
|
||||
@@ -505,6 +507,7 @@ vfs_writef_t vfs_writef(struct file *fil
|
||||
return new_sync_write;
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(vfs_writef);
|
||||
|
||||
ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t *pos)
|
||||
{
|
||||
@@ -574,6 +577,7 @@ ssize_t vfs_write(struct file *file, con
|
||||
|
||||
return ret;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(vfs_write);
|
||||
|
||||
static inline loff_t file_pos_read(struct file *file)
|
||||
{
|
||||
diff -Nurp linux-4.14.14-aufs/fs/splice.c linux-4.14.14-aufs.mod/fs/splice.c
|
||||
--- linux-4.14.14-aufs/fs/splice.c 2018-01-17 11:17:42.201975534 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/splice.c 2018-01-17 11:18:22.791556855 +0200
|
||||
@@ -850,6 +850,7 @@ long do_splice_from(struct pipe_inode_in
|
||||
|
||||
return splice_write(pipe, out, ppos, len, flags);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(do_splice_from);
|
||||
|
||||
/*
|
||||
* Attempt to initiate a splice from a file to a pipe.
|
||||
@@ -879,6 +880,7 @@ long do_splice_to(struct file *in, loff_
|
||||
|
||||
return splice_read(in, ppos, pipe, len, flags);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(do_splice_to);
|
||||
|
||||
/**
|
||||
* splice_direct_to_actor - splices data directly between two non-pipes
|
||||
diff -Nurp linux-4.14.14-aufs/fs/sync.c linux-4.14.14-aufs.mod/fs/sync.c
|
||||
--- linux-4.14.14-aufs/fs/sync.c 2018-01-17 11:17:42.201975534 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/sync.c 2018-01-17 11:18:22.791556855 +0200
|
||||
@@ -39,6 +39,7 @@ int __sync_filesystem(struct super_block
|
||||
sb->s_op->sync_fs(sb, wait);
|
||||
return __sync_blockdev(sb->s_bdev, wait);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(__sync_filesystem);
|
||||
|
||||
/*
|
||||
* Write out and wait upon all dirty data associated with this
|
||||
diff -Nurp linux-4.14.14-aufs/fs/xattr.c linux-4.14.14-aufs.mod/fs/xattr.c
|
||||
--- linux-4.14.14-aufs/fs/xattr.c 2017-11-12 20:46:13.000000000 +0200
|
||||
+++ linux-4.14.14-aufs.mod/fs/xattr.c 2018-01-17 11:18:22.791556855 +0200
|
||||
@@ -297,6 +297,7 @@ vfs_getxattr_alloc(struct dentry *dentry
|
||||
*xattr_value = value;
|
||||
return error;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(vfs_getxattr_alloc);
|
||||
|
||||
ssize_t
|
||||
__vfs_getxattr(struct dentry *dentry, struct inode *inode, const char *name,
|
||||
diff -Nurp linux-4.14.14-aufs/kernel/task_work.c linux-4.14.14-aufs.mod/kernel/task_work.c
|
||||
--- linux-4.14.14-aufs/kernel/task_work.c 2018-01-17 11:08:18.979908919 +0200
|
||||
+++ linux-4.14.14-aufs.mod/kernel/task_work.c 2018-01-17 11:18:22.791556855 +0200
|
||||
@@ -116,3 +116,4 @@ void task_work_run(void)
|
||||
} while (work);
|
||||
}
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(task_work_run);
|
||||
diff -Nurp linux-4.14.14-aufs/security/commoncap.c linux-4.14.14-aufs.mod/security/commoncap.c
|
||||
--- linux-4.14.14-aufs/security/commoncap.c 2018-01-17 11:08:18.999909204 +0200
|
||||
+++ linux-4.14.14-aufs.mod/security/commoncap.c 2018-01-17 11:18:22.791556855 +0200
|
||||
@@ -1267,12 +1267,14 @@ int cap_mmap_addr(unsigned long addr)
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(cap_mmap_addr);
|
||||
|
||||
int cap_mmap_file(struct file *file, unsigned long reqprot,
|
||||
unsigned long prot, unsigned long flags)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(cap_mmap_file);
|
||||
|
||||
#ifdef CONFIG_SECURITY
|
||||
|
||||
diff -Nurp linux-4.14.14-aufs/security/device_cgroup.c linux-4.14.14-aufs.mod/security/device_cgroup.c
|
||||
--- linux-4.14.14-aufs/security/device_cgroup.c 2017-11-12 20:46:13.000000000 +0200
|
||||
+++ linux-4.14.14-aufs.mod/security/device_cgroup.c 2018-01-17 11:18:22.791556855 +0200
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/device_cgroup.h>
|
||||
#include <linux/cgroup.h>
|
||||
#include <linux/ctype.h>
|
||||
+#include <linux/export.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/seq_file.h>
|
||||
@@ -850,6 +851,7 @@ int __devcgroup_inode_permission(struct
|
||||
return __devcgroup_check_permission(type, imajor(inode), iminor(inode),
|
||||
access);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(__devcgroup_inode_permission);
|
||||
|
||||
int devcgroup_inode_mknod(int mode, dev_t dev)
|
||||
{
|
||||
diff -Nurp linux-4.14.14-aufs/security/security.c linux-4.14.14-aufs.mod/security/security.c
|
||||
--- linux-4.14.14-aufs/security/security.c 2017-11-12 20:46:13.000000000 +0200
|
||||
+++ linux-4.14.14-aufs.mod/security/security.c 2018-01-17 11:18:22.791556855 +0200
|
||||
@@ -530,6 +530,7 @@ int security_path_rmdir(const struct pat
|
||||
return 0;
|
||||
return call_int_hook(path_rmdir, 0, dir, dentry);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_path_rmdir);
|
||||
|
||||
int security_path_unlink(const struct path *dir, struct dentry *dentry)
|
||||
{
|
||||
@@ -546,6 +547,7 @@ int security_path_symlink(const struct p
|
||||
return 0;
|
||||
return call_int_hook(path_symlink, 0, dir, dentry, old_name);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_path_symlink);
|
||||
|
||||
int security_path_link(struct dentry *old_dentry, const struct path *new_dir,
|
||||
struct dentry *new_dentry)
|
||||
@@ -554,6 +556,7 @@ int security_path_link(struct dentry *ol
|
||||
return 0;
|
||||
return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_path_link);
|
||||
|
||||
int security_path_rename(const struct path *old_dir, struct dentry *old_dentry,
|
||||
const struct path *new_dir, struct dentry *new_dentry,
|
||||
@@ -581,6 +584,7 @@ int security_path_truncate(const struct
|
||||
return 0;
|
||||
return call_int_hook(path_truncate, 0, path);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_path_truncate);
|
||||
|
||||
int security_path_chmod(const struct path *path, umode_t mode)
|
||||
{
|
||||
@@ -588,6 +592,7 @@ int security_path_chmod(const struct pat
|
||||
return 0;
|
||||
return call_int_hook(path_chmod, 0, path, mode);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_path_chmod);
|
||||
|
||||
int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
|
||||
{
|
||||
@@ -595,6 +600,7 @@ int security_path_chown(const struct pat
|
||||
return 0;
|
||||
return call_int_hook(path_chown, 0, path, uid, gid);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_path_chown);
|
||||
|
||||
int security_path_chroot(const struct path *path)
|
||||
{
|
||||
@@ -680,6 +686,7 @@ int security_inode_readlink(struct dentr
|
||||
return 0;
|
||||
return call_int_hook(inode_readlink, 0, dentry);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_inode_readlink);
|
||||
|
||||
int security_inode_follow_link(struct dentry *dentry, struct inode *inode,
|
||||
bool rcu)
|
||||
@@ -695,6 +702,7 @@ int security_inode_permission(struct ino
|
||||
return 0;
|
||||
return call_int_hook(inode_permission, 0, inode, mask);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_inode_permission);
|
||||
|
||||
int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
{
|
||||
@@ -866,6 +874,7 @@ int security_file_permission(struct file
|
||||
|
||||
return fsnotify_perm(file, mask);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_file_permission);
|
||||
|
||||
int security_file_alloc(struct file *file)
|
||||
{
|
||||
@@ -925,6 +934,7 @@ int security_mmap_file(struct file *file
|
||||
return ret;
|
||||
return ima_file_mmap(file, prot);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_mmap_file);
|
||||
|
||||
int security_mmap_addr(unsigned long addr)
|
||||
{
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,321 +0,0 @@
|
||||
|
||||
fs/aufs/Kconfig | 2 +-
|
||||
fs/dcache.c | 2 ++
|
||||
fs/exec.c | 1 +
|
||||
fs/fcntl.c | 1 +
|
||||
fs/file_table.c | 2 ++
|
||||
fs/inode.c | 1 +
|
||||
fs/namespace.c | 3 +++
|
||||
fs/notify/group.c | 1 +
|
||||
fs/open.c | 1 +
|
||||
fs/read_write.c | 4 ++++
|
||||
fs/splice.c | 2 ++
|
||||
fs/sync.c | 1 +
|
||||
fs/xattr.c | 1 +
|
||||
kernel/locking/lockdep.c | 1 +
|
||||
kernel/task_work.c | 1 +
|
||||
security/device_cgroup.c | 1 +
|
||||
security/security.c | 8 ++++++++
|
||||
17 files changed, 32 insertions(+), 1 deletion(-)
|
||||
|
||||
diff -Nurp linux-5.4-aufs/fs/aufs/Kconfig linux-5.4-aufs-mod/fs/aufs/Kconfig
|
||||
--- linux-5.4-aufs/fs/aufs/Kconfig 2019-11-28 01:25:59.062925618 +0200
|
||||
+++ linux-5.4-aufs-mod/fs/aufs/Kconfig 2019-11-28 01:38:40.564895255 +0200
|
||||
@@ -1,6 +1,6 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
config AUFS_FS
|
||||
- bool "Aufs (Advanced multi layered unification filesystem) support"
|
||||
+ tristate "Aufs (Advanced multi layered unification filesystem) support"
|
||||
help
|
||||
Aufs is a stackable unification filesystem such as Unionfs,
|
||||
which unifies several directories and provides a merged single
|
||||
diff -Nurp linux-5.4-aufs/fs/dcache.c linux-5.4-aufs-mod/fs/dcache.c
|
||||
--- linux-5.4-aufs/fs/dcache.c 2019-11-28 01:25:59.069925618 +0200
|
||||
+++ linux-5.4-aufs-mod/fs/dcache.c 2019-11-28 01:38:40.585895254 +0200
|
||||
@@ -1369,6 +1369,7 @@ rename_retry:
|
||||
seq = 1;
|
||||
goto again;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(d_walk);
|
||||
|
||||
struct check_mount {
|
||||
struct vfsmount *mnt;
|
||||
@@ -2914,6 +2915,7 @@ void d_exchange(struct dentry *dentry1,
|
||||
|
||||
write_sequnlock(&rename_lock);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(d_exchange);
|
||||
|
||||
/**
|
||||
* d_ancestor - search for an ancestor
|
||||
diff -Nurp linux-5.4-aufs/fs/exec.c linux-5.4-aufs-mod/fs/exec.c
|
||||
--- linux-5.4-aufs/fs/exec.c 2019-11-25 02:32:01.000000000 +0200
|
||||
+++ linux-5.4-aufs-mod/fs/exec.c 2019-11-28 01:38:40.589895254 +0200
|
||||
@@ -110,6 +110,7 @@ bool path_noexec(const struct path *path
|
||||
return (path->mnt->mnt_flags & MNT_NOEXEC) ||
|
||||
(path->mnt->mnt_sb->s_iflags & SB_I_NOEXEC);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(path_noexec);
|
||||
|
||||
#ifdef CONFIG_USELIB
|
||||
/*
|
||||
diff -Nurp linux-5.4-aufs/fs/fcntl.c linux-5.4-aufs-mod/fs/fcntl.c
|
||||
--- linux-5.4-aufs/fs/fcntl.c 2019-11-28 01:25:59.069925618 +0200
|
||||
+++ linux-5.4-aufs-mod/fs/fcntl.c 2019-11-28 01:38:40.589895254 +0200
|
||||
@@ -85,6 +85,7 @@ int setfl(int fd, struct file * filp, un
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(setfl);
|
||||
|
||||
static void f_modown(struct file *filp, struct pid *pid, enum pid_type type,
|
||||
int force)
|
||||
diff -Nurp linux-5.4-aufs/fs/file_table.c linux-5.4-aufs-mod/fs/file_table.c
|
||||
--- linux-5.4-aufs/fs/file_table.c 2019-11-25 02:32:01.000000000 +0200
|
||||
+++ linux-5.4-aufs-mod/fs/file_table.c 2019-11-28 01:38:40.589895254 +0200
|
||||
@@ -162,6 +162,7 @@ over:
|
||||
}
|
||||
return ERR_PTR(-ENFILE);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(alloc_empty_file);
|
||||
|
||||
/*
|
||||
* Variant of alloc_empty_file() that doesn't check and modify nr_files.
|
||||
@@ -375,6 +377,7 @@ void __fput_sync(struct file *file)
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(fput);
|
||||
+EXPORT_SYMBOL_GPL(__fput_sync);
|
||||
|
||||
void __init files_init(void)
|
||||
{
|
||||
diff -Nurp linux-5.4-aufs/fs/inode.c linux-5.4-aufs-mod/fs/inode.c
|
||||
--- linux-5.4-aufs/fs/inode.c 2019-11-28 01:25:59.070925617 +0200
|
||||
+++ linux-5.4-aufs-mod/fs/inode.c 2019-11-28 01:38:40.589895254 +0200
|
||||
@@ -1682,6 +1682,7 @@ int update_time(struct inode *inode, str
|
||||
|
||||
return update_time(inode, time, flags);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(update_time);
|
||||
|
||||
/**
|
||||
* touch_atime - update the access time
|
||||
diff -Nurp linux-5.4-aufs/fs/namespace.c linux-5.4-aufs-mod/fs/namespace.c
|
||||
--- linux-5.4-aufs/fs/namespace.c 2019-11-28 01:25:59.070925617 +0200
|
||||
+++ linux-5.4-aufs-mod/fs/namespace.c 2019-11-28 01:38:40.589895254 +0200
|
||||
@@ -431,6 +431,7 @@ void __mnt_drop_write(struct vfsmount *m
|
||||
mnt_dec_writers(real_mount(mnt));
|
||||
preempt_enable();
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(__mnt_drop_write);
|
||||
|
||||
/**
|
||||
* mnt_drop_write - give up write access to a mount
|
||||
@@ -781,6 +782,7 @@ int is_current_mnt_ns(struct vfsmount *m
|
||||
{
|
||||
return check_mnt(real_mount(mnt));
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(is_current_mnt_ns);
|
||||
|
||||
/*
|
||||
* vfsmount lock must be held for write
|
||||
@@ -1903,6 +1905,7 @@ int iterate_mounts(int (*f)(struct vfsmo
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(iterate_mounts);
|
||||
|
||||
static void lock_mnt_tree(struct mount *mnt)
|
||||
{
|
||||
diff -Nurp linux-5.4-aufs/fs/notify/group.c linux-5.4-aufs-mod/fs/notify/group.c
|
||||
--- linux-5.4-aufs/fs/notify/group.c 2019-11-25 02:32:01.000000000 +0200
|
||||
+++ linux-5.4-aufs-mod/fs/notify/group.c 2019-11-28 01:38:40.590895253 +0200
|
||||
@@ -99,6 +99,7 @@ void fsnotify_get_group(struct fsnotify_
|
||||
{
|
||||
refcount_inc(&group->refcnt);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(fsnotify_get_group);
|
||||
|
||||
/*
|
||||
* Drop a reference to a group. Free it if it's through.
|
||||
diff -Nurp linux-5.4-aufs/fs/open.c linux-5.4-aufs-mod/fs/open.c
|
||||
--- linux-5.4-aufs/fs/open.c 2019-11-25 02:32:01.000000000 +0200
|
||||
+++ linux-5.4-aufs-mod/fs/open.c 2019-11-28 01:38:48.762894928 +0200
|
||||
@@ -65,6 +65,7 @@ int do_truncate(struct dentry *dentry, l
|
||||
inode_unlock(dentry->d_inode);
|
||||
return ret;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(do_truncate);
|
||||
|
||||
long vfs_truncate(const struct path *path, loff_t length)
|
||||
{
|
||||
diff -Nurp linux-5.4-aufs/fs/read_write.c linux-5.4-aufs-mod/fs/read_write.c
|
||||
--- linux-5.4-aufs/fs/read_write.c 2019-11-28 01:25:59.070925617 +0200
|
||||
+++ linux-5.4-aufs-mod/fs/read_write.c 2019-11-28 01:38:48.780894927 +0200
|
||||
@@ -468,6 +468,7 @@ ssize_t vfs_read(struct file *file, char
|
||||
|
||||
return ret;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(vfs_read);
|
||||
|
||||
static ssize_t new_sync_write(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
|
||||
{
|
||||
@@ -508,6 +509,7 @@ vfs_readf_t vfs_readf(struct file *file)
|
||||
return new_sync_read;
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(vfs_readf);
|
||||
|
||||
vfs_writef_t vfs_writef(struct file *file)
|
||||
{
|
||||
@@ -519,6 +521,7 @@ vfs_writef_t vfs_writef(struct file *fil
|
||||
return new_sync_write;
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(vfs_writef);
|
||||
|
||||
ssize_t __kernel_write(struct file *file, const void *buf, size_t count, loff_t *pos)
|
||||
{
|
||||
@@ -588,6 +591,7 @@ ssize_t vfs_write(struct file *file, con
|
||||
|
||||
return ret;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(vfs_write);
|
||||
|
||||
/* file_ppos returns &file->f_pos or NULL if file is stream */
|
||||
static inline loff_t *file_ppos(struct file *file)
|
||||
diff -Nurp linux-5.4-aufs/fs/splice.c linux-5.4-aufs-mod/fs/splice.c
|
||||
--- linux-5.4-aufs/fs/splice.c 2019-11-28 01:25:59.071925617 +0200
|
||||
+++ linux-5.4-aufs-mod/fs/splice.c 2019-11-28 01:38:48.780894927 +0200
|
||||
@@ -847,6 +847,7 @@ long do_splice_from(struct pipe_inode_in
|
||||
|
||||
return splice_write(pipe, out, ppos, len, flags);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(do_splice_from);
|
||||
|
||||
/*
|
||||
* Attempt to initiate a splice from a file to a pipe.
|
||||
@@ -876,6 +877,7 @@ long do_splice_to(struct file *in, loff_
|
||||
|
||||
return splice_read(in, ppos, pipe, len, flags);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(do_splice_to);
|
||||
|
||||
/**
|
||||
* splice_direct_to_actor - splices data directly between two non-pipes
|
||||
diff -Nurp linux-5.4-aufs/fs/sync.c linux-5.4-aufs-mod/fs/sync.c
|
||||
--- linux-5.4-aufs/fs/sync.c 2019-11-28 01:25:59.071925617 +0200
|
||||
+++ linux-5.4-aufs-mod/fs/sync.c 2019-11-28 01:38:48.780894927 +0200
|
||||
@@ -39,6 +39,7 @@ int __sync_filesystem(struct super_block
|
||||
sb->s_op->sync_fs(sb, wait);
|
||||
return __sync_blockdev(sb->s_bdev, wait);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(__sync_filesystem);
|
||||
|
||||
/*
|
||||
* Write out and wait upon all dirty data associated with this
|
||||
diff -Nurp linux-5.4-aufs/fs/xattr.c linux-5.4-aufs-mod/fs/xattr.c
|
||||
--- linux-5.4-aufs/fs/xattr.c 2019-11-25 02:32:01.000000000 +0200
|
||||
+++ linux-5.4-aufs-mod/fs/xattr.c 2019-11-28 01:38:48.780894927 +0200
|
||||
@@ -296,6 +296,7 @@ vfs_getxattr_alloc(struct dentry *dentry
|
||||
*xattr_value = value;
|
||||
return error;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(vfs_getxattr_alloc);
|
||||
|
||||
ssize_t
|
||||
__vfs_getxattr(struct dentry *dentry, struct inode *inode, const char *name,
|
||||
diff -Nurp linux-5.4-aufs/kernel/locking/lockdep.c linux-5.4-aufs-mod/kernel/locking/lockdep.c
|
||||
--- linux-5.4-aufs/kernel/locking/lockdep.c 2019-11-28 01:25:59.072925617 +0200
|
||||
+++ linux-5.4-aufs-mod/kernel/locking/lockdep.c 2019-11-28 01:38:48.780894927 +0200
|
||||
@@ -174,6 +174,7 @@ inline struct lock_class *lockdep_hlock_
|
||||
*/
|
||||
return lock_classes + class_idx;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(lockdep_hlock_class);
|
||||
#define hlock_class(hlock) lockdep_hlock_class(hlock)
|
||||
|
||||
#ifdef CONFIG_LOCK_STAT
|
||||
diff -Nurp linux-5.4-aufs/kernel/task_work.c linux-5.4-aufs-mod/kernel/task_work.c
|
||||
--- linux-5.4-aufs/kernel/task_work.c 2019-11-25 02:32:01.000000000 +0200
|
||||
+++ linux-5.4-aufs-mod/kernel/task_work.c 2019-11-28 01:38:48.786894927 +0200
|
||||
@@ -116,3 +116,4 @@ void task_work_run(void)
|
||||
} while (work);
|
||||
}
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(task_work_run);
|
||||
diff -Nurp linux-5.4-aufs/security/device_cgroup.c linux-5.4-aufs-mod/security/device_cgroup.c
|
||||
--- linux-5.4-aufs/security/device_cgroup.c 2019-11-25 02:32:01.000000000 +0200
|
||||
+++ linux-5.4-aufs-mod/security/device_cgroup.c 2019-11-28 01:38:48.790894927 +0200
|
||||
@@ -824,3 +824,4 @@ int __devcgroup_check_permission(short t
|
||||
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(__devcgroup_check_permission);
|
||||
diff -Nurp linux-5.4-aufs/security/security.c linux-5.4-aufs-mod/security/security.c
|
||||
--- linux-5.4-aufs/security/security.c 2019-11-25 02:32:01.000000000 +0200
|
||||
+++ linux-5.4-aufs-mod/security/security.c 2019-11-28 01:38:48.794894926 +0200
|
||||
@@ -1036,6 +1036,7 @@ int security_path_rmdir(const struct pat
|
||||
return 0;
|
||||
return call_int_hook(path_rmdir, 0, dir, dentry);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_path_rmdir);
|
||||
|
||||
int security_path_unlink(const struct path *dir, struct dentry *dentry)
|
||||
{
|
||||
@@ -1052,6 +1053,7 @@ int security_path_symlink(const struct p
|
||||
return 0;
|
||||
return call_int_hook(path_symlink, 0, dir, dentry, old_name);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_path_symlink);
|
||||
|
||||
int security_path_link(struct dentry *old_dentry, const struct path *new_dir,
|
||||
struct dentry *new_dentry)
|
||||
@@ -1060,6 +1062,7 @@ int security_path_link(struct dentry *ol
|
||||
return 0;
|
||||
return call_int_hook(path_link, 0, old_dentry, new_dir, new_dentry);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_path_link);
|
||||
|
||||
int security_path_rename(const struct path *old_dir, struct dentry *old_dentry,
|
||||
const struct path *new_dir, struct dentry *new_dentry,
|
||||
@@ -1087,6 +1090,7 @@ int security_path_truncate(const struct
|
||||
return 0;
|
||||
return call_int_hook(path_truncate, 0, path);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_path_truncate);
|
||||
|
||||
int security_path_chmod(const struct path *path, umode_t mode)
|
||||
{
|
||||
@@ -1094,6 +1098,7 @@ int security_path_chmod(const struct pat
|
||||
return 0;
|
||||
return call_int_hook(path_chmod, 0, path, mode);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_path_chmod);
|
||||
|
||||
int security_path_chown(const struct path *path, kuid_t uid, kgid_t gid)
|
||||
{
|
||||
@@ -1101,6 +1106,7 @@ int security_path_chown(const struct pat
|
||||
return 0;
|
||||
return call_int_hook(path_chown, 0, path, uid, gid);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_path_chown);
|
||||
|
||||
int security_path_chroot(const struct path *path)
|
||||
{
|
||||
@@ -1201,6 +1207,7 @@ int security_inode_permission(struct ino
|
||||
return 0;
|
||||
return call_int_hook(inode_permission, 0, inode, mask);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_inode_permission);
|
||||
|
||||
int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
|
||||
{
|
||||
@@ -1378,6 +1385,7 @@ int security_file_permission(struct file
|
||||
|
||||
return fsnotify_perm(file, mask);
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(security_file_permission);
|
||||
|
||||
int security_file_alloc(struct file *file)
|
||||
{
|
||||
@@ -1,12 +0,0 @@
|
||||
diff -Nurp linux-5.3-aufs/include/uapi/linux/aufs_type.h linux-5.3-aufs-ver/include/uapi/linux/aufs_type.h
|
||||
--- linux-5.3-aufs/include/uapi/linux/aufs_type.h 2019-09-24 16:13:44.012259519 +0300
|
||||
+++ linux-5.3-aufs-ver/include/uapi/linux/aufs_type.h 2019-09-24 20:04:21.924707762 +0300
|
||||
@@ -27,7 +27,7 @@
|
||||
|
||||
#include <linux/limits.h>
|
||||
|
||||
-#define AUFS_VERSION "5.x-rcN"
|
||||
+#define AUFS_VERSION "5.4"
|
||||
|
||||
/* todo? move this to linux-2.6.19/include/magic.h */
|
||||
#define AUFS_SUPER_MAGIC ('a' << 24 | 'u' << 16 | 'f' << 8 | 's')
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,27 +0,0 @@
|
||||
|
||||
arm build fails with:
|
||||
|
||||
n file included from fs/aufs/aufs.h:31:0,
|
||||
from fs/aufs/module.c:11:
|
||||
fs/aufs/file.h: In function 'au_do_vm_file_reset':
|
||||
fs/aufs/file.h:273:9: error: dereferencing pointer to incomplete type 'struct vm_area_struct'
|
||||
f = vma->vm_file;
|
||||
^
|
||||
|
||||
on x86(64) we seem to get covered by implict inclusion.
|
||||
|
||||
So explicitly include it to avoid subtle breakage
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
---
|
||||
|
||||
--- ./fs/aufs/file.h.orig
|
||||
+++ ./fs/aufs/file.h
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/mm_types.h>
|
||||
#include <linux/poll.h>
|
||||
+#include <linux/vmalloc.h>
|
||||
#include "rwsem.h"
|
||||
|
||||
struct au_branch;
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,100 +0,0 @@
|
||||
Adapt mach64 to build with 2.6.31 series kernels
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mandriva.org>
|
||||
|
||||
diff -urp linux-2.6.31-rc3-git5-mnb1/drivers/gpu/drm/mach64/mach64_dma.c linux-2.6.31-rc3-git5-mnb1/drivers/gpu/drm/mach64.fixed/mach64_dma.c
|
||||
--- linux-2.6.31-rc3-git5-mnb1/drivers/gpu/drm/mach64/mach64_dma.c 2009-07-23 00:24:12.000000000 +0300
|
||||
+++ linux-2.6.31-rc3-git5-mnb1/drivers/gpu/drm/mach64.fixed/mach64_dma.c 2009-07-23 02:28:21.000000000 +0300
|
||||
@@ -1006,7 +1006,7 @@ static int mach64_do_dma_init(struct drm
|
||||
|
||||
DRM_DEBUG("\n");
|
||||
|
||||
- dev_priv = drm_alloc(sizeof(drm_mach64_private_t), DRM_MEM_DRIVER);
|
||||
+ dev_priv = kmalloc(sizeof(drm_mach64_private_t), GFP_KERNEL);
|
||||
if (dev_priv == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -1386,8 +1386,7 @@ int mach64_do_cleanup_dma(struct drm_dev
|
||||
|
||||
mach64_destroy_freelist(dev);
|
||||
|
||||
- drm_free(dev_priv, sizeof(drm_mach64_private_t),
|
||||
- DRM_MEM_DRIVER);
|
||||
+ kfree(dev_priv);
|
||||
dev->dev_private = NULL;
|
||||
}
|
||||
|
||||
@@ -1476,8 +1475,8 @@ int mach64_init_freelist(struct drm_devi
|
||||
for (i = 0; i < dma->buf_count; i++) {
|
||||
if ((entry =
|
||||
(drm_mach64_freelist_t *)
|
||||
- drm_alloc(sizeof(drm_mach64_freelist_t),
|
||||
- DRM_MEM_BUFLISTS)) == NULL)
|
||||
+ kmalloc(sizeof(drm_mach64_freelist_t),
|
||||
+ GFP_KERNEL)) == NULL)
|
||||
return -ENOMEM;
|
||||
memset(entry, 0, sizeof(drm_mach64_freelist_t));
|
||||
entry->buf = dma->buflist[i];
|
||||
@@ -1500,18 +1499,18 @@ void mach64_destroy_freelist(struct drm_
|
||||
list_for_each_safe(ptr, tmp, &dev_priv->pending) {
|
||||
list_del(ptr);
|
||||
entry = list_entry(ptr, drm_mach64_freelist_t, list);
|
||||
- drm_free(entry, sizeof(*entry), DRM_MEM_BUFLISTS);
|
||||
+ kfree(entry);
|
||||
}
|
||||
list_for_each_safe(ptr, tmp, &dev_priv->placeholders) {
|
||||
list_del(ptr);
|
||||
entry = list_entry(ptr, drm_mach64_freelist_t, list);
|
||||
- drm_free(entry, sizeof(*entry), DRM_MEM_BUFLISTS);
|
||||
+ kfree(entry);
|
||||
}
|
||||
|
||||
list_for_each_safe(ptr, tmp, &dev_priv->free_list) {
|
||||
list_del(ptr);
|
||||
entry = list_entry(ptr, drm_mach64_freelist_t, list);
|
||||
- drm_free(entry, sizeof(*entry), DRM_MEM_BUFLISTS);
|
||||
+ kfree(entry);
|
||||
}
|
||||
}
|
||||
|
||||
diff -urp linux-2.6.31-rc3-git5-mnb1/drivers/gpu/drm/mach64/mach64_state.c linux-2.6.31-rc3-git5-mnb1/drivers/gpu/drm/mach64.fixed/mach64_state.c
|
||||
--- linux-2.6.31-rc3-git5-mnb1/drivers/gpu/drm/mach64/mach64_state.c 2009-07-23 00:24:12.000000000 +0300
|
||||
+++ linux-2.6.31-rc3-git5-mnb1/drivers/gpu/drm/mach64.fixed/mach64_state.c 2009-07-23 02:29:24.000000000 +0300
|
||||
@@ -490,12 +490,12 @@ static __inline__ int copy_from_user_ver
|
||||
unsigned long n = bytes; /* dwords remaining in buffer */
|
||||
u32 *from, *orig_from;
|
||||
|
||||
- from = drm_alloc(bytes, DRM_MEM_DRIVER);
|
||||
+ from = kmalloc(bytes, GFP_KERNEL);
|
||||
if (from == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (DRM_COPY_FROM_USER(from, ufrom, bytes)) {
|
||||
- drm_free(from, bytes, DRM_MEM_DRIVER);
|
||||
+ kfree(from);
|
||||
return -EFAULT;
|
||||
}
|
||||
orig_from = from; /* we'll be modifying the "from" ptr, so save it */
|
||||
@@ -526,19 +526,19 @@ static __inline__ int copy_from_user_ver
|
||||
to += count;
|
||||
} else {
|
||||
DRM_ERROR("Got bad command: 0x%04x\n", reg);
|
||||
- drm_free(orig_from, bytes, DRM_MEM_DRIVER);
|
||||
+ kfree(orig_from);
|
||||
return -EACCES;
|
||||
}
|
||||
} else {
|
||||
DRM_ERROR
|
||||
("Got bad command count(=%u) dwords remaining=%lu\n",
|
||||
count, n);
|
||||
- drm_free(orig_from, bytes, DRM_MEM_DRIVER);
|
||||
+ kfree(orig_from);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
- drm_free(orig_from, bytes, DRM_MEM_DRIVER);
|
||||
+ kfree(orig_from);
|
||||
if (n == 0)
|
||||
return 0;
|
||||
else {
|
||||
@@ -1,27 +0,0 @@
|
||||
--- linux-2.6.35/drivers/gpu/drm/mach64/mach64_state.c.orig 2010-10-03 13:29:10.000000000 +0300
|
||||
+++ linux-2.6.35/drivers/gpu/drm/mach64/mach64_state.c 2010-10-03 14:04:45.991164007 +0300
|
||||
@@ -41,15 +41,15 @@
|
||||
*
|
||||
*/
|
||||
struct drm_ioctl_desc mach64_ioctls[] = {
|
||||
- DRM_IOCTL_DEF(DRM_MACH64_INIT, mach64_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
|
||||
- DRM_IOCTL_DEF(DRM_MACH64_CLEAR, mach64_dma_clear, DRM_AUTH),
|
||||
- DRM_IOCTL_DEF(DRM_MACH64_SWAP, mach64_dma_swap, DRM_AUTH),
|
||||
- DRM_IOCTL_DEF(DRM_MACH64_IDLE, mach64_dma_idle, DRM_AUTH),
|
||||
- DRM_IOCTL_DEF(DRM_MACH64_RESET, mach64_engine_reset, DRM_AUTH),
|
||||
- DRM_IOCTL_DEF(DRM_MACH64_VERTEX, mach64_dma_vertex, DRM_AUTH),
|
||||
- DRM_IOCTL_DEF(DRM_MACH64_BLIT, mach64_dma_blit, DRM_AUTH),
|
||||
- DRM_IOCTL_DEF(DRM_MACH64_FLUSH, mach64_dma_flush, DRM_AUTH),
|
||||
- DRM_IOCTL_DEF(DRM_MACH64_GETPARAM, mach64_get_param, DRM_AUTH),
|
||||
+ DRM_IOCTL_DEF_DRV(MACH64_INIT, mach64_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
|
||||
+ DRM_IOCTL_DEF_DRV(MACH64_CLEAR, mach64_dma_clear, DRM_AUTH),
|
||||
+ DRM_IOCTL_DEF_DRV(MACH64_SWAP, mach64_dma_swap, DRM_AUTH),
|
||||
+ DRM_IOCTL_DEF_DRV(MACH64_IDLE, mach64_dma_idle, DRM_AUTH),
|
||||
+ DRM_IOCTL_DEF_DRV(MACH64_RESET, mach64_engine_reset, DRM_AUTH),
|
||||
+ DRM_IOCTL_DEF_DRV(MACH64_VERTEX, mach64_dma_vertex, DRM_AUTH),
|
||||
+ DRM_IOCTL_DEF_DRV(MACH64_BLIT, mach64_dma_blit, DRM_AUTH),
|
||||
+ DRM_IOCTL_DEF_DRV(MACH64_FLUSH, mach64_dma_flush, DRM_AUTH),
|
||||
+ DRM_IOCTL_DEF_DRV(MACH64_GETPARAM, mach64_get_param, DRM_AUTH),
|
||||
};
|
||||
|
||||
int mach64_max_ioctl = DRM_ARRAY_SIZE(mach64_ioctls);
|
||||
@@ -1,24 +0,0 @@
|
||||
|
||||
Fix build for 2.6.37
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mandriva.org>
|
||||
|
||||
--- a/drivers/gpu/drm/mach64/mach64_drv.c.orig 2011-01-02 16:55:48.000000000 +0200
|
||||
+++ a/drivers/gpu/drm/mach64/mach64_drv.c 2011-01-02 17:53:54.808775632 +0200
|
||||
@@ -51,8 +51,6 @@ static struct drm_driver driver = {
|
||||
.irq_uninstall = mach64_driver_irq_uninstall,
|
||||
.irq_handler = mach64_driver_irq_handler,
|
||||
.reclaim_buffers = drm_core_reclaim_buffers,
|
||||
- .get_map_ofs = drm_core_get_map_ofs,
|
||||
- .get_reg_ofs = drm_core_get_reg_ofs,
|
||||
.ioctls = mach64_ioctls,
|
||||
.dma_ioctl = mach64_dma_buffers,
|
||||
.fops = {
|
||||
@@ -63,6 +61,7 @@ static struct drm_driver driver = {
|
||||
.mmap = drm_mmap,
|
||||
.poll = drm_poll,
|
||||
.fasync = drm_fasync,
|
||||
+ .llseek = noop_llseek,
|
||||
},
|
||||
.pci_driver = {
|
||||
.name = DRIVER_NAME,
|
||||
@@ -1,44 +0,0 @@
|
||||
|
||||
fix build with linux-3.0
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
drivers/gpu/drm/mach64/mach64_drv.c | 13 +++++++------
|
||||
1 file changed, 7 insertions(+), 6 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/mach64/mach64_drv.c.orig 2011-07-15 02:48:40.000000000 +0300
|
||||
+++ a/drivers/gpu/drm/mach64/mach64_drv.c 2011-07-15 13:24:41.454753025 +0300
|
||||
@@ -63,10 +63,6 @@ static struct drm_driver driver = {
|
||||
.fasync = drm_fasync,
|
||||
.llseek = noop_llseek,
|
||||
},
|
||||
- .pci_driver = {
|
||||
- .name = DRIVER_NAME,
|
||||
- .id_table = pciidlist,
|
||||
- },
|
||||
|
||||
.name = DRIVER_NAME,
|
||||
.desc = DRIVER_DESC,
|
||||
@@ -76,15 +72,20 @@ static struct drm_driver driver = {
|
||||
.patchlevel = DRIVER_PATCHLEVEL,
|
||||
};
|
||||
|
||||
+static struct pci_driver mach64_pci_driver = {
|
||||
+ .name = DRIVER_NAME,
|
||||
+ .id_table = pciidlist,
|
||||
+};
|
||||
+
|
||||
static int __init mach64_init(void)
|
||||
{
|
||||
driver.num_ioctls = mach64_max_ioctl;
|
||||
- return drm_init(&driver);
|
||||
+ return drm_pci_init(&driver, &mach64_pci_driver);
|
||||
}
|
||||
|
||||
static void __exit mach64_exit(void)
|
||||
{
|
||||
- drm_exit(&driver);
|
||||
+ drm_pci_exit(&driver, &mach64_pci_driver);
|
||||
}
|
||||
|
||||
module_init(mach64_init);
|
||||
@@ -1,17 +0,0 @@
|
||||
--- linux/drivers/gpu/drm/mach64/mach64_drv.c.orig 2013-10-13 12:19:41.000000000 +0300
|
||||
+++ linux/drivers/gpu/drm/mach64/mach64_drv.c 2013-10-13 14:27:25.684247911 +0300
|
||||
@@ -46,13 +46,12 @@ static const struct file_operations mach
|
||||
.unlocked_ioctl = drm_ioctl,
|
||||
.mmap = drm_mmap,
|
||||
.poll = drm_poll,
|
||||
- .fasync = drm_fasync,
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
||||
static struct drm_driver driver = {
|
||||
.driver_features =
|
||||
- DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_HAVE_DMA
|
||||
+ DRIVER_USE_AGP | DRIVER_PCI_DMA | DRIVER_HAVE_DMA
|
||||
| DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
|
||||
.lastclose = mach64_driver_lastclose,
|
||||
.get_vblank_counter = mach64_get_vblank_counter,
|
||||
@@ -1,31 +0,0 @@
|
||||
|
||||
Adapt for kernel-3.17
|
||||
|
||||
DRM_ARRAY_SIZE is a duplicate of ARRAY_SIZE and have been dropped.
|
||||
|
||||
drm_dev_to_irq has been dropped, so call dev->pdev->irq directly
|
||||
for code simplicity.
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
diff -urp linux/drivers/gpu/drm/mach64/mach64_state.c.orig linux/drivers/gpu/drm/mach64/mach64_state.c
|
||||
--- linux/drivers/gpu/drm/mach64/mach64_state.c.orig
|
||||
+++ linux/drivers/gpu/drm/mach64/mach64_state.c
|
||||
@@ -52,7 +52,7 @@ struct drm_ioctl_desc mach64_ioctls[] =
|
||||
DRM_IOCTL_DEF_DRV(MACH64_GETPARAM, mach64_get_param, DRM_AUTH),
|
||||
};
|
||||
|
||||
-int mach64_max_ioctl = DRM_ARRAY_SIZE(mach64_ioctls);
|
||||
+int mach64_max_ioctl = ARRAY_SIZE(mach64_ioctls);
|
||||
|
||||
/* ================================================================
|
||||
* DMA hardware state programming functions
|
||||
@@ -895,7 +895,7 @@ int mach64_get_param(struct drm_device *
|
||||
value = mach64_do_get_frames_queued(dev_priv);
|
||||
break;
|
||||
case MACH64_PARAM_IRQ_NR:
|
||||
- value = drm_dev_to_irq(dev);
|
||||
+ value = dev->pdev->irq;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -1,142 +0,0 @@
|
||||
|
||||
Fix build with kernel 3.18
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
diff -urp linux/drivers/gpu/drm/mach64.orig/mach64_dma.c linux/drivers/gpu/drm/mach64/mach64_dma.c
|
||||
--- linux/drivers/gpu/drm/mach64.orig/mach64_dma.c 2014-11-29 22:01:54.000000000 +0200
|
||||
+++ linux/drivers/gpu/drm/mach64/mach64_dma.c 2014-11-30 00:02:06.906821818 +0200
|
||||
@@ -1038,21 +1038,21 @@ static int mach64_do_dma_init(struct drm
|
||||
INIT_LIST_HEAD(&dev_priv->placeholders);
|
||||
INIT_LIST_HEAD(&dev_priv->pending);
|
||||
|
||||
- dev_priv->sarea = drm_getsarea(dev);
|
||||
+ dev_priv->sarea = drm_legacy_getsarea(dev);
|
||||
if (!dev_priv->sarea) {
|
||||
DRM_ERROR("can not find sarea!\n");
|
||||
dev->dev_private = (void *)dev_priv;
|
||||
mach64_do_cleanup_dma(dev);
|
||||
return -EINVAL;
|
||||
}
|
||||
- dev_priv->fb = drm_core_findmap(dev, init->fb_offset);
|
||||
+ dev_priv->fb = drm_legacy_findmap(dev, init->fb_offset);
|
||||
if (!dev_priv->fb) {
|
||||
DRM_ERROR("can not find frame buffer map!\n");
|
||||
dev->dev_private = (void *)dev_priv;
|
||||
mach64_do_cleanup_dma(dev);
|
||||
return -EINVAL;
|
||||
}
|
||||
- dev_priv->mmio = drm_core_findmap(dev, init->mmio_offset);
|
||||
+ dev_priv->mmio = drm_legacy_findmap(dev, init->mmio_offset);
|
||||
if (!dev_priv->mmio) {
|
||||
DRM_ERROR("can not find mmio map!\n");
|
||||
dev->dev_private = (void *)dev_priv;
|
||||
@@ -1060,7 +1060,7 @@ static int mach64_do_dma_init(struct drm
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- dev_priv->ring_map = drm_core_findmap(dev, init->ring_offset);
|
||||
+ dev_priv->ring_map = drm_legacy_findmap(dev, init->ring_offset);
|
||||
if (!dev_priv->ring_map) {
|
||||
DRM_ERROR("can not find ring map!\n");
|
||||
dev->dev_private = (void *)dev_priv;
|
||||
@@ -1072,7 +1072,7 @@ static int mach64_do_dma_init(struct drm
|
||||
((u8 *) dev_priv->sarea->handle + init->sarea_priv_offset);
|
||||
|
||||
if (!dev_priv->is_pci) {
|
||||
- drm_core_ioremap(dev_priv->ring_map, dev);
|
||||
+ drm_legacy_ioremap(dev_priv->ring_map, dev);
|
||||
if (!dev_priv->ring_map->handle) {
|
||||
DRM_ERROR("can not ioremap virtual address for"
|
||||
" descriptor ring\n");
|
||||
@@ -1082,7 +1082,7 @@ static int mach64_do_dma_init(struct drm
|
||||
}
|
||||
dev->agp_buffer_token = init->buffers_offset;
|
||||
dev->agp_buffer_map =
|
||||
- drm_core_findmap(dev, init->buffers_offset);
|
||||
+ drm_legacy_findmap(dev, init->buffers_offset);
|
||||
if (!dev->agp_buffer_map) {
|
||||
DRM_ERROR("can not find dma buffer map!\n");
|
||||
dev->dev_private = (void *)dev_priv;
|
||||
@@ -1093,7 +1093,7 @@ static int mach64_do_dma_init(struct drm
|
||||
dev isn't passed all the way though the mach64 - DA */
|
||||
dev_priv->dev_buffers = dev->agp_buffer_map;
|
||||
|
||||
- drm_core_ioremap(dev->agp_buffer_map, dev);
|
||||
+ drm_legacy_ioremap(dev->agp_buffer_map, dev);
|
||||
if (!dev->agp_buffer_map->handle) {
|
||||
DRM_ERROR("can not ioremap virtual address for"
|
||||
" dma buffer\n");
|
||||
@@ -1102,7 +1102,7 @@ static int mach64_do_dma_init(struct drm
|
||||
return -ENOMEM;
|
||||
}
|
||||
dev_priv->agp_textures =
|
||||
- drm_core_findmap(dev, init->agp_textures_offset);
|
||||
+ drm_legacy_findmap(dev, init->agp_textures_offset);
|
||||
if (!dev_priv->agp_textures) {
|
||||
DRM_ERROR("can not find agp texture region!\n");
|
||||
dev->dev_private = (void *)dev_priv;
|
||||
@@ -1376,10 +1376,10 @@ int mach64_do_cleanup_dma(struct drm_dev
|
||||
|
||||
if (!dev_priv->is_pci) {
|
||||
if (dev_priv->ring_map)
|
||||
- drm_core_ioremapfree(dev_priv->ring_map, dev);
|
||||
+ drm_legacy_ioremapfree(dev_priv->ring_map, dev);
|
||||
|
||||
if (dev->agp_buffer_map) {
|
||||
- drm_core_ioremapfree(dev->agp_buffer_map, dev);
|
||||
+ drm_legacy_ioremapfree(dev->agp_buffer_map, dev);
|
||||
dev->agp_buffer_map = NULL;
|
||||
}
|
||||
}
|
||||
diff -urp linux/drivers/gpu/drm/mach64.orig/mach64_drv.c linux/drivers/gpu/drm/mach64/mach64_drv.c
|
||||
--- linux/drivers/gpu/drm/mach64.orig/mach64_drv.c 2014-11-29 22:01:54.000000000 +0200
|
||||
+++ linux/drivers/gpu/drm/mach64/mach64_drv.c 2014-11-29 23:14:21.918009653 +0200
|
||||
@@ -34,6 +34,7 @@
|
||||
#include "mach64_drv.h"
|
||||
|
||||
#include <drm/drm_pciids.h>
|
||||
+#include <drm/drm_legacy.h>
|
||||
|
||||
static struct pci_device_id pciidlist[] = {
|
||||
mach64_PCI_IDS
|
||||
@@ -44,7 +45,7 @@ static const struct file_operations mach
|
||||
.open = drm_open,
|
||||
.release = drm_release,
|
||||
.unlocked_ioctl = drm_ioctl,
|
||||
- .mmap = drm_mmap,
|
||||
+ .mmap = drm_legacy_mmap,
|
||||
.poll = drm_poll,
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
diff -urp linux/drivers/gpu/drm/mach64.orig/mach64_drv.h linux/drivers/gpu/drm/mach64/mach64_drv.h
|
||||
--- linux/drivers/gpu/drm/mach64.orig/mach64_drv.h 2014-11-29 22:01:54.000000000 +0200
|
||||
+++ linux/drivers/gpu/drm/mach64/mach64_drv.h 2014-11-29 23:58:20.111491646 +0200
|
||||
@@ -35,6 +35,8 @@
|
||||
#ifndef __MACH64_DRV_H__
|
||||
#define __MACH64_DRV_H__
|
||||
|
||||
+#include <drm/drm_legacy.h>
|
||||
+
|
||||
/* General customization:
|
||||
*/
|
||||
|
||||
@@ -102,12 +104,12 @@ typedef struct drm_mach64_private {
|
||||
u32 back_offset_pitch;
|
||||
u32 depth_offset_pitch;
|
||||
|
||||
- drm_local_map_t *sarea;
|
||||
- drm_local_map_t *fb;
|
||||
- drm_local_map_t *mmio;
|
||||
- drm_local_map_t *ring_map;
|
||||
- drm_local_map_t *dev_buffers; /* this is a pointer to a structure in dev */
|
||||
- drm_local_map_t *agp_textures;
|
||||
+ struct drm_local_map *sarea;
|
||||
+ struct drm_local_map *fb;
|
||||
+ struct drm_local_map *mmio;
|
||||
+ struct drm_local_map *ring_map;
|
||||
+ struct drm_local_map *dev_buffers; /* this is a pointer to a structure in dev */
|
||||
+ struct drm_local_map *agp_textures;
|
||||
} drm_mach64_private_t;
|
||||
|
||||
extern struct drm_ioctl_desc mach64_ioctls[];
|
||||
@@ -1,47 +0,0 @@
|
||||
|
||||
This moves the .fops to a separate struct as required by kernel-3.3
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
b/drivers/gpu/drm/mach64/mach64_drv.c | 23 ++++++++++++-----------
|
||||
1 file changed, 12 insertions(+), 11 deletions(-)
|
||||
|
||||
--- a/drivers/gpu/drm/mach64/mach64_drv.c
|
||||
+++ b/drivers/gpu/drm/mach64/mach64_drv.c
|
||||
@@ -39,6 +39,17 @@ static struct pci_device_id pciidlist[]
|
||||
mach64_PCI_IDS
|
||||
};
|
||||
|
||||
+static const struct file_operations mach64_driver_fops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .open = drm_open,
|
||||
+ .release = drm_release,
|
||||
+ .unlocked_ioctl = drm_ioctl,
|
||||
+ .mmap = drm_mmap,
|
||||
+ .poll = drm_poll,
|
||||
+ .fasync = drm_fasync,
|
||||
+ .llseek = noop_llseek,
|
||||
+};
|
||||
+
|
||||
static struct drm_driver driver = {
|
||||
.driver_features =
|
||||
DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_HAVE_DMA
|
||||
@@ -54,17 +65,7 @@ static struct drm_driver driver = {
|
||||
.reclaim_buffers = drm_core_reclaim_buffers,
|
||||
.ioctls = mach64_ioctls,
|
||||
.dma_ioctl = mach64_dma_buffers,
|
||||
- .fops = {
|
||||
- .owner = THIS_MODULE,
|
||||
- .open = drm_open,
|
||||
- .release = drm_release,
|
||||
- .unlocked_ioctl = drm_ioctl,
|
||||
- .mmap = drm_mmap,
|
||||
- .poll = drm_poll,
|
||||
- .fasync = drm_fasync,
|
||||
- .llseek = noop_llseek,
|
||||
- },
|
||||
-
|
||||
+ .fops = &mach64_driver_fops,
|
||||
.name = DRIVER_NAME,
|
||||
.desc = DRIVER_DESC,
|
||||
.date = DRIVER_DATE,
|
||||
@@ -1,15 +0,0 @@
|
||||
|
||||
reclaim_buffers is gone in 3.6
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
--- linux/drivers/gpu/drm/mach64/mach64_drv.c.orig 2012-10-17 22:26:58.000000000 +0300
|
||||
+++ linux/drivers/gpu/drm/mach64/mach64_drv.c 2012-10-17 23:05:10.212566630 +0300
|
||||
@@ -62,7 +62,6 @@ static struct drm_driver driver = {
|
||||
.irq_postinstall = mach64_driver_irq_postinstall,
|
||||
.irq_uninstall = mach64_driver_irq_uninstall,
|
||||
.irq_handler = mach64_driver_irq_handler,
|
||||
- .reclaim_buffers = drm_core_reclaim_buffers,
|
||||
.ioctls = mach64_ioctls,
|
||||
.dma_ioctl = mach64_dma_buffers,
|
||||
.fops = &mach64_driver_fops,
|
||||
@@ -1,61 +0,0 @@
|
||||
diff -Nurp linux-3.7-rc8/drivers/gpu/drm/mach64.orig/mach64_dma.c linux-3.7-rc8/drivers/gpu/drm/mach64/mach64_dma.c
|
||||
--- linux-3.7-rc8/drivers/gpu/drm/mach64.orig/mach64_dma.c 2012-12-06 19:50:10.000000000 +0200
|
||||
+++ linux-3.7-rc8/drivers/gpu/drm/mach64/mach64_dma.c 2012-12-06 20:19:10.590681644 +0200
|
||||
@@ -34,8 +34,8 @@
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
-#include "drmP.h"
|
||||
-#include "drm.h"
|
||||
+#include <drm/drmP.h>
|
||||
+#include <drm/drm.h>
|
||||
#include "mach64_drm.h"
|
||||
#include "mach64_drv.h"
|
||||
|
||||
diff -Nurp linux-3.7-rc8/drivers/gpu/drm/mach64.orig/mach64_drv.c linux-3.7-rc8/drivers/gpu/drm/mach64/mach64_drv.c
|
||||
--- linux-3.7-rc8/drivers/gpu/drm/mach64.orig/mach64_drv.c 2012-12-06 19:50:10.000000000 +0200
|
||||
+++ linux-3.7-rc8/drivers/gpu/drm/mach64/mach64_drv.c 2012-12-06 20:20:13.062073838 +0200
|
||||
@@ -28,12 +28,12 @@
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
-#include "drmP.h"
|
||||
-#include "drm.h"
|
||||
+#include <drm/drmP.h>
|
||||
+#include <drm/drm.h>
|
||||
#include "mach64_drm.h"
|
||||
#include "mach64_drv.h"
|
||||
|
||||
-#include "drm_pciids.h"
|
||||
+#include <drm/drm_pciids.h>
|
||||
|
||||
static struct pci_device_id pciidlist[] = {
|
||||
mach64_PCI_IDS
|
||||
diff -Nurp linux-3.7-rc8/drivers/gpu/drm/mach64.orig/mach64_irq.c linux-3.7-rc8/drivers/gpu/drm/mach64/mach64_irq.c
|
||||
--- linux-3.7-rc8/drivers/gpu/drm/mach64.orig/mach64_irq.c 2012-12-06 19:50:10.000000000 +0200
|
||||
+++ linux-3.7-rc8/drivers/gpu/drm/mach64/mach64_irq.c 2012-12-06 20:20:40.192678476 +0200
|
||||
@@ -35,8 +35,8 @@
|
||||
* Leif Delgass <ldelgass@retinalburn.net>
|
||||
*/
|
||||
|
||||
-#include "drmP.h"
|
||||
-#include "drm.h"
|
||||
+#include <drm/drmP.h>
|
||||
+#include <drm/drm.h>
|
||||
#include "mach64_drm.h"
|
||||
#include "mach64_drv.h"
|
||||
|
||||
diff -Nurp linux-3.7-rc8/drivers/gpu/drm/mach64.orig/mach64_state.c linux-3.7-rc8/drivers/gpu/drm/mach64/mach64_state.c
|
||||
--- linux-3.7-rc8/drivers/gpu/drm/mach64.orig/mach64_state.c 2012-12-06 19:50:10.000000000 +0200
|
||||
+++ linux-3.7-rc8/drivers/gpu/drm/mach64/mach64_state.c 2012-12-06 20:21:00.783137370 +0200
|
||||
@@ -30,8 +30,8 @@
|
||||
* José Fonseca <j_r_fonseca@yahoo.co.uk>
|
||||
*/
|
||||
|
||||
-#include "drmP.h"
|
||||
-#include "drm.h"
|
||||
+#include <drm/drmP.h>
|
||||
+#include <drm/drm.h>
|
||||
#include "mach64_drm.h"
|
||||
#include "mach64_drv.h"
|
||||
|
||||
-20
@@ -1,20 +0,0 @@
|
||||
Update mach64 for changes in drm_ioctl done in 2.6.33:
|
||||
"drm: convert drm_ioctl to unlocked_ioctl" (commit ed8b670)
|
||||
|
||||
Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
|
||||
---
|
||||
drivers/gpu/drm/mach64/mach64_drv.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff -p -up linux-2.6.33/drivers/gpu/drm/mach64/mach64_drv.c.orig linux-2.6.33/drivers/gpu/drm/mach64/mach64_drv.c
|
||||
--- linux-2.6.33/drivers/gpu/drm/mach64/mach64_drv.c.orig 2010-03-16 19:27:22.517068880 -0300
|
||||
+++ linux-2.6.33/drivers/gpu/drm/mach64/mach64_drv.c 2010-03-16 19:27:54.890318416 -0300
|
||||
@@ -59,7 +59,7 @@ static struct drm_driver driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = drm_open,
|
||||
.release = drm_release,
|
||||
- .ioctl = drm_ioctl,
|
||||
+ .unlocked_ioctl = drm_ioctl,
|
||||
.mmap = drm_mmap,
|
||||
.poll = drm_poll,
|
||||
.fasync = drm_fasync,
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
diff -p -up linux-2.6.32/drivers/gpu/drm/mach64/mach64_dma.c.orig linux-2.6.32/drivers/gpu/drm/mach64/mach64_dma.c
|
||||
--- linux-2.6.32/drivers/gpu/drm/mach64/mach64_dma.c.orig 2010-01-06 11:35:13.784843304 -0200
|
||||
+++ linux-2.6.32/drivers/gpu/drm/mach64/mach64_dma.c 2010-01-06 11:37:50.793843502 -0200
|
||||
@@ -835,7 +835,7 @@ static int mach64_bm_dma_test(struct drm
|
||||
/* FIXME: get a dma buffer from the freelist here */
|
||||
DRM_DEBUG("Allocating data memory ...\n");
|
||||
cpu_addr_dmah =
|
||||
- drm_pci_alloc(dev, 0x1000, 0x1000, 0xfffffffful);
|
||||
+ drm_pci_alloc(dev, 0x1000, 0x1000);
|
||||
if (!cpu_addr_dmah) {
|
||||
DRM_INFO("data-memory allocation failed!\n");
|
||||
return -ENOMEM;
|
||||
@@ -1,97 +0,0 @@
|
||||
Fix/cleanup mach64 drm module for building with current kernel.
|
||||
|
||||
Signed-off-by: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
|
||||
|
||||
---
|
||||
drivers/gpu/drm/mach64/mach64_dma.c | 9 +--------
|
||||
drivers/gpu/drm/mach64/mach64_drv.c | 11 +----------
|
||||
drivers/gpu/drm/mach64/mach64_state.c | 4 ++--
|
||||
3 files changed, 4 insertions(+), 20 deletions(-)
|
||||
|
||||
diff -p -up linux-2.6.28/drivers/gpu/drm/mach64/mach64_dma.c.orig linux-2.6.28/drivers/gpu/drm/mach64/mach64_dma.c
|
||||
--- linux-2.6.28/drivers/gpu/drm/mach64/mach64_dma.c.orig 2008-12-10 12:19:14.000000000 -0500
|
||||
+++ linux-2.6.28/drivers/gpu/drm/mach64/mach64_dma.c 2008-12-10 13:34:19.000000000 -0500
|
||||
@@ -834,14 +834,8 @@ static int mach64_bm_dma_test(struct drm
|
||||
|
||||
/* FIXME: get a dma buffer from the freelist here */
|
||||
DRM_DEBUG("Allocating data memory ...\n");
|
||||
-#ifdef __FreeBSD__
|
||||
- DRM_UNLOCK();
|
||||
-#endif
|
||||
cpu_addr_dmah =
|
||||
drm_pci_alloc(dev, 0x1000, 0x1000, 0xfffffffful);
|
||||
-#ifdef __FreeBSD__
|
||||
- DRM_LOCK();
|
||||
-#endif
|
||||
if (!cpu_addr_dmah) {
|
||||
DRM_INFO("data-memory allocation failed!\n");
|
||||
return -ENOMEM;
|
||||
@@ -1375,8 +1369,7 @@ int mach64_do_cleanup_dma(struct drm_dev
|
||||
* may not have been called from userspace and after dev_private
|
||||
* is freed, it's too late.
|
||||
*/
|
||||
- if (dev->irq)
|
||||
- drm_irq_uninstall(dev);
|
||||
+ drm_irq_uninstall(dev);
|
||||
|
||||
if (dev->dev_private) {
|
||||
drm_mach64_private_t *dev_priv = dev->dev_private;
|
||||
diff -p -up linux-2.6.28/drivers/gpu/drm/mach64/mach64_drv.c.orig linux-2.6.28/drivers/gpu/drm/mach64/mach64_drv.c
|
||||
--- linux-2.6.28/drivers/gpu/drm/mach64/mach64_drv.c.orig 2008-12-10 12:13:13.000000000 -0500
|
||||
+++ linux-2.6.28/drivers/gpu/drm/mach64/mach64_drv.c 2008-12-10 12:16:54.000000000 -0500
|
||||
@@ -38,7 +38,6 @@ static struct pci_device_id pciidlist[]
|
||||
mach64_PCI_IDS
|
||||
};
|
||||
|
||||
-static int probe(struct pci_dev *pdev, const struct pci_device_id *ent);
|
||||
static struct drm_driver driver = {
|
||||
.driver_features =
|
||||
DRIVER_USE_AGP | DRIVER_USE_MTRR | DRIVER_PCI_DMA | DRIVER_HAVE_DMA
|
||||
@@ -68,8 +67,6 @@ static struct drm_driver driver = {
|
||||
.pci_driver = {
|
||||
.name = DRIVER_NAME,
|
||||
.id_table = pciidlist,
|
||||
- .probe = probe,
|
||||
- .remove = __devexit_p(drm_cleanup_pci),
|
||||
},
|
||||
|
||||
.name = DRIVER_NAME,
|
||||
@@ -80,16 +77,10 @@ static struct drm_driver driver = {
|
||||
.patchlevel = DRIVER_PATCHLEVEL,
|
||||
};
|
||||
|
||||
-static int probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
-{
|
||||
- return drm_get_dev(pdev, ent, &driver);
|
||||
-}
|
||||
-
|
||||
-
|
||||
static int __init mach64_init(void)
|
||||
{
|
||||
driver.num_ioctls = mach64_max_ioctl;
|
||||
- return drm_init(&driver, pciidlist);
|
||||
+ return drm_init(&driver);
|
||||
}
|
||||
|
||||
static void __exit mach64_exit(void)
|
||||
diff -p -up linux-2.6.28/drivers/gpu/drm/mach64/mach64_state.c.orig linux-2.6.28/drivers/gpu/drm/mach64/mach64_state.c
|
||||
--- linux-2.6.28/drivers/gpu/drm/mach64/mach64_state.c.orig 2008-12-10 12:13:13.000000000 -0500
|
||||
+++ linux-2.6.28/drivers/gpu/drm/mach64/mach64_state.c 2008-12-10 13:38:54.000000000 -0500
|
||||
@@ -455,7 +455,7 @@ static int mach64_do_get_frames_queued(d
|
||||
head = ring->head;
|
||||
|
||||
start = (MACH64_MAX_QUEUED_FRAMES -
|
||||
- DRM_MIN(MACH64_MAX_QUEUED_FRAMES, sarea_priv->frames_queued));
|
||||
+ min(MACH64_MAX_QUEUED_FRAMES, sarea_priv->frames_queued));
|
||||
|
||||
if (head == tail) {
|
||||
sarea_priv->frames_queued = 0;
|
||||
@@ -895,7 +895,7 @@ int mach64_get_param(struct drm_device *
|
||||
value = mach64_do_get_frames_queued(dev_priv);
|
||||
break;
|
||||
case MACH64_PARAM_IRQ_NR:
|
||||
- value = dev->irq;
|
||||
+ value = drm_dev_to_irq(dev);
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
@@ -1,10 +0,0 @@
|
||||
--- linux/drivers/gpu/drm/mach64/mach64_drv.c.orig 2011-12-25 00:48:42.814932355 +0200
|
||||
+++ linux/drivers/gpu/drm/mach64/mach64_drv.c 2011-12-25 00:47:43.393625260 +0200
|
||||
@@ -27,6 +27,7 @@
|
||||
* Leif Delgass <ldelgass@retinalburn.net>
|
||||
*/
|
||||
|
||||
+#include <linux/module.h>
|
||||
#include "drmP.h"
|
||||
#include "drm.h"
|
||||
#include "mach64_drm.h"
|
||||
-102
@@ -1,102 +0,0 @@
|
||||
|
||||
Fix build with kernel-3.14
|
||||
|
||||
Signed-off-by: Thomas Backlund <tmb@mageia.org>
|
||||
|
||||
drivers/gpu/drm/mach64/mach64_dma.c | 10 +++++-----
|
||||
drivers/gpu/drm/mach64/mach64_drv.h | 2 +-
|
||||
drivers/gpu/drm/mach64/mach64_irq.c | 2 +-
|
||||
drivers/gpu/drm/mach64/mach64_state.c | 6 +++---
|
||||
4 files changed, 10 insertions(+), 10 deletions(-)
|
||||
|
||||
diff -urp linux/drivers/gpu/drm/mach64.orig/mach64_dma.c linux/drivers/gpu/drm/mach64/mach64_dma.c
|
||||
--- linux/drivers/gpu/drm/mach64.orig/mach64_dma.c 2014-04-26 19:10:55.000000000 +0300
|
||||
+++ linux/drivers/gpu/drm/mach64/mach64_dma.c 2014-04-26 20:26:05.263501325 +0300
|
||||
@@ -696,9 +696,9 @@ do { \
|
||||
DRM_INFO( "ADVANCE_RING() wr=0x%06x tail=0x%06x\n", \
|
||||
_ring_write, _ring_tail ); \
|
||||
} \
|
||||
- DRM_MEMORYBARRIER(); \
|
||||
+ mb(); \
|
||||
mach64_clear_dma_eol( &_ring[(_ring_tail - 2) & _ring_mask] ); \
|
||||
- DRM_MEMORYBARRIER(); \
|
||||
+ mb(); \
|
||||
dev_priv->ring.tail = _ring_write; \
|
||||
mach64_ring_tick( dev_priv, &(dev_priv)->ring ); \
|
||||
} while (0)
|
||||
@@ -912,7 +912,7 @@ static int mach64_bm_dma_test(struct drm
|
||||
DRM_DEBUG(" data[%d] = 0x%08x\n", i, data[i]);
|
||||
}
|
||||
|
||||
- DRM_MEMORYBARRIER();
|
||||
+ mb();
|
||||
|
||||
DRM_DEBUG("waiting for idle...\n");
|
||||
if ((i = mach64_do_wait_for_idle(dev_priv))) {
|
||||
@@ -1716,10 +1716,10 @@ static int mach64_dma_get_buffers(struct
|
||||
|
||||
buf->file_priv = file_priv;
|
||||
|
||||
- if (DRM_COPY_TO_USER(&d->request_indices[i], &buf->idx,
|
||||
+ if (copy_to_user(&d->request_indices[i], &buf->idx,
|
||||
sizeof(buf->idx)))
|
||||
return -EFAULT;
|
||||
- if (DRM_COPY_TO_USER(&d->request_sizes[i], &buf->total,
|
||||
+ if (copy_to_user(&d->request_sizes[i], &buf->total,
|
||||
sizeof(buf->total)))
|
||||
return -EFAULT;
|
||||
|
||||
diff -urp linux/drivers/gpu/drm/mach64.orig/mach64_drv.h linux/drivers/gpu/drm/mach64/mach64_drv.h
|
||||
--- linux/drivers/gpu/drm/mach64.orig/mach64_drv.h 2014-04-26 19:10:55.000000000 +0300
|
||||
+++ linux/drivers/gpu/drm/mach64/mach64_drv.h 2014-04-26 20:28:43.693457652 +0300
|
||||
@@ -166,7 +166,7 @@ extern int mach64_get_param(struct drm_d
|
||||
extern u32 mach64_get_vblank_counter(struct drm_device *dev, int crtc);
|
||||
extern int mach64_enable_vblank(struct drm_device *dev, int crtc);
|
||||
extern void mach64_disable_vblank(struct drm_device *dev, int crtc);
|
||||
-extern irqreturn_t mach64_driver_irq_handler(DRM_IRQ_ARGS);
|
||||
+extern irqreturn_t mach64_driver_irq_handler(int irq, void *arg);
|
||||
extern void mach64_driver_irq_preinstall(struct drm_device *dev);
|
||||
extern int mach64_driver_irq_postinstall(struct drm_device *dev);
|
||||
extern void mach64_driver_irq_uninstall(struct drm_device *dev);
|
||||
diff -urp linux/drivers/gpu/drm/mach64.orig/mach64_irq.c linux/drivers/gpu/drm/mach64/mach64_irq.c
|
||||
--- linux/drivers/gpu/drm/mach64.orig/mach64_irq.c 2014-04-26 19:10:55.000000000 +0300
|
||||
+++ linux/drivers/gpu/drm/mach64/mach64_irq.c 2014-04-26 20:32:01.464898140 +0300
|
||||
@@ -40,7 +40,7 @@
|
||||
#include "mach64_drm.h"
|
||||
#include "mach64_drv.h"
|
||||
|
||||
-irqreturn_t mach64_driver_irq_handler(DRM_IRQ_ARGS)
|
||||
+irqreturn_t mach64_driver_irq_handler(int irq, void *arg)
|
||||
{
|
||||
struct drm_device *dev = arg;
|
||||
drm_mach64_private_t *dev_priv = dev->dev_private;
|
||||
diff -urp linux/drivers/gpu/drm/mach64.orig/mach64_state.c linux/drivers/gpu/drm/mach64/mach64_state.c
|
||||
--- linux/drivers/gpu/drm/mach64.orig/mach64_state.c 2014-04-26 19:10:55.000000000 +0300
|
||||
+++ linux/drivers/gpu/drm/mach64/mach64_state.c 2014-04-26 20:07:16.701527488 +0300
|
||||
@@ -494,7 +494,7 @@ static __inline__ int copy_from_user_ver
|
||||
if (from == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
- if (DRM_COPY_FROM_USER(from, ufrom, bytes)) {
|
||||
+ if (copy_from_user(from, ufrom, bytes)) {
|
||||
kfree(from);
|
||||
return -EFAULT;
|
||||
}
|
||||
@@ -640,7 +640,7 @@ static __inline__ int copy_from_user_bli
|
||||
{
|
||||
to = (u32 *)((char *)to + MACH64_HOSTDATA_BLIT_OFFSET);
|
||||
|
||||
- if (DRM_COPY_FROM_USER(to, ufrom, bytes)) {
|
||||
+ if (copy_from_user(to, ufrom, bytes)) {
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@@ -901,7 +901,7 @@ int mach64_get_param(struct drm_device *
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
- if (DRM_COPY_TO_USER(param->value, &value, sizeof(int))) {
|
||||
+ if (copy_to_user(param->value, &value, sizeof(int))) {
|
||||
DRM_ERROR("copy_to_user\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
-38
@@ -1,38 +0,0 @@
|
||||
Theese got dropped in 3.12-rc
|
||||
|
||||
Restore for now to get the mach64 driver to build
|
||||
|
||||
TODO: Need to check mesa & drm if it's dropped there too...
|
||||
|
||||
--- linux/include/drm/drm_pciids.h.orig 2013-10-13 11:05:33.000000000 +0300
|
||||
+++ linux/include/drm/drm_pciids.h 2013-10-13 14:30:43.625995248 +0300
|
||||
@@ -711,6 +711,29 @@
|
||||
{0x102b, 0x2527, PCI_ANY_ID, PCI_ANY_ID, 0, 0, MGA_CARD_TYPE_G550}, \
|
||||
{0, 0, 0}
|
||||
|
||||
+#define mach64_PCI_IDS \
|
||||
+ {0x1002, 0x4749, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4750, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4751, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4742, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4744, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4c49, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4c50, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4c51, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4c42, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4c44, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x474c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x474f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4752, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4753, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x474d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x474e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4c52, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4c53, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4c4d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0x1002, 0x4c4e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
+ {0, 0, 0}
|
||||
+
|
||||
#define sisdrv_PCI_IDS \
|
||||
{0x1039, 0x0300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
{0x1039, 0x5300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
|
||||
File diff suppressed because it is too large
Load Diff
-37
@@ -1,37 +0,0 @@
|
||||
Subject: Add blacklist of usb hid modules
|
||||
|
||||
IBM Blade Center HS20 can connect PS2 kerboard and mouse, It is USB emulation.
|
||||
This devices need HID_QUIRK_IGNORE option.
|
||||
|
||||
This patch is workaround.
|
||||
|
||||
[ rediffed for 2.6.28 -- herton ]
|
||||
Signed-off-by: Go Taniguchi <go@turbolinux.co.jp>
|
||||
|
||||
---
|
||||
drivers/hid/hid-core.c | 2 ++
|
||||
drivers/hid/hid-ids.h | 2 ++
|
||||
2 files changed, 4 insertions(+)
|
||||
|
||||
--- a/drivers/hid/hid-core.c
|
||||
+++ b/drivers/hid/hid-core.c
|
||||
@@ -2062,6 +2062,8 @@ static const struct hid_device_id hid_ig
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1005) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1006) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_GTCO, USB_DEVICE_ID_GTCO_1007) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_IBM, 0x4001) },
|
||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_IBM, 0x4002) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_JABRA, USB_DEVICE_ID_JABRA_SPEAK_410) },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_JABRA, USB_DEVICE_ID_JABRA_SPEAK_510) },
|
||||
--- a/drivers/hid/hid-ids.h
|
||||
+++ b/drivers/hid/hid-ids.h
|
||||
@@ -46,6 +46,8 @@
|
||||
#define USB_VENDOR_ID_AFATECH 0x15a4
|
||||
#define USB_DEVICE_ID_AFATECH_AF9016 0x9016
|
||||
|
||||
+#define USB_VENDOR_ID_IBM 0x04b3
|
||||
+
|
||||
#define USB_VENDOR_ID_AIPTEK 0x08ca
|
||||
#define USB_DEVICE_ID_AIPTEK_01 0x0001
|
||||
#define USB_DEVICE_ID_AIPTEK_10 0x0010
|
||||
-70
@@ -1,70 +0,0 @@
|
||||
From 9af0a9aecdb945cd5513941ffdcbcc031009b402 Mon Sep 17 00:00:00 2001
|
||||
From: Guenter Roeck <linux@roeck-us.net>
|
||||
Date: Mon, 4 Sep 2017 18:33:53 -0700
|
||||
Subject: hwmon: (k10temp) Add support for family 17h
|
||||
|
||||
Add support for temperature sensors on Family 17h (Ryzen) processors.
|
||||
|
||||
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
|
||||
---
|
||||
drivers/hwmon/k10temp.c | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c
|
||||
index fc8076c..c4dac53 100644
|
||||
--- a/drivers/hwmon/k10temp.c
|
||||
+++ b/drivers/hwmon/k10temp.c
|
||||
@@ -36,6 +36,10 @@ MODULE_PARM_DESC(force, "force loading on processors with erratum 319");
|
||||
/* Provide lock for writing to NB_SMU_IND_ADDR */
|
||||
static DEFINE_MUTEX(nb_smu_ind_mutex);
|
||||
|
||||
+#ifndef PCI_DEVICE_ID_AMD_17H_DF_F3
|
||||
+#define PCI_DEVICE_ID_AMD_17H_DF_F3 0x1463
|
||||
+#endif
|
||||
+
|
||||
/* CPUID function 0x80000001, ebx */
|
||||
#define CPUID_PKGTYPE_MASK 0xf0000000
|
||||
#define CPUID_PKGTYPE_F 0x00000000
|
||||
@@ -61,6 +65,9 @@ static DEFINE_MUTEX(nb_smu_ind_mutex);
|
||||
*/
|
||||
#define F15H_M60H_REPORTED_TEMP_CTRL_OFFSET 0xd8200ca4
|
||||
|
||||
+/* F17h M01h Access througn SMN */
|
||||
+#define F17H_M01H_REPORTED_TEMP_CTRL_OFFSET 0x00059800
|
||||
+
|
||||
struct k10temp_data {
|
||||
struct pci_dev *pdev;
|
||||
void (*read_tempreg)(struct pci_dev *pdev, u32 *regval);
|
||||
@@ -88,6 +95,12 @@ static void read_tempreg_nb_f15(struct pci_dev *pdev, u32 *regval)
|
||||
F15H_M60H_REPORTED_TEMP_CTRL_OFFSET, regval);
|
||||
}
|
||||
|
||||
+static void read_tempreg_nb_f17(struct pci_dev *pdev, u32 *regval)
|
||||
+{
|
||||
+ amd_nb_index_read(pdev, PCI_DEVFN(0, 0), 0x60,
|
||||
+ F17H_M01H_REPORTED_TEMP_CTRL_OFFSET, regval);
|
||||
+}
|
||||
+
|
||||
static ssize_t temp1_input_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
@@ -224,6 +237,8 @@ static int k10temp_probe(struct pci_dev *pdev,
|
||||
if (boot_cpu_data.x86 == 0x15 && (boot_cpu_data.x86_model == 0x60 ||
|
||||
boot_cpu_data.x86_model == 0x70))
|
||||
data->read_tempreg = read_tempreg_nb_f15;
|
||||
+ else if (boot_cpu_data.x86 == 0x17)
|
||||
+ data->read_tempreg = read_tempreg_nb_f17;
|
||||
else
|
||||
data->read_tempreg = read_tempreg_pci;
|
||||
|
||||
@@ -242,6 +257,7 @@ static const struct pci_device_id k10temp_id_table[] = {
|
||||
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_15H_M60H_NB_F3) },
|
||||
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_16H_NB_F3) },
|
||||
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_16H_M30H_NB_F3) },
|
||||
+ { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_17H_DF_F3) },
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, k10temp_id_table);
|
||||
--
|
||||
cgit v1.1
|
||||
|
||||
-80
@@ -1,80 +0,0 @@
|
||||
From 1b50b776355fa6c6d7b3281a63c275d5c18d629d Mon Sep 17 00:00:00 2001
|
||||
From: Guenter Roeck <linux@roeck-us.net>
|
||||
Date: Mon, 4 Sep 2017 18:33:53 -0700
|
||||
Subject: hwmon: (k10temp) Add support for temperature offsets
|
||||
|
||||
Add support for handling temperature offset values for various AMD CPUs,
|
||||
similar to the code used in the coretemp driver for Intel CPUs. This is
|
||||
primarily for Ryzen CPUs (which has documented temperature offsets),
|
||||
but the code is kept generic to simplify adding additional CPUs.
|
||||
|
||||
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
|
||||
---
|
||||
drivers/hwmon/k10temp.c | 30 ++++++++++++++++++++++++++++++
|
||||
1 file changed, 30 insertions(+)
|
||||
|
||||
diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c
|
||||
index c4dac53..46a54ed 100644
|
||||
--- a/drivers/hwmon/k10temp.c
|
||||
+++ b/drivers/hwmon/k10temp.c
|
||||
@@ -71,6 +71,24 @@ static DEFINE_MUTEX(nb_smu_ind_mutex);
|
||||
struct k10temp_data {
|
||||
struct pci_dev *pdev;
|
||||
void (*read_tempreg)(struct pci_dev *pdev, u32 *regval);
|
||||
+ int temp_offset;
|
||||
+};
|
||||
+
|
||||
+struct tctl_offset {
|
||||
+ u8 model;
|
||||
+ char const *id;
|
||||
+ int offset;
|
||||
+};
|
||||
+
|
||||
+static const struct tctl_offset tctl_offset_table[] = {
|
||||
+ { 0x17, "AMD Ryzen 7 1600X", 20000 },
|
||||
+ { 0x17, "AMD Ryzen 7 1700X", 20000 },
|
||||
+ { 0x17, "AMD Ryzen 7 1800X", 20000 },
|
||||
+ { 0x17, "AMD Ryzen Threadripper 1950X", 27000 },
|
||||
+ { 0x17, "AMD Ryzen Threadripper 1920X", 27000 },
|
||||
+ { 0x17, "AMD Ryzen Threadripper 1950", 10000 },
|
||||
+ { 0x17, "AMD Ryzen Threadripper 1920", 10000 },
|
||||
+ { 0x17, "AMD Ryzen Threadripper 1910", 10000 },
|
||||
};
|
||||
|
||||
static void read_tempreg_pci(struct pci_dev *pdev, u32 *regval)
|
||||
@@ -110,6 +128,7 @@ static ssize_t temp1_input_show(struct device *dev,
|
||||
|
||||
data->read_tempreg(data->pdev, ®val);
|
||||
temp = (regval >> 21) * 125;
|
||||
+ temp -= data->temp_offset;
|
||||
|
||||
return sprintf(buf, "%u\n", temp);
|
||||
}
|
||||
@@ -217,6 +236,7 @@ static int k10temp_probe(struct pci_dev *pdev,
|
||||
struct device *dev = &pdev->dev;
|
||||
struct k10temp_data *data;
|
||||
struct device *hwmon_dev;
|
||||
+ int i;
|
||||
|
||||
if (unreliable) {
|
||||
if (!force) {
|
||||
@@ -242,6 +262,16 @@ static int k10temp_probe(struct pci_dev *pdev,
|
||||
else
|
||||
data->read_tempreg = read_tempreg_pci;
|
||||
|
||||
+ for (i = 0; i < ARRAY_SIZE(tctl_offset_table); i++) {
|
||||
+ const struct tctl_offset *entry = &tctl_offset_table[i];
|
||||
+
|
||||
+ if (boot_cpu_data.x86 == entry->model &&
|
||||
+ strstr(boot_cpu_data.x86_model_id, entry->id)) {
|
||||
+ data->temp_offset = entry->offset;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
hwmon_dev = devm_hwmon_device_register_with_groups(dev, "k10temp", data,
|
||||
k10temp_groups);
|
||||
return PTR_ERR_OR_ZERO(hwmon_dev);
|
||||
--
|
||||
cgit v1.1
|
||||
|
||||
-132
@@ -1,132 +0,0 @@
|
||||
From 68546abf7a3a63f199e53d6dcaa7375df37a6aaa Mon Sep 17 00:00:00 2001
|
||||
From: Guenter Roeck <linux@roeck-us.net>
|
||||
Date: Mon, 4 Sep 2017 18:33:53 -0700
|
||||
Subject: hwmon: (k10temp) Move chip specific code into probe function
|
||||
|
||||
Introduce a local data structure and determine the temperature read
|
||||
function at probe time to reduce runtime complexity.
|
||||
|
||||
Signed-off-by: Guenter Roeck <linux@roeck-us.net>
|
||||
---
|
||||
drivers/hwmon/k10temp.c | 62 +++++++++++++++++++++++++++++++++++--------------
|
||||
1 file changed, 45 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/drivers/hwmon/k10temp.c b/drivers/hwmon/k10temp.c
|
||||
index ce3b91f..fc8076c 100644
|
||||
--- a/drivers/hwmon/k10temp.c
|
||||
+++ b/drivers/hwmon/k10temp.c
|
||||
@@ -61,31 +61,44 @@ static DEFINE_MUTEX(nb_smu_ind_mutex);
|
||||
*/
|
||||
#define F15H_M60H_REPORTED_TEMP_CTRL_OFFSET 0xd8200ca4
|
||||
|
||||
-static void amd_nb_smu_index_read(struct pci_dev *pdev, unsigned int devfn,
|
||||
- int offset, u32 *val)
|
||||
+struct k10temp_data {
|
||||
+ struct pci_dev *pdev;
|
||||
+ void (*read_tempreg)(struct pci_dev *pdev, u32 *regval);
|
||||
+};
|
||||
+
|
||||
+static void read_tempreg_pci(struct pci_dev *pdev, u32 *regval)
|
||||
+{
|
||||
+ pci_read_config_dword(pdev, REG_REPORTED_TEMPERATURE, regval);
|
||||
+}
|
||||
+
|
||||
+static void amd_nb_index_read(struct pci_dev *pdev, unsigned int devfn,
|
||||
+ unsigned int base, int offset, u32 *val)
|
||||
{
|
||||
mutex_lock(&nb_smu_ind_mutex);
|
||||
pci_bus_write_config_dword(pdev->bus, devfn,
|
||||
- 0xb8, offset);
|
||||
+ base, offset);
|
||||
pci_bus_read_config_dword(pdev->bus, devfn,
|
||||
- 0xbc, val);
|
||||
+ base + 4, val);
|
||||
mutex_unlock(&nb_smu_ind_mutex);
|
||||
}
|
||||
|
||||
+static void read_tempreg_nb_f15(struct pci_dev *pdev, u32 *regval)
|
||||
+{
|
||||
+ amd_nb_index_read(pdev, PCI_DEVFN(0, 0), 0xb8,
|
||||
+ F15H_M60H_REPORTED_TEMP_CTRL_OFFSET, regval);
|
||||
+}
|
||||
+
|
||||
static ssize_t temp1_input_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
+ struct k10temp_data *data = dev_get_drvdata(dev);
|
||||
u32 regval;
|
||||
- struct pci_dev *pdev = dev_get_drvdata(dev);
|
||||
-
|
||||
- if (boot_cpu_data.x86 == 0x15 && boot_cpu_data.x86_model == 0x60) {
|
||||
- amd_nb_smu_index_read(pdev, PCI_DEVFN(0, 0),
|
||||
- F15H_M60H_REPORTED_TEMP_CTRL_OFFSET,
|
||||
- ®val);
|
||||
- } else {
|
||||
- pci_read_config_dword(pdev, REG_REPORTED_TEMPERATURE, ®val);
|
||||
- }
|
||||
- return sprintf(buf, "%u\n", (regval >> 21) * 125);
|
||||
+ unsigned int temp;
|
||||
+
|
||||
+ data->read_tempreg(data->pdev, ®val);
|
||||
+ temp = (regval >> 21) * 125;
|
||||
+
|
||||
+ return sprintf(buf, "%u\n", temp);
|
||||
}
|
||||
|
||||
static ssize_t temp1_max_show(struct device *dev,
|
||||
@@ -98,11 +111,12 @@ static ssize_t show_temp_crit(struct device *dev,
|
||||
struct device_attribute *devattr, char *buf)
|
||||
{
|
||||
struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
|
||||
+ struct k10temp_data *data = dev_get_drvdata(dev);
|
||||
int show_hyst = attr->index;
|
||||
u32 regval;
|
||||
int value;
|
||||
|
||||
- pci_read_config_dword(dev_get_drvdata(dev),
|
||||
+ pci_read_config_dword(data->pdev,
|
||||
REG_HARDWARE_THERMAL_CONTROL, ®val);
|
||||
value = ((regval >> 16) & 0x7f) * 500 + 52000;
|
||||
if (show_hyst)
|
||||
@@ -119,7 +133,8 @@ static umode_t k10temp_is_visible(struct kobject *kobj,
|
||||
struct attribute *attr, int index)
|
||||
{
|
||||
struct device *dev = container_of(kobj, struct device, kobj);
|
||||
- struct pci_dev *pdev = dev_get_drvdata(dev);
|
||||
+ struct k10temp_data *data = dev_get_drvdata(dev);
|
||||
+ struct pci_dev *pdev = data->pdev;
|
||||
|
||||
if (index >= 2) {
|
||||
u32 reg_caps, reg_htc;
|
||||
@@ -187,6 +202,7 @@ static int k10temp_probe(struct pci_dev *pdev,
|
||||
{
|
||||
int unreliable = has_erratum_319(pdev);
|
||||
struct device *dev = &pdev->dev;
|
||||
+ struct k10temp_data *data;
|
||||
struct device *hwmon_dev;
|
||||
|
||||
if (unreliable) {
|
||||
@@ -199,7 +215,19 @@ static int k10temp_probe(struct pci_dev *pdev,
|
||||
"unreliable CPU thermal sensor; check erratum 319\n");
|
||||
}
|
||||
|
||||
- hwmon_dev = devm_hwmon_device_register_with_groups(dev, "k10temp", pdev,
|
||||
+ data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
|
||||
+ if (!data)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
+ data->pdev = pdev;
|
||||
+
|
||||
+ if (boot_cpu_data.x86 == 0x15 && (boot_cpu_data.x86_model == 0x60 ||
|
||||
+ boot_cpu_data.x86_model == 0x70))
|
||||
+ data->read_tempreg = read_tempreg_nb_f15;
|
||||
+ else
|
||||
+ data->read_tempreg = read_tempreg_pci;
|
||||
+
|
||||
+ hwmon_dev = devm_hwmon_device_register_with_groups(dev, "k10temp", data,
|
||||
k10temp_groups);
|
||||
return PTR_ERR_OR_ZERO(hwmon_dev);
|
||||
}
|
||||
--
|
||||
cgit v1.1
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
---
|
||||
drivers/ide/sis5513.c | 9 +++++++++
|
||||
1 file changed, 9 insertions(+)
|
||||
|
||||
diff -p -up linux-2.6.28/drivers/ide/sis5513.c.orig linux-2.6.28/drivers/ide/sis5513.c
|
||||
--- linux-2.6.28/drivers/ide/sis5513.c.orig 2008-12-08 12:41:13.000000000 -0500
|
||||
+++ linux-2.6.28/drivers/ide/sis5513.c 2008-12-08 12:51:32.000000000 -0500
|
||||
@@ -412,6 +412,15 @@ static int __devinit sis_find_family(str
|
||||
pci_name(dev));
|
||||
}
|
||||
}
|
||||
+ else if (trueid == 0x180) { /* sis965L */
|
||||
+ u16 pci_command;
|
||||
+ pci_read_config_word(dev, PCI_COMMAND, &pci_command);
|
||||
+ pci_command &= ~PCI_COMMAND_INTX_DISABLE;
|
||||
+ pci_write_config_word(dev, PCI_COMMAND, pci_command);
|
||||
+ chipset_family = ATA_133;
|
||||
+ printk(KERN_INFO DRV_NAME " %s: SiS 965 IDE UDMA133 controller\n",
|
||||
+ pci_name(dev));
|
||||
+ }
|
||||
}
|
||||
|
||||
if (!chipset_family) { /* Belongs to pci-quirks */
|
||||
-18
@@ -1,18 +0,0 @@
|
||||
--- a/drivers/input/touchscreen/goodix.c
|
||||
+++ a/drivers/input/touchscreen/goodix.c
|
||||
@@ -947,6 +954,7 @@ static SIMPLE_DEV_PM_OPS(goodix_pm_ops, goodix_suspend, goodix_resume);
|
||||
|
||||
static const struct i2c_device_id goodix_ts_id[] = {
|
||||
{ "GDIX1001:00", 0 },
|
||||
+ { "GDIX1002:00", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, goodix_ts_id);
|
||||
@@ -954,6 +962,7 @@ MODULE_DEVICE_TABLE(i2c, goodix_ts_id);
|
||||
#ifdef CONFIG_ACPI
|
||||
static const struct acpi_device_id goodix_acpi_match[] = {
|
||||
{ "GDIX1001", 0 },
|
||||
+ { "GDIX1002", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, goodix_acpi_match);
|
||||
-60
@@ -1,60 +0,0 @@
|
||||
From faec44b6838312484d63e82286087cf2d5ebb891 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Fri, 12 Jan 2018 00:36:48 -0800
|
||||
Subject: [PATCH] Input: goodix - disable IRQs while suspended
|
||||
|
||||
We should not try to do any i2c transfers before the controller is
|
||||
resumed (which happens before our resume method gets called).
|
||||
|
||||
So we need to disable our IRQ while suspended to enforce this. The
|
||||
code paths for devices with GPIOs for the int and reset pins already
|
||||
disable the IRQ the through goodix_free_irq().
|
||||
|
||||
This commit also disables the IRQ while suspended for devices without
|
||||
GPIOs for the int and reset pins.
|
||||
|
||||
This fixes the i2c bus sometimes getting stuck after a suspend/resume
|
||||
causing the touchscreen to sometimes not work after a suspend/resume.
|
||||
This has been tested on a GPD pocked device.
|
||||
|
||||
BugLink: https://github.com/nexus511/gpd-ubuntu-packages/issues/10
|
||||
BugLink: https://www.reddit.com/r/GPDPocket/comments/7niut2/fix_for_broken_touch_after_resume_all_linux/
|
||||
Tested-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Reviewed-by: Bastien Nocera <hadess@hadess.net>
|
||||
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
||||
---
|
||||
drivers/input/touchscreen/goodix.c | 8 ++++++--
|
||||
1 file changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/input/touchscreen/goodix.c b/drivers/input/touchscreen/goodix.c
|
||||
index 69d0b8cbc71f..ecec8eb17f28 100644
|
||||
--- a/drivers/input/touchscreen/goodix.c
|
||||
+++ b/drivers/input/touchscreen/goodix.c
|
||||
@@ -878,8 +878,10 @@ static int __maybe_unused goodix_suspend(struct device *dev)
|
||||
int error;
|
||||
|
||||
/* We need gpio pins to suspend/resume */
|
||||
- if (!ts->gpiod_int || !ts->gpiod_rst)
|
||||
+ if (!ts->gpiod_int || !ts->gpiod_rst) {
|
||||
+ disable_irq(client->irq);
|
||||
return 0;
|
||||
+ }
|
||||
|
||||
wait_for_completion(&ts->firmware_loading_complete);
|
||||
|
||||
@@ -919,8 +921,10 @@ static int __maybe_unused goodix_resume(struct device *dev)
|
||||
struct goodix_ts_data *ts = i2c_get_clientdata(client);
|
||||
int error;
|
||||
|
||||
- if (!ts->gpiod_int || !ts->gpiod_rst)
|
||||
+ if (!ts->gpiod_int || !ts->gpiod_rst) {
|
||||
+ enable_irq(client->irq);
|
||||
return 0;
|
||||
+ }
|
||||
|
||||
/*
|
||||
* Exit sleep mode by outputting HIGH level to INT pin
|
||||
--
|
||||
2.16.2
|
||||
|
||||
-47
@@ -1,47 +0,0 @@
|
||||
From 993b3a3f80a7842a48cd46c2b41e1b3ef6302468 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Fri, 24 Oct 2014 14:55:24 -0700
|
||||
Subject: [PATCH] Input: i8042 - quirks for Fujitsu Lifebook A544 and Lifebook
|
||||
AH544
|
||||
|
||||
These models need i8042.notimeout, otherwise the touchpad will not work.
|
||||
|
||||
BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=69731
|
||||
BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1111138
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
|
||||
---
|
||||
drivers/input/serio/i8042-x86ia64io.h | 16 ++++++++++++++++
|
||||
1 file changed, 16 insertions(+)
|
||||
|
||||
diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
|
||||
index a0bcbb6..aa9b299 100644
|
||||
--- a/drivers/input/serio/i8042-x86ia64io.h
|
||||
+++ b/drivers/input/serio/i8042-x86ia64io.h
|
||||
@@ -364,6 +364,22 @@ static const struct dmi_system_id __initconst i8042_dmi_notimeout_table[] = {
|
||||
},
|
||||
},
|
||||
{
|
||||
+ /* Fujitsu A544 laptop */
|
||||
+ /* https://bugzilla.redhat.com/show_bug.cgi?id=1111138 */
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
|
||||
+ DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK A544"),
|
||||
+ },
|
||||
+ },
|
||||
+ {
|
||||
+ /* Fujitsu AH544 laptop */
|
||||
+ /* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
|
||||
+ DMI_MATCH(DMI_PRODUCT_NAME, "LIFEBOOK AH544"),
|
||||
+ },
|
||||
+ },
|
||||
+ {
|
||||
/* Fujitsu U574 laptop */
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=69731 */
|
||||
.matches = {
|
||||
--
|
||||
2.1.2
|
||||
|
||||
-13
@@ -1,13 +0,0 @@
|
||||
diff --git a/drivers/media/video/pwc/pwc-if.c b/drivers/media/video/pwc/pwc-if.c
|
||||
index f976df4..32c883b 100644
|
||||
--- a/drivers/media/usb/pwc/pwc-if.c
|
||||
+++ b/drivers/media/usb/pwc/pwc-if.c
|
||||
@@ -119,7 +119,7 @@ static void usb_pwc_disconnect(struct us
|
||||
static void pwc_isoc_cleanup(struct pwc_device *pdev);
|
||||
|
||||
static struct usb_driver pwc_driver = {
|
||||
- .name = "Philips webcam", /* name */
|
||||
+ .name = "pwc", /* name */
|
||||
.id_table = pwc_device_table,
|
||||
.probe = usb_pwc_probe, /* probe() */
|
||||
.disconnect = usb_pwc_disconnect, /* disconnect() */
|
||||
-58
@@ -1,58 +0,0 @@
|
||||
From 7222708e823afc98dfb769d36bf2f26b6420b7ce Mon Sep 17 00:00:00 2001
|
||||
From: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
|
||||
Date: Mon, 22 Jan 2018 12:22:30 +0300
|
||||
Subject: [PATCH] mm, page_vma_mapped: Introduce pfn_in_hpage()
|
||||
|
||||
The new helper would check if the pfn belongs to the page. For huge
|
||||
pages it checks if the PFN is within range covered by the huge page.
|
||||
|
||||
The helper is used in check_pte(). The original code the helper replaces
|
||||
had two call to page_to_pfn(). page_to_pfn() is relatively costly.
|
||||
|
||||
Although current GCC is able to optimize code to have one call, it's
|
||||
better to do this explicitly.
|
||||
|
||||
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
mm/page_vma_mapped.c | 17 +++++++++--------
|
||||
1 file changed, 9 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/mm/page_vma_mapped.c b/mm/page_vma_mapped.c
|
||||
index 956015614395..ae3c2a35d61b 100644
|
||||
--- a/mm/page_vma_mapped.c
|
||||
+++ b/mm/page_vma_mapped.c
|
||||
@@ -30,6 +30,14 @@ static bool map_pte(struct page_vma_mapped_walk *pvmw)
|
||||
return true;
|
||||
}
|
||||
|
||||
+static inline bool pfn_in_hpage(struct page *hpage, unsigned long pfn)
|
||||
+{
|
||||
+ unsigned long hpage_pfn = page_to_pfn(hpage);
|
||||
+
|
||||
+ /* THP can be referenced by any subpage */
|
||||
+ return pfn >= hpage_pfn && pfn - hpage_pfn < hpage_nr_pages(hpage);
|
||||
+}
|
||||
+
|
||||
/**
|
||||
* check_pte - check if @pvmw->page is mapped at the @pvmw->pte
|
||||
*
|
||||
@@ -78,14 +86,7 @@ static bool check_pte(struct page_vma_mapped_walk *pvmw)
|
||||
pfn = pte_pfn(*pvmw->pte);
|
||||
}
|
||||
|
||||
- if (pfn < page_to_pfn(pvmw->page))
|
||||
- return false;
|
||||
-
|
||||
- /* THP can be referenced by any subpage */
|
||||
- if (pfn - page_to_pfn(pvmw->page) >= hpage_nr_pages(pvmw->page))
|
||||
- return false;
|
||||
-
|
||||
- return true;
|
||||
+ return pfn_in_hpage(pvmw->page, pfn);
|
||||
}
|
||||
|
||||
/**
|
||||
--
|
||||
2.16.1
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user