linux 3.4-rc1
This commit is contained in:
parent
5e9e2f5b16
commit
d8c9baa910
@ -1,58 +0,0 @@
|
|||||||
commit 64b3db22c04586997ab4be46dd5a5b99f8a2d390 (2.6.39),
|
|
||||||
"Remove use of unreliable FADT revision field" causes regression
|
|
||||||
for old P4 systems because now cst_control and other fields are
|
|
||||||
not reset to 0.
|
|
||||||
|
|
||||||
The effect is that acpi_processor_power_init will notice
|
|
||||||
cst_control != 0 and a write to CST_CNT register is performed
|
|
||||||
that should not happen. As result, the system oopses after the
|
|
||||||
"No _CST, giving up" message, sometimes in acpi_ns_internalize_name,
|
|
||||||
sometimes in acpi_ns_get_type, usually at random places. May be
|
|
||||||
during migration to CPU 1 in acpi_processor_get_throttling.
|
|
||||||
|
|
||||||
Every one of these settings help to avoid this problem:
|
|
||||||
- acpi=off
|
|
||||||
- processor.nocst=1
|
|
||||||
- maxcpus=1
|
|
||||||
|
|
||||||
The fix is to update acpi_gbl_FADT.header.length after
|
|
||||||
the original value is used to check for old revisions.
|
|
||||||
|
|
||||||
Signed-off-by: Julian Anastasov <ja@ssi.bg>
|
|
||||||
---
|
|
||||||
drivers/acpi/acpica/tbfadt.c | 8 ++++----
|
|
||||||
1 files changed, 4 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/acpi/acpica/tbfadt.c b/drivers/acpi/acpica/tbfadt.c
|
|
||||||
index c5d8704..4c9c760 100644
|
|
||||||
--- a/drivers/acpi/acpica/tbfadt.c
|
|
||||||
+++ b/drivers/acpi/acpica/tbfadt.c
|
|
||||||
@@ -363,10 +363,6 @@ static void acpi_tb_convert_fadt(void)
|
|
||||||
u32 address32;
|
|
||||||
u32 i;
|
|
||||||
|
|
||||||
- /* Update the local FADT table header length */
|
|
||||||
-
|
|
||||||
- acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt);
|
|
||||||
-
|
|
||||||
/*
|
|
||||||
* Expand the 32-bit FACS and DSDT addresses to 64-bit as necessary.
|
|
||||||
* Later code will always use the X 64-bit field. Also, check for an
|
|
||||||
@@ -408,6 +404,10 @@ static void acpi_tb_convert_fadt(void)
|
|
||||||
acpi_gbl_FADT.boot_flags = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* Update the local FADT table header length */
|
|
||||||
+
|
|
||||||
+ acpi_gbl_FADT.header.length = sizeof(struct acpi_table_fadt);
|
|
||||||
+
|
|
||||||
/*
|
|
||||||
* Expand the ACPI 1.0 32-bit addresses to the ACPI 2.0 64-bit "X"
|
|
||||||
* generic address structures as necessary. Later code will always use
|
|
||||||
--
|
|
||||||
1.7.3.4
|
|
||||||
|
|
||||||
--
|
|
||||||
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
|
|
||||||
the body of a message to majordomo@vger.kernel.org
|
|
||||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
|
@ -1,146 +0,0 @@
|
|||||||
From 9a056a5843ff83db987d6e18625f4a2ee64b5450 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Matthew Garrett <mjg@redhat.com>
|
|
||||||
Date: Tue, 30 Aug 2011 10:07:24 -0400
|
|
||||||
Subject: [PATCH] ACPI: Ensure thermal limits match CPU frequencies
|
|
||||||
|
|
||||||
The ACPI thermal management code supports slowing down a CPU when it's
|
|
||||||
overheating. Right now that's done by choosing to run it at 100%, 75%, 50%
|
|
||||||
or 25% of full speed. However, most CPUs do not allow an arbitrary
|
|
||||||
frequency to be set and so will run at the first frequency below that value.
|
|
||||||
This doesn't match the intent of the specification, which is to drop the
|
|
||||||
frequency state by state until the temperature stabalises. Fix this up
|
|
||||||
so it uses actual frequencies rather than percentages.
|
|
||||||
|
|
||||||
Reported by: Gene Snider <snider6982@comcast.net>
|
|
||||||
Signed-off-by: Matthew Garrett <mjg@redhat.com>
|
|
||||||
---
|
|
||||||
drivers/acpi/Kconfig | 1 +
|
|
||||||
drivers/acpi/processor_thermal.c | 45 +++++++++++++++++++++----------------
|
|
||||||
2 files changed, 26 insertions(+), 20 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
|
|
||||||
index de0e3df..7d1bdb5 100644
|
|
||||||
--- a/drivers/acpi/Kconfig
|
|
||||||
+++ b/drivers/acpi/Kconfig
|
|
||||||
@@ -185,6 +185,7 @@ config ACPI_PROCESSOR
|
|
||||||
tristate "Processor"
|
|
||||||
select THERMAL
|
|
||||||
select CPU_IDLE
|
|
||||||
+ select CPU_FREQ_TABLE
|
|
||||||
default y
|
|
||||||
help
|
|
||||||
This driver installs ACPI as the idle handler for Linux and uses
|
|
||||||
diff --git a/drivers/acpi/processor_thermal.c b/drivers/acpi/processor_thermal.c
|
|
||||||
index 870550d..1c4eb60 100644
|
|
||||||
--- a/drivers/acpi/processor_thermal.c
|
|
||||||
+++ b/drivers/acpi/processor_thermal.c
|
|
||||||
@@ -52,10 +52,8 @@ ACPI_MODULE_NAME("processor_thermal");
|
|
||||||
* _any_ cpufreq driver and not only the acpi-cpufreq driver.
|
|
||||||
*/
|
|
||||||
|
|
||||||
-#define CPUFREQ_THERMAL_MIN_STEP 0
|
|
||||||
-#define CPUFREQ_THERMAL_MAX_STEP 3
|
|
||||||
|
|
||||||
-static DEFINE_PER_CPU(unsigned int, cpufreq_thermal_reduction_pctg);
|
|
||||||
+static DEFINE_PER_CPU(unsigned int, cpufreq_thermal_limit_state);
|
|
||||||
static unsigned int acpi_thermal_cpufreq_is_init = 0;
|
|
||||||
|
|
||||||
static int cpu_has_cpufreq(unsigned int cpu)
|
|
||||||
@@ -70,19 +68,19 @@ static int acpi_thermal_cpufreq_notifier(struct notifier_block *nb,
|
|
||||||
unsigned long event, void *data)
|
|
||||||
{
|
|
||||||
struct cpufreq_policy *policy = data;
|
|
||||||
- unsigned long max_freq = 0;
|
|
||||||
+ int state = per_cpu(cpufreq_thermal_limit_state, policy->cpu);
|
|
||||||
+ struct cpufreq_frequency_table *table;
|
|
||||||
|
|
||||||
if (event != CPUFREQ_ADJUST)
|
|
||||||
- goto out;
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ table = cpufreq_frequency_get_table(policy->cpu);
|
|
||||||
|
|
||||||
- max_freq = (
|
|
||||||
- policy->cpuinfo.max_freq *
|
|
||||||
- (100 - per_cpu(cpufreq_thermal_reduction_pctg, policy->cpu) * 20)
|
|
||||||
- ) / 100;
|
|
||||||
+ if (!table)
|
|
||||||
+ return 0;
|
|
||||||
|
|
||||||
- cpufreq_verify_within_limits(policy, 0, max_freq);
|
|
||||||
+ cpufreq_verify_within_limits(policy, 0, table[state].frequency);
|
|
||||||
|
|
||||||
- out:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -92,10 +90,21 @@ static struct notifier_block acpi_thermal_cpufreq_notifier_block = {
|
|
||||||
|
|
||||||
static int cpufreq_get_max_state(unsigned int cpu)
|
|
||||||
{
|
|
||||||
+ int count = 0;
|
|
||||||
+ struct cpufreq_frequency_table *table;
|
|
||||||
+
|
|
||||||
if (!cpu_has_cpufreq(cpu))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
- return CPUFREQ_THERMAL_MAX_STEP;
|
|
||||||
+ table = cpufreq_frequency_get_table(cpu);
|
|
||||||
+
|
|
||||||
+ if (!table)
|
|
||||||
+ return 0;
|
|
||||||
+
|
|
||||||
+ while (table[count].frequency != CPUFREQ_TABLE_END)
|
|
||||||
+ count++;
|
|
||||||
+
|
|
||||||
+ return count;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cpufreq_get_cur_state(unsigned int cpu)
|
|
||||||
@@ -103,7 +112,7 @@ static int cpufreq_get_cur_state(unsigned int cpu)
|
|
||||||
if (!cpu_has_cpufreq(cpu))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
- return per_cpu(cpufreq_thermal_reduction_pctg, cpu);
|
|
||||||
+ return per_cpu(cpufreq_thermal_limit_state, cpu);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cpufreq_set_cur_state(unsigned int cpu, int state)
|
|
||||||
@@ -111,7 +120,7 @@ static int cpufreq_set_cur_state(unsigned int cpu, int state)
|
|
||||||
if (!cpu_has_cpufreq(cpu))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
- per_cpu(cpufreq_thermal_reduction_pctg, cpu) = state;
|
|
||||||
+ per_cpu(cpufreq_thermal_limit_state, cpu) = state;
|
|
||||||
cpufreq_update_policy(cpu);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -122,7 +131,7 @@ void acpi_thermal_cpufreq_init(void)
|
|
||||||
|
|
||||||
for (i = 0; i < nr_cpu_ids; i++)
|
|
||||||
if (cpu_present(i))
|
|
||||||
- per_cpu(cpufreq_thermal_reduction_pctg, i) = 0;
|
|
||||||
+ per_cpu(cpufreq_thermal_limit_state, i) = 0;
|
|
||||||
|
|
||||||
i = cpufreq_register_notifier(&acpi_thermal_cpufreq_notifier_block,
|
|
||||||
CPUFREQ_POLICY_NOTIFIER);
|
|
||||||
@@ -170,15 +179,11 @@ int acpi_processor_get_limit_info(struct acpi_processor *pr)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
-/* thermal coolign device callbacks */
|
|
||||||
+/* thermal cooling device callbacks */
|
|
||||||
static int acpi_processor_max_state(struct acpi_processor *pr)
|
|
||||||
{
|
|
||||||
int max_state = 0;
|
|
||||||
|
|
||||||
- /*
|
|
||||||
- * There exists four states according to
|
|
||||||
- * cpufreq_thermal_reduction_ptg. 0, 1, 2, 3
|
|
||||||
- */
|
|
||||||
max_state += cpufreq_get_max_state(pr->id);
|
|
||||||
if (pr->flags.throttling)
|
|
||||||
max_state += (pr->throttling.state_count -1);
|
|
||||||
--
|
|
||||||
1.7.6
|
|
||||||
|
|
@ -39,7 +39,7 @@ CONFIG_TASK_DELAY_ACCT=y
|
|||||||
CONFIG_TASK_XACCT=y
|
CONFIG_TASK_XACCT=y
|
||||||
CONFIG_TASK_IO_ACCOUNTING=y
|
CONFIG_TASK_IO_ACCOUNTING=y
|
||||||
CONFIG_SYSCTL=y
|
CONFIG_SYSCTL=y
|
||||||
CONFIG_LOG_BUF_SHIFT=17
|
CONFIG_LOG_BUF_SHIFT=18
|
||||||
# CONFIG_IKCONFIG is not set
|
# CONFIG_IKCONFIG is not set
|
||||||
# CONFIG_EMBEDDED is not set
|
# CONFIG_EMBEDDED is not set
|
||||||
# CONFIG_EXPERT is not set
|
# CONFIG_EXPERT is not set
|
||||||
|
20
kernel.spec
20
kernel.spec
@ -62,7 +62,7 @@ Summary: The Linux kernel
|
|||||||
# For non-released -rc kernels, this will be appended after the rcX and
|
# For non-released -rc kernels, this will be appended after the rcX and
|
||||||
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
|
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
|
||||||
#
|
#
|
||||||
%global baserelease 2
|
%global baserelease 1
|
||||||
%global fedora_build %{baserelease}
|
%global fedora_build %{baserelease}
|
||||||
|
|
||||||
# base_sublevel is the kernel version we're starting with and patching
|
# base_sublevel is the kernel version we're starting with and patching
|
||||||
@ -93,9 +93,9 @@ Summary: The Linux kernel
|
|||||||
# The next upstream release sublevel (base_sublevel+1)
|
# The next upstream release sublevel (base_sublevel+1)
|
||||||
%define upstream_sublevel %(echo $((%{base_sublevel} + 1)))
|
%define upstream_sublevel %(echo $((%{base_sublevel} + 1)))
|
||||||
# The rc snapshot level
|
# The rc snapshot level
|
||||||
%define rcrev 0
|
%define rcrev 1
|
||||||
# The git snapshot level
|
# The git snapshot level
|
||||||
%define gitrev 4
|
%define gitrev 0
|
||||||
# Set rpm version accordingly
|
# Set rpm version accordingly
|
||||||
%define rpmversion 3.%{upstream_sublevel}.0
|
%define rpmversion 3.%{upstream_sublevel}.0
|
||||||
%endif
|
%endif
|
||||||
@ -657,7 +657,6 @@ Patch162: nx-emu-remove-cpuinitdata-for-disable_nx-on-x86_32.patch
|
|||||||
Patch390: linux-2.6-defaults-acpi-video.patch
|
Patch390: linux-2.6-defaults-acpi-video.patch
|
||||||
Patch391: linux-2.6-acpi-video-dos.patch
|
Patch391: linux-2.6-acpi-video-dos.patch
|
||||||
Patch394: linux-2.6-acpi-debug-infinite-loop.patch
|
Patch394: linux-2.6-acpi-debug-infinite-loop.patch
|
||||||
Patch395: acpi-ensure-thermal-limits-match-cpu-freq.patch
|
|
||||||
Patch396: acpi-sony-nonvs-blacklist.patch
|
Patch396: acpi-sony-nonvs-blacklist.patch
|
||||||
|
|
||||||
Patch450: linux-2.6-input-kill-stupid-messages.patch
|
Patch450: linux-2.6-input-kill-stupid-messages.patch
|
||||||
@ -733,9 +732,6 @@ Patch21235: scsi-sd_revalidate_disk-prevent-NULL-ptr-deref.patch
|
|||||||
|
|
||||||
Patch21260: x86-Avoid-invoking-RCU-when-CPU-is-idle.patch
|
Patch21260: x86-Avoid-invoking-RCU-when-CPU-is-idle.patch
|
||||||
|
|
||||||
#rhbz 727865 730007
|
|
||||||
Patch21300: ACPICA-Fix-regression-in-FADT-revision-checks.patch
|
|
||||||
|
|
||||||
#rhbz 804007
|
#rhbz 804007
|
||||||
Patch21305: mac80211-fix-possible-tid_rx-reorder_timer-use-after-free.patch
|
Patch21305: mac80211-fix-possible-tid_rx-reorder_timer-use-after-free.patch
|
||||||
|
|
||||||
@ -1331,7 +1327,6 @@ ApplyPatch arm-tegra-nvec-kconfig.patch
|
|||||||
ApplyPatch linux-2.6-defaults-acpi-video.patch
|
ApplyPatch linux-2.6-defaults-acpi-video.patch
|
||||||
ApplyPatch linux-2.6-acpi-video-dos.patch
|
ApplyPatch linux-2.6-acpi-video-dos.patch
|
||||||
ApplyPatch linux-2.6-acpi-debug-infinite-loop.patch
|
ApplyPatch linux-2.6-acpi-debug-infinite-loop.patch
|
||||||
ApplyPatch acpi-ensure-thermal-limits-match-cpu-freq.patch
|
|
||||||
ApplyPatch acpi-sony-nonvs-blacklist.patch
|
ApplyPatch acpi-sony-nonvs-blacklist.patch
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -1422,9 +1417,6 @@ ApplyPatch power-x86-destdir.patch
|
|||||||
#rhbz 754518
|
#rhbz 754518
|
||||||
ApplyPatch scsi-sd_revalidate_disk-prevent-NULL-ptr-deref.patch
|
ApplyPatch scsi-sd_revalidate_disk-prevent-NULL-ptr-deref.patch
|
||||||
|
|
||||||
#rhbz 727865 730007
|
|
||||||
ApplyPatch ACPICA-Fix-regression-in-FADT-revision-checks.patch
|
|
||||||
|
|
||||||
#rhbz 804007
|
#rhbz 804007
|
||||||
ApplyPatch mac80211-fix-possible-tid_rx-reorder_timer-use-after-free.patch
|
ApplyPatch mac80211-fix-possible-tid_rx-reorder_timer-use-after-free.patch
|
||||||
|
|
||||||
@ -2291,6 +2283,12 @@ fi
|
|||||||
# ||----w |
|
# ||----w |
|
||||||
# || ||
|
# || ||
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Apr 02 2012 Justin M. Forbes <jforbes@redhat.com> - 3.4.0-0.rc1
|
||||||
|
- Linux v3.4-rc1
|
||||||
|
|
||||||
|
* Fri Mar 30 2012 Justin M. Forbes <jforbes@redhat.com> - 3.4.0-0.rc0.git5.1
|
||||||
|
- Linux v3.3-9295-gf52b69f
|
||||||
|
|
||||||
* Thu Mar 29 2012 Justin M. Forbes <jforbes@redhat.com> - 3.4.0-0.rc0.git4.1
|
* Thu Mar 29 2012 Justin M. Forbes <jforbes@redhat.com> - 3.4.0-0.rc0.git4.1
|
||||||
- Linux v3.3-8839-gb5174fa
|
- Linux v3.3-8839-gb5174fa
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
--- linux-2.6.34.noarch/drivers/acpi/acpica/acconfig.h~ 2010-07-01 14:49:03.000000000 -0400
|
--- linux-2.6.34.noarch/include/acpi/acconfig.h~ 2010-07-01 14:49:03.000000000 -0400
|
||||||
+++ linux-2.6.34.noarch/drivers/acpi/acpica/acconfig.h 2010-07-01 14:49:17.000000000 -0400
|
+++ linux-2.6.34.noarch/include/acpi/acconfig.h 2010-07-01 14:49:17.000000000 -0400
|
||||||
@@ -117,7 +117,7 @@
|
@@ -117,7 +117,7 @@
|
||||||
|
|
||||||
/* Maximum number of While() loop iterations before forced abort */
|
/* Maximum number of While() loop iterations before forced abort */
|
||||||
|
@ -4,42 +4,3 @@
|
|||||||
# Please add the errors from gcc before the diffs to save others having
|
# Please add the errors from gcc before the diffs to save others having
|
||||||
# to do a compile to figure out what your diff is fixing. Thanks.
|
# to do a compile to figure out what your diff is fixing. Thanks.
|
||||||
#
|
#
|
||||||
# ../../lib/rbtree.c:24:26: fatal error: linux/export.h: No such file or directory
|
|
||||||
diff --git a/tools/perf/Makefile b/tools/perf/Makefile
|
|
||||||
index b492e3a..2f42886 100644
|
|
||||||
--- a/tools/perf/Makefile
|
|
||||||
+++ b/tools/perf/Makefile
|
|
||||||
@@ -251,7 +251,7 @@ LIB_H += util/include/linux/const.h
|
|
||||||
LIB_H += util/include/linux/ctype.h
|
|
||||||
LIB_H += util/include/linux/kernel.h
|
|
||||||
LIB_H += util/include/linux/list.h
|
|
||||||
-LIB_H += util/include/linux/module.h
|
|
||||||
+LIB_H += util/include/linux/export.h
|
|
||||||
LIB_H += util/include/linux/poison.h
|
|
||||||
LIB_H += util/include/linux/prefetch.h
|
|
||||||
LIB_H += util/include/linux/rbtree.h
|
|
||||||
diff --git a/tools/perf/util/include/linux/export.h b/tools/perf/util/include/linux/export.h
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..b43e2dc
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tools/perf/util/include/linux/export.h
|
|
||||||
@@ -0,0 +1,6 @@
|
|
||||||
+#ifndef PERF_LINUX_MODULE_H
|
|
||||||
+#define PERF_LINUX_MODULE_H
|
|
||||||
+
|
|
||||||
+#define EXPORT_SYMBOL(name)
|
|
||||||
+
|
|
||||||
+#endif
|
|
||||||
diff --git a/tools/perf/util/include/linux/module.h b/tools/perf/util/include/linux/module.h
|
|
||||||
deleted file mode 100644
|
|
||||||
index b43e2dc..0000000
|
|
||||||
--- a/tools/perf/util/include/linux/module.h
|
|
||||||
+++ /dev/null
|
|
||||||
@@ -1,6 +0,0 @@
|
|
||||||
-#ifndef PERF_LINUX_MODULE_H
|
|
||||||
-#define PERF_LINUX_MODULE_H
|
|
||||||
-
|
|
||||||
-#define EXPORT_SYMBOL(name)
|
|
||||||
-
|
|
||||||
-#endif
|
|
||||||
--
|
|
||||||
|
@ -333,9 +333,9 @@ index 4d42300..4cb14a1 100644
|
|||||||
+#endif /*CONFIG_X86_32*/
|
+#endif /*CONFIG_X86_32*/
|
||||||
+
|
+
|
||||||
tsk->thread.error_code = error_code;
|
tsk->thread.error_code = error_code;
|
||||||
tsk->thread.trap_no = 13;
|
tsk->thread.trap_nr = X86_TRAP_GP;
|
||||||
|
|
||||||
@@ -650,19 +745,37 @@ do_device_not_available(struct pt_regs *regs, long error_code)
|
@@ -650,20 +745,37 @@ do_device_not_available(struct pt_regs *regs, long error_code)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
@ -362,10 +362,11 @@ index 4d42300..4cb14a1 100644
|
|||||||
- info.si_errno = 0;
|
- info.si_errno = 0;
|
||||||
- info.si_code = ILL_BADSTK;
|
- info.si_code = ILL_BADSTK;
|
||||||
- info.si_addr = NULL;
|
- info.si_addr = NULL;
|
||||||
- if (notify_die(DIE_TRAP, "iret exception",
|
- if (notify_die(DIE_TRAP, "iret exception", regs, error_code,
|
||||||
- regs, error_code, 32, SIGILL) == NOTIFY_STOP)
|
- X86_TRAP_IRET, SIGILL) == NOTIFY_STOP)
|
||||||
- return;
|
- return;
|
||||||
- do_trap(32, SIGILL, "iret exception", regs, error_code, &info);
|
- do_trap(X86_TRAP_IRET, SIGILL, "iret exception", regs, error_code,
|
||||||
|
- &info);
|
||||||
+ cpu = get_cpu();
|
+ cpu = get_cpu();
|
||||||
+ ok = check_lazy_exec_limit(cpu, regs, error_code);
|
+ ok = check_lazy_exec_limit(cpu, regs, error_code);
|
||||||
+ put_cpu();
|
+ put_cpu();
|
||||||
|
Loading…
Reference in New Issue
Block a user