mirror of
https://github.com/torvalds/linux.git
synced 2026-09-12 12:34:02 +02:00
Compare commits
No commits in common. "master" and "v7.3-rc1" have entirely different histories.
11
.mailmap
11
.mailmap
|
|
@ -19,8 +19,7 @@ Abhinav Kumar <quic_abhinavk@quicinc.com> <abhinavk@codeaurora.org>
|
|||
Ahmad Masri <quic_amasri@quicinc.com> <amasri@codeaurora.org>
|
||||
Adam Oldham <oldhamca@gmail.com>
|
||||
Adam Radford <aradford@gmail.com>
|
||||
Aditya Garg <aditya.garg@linux.dev> <gargaditya08@live.com>
|
||||
Aditya Garg <aditya.garg@linux.dev> <gargaditya08@proton.me>
|
||||
Aditya Garg <gargaditya08@proton.me> <gargaditya08@live.com>
|
||||
Adriana Reus <adi.reus@gmail.com> <adriana.reus@intel.com>
|
||||
Adrian Bunk <bunk@stusta.de>
|
||||
Ajay Kaher <ajay.kaher@broadcom.com> <akaher@vmware.com>
|
||||
|
|
@ -421,7 +420,6 @@ Jens Axboe <axboe@kernel.dk> <axboe@suse.de>
|
|||
Jens Axboe <axboe@kernel.dk> <jens.axboe@oracle.com>
|
||||
Jens Axboe <axboe@kernel.dk> <axboe@fb.com>
|
||||
Jens Axboe <axboe@kernel.dk> <axboe@meta.com>
|
||||
Jens Axboe <axboe@kernel.dk> <axboe@anthropic.com>
|
||||
Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
|
||||
Jens Wiklander <jenswi@kernel.org> <jens.wiklander@linaro.org>
|
||||
Jernej Skrabec <jernej.skrabec@gmail.com> <jernej.skrabec@siol.net>
|
||||
|
|
@ -552,9 +550,6 @@ Li Yang <leoyang.li@nxp.com> <leo@zh-kernel.org>
|
|||
Lior David <quic_liord@quicinc.com> <liord@codeaurora.org>
|
||||
Loic Poulain <loic.poulain@oss.qualcomm.com> <loic.poulain@linaro.org>
|
||||
Loic Poulain <loic.poulain@oss.qualcomm.com> <loic.poulain@intel.com>
|
||||
Lorenzo Bianconi <lorenzo@kernel.org> <lorenzo.bianconi@redhat.com>
|
||||
Lorenzo Bianconi <lorenzo@kernel.org> <lorenzo.bianconi@st.com>
|
||||
Lorenzo Bianconi <lorenzo@kernel.org> <lorenzo.bianconi83@gmail.com>
|
||||
Lorenzo Pieralisi <lpieralisi@kernel.org> <lorenzo.pieralisi@arm.com>
|
||||
Lorenzo Stoakes <ljs@kernel.org> <lstoakes@gmail.com>
|
||||
Lorenzo Stoakes <ljs@kernel.org> <lorenzo.stoakes@oracle.com>
|
||||
|
|
@ -704,7 +699,6 @@ Oliver Hartkopp <socketcan@hartkopp.net> <oliver.hartkopp@volkswagen.de>
|
|||
Oliver Hartkopp <socketcan@hartkopp.net> <oliver@hartkopp.net>
|
||||
Oliver Upton <oupton@kernel.org> <oupton@google.com>
|
||||
Oliver Upton <oupton@kernel.org> <oliver.upton@linux.dev>
|
||||
Ondrej Mosnáček <omosnacek@gmail.com> <omosnace@redhat.com>
|
||||
Ondřej Jirman <megi@xff.cz> <megous@megous.com>
|
||||
Oza Pawandeep <quic_poza@quicinc.com> <poza@codeaurora.org>
|
||||
Pali Rohár <pali@kernel.org> <pali.rohar@gmail.com>
|
||||
|
|
@ -904,8 +898,7 @@ Thomas Graf <tgraf@suug.ch>
|
|||
Thomas Gleixner <tglx@kernel.org> <tglx@linutronix.de>
|
||||
Thomas Körper <socketcan@esd.eu> <thomas.koerper@esd.eu>
|
||||
Thomas Pedersen <twp@codeaurora.org>
|
||||
Thorsten Blum <blum@kernel.org> <thorsten.blum@toblux.com>
|
||||
Thorsten Blum <blum@kernel.org> <thorsten.blum@linux.dev>
|
||||
Thorsten Blum <thorsten.blum@linux.dev> <thorsten.blum@toblux.com>
|
||||
Tiezhu Yang <yangtiezhu@loongson.cn> <kernelpatch@126.com>
|
||||
Tingwei Zhang <quic_tingwei@quicinc.com> <tingwei@codeaurora.org>
|
||||
Tirupathi Reddy <quic_tirupath@quicinc.com> <tirupath@codeaurora.org>
|
||||
|
|
|
|||
8
CREDITS
8
CREDITS
|
|
@ -1512,10 +1512,6 @@ N: Andy Gross
|
|||
E: agross@kernel.org
|
||||
D: Qualcomm SoC subsystem and drivers
|
||||
|
||||
N: Mark Gross
|
||||
E: markgross@kernel.org
|
||||
D: x86/mellanox platform maintenance and various x86 specific drivers
|
||||
|
||||
N: Grant Grundler
|
||||
E: grantgrundler@gmail.com
|
||||
W: http://obmouse.sourceforge.net/
|
||||
|
|
@ -4309,10 +4305,6 @@ N: Juergen Weigert
|
|||
E: jnweiger@immd4.informatik.uni-erlangen.de
|
||||
D: The Linux Support Team Erlangen
|
||||
|
||||
N: Russ Weight
|
||||
E: russ.weight@gmail.com
|
||||
D: Added support for Firmware Upload to the Firmware Loader
|
||||
|
||||
N: David Weinehall
|
||||
E: tao@acc.umu.se
|
||||
P: 1024D/DC47CA16 7ACE 0FB0 7A74 F994 9B36 E1D1 D14E 8526 DC47 CA16
|
||||
|
|
|
|||
|
|
@ -108,9 +108,6 @@ Description:
|
|||
# NSFS_MAGIC
|
||||
dont_measure fsmagic=0x6e736673
|
||||
dont_appraise fsmagic=0x6e736673
|
||||
# CONFIGFS_MAGIC
|
||||
dont_measure fsmagic=0x62656570
|
||||
dont_appraise fsmagic=0x62656570
|
||||
|
||||
measure func=BPRM_CHECK
|
||||
measure func=FILE_MMAP mask=MAY_EXEC
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
What: /sys/class/firmware/.../data
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: driver-core@lists.linux.dev
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: The data sysfs file is used for firmware-fallback and for
|
||||
firmware uploads. Cat a firmware image to this sysfs file
|
||||
after you echo 1 to the loading sysfs file. When the firmware
|
||||
|
|
@ -13,7 +13,7 @@ Description: The data sysfs file is used for firmware-fallback and for
|
|||
What: /sys/class/firmware/.../cancel
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: driver-core@lists.linux.dev
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: Write-only. For firmware uploads, write a "1" to this file to
|
||||
request that the transfer of firmware data to the lower-level
|
||||
device be canceled. This request will be rejected (EBUSY) if
|
||||
|
|
@ -23,7 +23,7 @@ Description: Write-only. For firmware uploads, write a "1" to this file to
|
|||
What: /sys/class/firmware/.../error
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: driver-core@lists.linux.dev
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: Read-only. Returns a string describing a failed firmware
|
||||
upload. This string will be in the form of <STATUS>:<ERROR>,
|
||||
where <STATUS> will be one of the status strings described
|
||||
|
|
@ -37,7 +37,7 @@ Description: Read-only. Returns a string describing a failed firmware
|
|||
What: /sys/class/firmware/.../loading
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: driver-core@lists.linux.dev
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: The loading sysfs file is used for both firmware-fallback and
|
||||
for firmware uploads. Echo 1 onto the loading file to indicate
|
||||
you are writing a firmware file to the data sysfs node. Echo
|
||||
|
|
@ -49,7 +49,7 @@ Description: The loading sysfs file is used for both firmware-fallback and
|
|||
What: /sys/class/firmware/.../remaining_size
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: driver-core@lists.linux.dev
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: Read-only. For firmware upload, this file contains the size
|
||||
of the firmware data that remains to be transferred to the
|
||||
lower-level device driver. The size value is initialized to
|
||||
|
|
@ -62,7 +62,7 @@ Description: Read-only. For firmware upload, this file contains the size
|
|||
What: /sys/class/firmware/.../status
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: driver-core@lists.linux.dev
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: Read-only. Returns a string describing the current status of
|
||||
a firmware upload. The string will be one of the following:
|
||||
idle, "receiving", "preparing", "transferring", "programming".
|
||||
|
|
@ -70,7 +70,7 @@ Description: Read-only. Returns a string describing the current status of
|
|||
What: /sys/class/firmware/.../timeout
|
||||
Date: July 2022
|
||||
KernelVersion: 5.19
|
||||
Contact: driver-core@lists.linux.dev
|
||||
Contact: Russ Weight <russ.weight@linux.dev>
|
||||
Description: This file supports the timeout mechanism for firmware
|
||||
fallback. This file has no affect on firmware uploads. For
|
||||
more information on timeouts please see the documentation
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ Features:
|
|||
- pages are linked to per-memcg LRU exclusively, and there is no global LRU.
|
||||
- optionally, memory+swap usage can be accounted and limited.
|
||||
- hierarchical accounting
|
||||
- soft limit
|
||||
- moving (recharging) account at moving a task is selectable.
|
||||
- usage threshold notifier
|
||||
- memory pressure notifier
|
||||
|
|
@ -75,9 +76,10 @@ Brief summary of control files.
|
|||
memory.memsw.failcnt show the number of memory+Swap hits limits
|
||||
memory.max_usage_in_bytes show max memory usage recorded
|
||||
memory.memsw.max_usage_in_bytes show max memory+Swap usage recorded
|
||||
memory.soft_limit_in_bytes This knob is deprecated and has no effect.
|
||||
Writes are ignored and reads always
|
||||
return the maximum value.
|
||||
memory.soft_limit_in_bytes set/show soft limit of memory usage
|
||||
This knob is not available on CONFIG_PREEMPT_RT systems.
|
||||
This knob is deprecated and shouldn't be
|
||||
used.
|
||||
memory.stat show various statistics
|
||||
memory.use_hierarchy set/show hierarchical account enabled
|
||||
This knob is deprecated and shouldn't be
|
||||
|
|
@ -338,6 +340,9 @@ memory.kmem.usage_in_bytes, or in a separate counter when it makes sense.
|
|||
The main "kmem" counter is fed into the main counter, so kmem charges will
|
||||
also be visible from the user counter.
|
||||
|
||||
Currently no soft limit is implemented for kernel memory. It is future work
|
||||
to trigger slab reclaim when those limits are reached.
|
||||
|
||||
2.7.1 Current Kernel Memory resources accounted
|
||||
-----------------------------------------------
|
||||
|
||||
|
|
@ -705,10 +710,42 @@ For compatibility reasons writing 1 to memory.use_hierarchy will always pass::
|
|||
|
||||
THIS IS DEPRECATED!
|
||||
|
||||
Writing to memory.soft_limit_in_bytes has no effect and reading it will
|
||||
always return the maximum value.
|
||||
Soft limits allow for greater sharing of memory. The idea behind soft limits
|
||||
is to allow control groups to use as much of the memory as needed, provided
|
||||
|
||||
Use memory.low and memory.min in cgroup v2 instead.
|
||||
a. There is no memory contention
|
||||
b. They do not exceed their hard limit
|
||||
|
||||
When the system detects memory contention or low memory, control groups
|
||||
are pushed back to their soft limits. If the soft limit of each control
|
||||
group is very high, they are pushed back as much as possible to make
|
||||
sure that one control group does not starve the others of memory.
|
||||
|
||||
Please note that soft limits is a best-effort feature; it comes with
|
||||
no guarantees, but it does its best to make sure that when memory is
|
||||
heavily contended for, memory is allocated based on the soft limit
|
||||
hints/setup. Currently soft limit based reclaim is set up such that
|
||||
it gets invoked from balance_pgdat (kswapd).
|
||||
|
||||
7.1 Interface
|
||||
-------------
|
||||
|
||||
Soft limits can be setup by using the following commands (in this example we
|
||||
assume a soft limit of 256 MiB)::
|
||||
|
||||
# echo 256M > memory.soft_limit_in_bytes
|
||||
|
||||
If we want to change this to 1G, we can at any time use::
|
||||
|
||||
# echo 1G > memory.soft_limit_in_bytes
|
||||
|
||||
.. note::
|
||||
Soft limits take effect over a long period of time, since they involve
|
||||
reclaiming memory for balancing between memory cgroups
|
||||
|
||||
.. note::
|
||||
It is recommended to set the soft limit always below the hard limit,
|
||||
otherwise the hard limit will take precedence.
|
||||
|
||||
.. _cgroup-v1-memory-move-charges:
|
||||
|
||||
|
|
|
|||
|
|
@ -1130,9 +1130,9 @@ policy and the underlying scheduler. From the point of view of the cpu controlle
|
|||
processes can be categorized as follows:
|
||||
|
||||
* Processes under the fair-class scheduler
|
||||
* Processes under a BPF scheduler with the corresponding ``cgroup_set_*`` callback
|
||||
* Processes under a BPF scheduler with the ``cgroup_set_weight`` callback
|
||||
* Everything else: ``SCHED_{FIFO,RR,DEADLINE}`` and processes under a BPF scheduler
|
||||
without the corresponding ``cgroup_set_*`` callback
|
||||
without the ``cgroup_set_weight`` callback
|
||||
|
||||
For details on when a process is under the fair-class scheduler or a BPF scheduler,
|
||||
check out :ref:`Documentation/scheduler/sched-ext.rst <sched-ext>`.
|
||||
|
|
@ -1223,9 +1223,7 @@ will be referred to. All time durations are in microseconds.
|
|||
$PERIOD duration. "max" for $MAX indicates no limit. If only
|
||||
one number is written, $MAX is updated.
|
||||
|
||||
This file affects only processes under the fair-class scheduler and a BPF
|
||||
scheduler with the ``cgroup_set_bandwidth`` callback depending on what
|
||||
the callback actually does.
|
||||
This file affects only processes under the fair-class scheduler.
|
||||
|
||||
cpu.max.burst
|
||||
A read-write single value file which exists on non-root
|
||||
|
|
@ -1233,9 +1231,7 @@ will be referred to. All time durations are in microseconds.
|
|||
|
||||
The burst in the range [0, $MAX].
|
||||
|
||||
This file affects only processes under the fair-class scheduler and a BPF
|
||||
scheduler with the ``cgroup_set_bandwidth`` callback depending on what
|
||||
the callback actually does.
|
||||
This file affects only processes under the fair-class scheduler.
|
||||
|
||||
cpu.pressure
|
||||
A read-write nested-keyed file.
|
||||
|
|
@ -1287,9 +1283,7 @@ will be referred to. All time durations are in microseconds.
|
|||
own relative priorities, but the cgroup itself will be treated as
|
||||
very low priority relative to its peers.
|
||||
|
||||
This file affects only processes under the fair-class scheduler and a BPF
|
||||
scheduler with the ``cgroup_set_idle`` callback depending on what the
|
||||
callback actually does.
|
||||
This file affects only processes under the fair-class scheduler.
|
||||
|
||||
Memory
|
||||
------
|
||||
|
|
@ -3070,7 +3064,7 @@ resources (res_a and res_b) are registered then:
|
|||
change in this file generates a file modified event. All fields in
|
||||
this file are hierarchical.
|
||||
|
||||
<res>.max
|
||||
max
|
||||
The number of times the cgroup's resource usage was
|
||||
about to go over the max boundary.
|
||||
|
||||
|
|
|
|||
|
|
@ -4987,6 +4987,18 @@ Kernel parameters
|
|||
Set to non-zero if a chip is present that snoops speed
|
||||
changes. Disabled by default.
|
||||
|
||||
pata_legacy.ht6560a= [HW,LIBATA]
|
||||
Format: <int>
|
||||
Set to 1, 2, or 3 for HT 6560A on the primary channel,
|
||||
the secondary channel, or both channels respectively.
|
||||
Disabled by default.
|
||||
|
||||
pata_legacy.ht6560b= [HW,LIBATA]
|
||||
Format: <int>
|
||||
Set to 1, 2, or 3 for HT 6560B on the primary channel,
|
||||
the secondary channel, or both channels respectively.
|
||||
Disabled by default.
|
||||
|
||||
pata_legacy.iordy_mask= [HW,LIBATA]
|
||||
Format: <int>
|
||||
IORDY enable mask. Set individual bits to allow IORDY
|
||||
|
|
@ -4999,6 +5011,18 @@ Kernel parameters
|
|||
with the sequence. By default IORDY is allowed across
|
||||
all channels.
|
||||
|
||||
pata_legacy.opti82c46x= [HW,LIBATA]
|
||||
Format: <int>
|
||||
Set to 1, 2, or 3 for Opti 82c611A on the primary
|
||||
channel, the secondary channel, or both channels
|
||||
respectively. Disabled by default.
|
||||
|
||||
pata_legacy.opti82c611a= [HW,LIBATA]
|
||||
Format: <int>
|
||||
Set to 1, 2, or 3 for Opti 82c465MV on the primary
|
||||
channel, the secondary channel, or both channels
|
||||
respectively. Disabled by default.
|
||||
|
||||
pata_legacy.pio_mask= [HW,LIBATA]
|
||||
Format: <int>
|
||||
PIO mode mask for autospeed devices. Set individual
|
||||
|
|
@ -5022,6 +5046,19 @@ Kernel parameters
|
|||
the first port in the list above (0x1f0), and so on.
|
||||
By default all supported ports are probed.
|
||||
|
||||
pata_legacy.qdi= [HW,LIBATA]
|
||||
Format: <int>
|
||||
Set to non-zero to probe QDI controllers. By default
|
||||
set to 1 if CONFIG_PATA_QDI_MODULE, 0 otherwise.
|
||||
|
||||
pata_legacy.winbond= [HW,LIBATA]
|
||||
Format: <int>
|
||||
Set to non-zero to probe Winbond controllers. Use
|
||||
the standard I/O port (0x130) if 1, otherwise the
|
||||
value given is the I/O port to use (typically 0x1b0).
|
||||
By default set to 1 if CONFIG_PATA_WINBOND_VLB_MODULE,
|
||||
0 otherwise.
|
||||
|
||||
pata_platform.pio_mask= [HW,LIBATA]
|
||||
Format: <int>
|
||||
Supported PIO mode mask. Set individual bits to allow
|
||||
|
|
|
|||
|
|
@ -1416,7 +1416,7 @@ Controls whether userspace may arm Syscall User Dispatch via
|
|||
== ===================================================================
|
||||
|
||||
Only present when the kernel is built with ``CONFIG_SYSCALL_USER_DISPATCH``
|
||||
and ``CONFIG_SYSCTL``.
|
||||
and ``CONFIG_PROC_SYSCTL``.
|
||||
|
||||
|
||||
sysctl_writes_strict
|
||||
|
|
|
|||
|
|
@ -155,8 +155,7 @@ The following keys are defined:
|
|||
defined in version 1.0 of the RISC-V Cryptography Extensions Volume II.
|
||||
|
||||
* :c:macro:`RISCV_HWPROBE_EXT_ZFH`: The Zfh extension version 1.0 is supported
|
||||
as defined in the RISC-V ISA manual. Zfh is a superset of Zfhmin, so
|
||||
RISCV_HWPROBE_EXT_ZFHMIN is reported whenever RISCV_HWPROBE_EXT_ZFH is.
|
||||
as defined in the RISC-V ISA manual.
|
||||
|
||||
* :c:macro:`RISCV_HWPROBE_EXT_ZFHMIN`: The Zfhmin extension version 1.0 is
|
||||
supported as defined in the RISC-V ISA manual.
|
||||
|
|
@ -165,9 +164,8 @@ The following keys are defined:
|
|||
is supported as defined in the RISC-V ISA manual.
|
||||
|
||||
* :c:macro:`RISCV_HWPROBE_EXT_ZVFH`: The Zvfh extension is supported as
|
||||
defined in the RISC-V Vector manual starting from commit e2ccd0548d6c
|
||||
("Remove draft warnings from Zvfh[min]"). Zvfh is a superset of Zvfhmin,
|
||||
so RISCV_HWPROBE_EXT_ZVFHMIN is reported whenever RISCV_HWPROBE_EXT_ZVFH is.
|
||||
defined in the RISC-V Vector manual starting from commit e2ccd0548d6c
|
||||
("Remove draft warnings from Zvfh[min]").
|
||||
|
||||
* :c:macro:`RISCV_HWPROBE_EXT_ZVFHMIN`: The Zvfhmin extension is supported as
|
||||
defined in the RISC-V Vector manual starting from commit e2ccd0548d6c
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ properties:
|
|||
- silergy,syr827
|
||||
- silergy,syr828
|
||||
- tcs,tcs4525
|
||||
- tcs,tcs4526
|
||||
- items:
|
||||
- const: rockchip,rk8601
|
||||
- const: rockchip,rk8600
|
||||
|
|
|
|||
|
|
@ -117,8 +117,8 @@ properties:
|
|||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
description:
|
||||
VLEN/8, the vector register length in bytes. This property is required on
|
||||
thead systems where the vector register length is not identical on all
|
||||
harts, or the vlenb CSR is not available.
|
||||
thead systems where the vector register length is not identical on all harts, or
|
||||
the vlenb CSR is not available.
|
||||
|
||||
# RISC-V has multiple properties for cache op block sizes as the sizes
|
||||
# differ between individual CBO extensions
|
||||
|
|
@ -151,8 +151,8 @@ anyOf:
|
|||
- riscv,isa-base
|
||||
|
||||
dependencies:
|
||||
riscv,isa-base: ["riscv,isa-extensions"]
|
||||
riscv,isa-extensions: ["riscv,isa-base"]
|
||||
riscv,isa-base: [ "riscv,isa-extensions" ]
|
||||
riscv,isa-extensions: [ "riscv,isa-base" ]
|
||||
|
||||
required:
|
||||
- interrupt-controller
|
||||
|
|
|
|||
|
|
@ -44,21 +44,6 @@ allOf:
|
|||
else:
|
||||
properties:
|
||||
starfive,sfc-filter-syscon: false
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
const: ultrarisc,dp1000-spi
|
||||
then:
|
||||
properties:
|
||||
reg:
|
||||
maxItems: 1
|
||||
clocks:
|
||||
minItems: 2
|
||||
clock-names:
|
||||
minItems: 2
|
||||
required:
|
||||
- clock-names
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
|
|
@ -78,7 +63,6 @@ properties:
|
|||
- mscc,jaguar2-spi
|
||||
- sophgo,sg2042-spi
|
||||
- thead,th1520-spi
|
||||
- ultrarisc,dp1000-spi
|
||||
- const: snps,dw-apb-ssi
|
||||
- description: Vendor controllers compatible with v1.01a
|
||||
items:
|
||||
|
|
|
|||
|
|
@ -176,68 +176,3 @@ Message from dmesg::
|
|||
secondary_startup_64+0xa4/0xb0
|
||||
nvme nvme0: Could not set queue count (16385)
|
||||
nvme nvme0: IO queues not created
|
||||
|
||||
Example 4: Inject an error into the first write command
|
||||
-------------------------------------------------------
|
||||
|
||||
::
|
||||
|
||||
echo 0x01 > /sys/kernel/debug/nvme0n1/fault_inject/opcode
|
||||
echo 1 > /sys/kernel/debug/nvme0n1/fault_inject/times
|
||||
echo 100 > /sys/kernel/debug/nvme0n1/fault_inject/probability
|
||||
dd if=/dev/zero of=/dev/nvme0n1 oflag=direct bs=512 count=1
|
||||
|
||||
Expected Result::
|
||||
|
||||
The first write command sent to nvme0n1 fails
|
||||
|
||||
Message from dmesg::
|
||||
|
||||
FAULT_INJECTION: forcing a failure.
|
||||
name fault_inject, interval 1, probability 100, space 0, times 1
|
||||
CPU: 4 UID: 0 PID: 0 Comm: swapper/4 Not tainted 7.1.0+ #5 PREEMPT(full)
|
||||
Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-20240910_120124-localhost 04/01/2014
|
||||
Call Trace:
|
||||
<IRQ>
|
||||
dump_stack_lvl+0x6e/0xa0
|
||||
dump_stack+0x10/0x16
|
||||
should_fail_ex+0x461/0x510
|
||||
should_fail+0xb/0x20
|
||||
nvme_should_fail+0x11b/0x240 [nvme_core]
|
||||
nvme_poll_cq+0x6ad/0xb30 [nvme]
|
||||
nvme_irq+0x84/0xe0 [nvme]
|
||||
? __pfx_nvme_irq+0x10/0x10 [nvme]
|
||||
? rcu_core+0xa40/0xa90
|
||||
? __pfx_sched_balance_softirq+0x10/0x10
|
||||
? debug_smp_processor_id+0x17/0x20
|
||||
? rcu_is_watching+0x13/0xa0
|
||||
__handle_irq_event_percpu+0x396/0x610
|
||||
handle_irq_event_percpu+0xf/0x90
|
||||
handle_irq_event+0xab/0x110
|
||||
handle_edge_irq+0x1a3/0x210
|
||||
__common_interrupt+0xff/0x170
|
||||
common_interrupt+0x90/0xc0
|
||||
</IRQ>
|
||||
<TASK>
|
||||
asm_common_interrupt+0x27/0x40
|
||||
RIP: 0010:pv_native_safe_halt+0x13/0x20
|
||||
Code: 1f 84 00 00 00 00 00 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 90 8b 05 0a 2a 58 01 85 c0 7e 07 0f 00 2d ff cc 0d 00 fb f4 <c3> cc 0
|
||||
RSP: 0018:ffff888100a67e40 EFLAGS: 00000242
|
||||
RAX: 0000000000000001 RBX: ffff888100a49c40 RCX: ffffed102b6c645b
|
||||
RDX: ffffed102b6c645b RSI: ffffffff82a0d3c0 RDI: ffffffff81428b9b
|
||||
RBP: ffff888100a67e48 R08: ffffed102b6c645b R09: 0000000000000004
|
||||
R10: ffffed102b6c645a R11: 0000000000000001 R12: 0000000000000000
|
||||
R13: 0000000000000000 R14: ffffed1020149388 R15: dffffc0000000000
|
||||
? do_idle+0x19b/0x2c0
|
||||
? default_idle+0x9/0x20
|
||||
arch_cpu_idle+0x9/0x10
|
||||
default_idle_call+0x6b/0xa0
|
||||
do_idle+0x19b/0x2c0
|
||||
? __pfx_do_idle+0x10/0x10
|
||||
? complete_with_flags+0x63/0x70
|
||||
cpu_startup_entry+0x55/0x60
|
||||
start_secondary+0x1df/0x1e0
|
||||
common_startup_64+0x13e/0x158
|
||||
</TASK>
|
||||
nvme0n1: Write(0x1) @ LBA 0, 1 blocks, Invalid Command Opcode (sct 0x0 / sc 0x1) DNR
|
||||
operation not supported error, dev nvme0n1, sector 0 op 0x1:(WRITE) flags 0x8800 phys_seg 1 prio class 2
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ pwm1_enable
|
|||
at full speed. Write "1" to set to manual, write "2" to let the EC control
|
||||
decide fan speed. Read this attribute to see current status.
|
||||
|
||||
NB: In consideration of the safety of the device, when setting to manual mode,
|
||||
NB:In consideration of the safety of the device, when setting to manual mode,
|
||||
the pwm speed will be set to the maximum value (255) by default. You can set
|
||||
a different value by writing pwm1 later.
|
||||
|
||||
|
|
|
|||
|
|
@ -42,9 +42,6 @@ register/unregister functions::
|
|||
|
||||
char *devm_hwmon_sanitize_name(struct device *dev, const char *name);
|
||||
|
||||
int hwmon_notify_event(struct device *dev, enum hwmon_sensor_types type,
|
||||
u32 attr, int channel);
|
||||
|
||||
void hwmon_lock(struct device *dev);
|
||||
void hwmon_unlock(struct device *dev);
|
||||
|
||||
|
|
@ -93,18 +90,6 @@ implemented in the driver, or debugfs functions, hwmon_lock() and hwmon_unlock()
|
|||
can be used to ensure that calls to those functions are serialized. Those
|
||||
functions also support guard() and scoped_guard() variants.
|
||||
|
||||
Drivers can call hwmon_notify_event() to notify userspace and the thermal
|
||||
subsystem when a hardware monitoring event (such as an alarm or a fault
|
||||
condition) occurs or clears. The parameters are the hwmon device, the sensor
|
||||
type, the attribute identifier associated with the event (such as
|
||||
hwmon_temp_max_alarm or hwmon_fan_fault), and the sensor channel number.
|
||||
hwmon_notify_event() generates a sysfs event (calling sysfs_notify()) and a
|
||||
udev event with the attribute name passed in the NAME environment property
|
||||
(e.g., "NAME=temp1_max_alarm"). If the event is for a temperature sensor and
|
||||
the sensor is attached to a thermal zone, it also notifies the thermal
|
||||
subsystem to update the thermal zone. hwmon_notify_event() returns 0 on
|
||||
success or a negative error code on failure.
|
||||
|
||||
Using devm_hwmon_device_register_with_info()
|
||||
--------------------------------------------
|
||||
|
||||
|
|
|
|||
|
|
@ -360,17 +360,6 @@ attribute-sets:
|
|||
name: tsoff
|
||||
type: u32
|
||||
byte-order: big-endian
|
||||
-
|
||||
name: filter-attrs
|
||||
attributes:
|
||||
-
|
||||
name: orig-flags
|
||||
type: u32
|
||||
doc: bitmask of tuple fields to filter on, original direction
|
||||
-
|
||||
name: reply-flags
|
||||
type: u32
|
||||
doc: bitmask of tuple fields to filter on, reply direction
|
||||
-
|
||||
name: conntrack-attrs
|
||||
attributes:
|
||||
|
|
@ -477,7 +466,7 @@ attribute-sets:
|
|||
-
|
||||
name: filter
|
||||
type: nest
|
||||
nested-attributes: filter-attrs
|
||||
nested-attributes: tuple-attrs
|
||||
-
|
||||
name: status-mask
|
||||
type: u32
|
||||
|
|
@ -602,14 +591,10 @@ operations:
|
|||
request:
|
||||
value: 0x101
|
||||
attributes:
|
||||
- tuple-orig
|
||||
- tuple-reply
|
||||
- status
|
||||
- mark
|
||||
- zone
|
||||
- mark-mask
|
||||
- filter
|
||||
- status-mask
|
||||
- status
|
||||
- zone
|
||||
reply:
|
||||
value: 0x100
|
||||
attributes:
|
||||
|
|
|
|||
|
|
@ -898,8 +898,6 @@ attribute-sets:
|
|||
-
|
||||
name: txqlen
|
||||
type: u32
|
||||
checks:
|
||||
max: 32767
|
||||
-
|
||||
name: map
|
||||
type: binary
|
||||
|
|
|
|||
|
|
@ -230,7 +230,7 @@ optional. The following modified excerpt is from
|
|||
|
||||
void BPF_STRUCT_OPS(simple_exit, struct scx_exit_info *ei)
|
||||
{
|
||||
exit_type = ei->kind;
|
||||
exit_type = ei->type;
|
||||
}
|
||||
|
||||
SEC(".struct_ops")
|
||||
|
|
@ -242,21 +242,6 @@ optional. The following modified excerpt is from
|
|||
.name = "simple",
|
||||
};
|
||||
|
||||
Scheduler-Dependent Knobs
|
||||
-------------------------
|
||||
|
||||
The fair-class scheduler enforces CPU controller settings such as
|
||||
``cpu.max``, ``cpu.weight`` and ``cpu.idle``. For sched_ext tasks, the
|
||||
scheduler core communicates these settings to the BPF scheduler
|
||||
through ``ops.cgroup_init()`` and reports subsequent changes through
|
||||
the corresponding ``ops.cgroup_set_*()`` callbacks. Similarly, per-task
|
||||
nice changes are converted to weights and reported through
|
||||
``ops.set_weight()``.
|
||||
|
||||
Each BPF scheduler is responsible for implementing the scheduling
|
||||
semantics of these settings and may choose to ignore them. Consult the
|
||||
loaded scheduler's documentation before relying on these controls.
|
||||
|
||||
Dispatch Queues
|
||||
---------------
|
||||
|
||||
|
|
|
|||
|
|
@ -15,41 +15,19 @@ arch/riscv 开发者维护指南
|
|||
|
||||
概述
|
||||
----
|
||||
RISC-V 指令集体系结构是公开开发的:
|
||||
RISC-V指令集体系结构是公开开发的:
|
||||
正在进行的草案可供所有人查看和测试实现。新模块或者扩展草案可能会在开发过程中发
|
||||
生更改 --- 有时以不兼容的方式对以前的草案进行更改。这种灵活性可能会给 RISC-V
|
||||
Linux 维护者带来挑战。Linux 维护者不赞成频繁的变更,且 Linux 开发过程更喜欢经过
|
||||
良好检查和测试的代码,而不是试验代码。我们希望推广同样的规则到即将被内核合并的
|
||||
RISC-V 相关代码。
|
||||
|
||||
Patchwork
|
||||
---------
|
||||
|
||||
RISC-V 有一个 patchwork 实例,可以在那里查看补丁的状态:
|
||||
|
||||
https://patchwork.kernel.org/project/linux-riscv/list/
|
||||
|
||||
如果你的补丁不在默认视图中出现,那么 RISC-V 维护者很有可能已要求修改,或者希望
|
||||
将其应用到另一个代码树上。
|
||||
|
||||
自动化流程会在该 patchwork 实例上运行,在每个补丁到达时立刻对其进行构建/测试。
|
||||
自动化流程会根据补丁是否被识别为修复,选用 RISC-V `for-next` 或 `fixes` 分支
|
||||
当前的 HEAD;若上述均应用失败,则使用 RISC-V `master` 分支。补丁系列被应用到的具
|
||||
体提交将标注在 patchwork 上。任何检查未通过的补丁通常不会被应用,并且在大多数情
|
||||
况下将需要重新提交。
|
||||
生更改---有时以不兼容的方式对以前的草案进行更改。这种灵活性可能会给RISC-V Linux
|
||||
维护者带来挑战。Linux开发过程更喜欢经过良好检查和测试的代码,而不是试验代码。我
|
||||
们希望推广同样的规则到即将被内核合并的RISC-V相关代码。
|
||||
|
||||
附加的提交检查单
|
||||
----------------
|
||||
我们仅接受针对新模块或扩展的补丁,前提是这些模块或扩展的规范被列为未来不太可能发
|
||||
生不兼容的变更。对于来自 RISC-V 基金会的规范,这意味着“已冻结”或“已批准”,对于
|
||||
UEFI 论坛的规范,这意味着已发布的 ECR。(开发者当然可以维护自己的 Linux 内核树,
|
||||
其中包含他们所需的任何扩展草案的代码。)
|
||||
我们仅接受相关标准已经被RISC-V基金会标准为“已批准”或“已冻结”的扩展或模块的补丁。
|
||||
(开发者当然可以维护自己的Linux内核树,其中包含所需代码扩展草案的代码。)
|
||||
|
||||
此外,RISC-V 规范允许实现者创建自己的自定义扩展。这些自定义扩展不需要通过 RISC-V
|
||||
基金会的任何审核或批准流程。为了避免因添加实现者特定的 RISC-V 扩展带来的维护复杂
|
||||
性和对性能的潜在影响,我们将只考虑符合以下任一条件的扩展补丁:
|
||||
|
||||
- 已由 RISC-V 基金会正式冻结或批准
|
||||
- 已按照标准 Linux 惯例,在广泛可用的硬件中实现
|
||||
|
||||
(实现者当然可以维护自己的 Linux 内核树,其中包含他们所需的任何自定义扩展的代码。)
|
||||
此外,RISC-V规范允许爱好者创建自己的自定义扩展。这些自定义拓展不需要通过RISC-V
|
||||
基金会的任何审核或批准。为了避免将爱好者一些特别的RISC-V拓展添加进内核代码带来
|
||||
的维护复杂性和对性能的潜在影响,我们将只接受RISC-V基金会正式冻结或批准的的扩展
|
||||
补丁。(开发者当然可以维护自己的Linux内核树,其中包含他们想要的任何自定义扩展
|
||||
的代码。)
|
||||
|
|
|
|||
|
|
@ -90,6 +90,10 @@ irq_domain映射的类型
|
|||
映射的优点是固定时间查找IRQ号,而且irq_descs只分配给在用的IRQ。 缺点是该表
|
||||
必须尽可能大的hwirq号。
|
||||
|
||||
irq_domain_add_linear()和irq_domain_create_linear()在功能上是等价的,
|
||||
除了第一个参数不同--前者接受一个Open Firmware特定的 'struct device_node' 而
|
||||
后者接受一个更通用的抽象 'struct fwnode_handle' 。
|
||||
|
||||
大多数驱动应该使用线性映射
|
||||
|
||||
树状映射
|
||||
|
|
|
|||
61
MAINTAINERS
61
MAINTAINERS
|
|
@ -4512,7 +4512,7 @@ AYANEO PLATFORM EC DRIVER
|
|||
M: Antheas Kapenekakis <lkml@antheas.dev>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/ABI/testing/sysfs-platform-ayaneo-ec
|
||||
F: Documentation/ABI/testing/sysfs-platform-ayaneo
|
||||
F: drivers/platform/x86/ayaneo-ec.c
|
||||
|
||||
AZ6007 DVB DRIVER
|
||||
|
|
@ -5671,8 +5671,8 @@ W: http://bu3sch.de/btgpio.php
|
|||
F: drivers/gpio/gpio-bt8xx.c
|
||||
|
||||
BTRFS FILE SYSTEM
|
||||
M: Chris Mason <clm@fb.com>
|
||||
M: David Sterba <dsterba@suse.com>
|
||||
R: Chris Mason <mason@kernel.org>
|
||||
L: linux-btrfs@vger.kernel.org
|
||||
S: Maintained
|
||||
W: https://btrfs.readthedocs.io
|
||||
|
|
@ -8039,7 +8039,7 @@ F: drivers/gpu/drm/sun4i/sun8i*
|
|||
|
||||
DRM DRIVER FOR APPLE TOUCH BARS
|
||||
M: Aun-Ali Zaidi <admin@kodeit.net>
|
||||
M: Aditya Garg <aditya.garg@linux.dev>
|
||||
M: Aditya Garg <gargaditya08@proton.me>
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
S: Maintained
|
||||
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
|
|
@ -9387,8 +9387,9 @@ S: Maintained
|
|||
F: drivers/edac/octeon_edac*
|
||||
|
||||
EDAC-CAVIUM THUNDERX
|
||||
M: Robert Richter <rric@kernel.org>
|
||||
L: linux-edac@vger.kernel.org
|
||||
S: Orphan
|
||||
S: Odd Fixes
|
||||
F: drivers/edac/thunderx_edac*
|
||||
|
||||
EDAC-CORE
|
||||
|
|
@ -9415,8 +9416,9 @@ S: Supported
|
|||
F: drivers/edac/dmc520_edac.c
|
||||
|
||||
EDAC-E752X
|
||||
M: Mark Gross <markgross@kernel.org>
|
||||
L: linux-edac@vger.kernel.org
|
||||
S: Orphan
|
||||
S: Maintained
|
||||
F: drivers/edac/e752x_edac.c
|
||||
|
||||
EDAC-E7XXX
|
||||
|
|
@ -9491,8 +9493,9 @@ S: Maintained
|
|||
F: drivers/edac/igen6_edac.c
|
||||
|
||||
EDAC-MPC85XX
|
||||
M: Johannes Thumshirn <morbidrsa@gmail.com>
|
||||
L: linux-edac@vger.kernel.org
|
||||
S: Orphan
|
||||
S: Maintained
|
||||
F: drivers/edac/mpc85xx_edac.[ch]
|
||||
|
||||
EDAC-NPCM
|
||||
|
|
@ -10190,6 +10193,7 @@ F: include/linux/arm_ffa.h
|
|||
|
||||
FIRMWARE LOADER (request_firmware)
|
||||
M: Luis Chamberlain <mcgrof@kernel.org>
|
||||
M: Russ Weight <russ.weight@linux.dev>
|
||||
M: Danilo Krummrich <dakr@kernel.org>
|
||||
L: driver-core@lists.linux.dev
|
||||
S: Maintained
|
||||
|
|
@ -12220,7 +12224,7 @@ F: drivers/tty/hvc/
|
|||
|
||||
HUNG TASK DETECTOR
|
||||
M: Andrew Morton <akpm@linux-foundation.org>
|
||||
M: Lance Yang <lance.yang@linux.dev>
|
||||
R: Lance Yang <lance.yang@linux.dev>
|
||||
R: Masami Hiramatsu <mhiramat@kernel.org>
|
||||
R: Petr Mladek <pmladek@suse.com>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
|
|
@ -13279,6 +13283,7 @@ F: drivers/crypto/intel/keembay/ocs-aes.h
|
|||
|
||||
INTEL KEEM BAY OCS ECC CRYPTO DRIVER
|
||||
M: Prabhjot Khurana <prabhjot.khurana@intel.com>
|
||||
M: Mark Gross <mgross@linux.intel.com>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/crypto/intel,keembay-ocs-ecc.yaml
|
||||
F: drivers/crypto/intel/keembay/Kconfig
|
||||
|
|
@ -14235,6 +14240,8 @@ F: tools/testing/selftests/
|
|||
KERNEL SMB3 SERVER (KSMBD)
|
||||
M: Namjae Jeon <linkinjeon@kernel.org>
|
||||
M: Namjae Jeon <linkinjeon@samba.org>
|
||||
M: Steve French <smfrench@gmail.com>
|
||||
M: Steve French <sfrench@samba.org>
|
||||
R: Sergey Senozhatsky <senozhatsky@chromium.org>
|
||||
R: Tom Talpey <tom@talpey.com>
|
||||
R: ChenXiaoSong <chenxiaosong@chenxiaosong.com>
|
||||
|
|
@ -15020,8 +15027,6 @@ M: Madhavan Srinivasan <maddy@linux.ibm.com>
|
|||
R: Michael Ellerman <mpe@ellerman.id.au>
|
||||
R: Nicholas Piggin <npiggin@gmail.com>
|
||||
R: Christophe Leroy (CS GROUP) <chleroy@kernel.org>
|
||||
R: Ritesh Harjani (IBM) <ritesh.list@gmail.com>
|
||||
R: Shrikanth Hegde <sshegde@linux.ibm.com>
|
||||
L: linuxppc-dev@lists.ozlabs.org
|
||||
S: Supported
|
||||
W: https://github.com/linuxppc/wiki/wiki
|
||||
|
|
@ -17411,6 +17416,7 @@ F: mm/swapfile.c
|
|||
MEMORY MANAGEMENT - THP (TRANSPARENT HUGE PAGE)
|
||||
M: Andrew Morton <akpm@linux-foundation.org>
|
||||
M: David Hildenbrand <david@kernel.org>
|
||||
M: Lorenzo Stoakes <ljs@kernel.org>
|
||||
R: Zi Yan <ziy@nvidia.com>
|
||||
R: Baolin Wang <baolin.wang@linux.alibaba.com>
|
||||
R: Liam R. Howlett <liam@infradead.org>
|
||||
|
|
@ -17420,7 +17426,6 @@ R: Dev Jain <dev.jain@arm.com>
|
|||
R: Barry Song <baohua@kernel.org>
|
||||
R: Lance Yang <lance.yang@linux.dev>
|
||||
R: Usama Arif <usama.arif@linux.dev>
|
||||
R: Kiryl Shutsemau <kas@kernel.org>
|
||||
L: linux-mm@kvack.org
|
||||
S: Maintained
|
||||
W: http://www.linux-mm.org
|
||||
|
|
@ -17693,7 +17698,7 @@ F: Documentation/devicetree/bindings/serial/atmel,at91-usart.yaml
|
|||
F: drivers/spi/spi-at91-usart.c
|
||||
|
||||
MICROCHIP ATSHA204A DRIVER
|
||||
M: Thorsten Blum <blum@kernel.org>
|
||||
M: Thorsten Blum <thorsten.blum@linux.dev>
|
||||
L: linux-crypto@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/crypto/atmel-sha204a.c
|
||||
|
|
@ -17717,7 +17722,7 @@ F: Documentation/devicetree/bindings/media/microchip,csi2dc.yaml
|
|||
F: drivers/media/platform/microchip/microchip-csi2dc.c
|
||||
|
||||
MICROCHIP ECC DRIVER
|
||||
M: Thorsten Blum <blum@kernel.org>
|
||||
M: Thorsten Blum <thorsten.blum@linux.dev>
|
||||
L: linux-crypto@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/crypto/atmel-ecc.c
|
||||
|
|
@ -19564,7 +19569,7 @@ F: include/linux/platform_data/x86/nvidia-wmi-ec-backlight.h
|
|||
|
||||
NVM EXPRESS DRIVER
|
||||
M: Keith Busch <kbusch@kernel.org>
|
||||
M: Jens Axboe <axboe@kernel.dk>
|
||||
M: Jens Axboe <axboe@fb.com>
|
||||
M: Christoph Hellwig <hch@lst.de>
|
||||
M: Sagi Grimberg <sagi@grimberg.me>
|
||||
L: linux-nvme@lists.infradead.org
|
||||
|
|
@ -24773,7 +24778,7 @@ K: \bsecurity_[a-z_0-9]\+\b
|
|||
SELINUX SECURITY MODULE
|
||||
M: Paul Moore <paul@paul-moore.com>
|
||||
M: Stephen Smalley <stephen.smalley.work@gmail.com>
|
||||
R: Ondrej Mosnáček <omosnacek@gmail.com>
|
||||
R: Ondrej Mosnacek <omosnace@redhat.com>
|
||||
L: selinux@vger.kernel.org
|
||||
S: Supported
|
||||
W: https://github.com/SELinuxProject
|
||||
|
|
@ -25231,9 +25236,10 @@ F: Documentation/admin-guide/LSM/Smack.rst
|
|||
F: security/smack/
|
||||
|
||||
SMBDIRECT (RDMA Stream Transport with Read/Write-Offload, MS-SMBD)
|
||||
M: Steve French <smfrench@gmail.com>
|
||||
M: Steve French <sfrench@samba.org>
|
||||
M: Namjae Jeon <linkinjeon@kernel.org>
|
||||
M: Namjae Jeon <linkinjeon@samba.org>
|
||||
M: Paulo Alcantara <pc@manguebit.org>
|
||||
R: Stefan Metzmacher <metze@samba.org>
|
||||
R: Tom Talpey <tom@talpey.com>
|
||||
L: linux-cifs@vger.kernel.org
|
||||
|
|
@ -25336,8 +25342,8 @@ F: Documentation/networking/timestamping.rst
|
|||
F: include/linux/net_tstamp.h
|
||||
F: include/uapi/linux/net_tstamp.h
|
||||
F: tools/testing/selftests/bpf/*/net_timestamping*
|
||||
F: tools/testing/selftests/drivers/net/so_txtime.*
|
||||
F: tools/testing/selftests/net/*timestamp*
|
||||
F: tools/testing/selftests/net/so_txtime.c
|
||||
|
||||
SOEKRIS NET48XX LED SUPPORT
|
||||
M: Chris Boot <bootc@bootc.net>
|
||||
|
|
@ -25404,7 +25410,7 @@ F: drivers/md/md*
|
|||
F: drivers/md/raid*
|
||||
F: include/linux/raid/
|
||||
F: include/uapi/linux/raid/
|
||||
F: lib/raid/
|
||||
F: lib/raid/raid6/
|
||||
|
||||
SOLIDRUN CLEARFOG SUPPORT
|
||||
M: Russell King <linux@armlinux.org.uk>
|
||||
|
|
@ -26948,7 +26954,8 @@ S: Maintained
|
|||
F: drivers/net/ethernet/tehuti/tn40*
|
||||
|
||||
TELECOM CLOCK DRIVER FOR MCPL0010
|
||||
S: Orphan
|
||||
M: Mark Gross <markgross@kernel.org>
|
||||
S: Supported
|
||||
F: drivers/char/tlclk.c
|
||||
|
||||
TEMPO SEMICONDUCTOR DRIVERS
|
||||
|
|
@ -28869,8 +28876,8 @@ F: include/uapi/linux/virtio_console.h
|
|||
VIRTIO CORE
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
M: Jason Wang <jasowangio@gmail.com>
|
||||
M: Eugenio Pérez <eperezma@redhat.com>
|
||||
R: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
|
||||
R: Eugenio Pérez <eperezma@redhat.com>
|
||||
L: virtualization@lists.linux.dev
|
||||
S: Maintained
|
||||
F: Documentation/ABI/testing/sysfs-bus-vdpa
|
||||
|
|
@ -28947,7 +28954,7 @@ F: include/uapi/linux/virtio_gpu.h
|
|||
VIRTIO HOST (VHOST)
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
M: Jason Wang <jasowangio@gmail.com>
|
||||
M: Eugenio Pérez <eperezma@redhat.com>
|
||||
R: Eugenio Pérez <eperezma@redhat.com>
|
||||
L: kvm@vger.kernel.org
|
||||
L: virtualization@lists.linux.dev
|
||||
L: netdev@vger.kernel.org
|
||||
|
|
@ -29002,8 +29009,8 @@ F: include/uapi/linux/virtio_mem.h
|
|||
VIRTIO NET DRIVER
|
||||
M: "Michael S. Tsirkin" <mst@redhat.com>
|
||||
M: Jason Wang <jasowangio@gmail.com>
|
||||
M: Eugenio Pérez <eperezma@redhat.com>
|
||||
R: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
|
||||
R: Eugenio Pérez <eperezma@redhat.com>
|
||||
L: netdev@vger.kernel.org
|
||||
L: virtualization@lists.linux.dev
|
||||
S: Maintained
|
||||
|
|
@ -29019,13 +29026,6 @@ S: Maintained
|
|||
F: drivers/nvdimm/nd_virtio.c
|
||||
F: drivers/nvdimm/virtio_pmem.c
|
||||
|
||||
VIRTIO RNG DRIVER
|
||||
M: Laurent Vivier <lvivier@redhat.com>
|
||||
L: virtualization@lists.linux.dev
|
||||
S: Maintained
|
||||
F: drivers/char/hw_random/virtio-rng.c
|
||||
F: include/uapi/linux/virtio_rng.h
|
||||
|
||||
VIRTIO RTC DRIVER
|
||||
M: Peter Hilber <peter.hilber@oss.qualcomm.com>
|
||||
L: virtualization@lists.linux.dev
|
||||
|
|
@ -29357,7 +29357,7 @@ M: Guenter Roeck <linux@roeck-us.net>
|
|||
L: linux-watchdog@vger.kernel.org
|
||||
S: Maintained
|
||||
W: http://www.linux-watchdog.org/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/groeck/linux-staging.git
|
||||
T: git git://www.linux-watchdog.org/linux-watchdog.git
|
||||
F: Documentation/devicetree/bindings/watchdog/
|
||||
F: Documentation/watchdog/
|
||||
F: drivers/watchdog/
|
||||
|
|
@ -29937,14 +29937,12 @@ F: include/uapi/linux/xilinx-v4l2-controls.h
|
|||
XILINX VERSAL EDAC DRIVER
|
||||
M: Shubhrajyoti Datta <shubhrajyoti.datta@amd.com>
|
||||
M: Sai Krishna Potthuri <sai.krishna.potthuri@amd.com>
|
||||
R: Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/memory-controllers/xlnx,versal-ddrmc-edac.yaml
|
||||
F: drivers/edac/versal_edac.c
|
||||
|
||||
XILINX VERSALNET EDAC DRIVER
|
||||
M: Shubhrajyoti Datta <shubhrajyoti.datta@amd.com>
|
||||
R: Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/memory-controllers/xlnx,versal-net-ddrmc5.yaml
|
||||
F: drivers/edac/versalnet_edac.c
|
||||
|
|
@ -29990,7 +29988,6 @@ F: include/dt-bindings/dma/xlnx-zynqmp-dpdma.h
|
|||
XILINX ZYNQMP OCM EDAC DRIVER
|
||||
M: Shubhrajyoti Datta <shubhrajyoti.datta@amd.com>
|
||||
M: Sai Krishna Potthuri <sai.krishna.potthuri@amd.com>
|
||||
R: Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/memory-controllers/xlnx,zynqmp-ocmc-1.0.yaml
|
||||
F: drivers/edac/zynqmp_edac.c
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -2,7 +2,7 @@
|
|||
VERSION = 7
|
||||
PATCHLEVEL = 3
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc2
|
||||
EXTRAVERSION = -rc1
|
||||
NAME = Baby Opossum Posse
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ static int aesbs_setkey(struct crypto_skcipher *tfm, const u8 *in_key,
|
|||
struct crypto_aes_ctx *rk;
|
||||
int err;
|
||||
|
||||
rk = kmalloc_obj(*rk);
|
||||
rk = kmalloc(sizeof(*rk), GFP_KERNEL);
|
||||
if (!rk)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -128,7 +128,7 @@ static int aesbs_cbc_ctr_setkey(struct crypto_skcipher *tfm, const u8 *in_key,
|
|||
struct crypto_aes_ctx *rk;
|
||||
int err;
|
||||
|
||||
rk = kmalloc_obj(*rk);
|
||||
rk = kmalloc(sizeof(*rk), GFP_KERNEL);
|
||||
if (!rk)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
|||
|
|
@ -78,6 +78,5 @@ void __init cpuinfo_store_boot_cpu(void);
|
|||
void __init init_cpu_features(struct cpuinfo_arm64 *info);
|
||||
void update_cpu_features(int cpu, struct cpuinfo_arm64 *info,
|
||||
struct cpuinfo_arm64 *boot);
|
||||
bool gmid_el1_accessible(const struct cpuinfo_arm64 *info);
|
||||
|
||||
#endif /* __ASM_CPU_H */
|
||||
|
|
|
|||
|
|
@ -627,6 +627,13 @@ static inline bool id_aa64pfr1_mpamfrac(u64 pfr1)
|
|||
return val > 0;
|
||||
}
|
||||
|
||||
static inline bool id_aa64pfr1_mte(u64 pfr1)
|
||||
{
|
||||
u32 val = cpuid_feature_extract_unsigned_field(pfr1, ID_AA64PFR1_EL1_MTE_SHIFT);
|
||||
|
||||
return val >= ID_AA64PFR1_EL1_MTE_MTE2;
|
||||
}
|
||||
|
||||
void __init setup_boot_cpu_features(void);
|
||||
void __init setup_system_features(void);
|
||||
void __init setup_user_features(void);
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ is_affected_midr_range(const struct arm64_cpu_capabilities *entry, int scope)
|
|||
|
||||
for (i = 0; i < target_impl_cpu_num; i++) {
|
||||
if (__is_affected_midr_range(entry, target_impl_cpus[i].midr,
|
||||
target_impl_cpus[i].revidr))
|
||||
target_impl_cpus[i].midr))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -1178,33 +1178,6 @@ static bool detect_ftr_has_mpam(void)
|
|||
return id_aa64pfr0_mpam(pfr0) || id_aa64pfr1_mpamfrac(pfr1);
|
||||
}
|
||||
|
||||
bool gmid_el1_accessible(const struct cpuinfo_arm64 *info)
|
||||
{
|
||||
const struct arm64_ftr_bits *ftrp;
|
||||
s64 mte, ovr;
|
||||
u64 ftr_mask;
|
||||
|
||||
/* No ID register reflects CONFIG_ARM64_MTE. */
|
||||
if (!IS_ENABLED(CONFIG_ARM64_MTE))
|
||||
return false;
|
||||
|
||||
for (ftrp = ftr_id_aa64pfr1; ftrp->width; ftrp++) {
|
||||
if (ftrp->shift == ID_AA64PFR1_EL1_MTE_SHIFT)
|
||||
break;
|
||||
}
|
||||
|
||||
ftr_mask = arm64_ftr_mask(ftrp);
|
||||
mte = arm64_ftr_value(ftrp, info->reg_id_aa64pfr1);
|
||||
|
||||
/* The boot CPU runs before init_cpu_ftr_reg() strips unsafe overrides. */
|
||||
if ((id_aa64pfr1_override.mask & ftr_mask) == ftr_mask) {
|
||||
ovr = arm64_ftr_value(ftrp, id_aa64pfr1_override.val);
|
||||
mte = arm64_ftr_safe_value(ftrp, ovr, mte);
|
||||
}
|
||||
|
||||
return mte >= ID_AA64PFR1_EL1_MTE_MTE2;
|
||||
}
|
||||
|
||||
void __init init_cpu_features(struct cpuinfo_arm64 *info)
|
||||
{
|
||||
/* Before we start using the tables, make sure it is sorted */
|
||||
|
|
@ -1257,7 +1230,7 @@ void __init init_cpu_features(struct cpuinfo_arm64 *info)
|
|||
init_cpu_ftr_reg(SYS_MPAMIDR_EL1, info->reg_mpamidr);
|
||||
}
|
||||
|
||||
if (gmid_el1_accessible(info))
|
||||
if (id_aa64pfr1_mte(info->reg_id_aa64pfr1))
|
||||
init_cpu_ftr_reg(SYS_GMID_EL1, info->reg_gmid);
|
||||
}
|
||||
|
||||
|
|
@ -1519,9 +1492,11 @@ void update_cpu_features(int cpu,
|
|||
* they read/write depends on the GMID_EL1.BS field. Check that the
|
||||
* value is the same on all CPUs.
|
||||
*/
|
||||
if (gmid_el1_accessible(info))
|
||||
if (IS_ENABLED(CONFIG_ARM64_MTE) &&
|
||||
id_aa64pfr1_mte(info->reg_id_aa64pfr1)) {
|
||||
taint |= check_update_ftr_reg(SYS_GMID_EL1, cpu,
|
||||
info->reg_gmid, boot->reg_gmid);
|
||||
}
|
||||
|
||||
/*
|
||||
* If we don't have AArch32 at all then skip the checks entirely
|
||||
|
|
|
|||
|
|
@ -502,7 +502,7 @@ static void __cpuinfo_store_cpu(struct cpuinfo_arm64 *info)
|
|||
info->reg_id_aa64smfr0 = read_cpuid(ID_AA64SMFR0_EL1);
|
||||
info->reg_id_aa64fpfr0 = read_cpuid(ID_AA64FPFR0_EL1);
|
||||
|
||||
if (gmid_el1_accessible(info))
|
||||
if (id_aa64pfr1_mte(info->reg_id_aa64pfr1))
|
||||
info->reg_gmid = read_cpuid(GMID_EL1);
|
||||
|
||||
if (id_aa64pfr0_32bit_el0(info->reg_id_aa64pfr0))
|
||||
|
|
|
|||
|
|
@ -129,8 +129,7 @@ int machine_kexec_post_load(struct kimage *kimage)
|
|||
}
|
||||
|
||||
/* Create a copy of the linear map */
|
||||
rc = trans_pgd_create_copy(&info, &trans_pgd,
|
||||
_PAGE_OFFSET(vabits_actual), PAGE_END);
|
||||
rc = trans_pgd_create_copy(&info, &trans_pgd, PAGE_OFFSET, PAGE_END);
|
||||
if (rc)
|
||||
return rc;
|
||||
kimage->arch.ttbr1 = __pa(trans_pgd);
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ int kvm_vcpu_init_nested(struct kvm_vcpu *vcpu)
|
|||
num_mmus = atomic_read(&kvm->online_vcpus) * S2_MMU_PER_VCPU;
|
||||
|
||||
if (num_mmus > kvm->arch.nested_mmus_size) {
|
||||
tmp = kvzalloc_objs(*tmp, num_mmus, GFP_KERNEL_ACCOUNT);
|
||||
tmp = kvcalloc(num_mmus, sizeof(*tmp), GFP_KERNEL_ACCOUNT);
|
||||
if (!tmp)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
|||
|
|
@ -16,7 +16,6 @@
|
|||
#include <linux/mm.h>
|
||||
#include <linux/hardirq.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/irqflags.h>
|
||||
#include <linux/kasan.h>
|
||||
#include <linux/kprobes.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
|
@ -155,9 +154,6 @@ static void show_pte(unsigned long addr)
|
|||
pr_alert("%s pgtable: %luk pages, %llu-bit VAs, pgdp=%016lx\n",
|
||||
mm == &init_mm ? "swapper" : "user", PAGE_SIZE / SZ_1K,
|
||||
vabits_actual, mm_to_pgd_phys(mm));
|
||||
|
||||
guard(irqsave)();
|
||||
|
||||
pgdp = pgd_offset(mm, addr);
|
||||
pgd = READ_ONCE(*pgdp);
|
||||
pr_alert("[%016lx] pgd=%016llx", addr, pgd_val(pgd));
|
||||
|
|
@ -171,25 +167,25 @@ static void show_pte(unsigned long addr)
|
|||
if (pgd_none(pgd) || pgd_bad(pgd))
|
||||
break;
|
||||
|
||||
p4dp = p4d_offset_lockless(pgdp, pgd, addr);
|
||||
p4dp = p4d_offset(pgdp, addr);
|
||||
p4d = READ_ONCE(*p4dp);
|
||||
pr_cont(", p4d=%016llx", p4d_val(p4d));
|
||||
if (p4d_none(p4d) || p4d_bad(p4d))
|
||||
break;
|
||||
|
||||
pudp = pud_offset_lockless(p4dp, p4d, addr);
|
||||
pudp = pud_offset(p4dp, addr);
|
||||
pud = READ_ONCE(*pudp);
|
||||
pr_cont(", pud=%016llx", pud_val(pud));
|
||||
if (pud_none(pud) || pud_bad(pud))
|
||||
break;
|
||||
|
||||
pmdp = pmd_offset_lockless(pudp, pud, addr);
|
||||
pmdp = pmd_offset(pudp, addr);
|
||||
pmd = READ_ONCE(*pmdp);
|
||||
pr_cont(", pmd=%016llx", pmd_val(pmd));
|
||||
if (pmd_none(pmd) || pmd_bad(pmd))
|
||||
break;
|
||||
|
||||
ptep = pte_offset_map(&pmd, addr);
|
||||
ptep = pte_offset_map(pmdp, addr);
|
||||
if (!ptep)
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -175,7 +175,7 @@ config LOONGARCH
|
|||
select HAVE_RELIABLE_STACKTRACE if UNWINDER_ORC
|
||||
select HAVE_RETHOOK
|
||||
select HAVE_RSEQ
|
||||
select HAVE_RUST if !KASAN
|
||||
select HAVE_RUST
|
||||
select HAVE_SAMPLE_FTRACE_DIRECT
|
||||
select HAVE_SAMPLE_FTRACE_DIRECT_MULTI
|
||||
select HAVE_SETUP_PER_CPU_AREA if NUMA
|
||||
|
|
|
|||
|
|
@ -20,7 +20,6 @@ struct dmsintc_state {
|
|||
};
|
||||
|
||||
int kvm_loongarch_register_dmsintc_device(void);
|
||||
void kvm_loongarch_unregister_dmsintc_device(void);
|
||||
void dmsintc_inject_irq(struct kvm_vcpu *vcpu);
|
||||
int dmsintc_set_irq(struct kvm *kvm, u64 addr, int data, int level);
|
||||
int dmsintc_deliver_msi_to_vcpu(struct kvm *kvm, struct kvm_vcpu *vcpu, u32 vector, int level);
|
||||
|
|
|
|||
|
|
@ -79,7 +79,6 @@ struct loongarch_eiointc {
|
|||
};
|
||||
|
||||
int kvm_loongarch_register_eiointc_device(void);
|
||||
void kvm_loongarch_unregister_eiointc_device(void);
|
||||
void eiointc_set_irq(struct loongarch_eiointc *s, int irq, int level);
|
||||
|
||||
#endif /* __ASM_KVM_EIOINTC_H */
|
||||
|
|
|
|||
|
|
@ -125,7 +125,6 @@ struct kvm_arch {
|
|||
unsigned int pte_shifts[MAX_PGTABLE_LEVELS];
|
||||
unsigned int root_level;
|
||||
spinlock_t phyid_map_lock;
|
||||
spinlock_t pv_setting_lock;
|
||||
struct kvm_phyid_map *phyid_map;
|
||||
/* Enabled PV features */
|
||||
unsigned long pv_features;
|
||||
|
|
@ -351,6 +350,7 @@ static inline void kvm_arch_vcpu_block_finish(struct kvm_vcpu *vcpu) {}
|
|||
static inline void kvm_arch_free_memslot(struct kvm *kvm, struct kvm_memory_slot *slot) {}
|
||||
void kvm_check_vpid(struct kvm_vcpu *vcpu);
|
||||
enum hrtimer_restart kvm_swtimer_wakeup(struct hrtimer *timer);
|
||||
void kvm_arch_flush_remote_tlbs_memslot(struct kvm *kvm, const struct kvm_memory_slot *memslot);
|
||||
void kvm_init_vmcs(struct kvm *kvm);
|
||||
void kvm_exc_entry(void);
|
||||
int kvm_enter_guest(struct kvm_run *run, struct kvm_vcpu *vcpu);
|
||||
|
|
|
|||
|
|
@ -41,6 +41,5 @@ struct ipi_state {
|
|||
#define IOCSR_ANY_SEND 0x158
|
||||
|
||||
int kvm_loongarch_register_ipi_device(void);
|
||||
void kvm_loongarch_unregister_ipi_device(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -70,7 +70,6 @@ struct loongarch_pch_pic {
|
|||
|
||||
struct kvm_kernel_irq_routing_entry;
|
||||
int kvm_loongarch_register_pch_pic_device(void);
|
||||
void kvm_loongarch_unregister_pch_pic_device(void);
|
||||
void pch_pic_set_irq(struct loongarch_pch_pic *s, int irq, int level);
|
||||
int pch_msi_set_irq(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, int level);
|
||||
|
||||
|
|
|
|||
|
|
@ -275,9 +275,6 @@ bool kprobe_singlestep_handler(struct pt_regs *regs)
|
|||
struct kprobe_ctlblk *kcb = get_kprobe_ctlblk();
|
||||
unsigned long addr = instruction_pointer(regs);
|
||||
|
||||
if (!cur)
|
||||
return false;
|
||||
|
||||
if (cur && (kcb->kprobe_status & (KPROBE_HIT_SS | KPROBE_REENTER)) &&
|
||||
((unsigned long)&cur->ainsn.insn[1] == addr)) {
|
||||
restore_local_irqflag(kcb, regs);
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
cfi_st t6, PT_R18
|
||||
cfi_st t7, PT_R19
|
||||
cfi_st t8, PT_R20
|
||||
cfi_st u0, PT_R21
|
||||
cfi_st fp, PT_R22
|
||||
cfi_st s0, PT_R23
|
||||
cfi_st s1, PT_R24
|
||||
|
|
@ -58,6 +59,7 @@
|
|||
cfi_ld t6, PT_R18
|
||||
cfi_ld t7, PT_R19
|
||||
cfi_ld t8, PT_R20
|
||||
cfi_ld u0, PT_R21
|
||||
cfi_ld fp, PT_R22
|
||||
cfi_ld s0, PT_R23
|
||||
cfi_ld s1, PT_R24
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq_work.h>
|
||||
#include <linux/profile.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/threads.h>
|
||||
|
|
@ -715,6 +716,13 @@ void smp_send_stop(void)
|
|||
smp_call_function(stop_this_cpu, NULL, 0);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PROFILING
|
||||
int setup_profiling_timer(unsigned int multiplier)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void flush_tlb_all_ipi(void *info)
|
||||
{
|
||||
local_flush_tlb_all();
|
||||
|
|
|
|||
|
|
@ -23,7 +23,7 @@
|
|||
#include "image-vars.h"
|
||||
|
||||
/*
|
||||
* Max available Page Size is 64K, so we set SectionAlignment
|
||||
* Max avaliable Page Size is 64K, so we set SectionAlignment
|
||||
* field of EFI application to 64K.
|
||||
*/
|
||||
PECOFF_FILE_ALIGN = 0x200;
|
||||
|
|
|
|||
|
|
@ -149,7 +149,7 @@ static int kvm_dmsintc_create(struct kvm_device *dev, u32 type)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
s = kzalloc_obj(struct loongarch_dmsintc);
|
||||
s = kzalloc(sizeof(struct loongarch_dmsintc), GFP_KERNEL);
|
||||
if (!s)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -180,8 +180,3 @@ int kvm_loongarch_register_dmsintc_device(void)
|
|||
{
|
||||
return kvm_register_device_ops(&kvm_dmsintc_dev_ops, KVM_DEV_TYPE_LOONGARCH_DMSINTC);
|
||||
}
|
||||
|
||||
void kvm_loongarch_unregister_dmsintc_device(void)
|
||||
{
|
||||
kvm_unregister_device_ops(KVM_DEV_TYPE_LOONGARCH_DMSINTC);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -695,8 +695,3 @@ int kvm_loongarch_register_eiointc_device(void)
|
|||
{
|
||||
return kvm_register_device_ops(&kvm_eiointc_dev_ops, KVM_DEV_TYPE_LOONGARCH_EIOINTC);
|
||||
}
|
||||
|
||||
void kvm_loongarch_unregister_eiointc_device(void)
|
||||
{
|
||||
kvm_unregister_device_ops(KVM_DEV_TYPE_LOONGARCH_EIOINTC);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -463,8 +463,3 @@ int kvm_loongarch_register_ipi_device(void)
|
|||
{
|
||||
return kvm_register_device_ops(&kvm_ipi_dev_ops, KVM_DEV_TYPE_LOONGARCH_IPI);
|
||||
}
|
||||
|
||||
void kvm_loongarch_unregister_ipi_device(void)
|
||||
{
|
||||
kvm_unregister_device_ops(KVM_DEV_TYPE_LOONGARCH_IPI);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -78,9 +78,6 @@ int pch_msi_set_irq(struct kvm *kvm, struct kvm_kernel_irq_routing_entry *e, int
|
|||
return dmsintc_set_irq(kvm, msg_addr, e->msi.data, level);
|
||||
}
|
||||
|
||||
if (e->msi.data >= EIOINTC_IRQS)
|
||||
return -EINVAL;
|
||||
|
||||
eiointc_set_irq(kvm->arch.eiointc, e->msi.data, level);
|
||||
|
||||
return 0;
|
||||
|
|
@ -503,8 +500,3 @@ int kvm_loongarch_register_pch_pic_device(void)
|
|||
{
|
||||
return kvm_register_device_ops(&kvm_pch_pic_dev_ops, KVM_DEV_TYPE_LOONGARCH_PCHPIC);
|
||||
}
|
||||
|
||||
void kvm_loongarch_unregister_pch_pic_device(void)
|
||||
{
|
||||
kvm_unregister_device_ops(KVM_DEV_TYPE_LOONGARCH_PCHPIC);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -385,52 +385,27 @@ static int kvm_loongarch_env_init(void)
|
|||
/* Register LoongArch IPI interrupt controller interface. */
|
||||
ret = kvm_loongarch_register_ipi_device();
|
||||
if (ret)
|
||||
goto err_env;
|
||||
return ret;
|
||||
|
||||
/* Register LoongArch EIOINTC interrupt controller interface. */
|
||||
ret = kvm_loongarch_register_eiointc_device();
|
||||
if (ret)
|
||||
goto err_ipi;
|
||||
return ret;
|
||||
|
||||
/* Register LoongArch PCH-PIC interrupt controller interface. */
|
||||
ret = kvm_loongarch_register_pch_pic_device();
|
||||
if (ret)
|
||||
goto err_eiointc;
|
||||
return ret;
|
||||
|
||||
/* Register LoongArch DMSINTC interrupt contrroller interface */
|
||||
if (cpu_has_msgint) {
|
||||
if (cpu_has_msgint)
|
||||
ret = kvm_loongarch_register_dmsintc_device();
|
||||
if (ret)
|
||||
goto err_pch_pic;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_pch_pic:
|
||||
kvm_loongarch_unregister_pch_pic_device();
|
||||
err_eiointc:
|
||||
kvm_loongarch_unregister_eiointc_device();
|
||||
err_ipi:
|
||||
kvm_loongarch_unregister_ipi_device();
|
||||
err_env:
|
||||
kvm_unregister_perf_callbacks();
|
||||
kfree(kvm_loongarch_ops);
|
||||
kvm_loongarch_ops = NULL;
|
||||
free_percpu(vmcs);
|
||||
vmcs = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void kvm_loongarch_env_exit(void)
|
||||
{
|
||||
if (cpu_has_msgint)
|
||||
kvm_loongarch_unregister_dmsintc_device();
|
||||
|
||||
kvm_loongarch_unregister_pch_pic_device();
|
||||
kvm_loongarch_unregister_eiointc_device();
|
||||
kvm_loongarch_unregister_ipi_device();
|
||||
|
||||
if (vmcs)
|
||||
free_percpu(vmcs);
|
||||
|
||||
|
|
@ -453,11 +428,7 @@ static int kvm_loongarch_init(void)
|
|||
if (r)
|
||||
return r;
|
||||
|
||||
r = kvm_init(sizeof(struct kvm_vcpu), 0, THIS_MODULE);
|
||||
if (r)
|
||||
kvm_loongarch_env_exit();
|
||||
|
||||
return r;
|
||||
return kvm_init(sizeof(struct kvm_vcpu), 0, THIS_MODULE);
|
||||
}
|
||||
|
||||
static void kvm_loongarch_exit(void)
|
||||
|
|
|
|||
|
|
@ -383,16 +383,6 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm, const struct kvm_memory_slot
|
|||
hva_t hva_start;
|
||||
size_t size, gpa_offset, hva_offset;
|
||||
|
||||
/*
|
||||
* The generic code allocates a fresh, zeroed memslot for every change,
|
||||
* so the arch flags computed below must be carried over when only the
|
||||
* userspace flags change, e.g. when dirty logging is toggled.
|
||||
*/
|
||||
if (change == KVM_MR_FLAGS_ONLY) {
|
||||
new->arch = old->arch;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((change != KVM_MR_MOVE) && (change != KVM_MR_CREATE))
|
||||
return 0;
|
||||
/*
|
||||
|
|
@ -949,3 +939,9 @@ int kvm_handle_mm_fault(struct kvm_vcpu *vcpu, unsigned long gpa, bool write, in
|
|||
void kvm_arch_sync_dirty_log(struct kvm *kvm, struct kvm_memory_slot *memslot)
|
||||
{
|
||||
}
|
||||
|
||||
void kvm_arch_flush_remote_tlbs_memslot(struct kvm *kvm,
|
||||
const struct kvm_memory_slot *memslot)
|
||||
{
|
||||
kvm_flush_remote_tlbs(kvm);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1165,14 +1165,10 @@ static int kvm_loongarch_cpucfg_set_attr(struct kvm_vcpu *vcpu,
|
|||
return -EINVAL;
|
||||
|
||||
/* All vCPUs need set the same PV features */
|
||||
spin_lock(&kvm->arch.pv_setting_lock);
|
||||
if ((kvm->arch.pv_features & LOONGARCH_PV_FEAT_UPDATED)
|
||||
&& ((kvm->arch.pv_features & valid) != val)) {
|
||||
spin_unlock(&kvm->arch.pv_setting_lock);
|
||||
&& ((kvm->arch.pv_features & valid) != val))
|
||||
return -EINVAL;
|
||||
}
|
||||
kvm->arch.pv_features = val | LOONGARCH_PV_FEAT_UPDATED;
|
||||
spin_unlock(&kvm->arch.pv_setting_lock);
|
||||
return 0;
|
||||
default:
|
||||
return -ENXIO;
|
||||
|
|
|
|||
|
|
@ -76,7 +76,6 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
|||
return -ENOMEM;
|
||||
}
|
||||
spin_lock_init(&kvm->arch.phyid_map_lock);
|
||||
spin_lock_init(&kvm->arch.pv_setting_lock);
|
||||
|
||||
kvm_init_vmcs(kvm);
|
||||
kvm_vm_init_features(kvm);
|
||||
|
|
|
|||
|
|
@ -717,7 +717,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx, bool ext
|
|||
move_reg(ctx, t1, src);
|
||||
emit_zext_32(ctx, t1, true);
|
||||
move_imm(ctx, dst, (ctx->user_vm_start >> 32) << 32, false);
|
||||
emit_insn(ctx, beq, t1, LOONGARCH_GPR_ZERO, 2);
|
||||
emit_insn(ctx, beq, t1, LOONGARCH_GPR_ZERO, 1);
|
||||
emit_insn(ctx, or, t1, dst, t1);
|
||||
move_reg(ctx, dst, t1);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -523,24 +523,24 @@ bcm47xx_buttons_add(const struct bcm47xx_gpio_key *buttons, int nbuttons)
|
|||
|
||||
/* 1 node for gpio-keys device, 1 node for each button, 1 terminator */
|
||||
const struct software_node **node_group __free(kfree) =
|
||||
kzalloc_objs(*node_group, 1 + nbuttons + 1);
|
||||
kcalloc(1 + nbuttons + 1, sizeof(*node_group), GFP_KERNEL);
|
||||
if (!node_group)
|
||||
return -ENOMEM;
|
||||
|
||||
/* 1 code property, 1 gpio property, 1 terminator */
|
||||
struct property_entry *props __free(kfree) =
|
||||
kzalloc_objs(*props, nbuttons * 3);
|
||||
kcalloc(nbuttons * 3, sizeof(*props), GFP_KERNEL);
|
||||
if (!props)
|
||||
return -ENOMEM;
|
||||
|
||||
/* 1 node for gpio-keys device, 1 node for each button */
|
||||
struct software_node *nodes __free(kfree) =
|
||||
kzalloc_objs(*nodes, 1 + nbuttons);
|
||||
kcalloc(1 + nbuttons, sizeof(*nodes), GFP_KERNEL);
|
||||
if (!nodes)
|
||||
return -ENOMEM;
|
||||
|
||||
struct software_node_ref_args *ref_args __free(kfree) =
|
||||
kzalloc_objs(*ref_args, nbuttons);
|
||||
kcalloc(nbuttons, sizeof(*ref_args), GFP_KERNEL);
|
||||
if (!ref_args)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
|||
|
|
@ -270,7 +270,7 @@ static inline void arch_interrupt_exit_prepare(struct pt_regs *regs)
|
|||
}
|
||||
|
||||
/* irqentry_exit expects to be called with interrupts disabled */
|
||||
hard_irq_disable();
|
||||
local_irq_disable();
|
||||
}
|
||||
|
||||
static inline void arch_interrupt_async_enter_prepare(struct pt_regs *regs)
|
||||
|
|
@ -515,14 +515,8 @@ static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
|
|||
#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
|
||||
local_paca->tm_scratch = regs->msr;
|
||||
#endif
|
||||
/*
|
||||
* Do not restore KUAP here. Generic entry might treat this as the last
|
||||
* arch step before userspace but PowerPC still has kernel work after
|
||||
* irqentry_exit()/syscall_exit_to_user_mode() i.e. in
|
||||
* interrupt_exit_user_prepare() / syscall_exit_prepare() may enable
|
||||
* IRQs and retry. Those functions restore KUAP immediately before rfi,
|
||||
* which is where it should belong.
|
||||
*/
|
||||
/* Restore user access locks last */
|
||||
kuap_user_restore(regs);
|
||||
}
|
||||
|
||||
#define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare
|
||||
|
|
|
|||
|
|
@ -533,7 +533,9 @@ static void eeh_rmv_device(struct eeh_dev *edev, void *userdata)
|
|||
if (rmv_data)
|
||||
list_add(&edev->rmv_entry, &rmv_data->removed_vf_list);
|
||||
} else {
|
||||
pci_lock_rescan_remove();
|
||||
pci_stop_and_remove_bus_device(dev);
|
||||
pci_unlock_rescan_remove();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -175,7 +175,7 @@ notrace unsigned long syscall_exit_restart(unsigned long r3, struct pt_regs *reg
|
|||
current_thread_info()->exit_flags &= ~_TIF_RESTOREALL;
|
||||
regs->exit_result |= ret;
|
||||
|
||||
return regs->exit_result;
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -54,10 +54,6 @@ int rtas_pci_dn_read_config(struct pci_dn *pdn, int where, int size, u32 *val)
|
|||
if (!config_access_valid(pdn, where))
|
||||
return PCIBIOS_BAD_REGISTER_NUMBER;
|
||||
#ifdef CONFIG_EEH
|
||||
if (pdn->edev &&
|
||||
(pdn->edev->mode & EEH_DEV_REMOVED))
|
||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||
|
||||
if (pdn->edev && pdn->edev->pe &&
|
||||
(pdn->edev->pe->state & EEH_PE_CFG_BLOCKED))
|
||||
return PCIBIOS_SET_FAILED;
|
||||
|
|
@ -109,10 +105,6 @@ int rtas_pci_dn_write_config(struct pci_dn *pdn, int where, int size, u32 val)
|
|||
if (!config_access_valid(pdn, where))
|
||||
return PCIBIOS_BAD_REGISTER_NUMBER;
|
||||
#ifdef CONFIG_EEH
|
||||
if (pdn->edev &&
|
||||
(pdn->edev->mode & EEH_DEV_REMOVED))
|
||||
return PCIBIOS_DEVICE_NOT_FOUND;
|
||||
|
||||
if (pdn->edev && pdn->edev->pe &&
|
||||
(pdn->edev->pe->state & EEH_PE_CFG_BLOCKED))
|
||||
return PCIBIOS_SET_FAILED;
|
||||
|
|
|
|||
|
|
@ -18,10 +18,8 @@ notrace long system_call_exception(struct pt_regs *regs, unsigned long r0)
|
|||
long ret;
|
||||
syscall_fn f;
|
||||
|
||||
if (unlikely(!syscall_enter_from_user_mode_randomize_stack(regs, &r0))) {
|
||||
clear_thread_flag(TIF_SYSCALL_RET);
|
||||
if (unlikely(!syscall_enter_from_user_mode_randomize_stack(regs, &r0)))
|
||||
return syscall_get_error(current, regs);
|
||||
}
|
||||
|
||||
if (unlikely(test_and_clear_thread_flag(TIF_SYSCALL_RET)))
|
||||
return syscall_get_error(current, regs);
|
||||
|
|
|
|||
|
|
@ -57,7 +57,7 @@ int arch_check_excluded_range(struct kimage *image, unsigned long start,
|
|||
|
||||
emem = image->arch.exclude_ranges;
|
||||
for (i = 0; i < emem->nr_ranges; i++)
|
||||
if (start <= emem->ranges[i].end && end >= emem->ranges[i].start)
|
||||
if (start < emem->ranges[i].end && end > emem->ranges[i].start)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
|
|
@ -113,7 +113,7 @@ static int add_usable_mem(struct umem_info *um_info, u64 base, u64 end)
|
|||
loc_end = um_info->ranges[i].end;
|
||||
if (loc_base >= base && loc_end <= end)
|
||||
add = true;
|
||||
else if (base <= loc_end && end >= loc_base) {
|
||||
else if (base < loc_end && end > loc_base) {
|
||||
if (loc_base < base)
|
||||
loc_base = base;
|
||||
if (loc_end > end)
|
||||
|
|
@ -377,12 +377,16 @@ static int load_backup_segment(struct kimage *image, struct kexec_buf *kbuf)
|
|||
static unsigned int kdump_extra_elfcorehdr_size(struct crash_mem *cmem)
|
||||
{
|
||||
#if defined(CONFIG_CRASH_HOTPLUG) && defined(CONFIG_MEMORY_HOTPLUG)
|
||||
unsigned int extra_sz = 0;
|
||||
|
||||
if (CONFIG_CRASH_MAX_MEMORY_RANGES > (unsigned int)PN_XNUM)
|
||||
pr_warn("Number of Phdrs %u exceeds max\n", CONFIG_CRASH_MAX_MEMORY_RANGES);
|
||||
else if (cmem->nr_ranges >= CONFIG_CRASH_MAX_MEMORY_RANGES)
|
||||
pr_warn("Configured crash mem ranges may not be enough\n");
|
||||
else
|
||||
return (CONFIG_CRASH_MAX_MEMORY_RANGES - cmem->nr_ranges) * sizeof(Elf64_Phdr);
|
||||
extra_sz = (CONFIG_CRASH_MAX_MEMORY_RANGES - cmem->nr_ranges) * sizeof(Elf64_Phdr);
|
||||
|
||||
return extra_sz;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1623,13 +1623,15 @@ int64_t pnv_opal_pci_msi_eoi(struct irq_data *d)
|
|||
return opal_pci_msi_eoi(phb->opal_id, d->parent_data->hwirq);
|
||||
}
|
||||
|
||||
static struct irq_chip pnv_pci_msi_irq_chip;
|
||||
|
||||
/*
|
||||
* Returns true iff chip is something that we could call
|
||||
* pnv_opal_pci_msi_eoi for.
|
||||
*/
|
||||
bool is_pnv_opal_msi(struct irq_chip *chip)
|
||||
{
|
||||
return chip && chip->name && str_has_prefix(chip->name, "PNV-");
|
||||
return chip == &pnv_pci_msi_irq_chip;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(is_pnv_opal_msi);
|
||||
|
||||
|
|
@ -1726,7 +1728,7 @@ static const struct msi_parent_ops pnv_msi_parent_ops = {
|
|||
.chip_flags = MSI_CHIP_FLAG_SET_EOI,
|
||||
.bus_select_token = DOMAIN_BUS_NEXUS,
|
||||
.bus_select_mask = MATCH_PCI_MSI,
|
||||
.prefix = "PNV-", /* Note: is_pnv_opal_msi() uses this */
|
||||
.prefix = "PNV-",
|
||||
.init_dev_msi_info = pnv_init_dev_msi_info,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -6,8 +6,6 @@
|
|||
* Copyright 2006 Sony Corp.
|
||||
*/
|
||||
|
||||
#include <linux/minmax.h>
|
||||
|
||||
#include <asm/lv1call.h>
|
||||
|
||||
#include "platform.h"
|
||||
|
|
@ -76,9 +74,8 @@ static void _dump_node(unsigned int lpar_id, u64 n1, u64 n2, u64 n3, u64 n4,
|
|||
static u64 make_first_field(const char *text, u64 index)
|
||||
{
|
||||
u64 n = 0;
|
||||
size_t len = min(strlen(text), sizeof(n));
|
||||
|
||||
memcpy(&n, text, len);
|
||||
memcpy((char *)&n, text, strnlen(text, sizeof(n)));
|
||||
return PS3_VENDOR_ID_NONE + (n >> 32) + index;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -132,14 +132,11 @@ static int pseries_pci_sriov_enable(struct pci_dev *pdev, u16 num_vfs)
|
|||
|
||||
/* First integer stores max config */
|
||||
max_config_vfs = of_read_number(&max_vfs[0], 1);
|
||||
if (max_config_vfs < num_vfs) {
|
||||
dev_err(&pdev->dev, "Num VFs %x > %x Configurable VFs\n",
|
||||
num_vfs, max_config_vfs);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (num_vfs > MAX_VFS_FOR_MAP_PE) {
|
||||
dev_err(&pdev->dev, "Num VFs %x > %x PE mapping limit\n",
|
||||
num_vfs, MAX_VFS_FOR_MAP_PE);
|
||||
if (max_config_vfs < num_vfs || num_vfs > MAX_VFS_FOR_MAP_PE) {
|
||||
dev_err(&pdev->dev,
|
||||
"Num VFs %x > %x Configurable VFs\n",
|
||||
num_vfs, (num_vfs > MAX_VFS_FOR_MAP_PE) ?
|
||||
MAX_VFS_FOR_MAP_PE : max_config_vfs);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1134,7 +1134,7 @@ static int __init xive_init_ipis(void)
|
|||
if (!ipi_domain)
|
||||
goto out_free_fwnode;
|
||||
|
||||
xive_ipis = kzalloc_objs(*xive_ipis, nr_node_ids);
|
||||
xive_ipis = kzalloc_objs(*xive_ipis, nr_node_ids, GFP_KERNEL);
|
||||
if (!xive_ipis)
|
||||
goto out_free_domain;
|
||||
|
||||
|
|
|
|||
|
|
@ -326,7 +326,7 @@ config STACKTRACE_SUPPORT
|
|||
config GENERIC_BUG
|
||||
def_bool y
|
||||
depends on BUG
|
||||
select GENERIC_BUG_RELATIVE_POINTERS
|
||||
select GENERIC_BUG_RELATIVE_POINTERS if 64BIT
|
||||
|
||||
config GENERIC_BUG_RELATIVE_POINTERS
|
||||
bool
|
||||
|
|
|
|||
|
|
@ -29,8 +29,13 @@
|
|||
|
||||
typedef u32 bug_insn_t;
|
||||
|
||||
#ifdef CONFIG_GENERIC_BUG_RELATIVE_POINTERS
|
||||
#define __BUG_ENTRY_ADDR RISCV_INT " 1b - ."
|
||||
#define __BUG_ENTRY_FILE(file) RISCV_INT " " file " - ."
|
||||
#else
|
||||
#define __BUG_ENTRY_ADDR RISCV_PTR " 1b"
|
||||
#define __BUG_ENTRY_FILE(file) RISCV_PTR " " file
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_DEBUG_BUGVERBOSE
|
||||
#define __BUG_ENTRY(file, line, flags) \
|
||||
|
|
|
|||
|
|
@ -61,8 +61,8 @@ static inline void __switch_to_fpu(struct task_struct *prev,
|
|||
|
||||
static __always_inline bool has_fpu(void)
|
||||
{
|
||||
/* D extension depends on F, so checking D alone is sufficient. */
|
||||
return riscv_has_extension_likely(RISCV_ISA_EXT_D);
|
||||
return riscv_has_extension_likely(RISCV_ISA_EXT_F) ||
|
||||
riscv_has_extension_likely(RISCV_ISA_EXT_D);
|
||||
}
|
||||
#else
|
||||
static __always_inline bool has_fpu(void) { return false; }
|
||||
|
|
|
|||
|
|
@ -412,19 +412,6 @@ static const unsigned int riscv_zvbb_exts[] = {
|
|||
RISCV_ISA_EXT_ZVKB
|
||||
};
|
||||
|
||||
/*
|
||||
* The RISC-V ISA manual specifies that Zfh implies Zfhmin and Zvfh implies
|
||||
* Zvfhmin. Report the implied subset extensions whenever the supersets are
|
||||
* detected (see https://github.com/riscv/riscv-isa-manual/pull/3070).
|
||||
*/
|
||||
static const unsigned int riscv_zfh_exts[] = {
|
||||
RISCV_ISA_EXT_ZFHMIN
|
||||
};
|
||||
|
||||
static const unsigned int riscv_zvfh_exts[] = {
|
||||
RISCV_ISA_EXT_ZVFHMIN
|
||||
};
|
||||
|
||||
#define RISCV_ISA_EXT_ZVE64F_IMPLY_LIST \
|
||||
RISCV_ISA_EXT_ZVE64X, \
|
||||
RISCV_ISA_EXT_ZVE32F, \
|
||||
|
|
@ -563,8 +550,7 @@ const struct riscv_isa_ext_data riscv_isa_ext[] = {
|
|||
__RISCV_ISA_EXT_DATA(zawrs, RISCV_ISA_EXT_ZAWRS),
|
||||
__RISCV_ISA_EXT_DATA_VALIDATE(zfa, RISCV_ISA_EXT_ZFA, riscv_ext_f_depends),
|
||||
__RISCV_ISA_EXT_DATA_VALIDATE(zfbfmin, RISCV_ISA_EXT_ZFBFMIN, riscv_ext_f_depends),
|
||||
__RISCV_ISA_EXT_SUPERSET_VALIDATE(zfh, RISCV_ISA_EXT_ZFH,
|
||||
riscv_zfh_exts, riscv_ext_f_depends),
|
||||
__RISCV_ISA_EXT_DATA_VALIDATE(zfh, RISCV_ISA_EXT_ZFH, riscv_ext_f_depends),
|
||||
__RISCV_ISA_EXT_DATA_VALIDATE(zfhmin, RISCV_ISA_EXT_ZFHMIN, riscv_ext_f_depends),
|
||||
__RISCV_ISA_EXT_DATA(zca, RISCV_ISA_EXT_ZCA),
|
||||
__RISCV_ISA_EXT_DATA_VALIDATE(zcb, RISCV_ISA_EXT_ZCB, riscv_ext_zca_depends),
|
||||
|
|
@ -600,9 +586,7 @@ const struct riscv_isa_ext_data riscv_isa_ext[] = {
|
|||
__RISCV_ISA_EXT_SUPERSET_VALIDATE(zve64x, RISCV_ISA_EXT_ZVE64X, riscv_zve64x_exts, riscv_ext_vector_x_validate),
|
||||
__RISCV_ISA_EXT_DATA_VALIDATE(zvfbfmin, RISCV_ISA_EXT_ZVFBFMIN, riscv_vector_f_validate),
|
||||
__RISCV_ISA_EXT_DATA_VALIDATE(zvfbfwma, RISCV_ISA_EXT_ZVFBFWMA, riscv_ext_zvfbfwma_validate),
|
||||
__RISCV_ISA_EXT_SUPERSET_VALIDATE(zvfh, RISCV_ISA_EXT_ZVFH,
|
||||
riscv_zvfh_exts,
|
||||
riscv_ext_vector_float_validate),
|
||||
__RISCV_ISA_EXT_DATA(zvfh, RISCV_ISA_EXT_ZVFH),
|
||||
__RISCV_ISA_EXT_DATA(zvfhmin, RISCV_ISA_EXT_ZVFHMIN),
|
||||
__RISCV_ISA_EXT_DATA_VALIDATE(zvkb, RISCV_ISA_EXT_ZVKB, riscv_ext_vector_crypto_validate),
|
||||
__RISCV_ISA_EXT_DATA_VALIDATE(zvkg, RISCV_ISA_EXT_ZVKG, riscv_ext_vector_crypto_validate),
|
||||
|
|
|
|||
|
|
@ -45,8 +45,6 @@ static __always_inline void *patch_map(void *addr, const unsigned int fixmap)
|
|||
phys_addr_t phys;
|
||||
|
||||
if (core_kernel_text(uintaddr) || is_kernel_exittext(uintaddr)) {
|
||||
if (!IS_ENABLED(CONFIG_STRICT_KERNEL_RWX))
|
||||
return addr;
|
||||
phys = __pa_symbol(addr);
|
||||
} else if (IS_ENABLED(CONFIG_STRICT_MODULE_RWX)) {
|
||||
struct page *page = vmalloc_to_page(addr);
|
||||
|
|
|
|||
|
|
@ -349,8 +349,10 @@ long set_tagged_addr_ctrl(struct task_struct *task, unsigned long arg)
|
|||
if (arg & PR_TAGGED_ADDR_ENABLE && (tagged_addr_disabled || !pmlen))
|
||||
return -EINVAL;
|
||||
|
||||
if (!(arg & PR_TAGGED_ADDR_ENABLE))
|
||||
if (!(arg & PR_TAGGED_ADDR_ENABLE)) {
|
||||
pmlen = PMLEN_0;
|
||||
pmm = ENVCFG_PMM_PMLEN_0;
|
||||
}
|
||||
|
||||
if (mmap_write_lock_killable(mm))
|
||||
return -EINTR;
|
||||
|
|
|
|||
|
|
@ -297,8 +297,6 @@ static u64 hwprobe_vec_misaligned(const struct cpumask *cpus)
|
|||
static void hwprobe_one_pair(struct riscv_hwprobe *pair,
|
||||
const struct cpumask *cpus)
|
||||
{
|
||||
pair->value = 0;
|
||||
|
||||
switch (pair->key) {
|
||||
case RISCV_HWPROBE_KEY_MVENDORID:
|
||||
case RISCV_HWPROBE_KEY_MARCHID:
|
||||
|
|
@ -333,14 +331,17 @@ static void hwprobe_one_pair(struct riscv_hwprobe *pair,
|
|||
break;
|
||||
|
||||
case RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE:
|
||||
pair->value = 0;
|
||||
if (hwprobe_ext0_has(cpus, RISCV_HWPROBE_EXT_ZICBOZ))
|
||||
pair->value = riscv_cboz_block_size;
|
||||
break;
|
||||
case RISCV_HWPROBE_KEY_ZICBOM_BLOCK_SIZE:
|
||||
pair->value = 0;
|
||||
if (hwprobe_ext0_has(cpus, RISCV_HWPROBE_EXT_ZICBOM))
|
||||
pair->value = riscv_cbom_block_size;
|
||||
break;
|
||||
case RISCV_HWPROBE_KEY_ZICBOP_BLOCK_SIZE:
|
||||
pair->value = 0;
|
||||
if (hwprobe_ext0_has(cpus, RISCV_HWPROBE_EXT_ZICBOP))
|
||||
pair->value = riscv_cbop_block_size;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -525,8 +525,9 @@ static int __init setup_global_riscv_enable(char *str)
|
|||
|
||||
if (riscv_nousercfi)
|
||||
pr_info("RISC-V user CFI disabled via cmdline - shadow stack status : %s, landing pad status : %s\n",
|
||||
str_disabled_enabled(riscv_nousercfi & CMDLINE_DISABLE_RISCV_USERCFI_BCFI),
|
||||
str_disabled_enabled(riscv_nousercfi & CMDLINE_DISABLE_RISCV_USERCFI_FCFI));
|
||||
(riscv_nousercfi & CMDLINE_DISABLE_RISCV_USERCFI_BCFI) ? "disabled" :
|
||||
"enabled", (riscv_nousercfi & CMDLINE_DISABLE_RISCV_USERCFI_FCFI) ?
|
||||
"disabled" : "enabled");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -503,8 +503,8 @@ int kvm_riscv_vcpu_pmu_event_info(struct kvm_vcpu *vcpu, unsigned long saddr_low
|
|||
}
|
||||
}
|
||||
|
||||
einfo = kvzalloc_objs(*einfo, num_events,
|
||||
GFP_KERNEL_ACCOUNT | __GFP_NOWARN);
|
||||
einfo = kvcalloc(num_events, sizeof(*einfo),
|
||||
GFP_KERNEL_ACCOUNT | __GFP_NOWARN);
|
||||
if (!einfo) {
|
||||
ret = SBI_ERR_FAILURE;
|
||||
goto out;
|
||||
|
|
|
|||
|
|
@ -76,7 +76,6 @@ SYM_FUNC_START(fallback_scalar_usercopy_sum_enabled)
|
|||
li a3, 9*SZREG-1 /* size must >= (word_copy stride + SZREG-1) */
|
||||
bltu a2, a3, .Lbyte_copy_tail
|
||||
|
||||
#if !defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
|
||||
/*
|
||||
* Copy first bytes until dst is aligned to word boundary.
|
||||
* a0 - start of dst
|
||||
|
|
@ -104,7 +103,7 @@ SYM_FUNC_START(fallback_scalar_usercopy_sum_enabled)
|
|||
/* a1 - start of src */
|
||||
andi a3, a1, SZREG-1
|
||||
bnez a3, .Lshift_copy
|
||||
#endif
|
||||
|
||||
.Lword_copy:
|
||||
/*
|
||||
* Both src and dst are aligned, unrolled word copy
|
||||
|
|
@ -138,7 +137,6 @@ SYM_FUNC_START(fallback_scalar_usercopy_sum_enabled)
|
|||
addi t0, t0, 8*SZREG /* revert to original value */
|
||||
j .Lbyte_copy_tail
|
||||
|
||||
#if !defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS)
|
||||
.Lshift_copy:
|
||||
|
||||
/*
|
||||
|
|
@ -191,7 +189,6 @@ SYM_FUNC_START(fallback_scalar_usercopy_sum_enabled)
|
|||
|
||||
/* Revert src to original unaligned value */
|
||||
add a1, a1, a3
|
||||
#endif
|
||||
|
||||
.Lbyte_copy_tail:
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1465,9 +1465,7 @@ struct execmem_info __init *execmem_arch_setup(void)
|
|||
[EXECMEM_KPROBES] = {
|
||||
.start = VMALLOC_START,
|
||||
.end = VMALLOC_END,
|
||||
.pgprot = IS_ENABLED(CONFIG_STRICT_MODULE_RWX) ?
|
||||
PAGE_KERNEL_READ_EXEC :
|
||||
PAGE_KERNEL_EXEC,
|
||||
.pgprot = PAGE_KERNEL_READ_EXEC,
|
||||
.alignment = 1,
|
||||
},
|
||||
[EXECMEM_BPF] = {
|
||||
|
|
|
|||
|
|
@ -2128,15 +2128,7 @@ bool bpf_jit_supports_ptr_xchg(void)
|
|||
|
||||
bool bpf_jit_supports_arena(void)
|
||||
{
|
||||
/*
|
||||
* The arena range tree uses kmalloc_nolock(), which needs
|
||||
* cmpxchg128, provided by ZACAS on riscv.
|
||||
*/
|
||||
#ifdef system_has_cmpxchg128
|
||||
return system_has_cmpxchg128();
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
bool bpf_jit_supports_insn(struct bpf_insn *insn, bool in_arena)
|
||||
|
|
|
|||
|
|
@ -45,12 +45,11 @@ static void alt_debug_modify(int type, unsigned int nr, bool clear)
|
|||
|
||||
static char *alt_debug_parse(int type, char *str)
|
||||
{
|
||||
unsigned long val, endval, limit;
|
||||
unsigned long val, endval;
|
||||
char *endp;
|
||||
bool clear;
|
||||
int i;
|
||||
|
||||
limit = type == ALT_TYPE_FACILITY ? MAX_FACILITY_BIT : MAX_MFEATURE_BIT;
|
||||
if (*str == ':') {
|
||||
str++;
|
||||
} else {
|
||||
|
|
@ -74,7 +73,7 @@ static char *alt_debug_parse(int type, char *str)
|
|||
if (str == endp)
|
||||
break;
|
||||
str = endp;
|
||||
while (val <= endval && val < limit) {
|
||||
while (val <= endval) {
|
||||
alt_debug_modify(type, val, clear);
|
||||
val++;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ struct parmarea parmarea __section(".parmarea") = {
|
|||
};
|
||||
|
||||
char __bootdata(early_command_line)[COMMAND_LINE_SIZE];
|
||||
static char command_line_buf[COMMAND_LINE_SIZE];
|
||||
|
||||
unsigned int __bootdata_preserved(zlib_dfltcc_support) = ZLIB_DFLTCC_FULL;
|
||||
struct ipl_parameter_block __bootdata_preserved(ipl_block);
|
||||
|
|
@ -136,29 +135,31 @@ static size_t ipl_block_get_ascii_scpdata(char *dest, size_t size,
|
|||
|
||||
static void append_ipl_block_parm(void)
|
||||
{
|
||||
size_t len, extra = 0;
|
||||
char *delim;
|
||||
char *parm, *delim;
|
||||
size_t len, rc = 0;
|
||||
|
||||
len = strlen(early_command_line);
|
||||
delim = early_command_line + len; /* '\0' character position */
|
||||
|
||||
delim = early_command_line + len; /* '\0' character position */
|
||||
parm = early_command_line + len + 1; /* append right after '\0' */
|
||||
|
||||
switch (ipl_block.pb0_hdr.pbt) {
|
||||
case IPL_PBT_CCW:
|
||||
extra = ipl_block_get_ascii_vmparm(command_line_buf, sizeof(command_line_buf), &ipl_block);
|
||||
rc = ipl_block_get_ascii_vmparm(
|
||||
parm, COMMAND_LINE_SIZE - len - 1, &ipl_block);
|
||||
break;
|
||||
case IPL_PBT_FCP:
|
||||
case IPL_PBT_NVME:
|
||||
case IPL_PBT_ECKD:
|
||||
extra = ipl_block_get_ascii_scpdata(command_line_buf, sizeof(command_line_buf), &ipl_block);
|
||||
rc = ipl_block_get_ascii_scpdata(
|
||||
parm, COMMAND_LINE_SIZE - len - 1, &ipl_block);
|
||||
break;
|
||||
}
|
||||
if (extra) {
|
||||
if (command_line_buf[0] == '=') {
|
||||
memmove(early_command_line, command_line_buf + 1, extra);
|
||||
} else if (len < COMMAND_LINE_SIZE - 2) {
|
||||
if (rc) {
|
||||
if (*parm == '=')
|
||||
memmove(early_command_line, parm + 1, rc);
|
||||
else
|
||||
*delim = ' '; /* replace '\0' with space */
|
||||
sized_strscpy(delim + 1, command_line_buf, COMMAND_LINE_SIZE - len - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -230,7 +231,7 @@ static void modify_fac_list(char *str)
|
|||
if (str == endp)
|
||||
break;
|
||||
str = endp;
|
||||
while (val <= endval && val < MAX_FACILITY_BIT) {
|
||||
while (val <= endval) {
|
||||
modify_facility(val, clear);
|
||||
val++;
|
||||
}
|
||||
|
|
@ -244,6 +245,7 @@ static void modify_fac_list(char *str)
|
|||
check_cleared_facilities();
|
||||
}
|
||||
|
||||
static char command_line_buf[COMMAND_LINE_SIZE];
|
||||
void parse_boot_command_line(void)
|
||||
{
|
||||
char *param, *val;
|
||||
|
|
|
|||
|
|
@ -141,7 +141,7 @@ static int tprot(unsigned long addr)
|
|||
|
||||
static unsigned long search_mem_end(void)
|
||||
{
|
||||
unsigned long range = 1UL << (MAX_PHYSMEM_BITS - 20); /* in 1MB blocks */
|
||||
unsigned long range = 1 << (MAX_PHYSMEM_BITS - 20); /* in 1MB blocks */
|
||||
unsigned long offset = 0;
|
||||
unsigned long pivot;
|
||||
|
||||
|
|
|
|||
|
|
@ -301,7 +301,6 @@ static __always_inline void __cpacf_query(unsigned int opcode,
|
|||
cpacf_mask_t *mask)
|
||||
{
|
||||
__cpacf_query_insn(opcode, mask, CPACF_FC_QUERY);
|
||||
kmsan_unpoison_memory(mask, sizeof(*mask));
|
||||
}
|
||||
|
||||
static __always_inline int __cpacf_check_opcode(unsigned int opcode)
|
||||
|
|
@ -371,7 +370,6 @@ static __always_inline int cpacf_query_func(unsigned int opcode,
|
|||
static __always_inline void __cpacf_qai(unsigned int opcode, cpacf_qai_t *qai)
|
||||
{
|
||||
__cpacf_query_insn(opcode, qai, CPACF_FC_QUERY_AUTH_INFO);
|
||||
kmsan_unpoison_memory(qai, sizeof(*qai));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -424,7 +422,6 @@ static inline int cpacf_km(unsigned long func, void *param,
|
|||
[opc] "i" (CPACF_KM)
|
||||
: "cc", "memory", "0", "1");
|
||||
|
||||
kmsan_unpoison_memory(dest, src_len - s.odd);
|
||||
return src_len - s.odd;
|
||||
}
|
||||
|
||||
|
|
@ -457,7 +454,6 @@ static inline int cpacf_kmc(unsigned long func, void *param,
|
|||
[opc] "i" (CPACF_KMC)
|
||||
: "cc", "memory", "0", "1");
|
||||
|
||||
kmsan_unpoison_memory(dest, src_len - s.odd);
|
||||
return src_len - s.odd;
|
||||
}
|
||||
|
||||
|
|
@ -591,7 +587,6 @@ static inline int cpacf_kmctr(unsigned long func, void *param, u8 *dest,
|
|||
[opc] "i" (CPACF_KMCTR)
|
||||
: "cc", "memory", "0", "1");
|
||||
|
||||
kmsan_unpoison_memory(dest, src_len - s.odd);
|
||||
return src_len - s.odd;
|
||||
}
|
||||
|
||||
|
|
@ -624,7 +619,6 @@ static inline void cpacf_prno(unsigned long func, void *param,
|
|||
: [fc] "d" (func), [pba] "d" ((unsigned long)param),
|
||||
[seed] "d" (s.pair), [opc] "i" (CPACF_PRNO)
|
||||
: "cc", "memory", "0", "1");
|
||||
kmsan_unpoison_memory(dest, dest_len);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ struct pcpu {
|
|||
unsigned long ec_mask; /* bit mask for ec_xxx functions */
|
||||
unsigned long ec_clk; /* sigp timestamp for ec_xxx */
|
||||
unsigned long flags; /* per CPU flags */
|
||||
unsigned long capacity; /* cpu capacity for scheduler */
|
||||
signed char state; /* physical cpu state */
|
||||
signed char polarization; /* physical polarization */
|
||||
u16 address; /* physical cpu address */
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ static __always_inline unsigned int raw_smp_processor_id(void)
|
|||
return cpu;
|
||||
}
|
||||
|
||||
#define arch_scale_cpu_capacity topology_get_cpu_scale
|
||||
#define arch_scale_cpu_capacity smp_cpu_get_capacity
|
||||
|
||||
extern struct mutex smp_cpu_state_mutex;
|
||||
extern unsigned int smp_cpu_mt_shift;
|
||||
|
|
@ -53,7 +53,9 @@ extern void smp_save_dump_secondary_cpus(void);
|
|||
extern void smp_yield_cpu(int cpu);
|
||||
extern void smp_cpu_set_polarization(int cpu, int val);
|
||||
extern int smp_cpu_get_polarization(int cpu);
|
||||
extern void smp_cpu_set_capacity(int cpu, unsigned long val);
|
||||
extern void smp_set_core_capacity(int cpu, unsigned long val);
|
||||
extern unsigned long smp_cpu_get_capacity(int cpu);
|
||||
extern int smp_cpu_get_cpu_address(int cpu);
|
||||
extern void smp_fill_possible_mask(void);
|
||||
extern void smp_detect_cpus(void);
|
||||
|
|
|
|||
|
|
@ -182,7 +182,8 @@ long diag324_pibbuf(unsigned long arg)
|
|||
goto out;
|
||||
rc = copy_to_user((void __user *)address, data->pib, data->pib->len);
|
||||
rc |= put_user(data->sequence, &udata->sequence);
|
||||
rc = rc ? -EFAULT : data->rc;
|
||||
if (rc)
|
||||
rc = -EFAULT;
|
||||
out:
|
||||
mutex_unlock(&pibmutex);
|
||||
return rc;
|
||||
|
|
|
|||
|
|
@ -1157,8 +1157,6 @@ static struct attribute_group reipl_nss_attr_group = {
|
|||
|
||||
void set_os_info_reipl_block(void)
|
||||
{
|
||||
if (!reipl_block_actual)
|
||||
return;
|
||||
os_info_entry_add_data(OS_INFO_REIPL_BLOCK, reipl_block_actual,
|
||||
reipl_block_actual->hdr.len);
|
||||
}
|
||||
|
|
@ -1929,8 +1927,7 @@ static struct shutdown_action __refdata dump_action = {
|
|||
static void dump_reipl_run(struct shutdown_trigger *trigger)
|
||||
{
|
||||
struct lowcore *abs_lc;
|
||||
unsigned long ipib = 0;
|
||||
unsigned int csum = 0;
|
||||
unsigned int csum;
|
||||
|
||||
/*
|
||||
* Set REIPL_CLEAR flag in os_info flags entry indicating
|
||||
|
|
@ -1946,12 +1943,9 @@ static void dump_reipl_run(struct shutdown_trigger *trigger)
|
|||
reipl_type == IPL_TYPE_UNKNOWN)
|
||||
os_info_flags |= OS_INFO_FLAG_REIPL_CLEAR;
|
||||
os_info_entry_add_data(OS_INFO_FLAGS_ENTRY, &os_info_flags, sizeof(os_info_flags));
|
||||
if (reipl_block_actual) {
|
||||
ipib = __pa(reipl_block_actual);
|
||||
csum = (__force unsigned int)cksm(reipl_block_actual, reipl_block_actual->hdr.len, 0);
|
||||
}
|
||||
csum = (__force unsigned int)cksm(reipl_block_actual, reipl_block_actual->hdr.len, 0);
|
||||
abs_lc = get_abs_lowcore();
|
||||
abs_lc->ipib = ipib;
|
||||
abs_lc->ipib = __pa(reipl_block_actual);
|
||||
abs_lc->ipib_checksum = csum;
|
||||
put_abs_lowcore(abs_lc);
|
||||
dump_run(trigger);
|
||||
|
|
|
|||
|
|
@ -464,7 +464,6 @@ static void pai_start(struct perf_event *event, int flags,
|
|||
cpump->event = event;
|
||||
}
|
||||
}
|
||||
event->hw.state &= ~PERF_HES_STOPPED;
|
||||
}
|
||||
|
||||
static void paicrypt_start(struct perf_event *event, int flags)
|
||||
|
|
@ -511,13 +510,6 @@ static void pai_stop(struct perf_event *event, int flags)
|
|||
struct pai_mapptr *mp = this_cpu_ptr(pai_root[idx].mapptr);
|
||||
struct pai_map *cpump = mp->mapptr;
|
||||
|
||||
/* Cope with multiple invocations:
|
||||
* 1. perf_event_throttle() --> PMU->stop()
|
||||
* 2. task schedules out --> PMU->stop()
|
||||
* Check for event already stopped.
|
||||
*/
|
||||
if (event->hw.state & PERF_HES_STOPPED)
|
||||
return;
|
||||
if (!event->attr.sample_period) { /* Counting */
|
||||
pai_pmu[idx].pmu->read(event);
|
||||
} else { /* Sampling */
|
||||
|
|
@ -680,9 +672,9 @@ static void pai_have_samples(int idx)
|
|||
{
|
||||
struct pai_mapptr *mp = this_cpu_ptr(pai_root[idx].mapptr);
|
||||
struct pai_map *cpump = mp->mapptr;
|
||||
struct perf_event *event, *e2;
|
||||
struct perf_event *event;
|
||||
|
||||
list_for_each_entry_safe(event, e2, &cpump->syswide_list, hw.tp_list)
|
||||
list_for_each_entry(event, &cpump->syswide_list, hw.tp_list)
|
||||
pai_have_sample(event, cpump);
|
||||
}
|
||||
|
||||
|
|
@ -699,17 +691,6 @@ static void paicrypt_sched_task(struct perf_event_pmu_context *pmu_ctx,
|
|||
pai_have_samples(PAI_PMU_CRYPTO);
|
||||
}
|
||||
|
||||
/* Prevent ioctl(fd, PERF_EVENT_IOC_PERIOD, ...) call.
|
||||
* It sets perf_event::event_limit to a positive value and causes
|
||||
* perf_event_overflow() to invoke pai_stop() call back function when
|
||||
* perf_event::event_limit hits zero. This is not supported because the
|
||||
* sample events CRYPTO_ALL and NNPA_ALL are always taken at schedule out
|
||||
* of a task.
|
||||
*/
|
||||
static int pai_check_period(struct perf_event *event, u64 value)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
/* ============================= paiext ====================================*/
|
||||
|
||||
static void paiext_event_destroy(struct perf_event *event)
|
||||
|
|
@ -823,7 +804,6 @@ static struct pmu paicrypt = {
|
|||
.stop = paicrypt_stop,
|
||||
.read = paicrypt_read,
|
||||
.sched_task = paicrypt_sched_task,
|
||||
.check_period = pai_check_period,
|
||||
.attr_groups = paicrypt_attr_groups
|
||||
};
|
||||
|
||||
|
|
@ -1035,7 +1015,6 @@ static struct pmu paiext = {
|
|||
.stop = paiext_stop,
|
||||
.read = paiext_read,
|
||||
.sched_task = paiext_sched_task,
|
||||
.check_period = pai_check_period,
|
||||
.attr_groups = paiext_attr_groups,
|
||||
};
|
||||
|
||||
|
|
@ -1242,7 +1221,7 @@ static int __init paipmu_setup(void)
|
|||
static int __init pai_init(void)
|
||||
{
|
||||
/* Setup s390dbf facility */
|
||||
paidbg = debug_register("pai", 1, 1, 128);
|
||||
paidbg = debug_register("pai", 32, 256, 128);
|
||||
if (!paidbg) {
|
||||
pr_err("Registration of s390dbf pai failed\n");
|
||||
return -ENOMEM;
|
||||
|
|
|
|||
|
|
@ -659,13 +659,23 @@ int smp_cpu_get_polarization(int cpu)
|
|||
return per_cpu(pcpu_devices, cpu).polarization;
|
||||
}
|
||||
|
||||
void smp_cpu_set_capacity(int cpu, unsigned long val)
|
||||
{
|
||||
per_cpu(pcpu_devices, cpu).capacity = val;
|
||||
}
|
||||
|
||||
unsigned long smp_cpu_get_capacity(int cpu)
|
||||
{
|
||||
return per_cpu(pcpu_devices, cpu).capacity;
|
||||
}
|
||||
|
||||
void smp_set_core_capacity(int cpu, unsigned long val)
|
||||
{
|
||||
int i;
|
||||
|
||||
cpu = smp_get_base_cpu(cpu);
|
||||
for (i = cpu; (i <= cpu + smp_cpu_mtid) && (i < nr_cpu_ids); i++)
|
||||
topology_set_cpu_scale(i, val);
|
||||
smp_cpu_set_capacity(i, val);
|
||||
}
|
||||
|
||||
int smp_cpu_get_cpu_address(int cpu)
|
||||
|
|
@ -717,7 +727,7 @@ static int smp_add_core(struct sclp_core_entry *core, cpumask_t *avail,
|
|||
else
|
||||
pcpu->state = CPU_STATE_STANDBY;
|
||||
smp_cpu_set_polarization(cpu, POLARIZATION_UNKNOWN);
|
||||
topology_set_cpu_scale(cpu, CPU_CAPACITY_HIGH);
|
||||
smp_cpu_set_capacity(cpu, CPU_CAPACITY_HIGH);
|
||||
set_cpu_present(cpu, true);
|
||||
if (!early && arch_register_cpu(cpu))
|
||||
set_cpu_present(cpu, false);
|
||||
|
|
@ -957,7 +967,7 @@ void __init smp_prepare_boot_cpu(void)
|
|||
ipl_pcpu->state = CPU_STATE_CONFIGURED;
|
||||
lc->pcpu = (unsigned long)ipl_pcpu;
|
||||
smp_cpu_set_polarization(0, POLARIZATION_UNKNOWN);
|
||||
topology_set_cpu_scale(0, CPU_CAPACITY_HIGH);
|
||||
smp_cpu_set_capacity(0, CPU_CAPACITY_HIGH);
|
||||
}
|
||||
|
||||
void __init smp_setup_processor_id(void)
|
||||
|
|
|
|||
|
|
@ -147,7 +147,7 @@ static void add_cpus_to_mask(struct topology_core *tl_core,
|
|||
cpumask_set_cpu(cpu, &book->mask);
|
||||
cpumask_set_cpu(cpu, &socket->mask);
|
||||
smp_cpu_set_polarization(cpu, tl_core->pp);
|
||||
topology_set_cpu_scale(cpu, CPU_CAPACITY_HIGH);
|
||||
smp_cpu_set_capacity(cpu, CPU_CAPACITY_HIGH);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ static atomic64_t virt_timer_elapsed;
|
|||
DEFINE_PER_CPU(u64, mt_cycles[8]);
|
||||
static DEFINE_PER_CPU(u64, mt_scaling_mult) = { 1 };
|
||||
static DEFINE_PER_CPU(u64, mt_scaling_div) = { 1 };
|
||||
static DEFINE_PER_CPU(unsigned long, mt_scaling_jiffies);
|
||||
static DEFINE_PER_CPU(u64, mt_scaling_jiffies);
|
||||
|
||||
static inline void set_vtimer(u64 expires)
|
||||
{
|
||||
|
|
@ -81,7 +81,7 @@ static void update_mt_scaling(void)
|
|||
memcpy(cycles_old, cycles_new,
|
||||
sizeof(u64) * (smp_cpu_mtid + 1));
|
||||
}
|
||||
__this_cpu_write(mt_scaling_jiffies, jiffies);
|
||||
__this_cpu_write(mt_scaling_jiffies, jiffies_64);
|
||||
}
|
||||
|
||||
static inline u64 update_tsk_timer(unsigned long *tsk_vtime, u64 new)
|
||||
|
|
@ -144,7 +144,7 @@ static int do_account_vtime(struct task_struct *tsk)
|
|||
lc->system_timer += timer;
|
||||
|
||||
/* Update MT utilization calculation */
|
||||
if (smp_cpu_mtid && time_after(jiffies, __this_cpu_read(mt_scaling_jiffies)))
|
||||
if (smp_cpu_mtid && time_after64(jiffies_64, __this_cpu_read(mt_scaling_jiffies)))
|
||||
update_mt_scaling();
|
||||
|
||||
/* Calculate cputime delta */
|
||||
|
|
|
|||
|
|
@ -2168,7 +2168,7 @@ static int kvm_s390_get_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
|
|||
if (args->count < 1 || args->count > KVM_S390_SKEYS_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
keys = kvmalloc_objs(*keys, args->count, GFP_KERNEL_ACCOUNT);
|
||||
keys = kvmalloc_array(args->count, sizeof(*keys), GFP_KERNEL_ACCOUNT);
|
||||
if (!keys)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -2205,7 +2205,7 @@ static int kvm_s390_set_skeys(struct kvm *kvm, struct kvm_s390_skeys *args)
|
|||
if (args->count < 1 || args->count > KVM_S390_SKEYS_MAX)
|
||||
return -EINVAL;
|
||||
|
||||
keys = kvmalloc_objs(*keys, args->count, GFP_KERNEL_ACCOUNT);
|
||||
keys = kvmalloc_array(args->count, sizeof(*keys), GFP_KERNEL_ACCOUNT);
|
||||
if (!keys)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
|||
|
|
@ -55,46 +55,63 @@ static void __crst_table_upgrade(void *arg)
|
|||
|
||||
int crst_table_upgrade(struct mm_struct *mm, unsigned long end)
|
||||
{
|
||||
unsigned long *table, *pgd;
|
||||
int rc, notify;
|
||||
unsigned long *pgd = NULL, *p4d = NULL, *__pgd;
|
||||
unsigned long asce_limit = mm->context.asce_limit;
|
||||
|
||||
mmap_assert_write_locked(mm);
|
||||
|
||||
/* upgrade should only happen from 3 to 4, 3 to 5, or 4 to 5 levels */
|
||||
VM_BUG_ON(mm->context.asce_limit < _REGION2_SIZE);
|
||||
rc = 0;
|
||||
notify = 0;
|
||||
while (mm->context.asce_limit < end) {
|
||||
table = crst_table_alloc(mm);
|
||||
if (!table) {
|
||||
rc = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
spin_lock_bh(&mm->page_table_lock);
|
||||
pgd = (unsigned long *)mm->pgd;
|
||||
if (mm->context.asce_limit == _REGION2_SIZE) {
|
||||
crst_table_init(table, _REGION2_ENTRY_EMPTY);
|
||||
p4d_populate(mm, (p4d_t *)table, (pud_t *)pgd);
|
||||
pagetable_p4d_ctor(virt_to_ptdesc(table));
|
||||
mm->pgd = (pgd_t *)table;
|
||||
mm->context.asce_limit = _REGION1_SIZE;
|
||||
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
||||
_ASCE_USER_BITS | _ASCE_TYPE_REGION2;
|
||||
mm_inc_nr_puds(mm);
|
||||
} else {
|
||||
crst_table_init(table, _REGION1_ENTRY_EMPTY);
|
||||
pgd_populate(mm, (pgd_t *)table, (p4d_t *)pgd);
|
||||
pagetable_pgd_ctor(virt_to_ptdesc(table));
|
||||
mm->pgd = (pgd_t *)table;
|
||||
mm->context.asce_limit = TASK_SIZE_MAX;
|
||||
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
||||
_ASCE_USER_BITS | _ASCE_TYPE_REGION1;
|
||||
}
|
||||
notify = 1;
|
||||
spin_unlock_bh(&mm->page_table_lock);
|
||||
VM_BUG_ON(asce_limit < _REGION2_SIZE);
|
||||
|
||||
if (end <= asce_limit)
|
||||
return 0;
|
||||
|
||||
if (asce_limit == _REGION2_SIZE) {
|
||||
p4d = crst_table_alloc(mm);
|
||||
if (unlikely(!p4d))
|
||||
goto err_p4d;
|
||||
crst_table_init(p4d, _REGION2_ENTRY_EMPTY);
|
||||
pagetable_p4d_ctor(virt_to_ptdesc(p4d));
|
||||
}
|
||||
if (notify)
|
||||
on_each_cpu(__crst_table_upgrade, mm, 0);
|
||||
return rc;
|
||||
if (end > _REGION1_SIZE) {
|
||||
pgd = crst_table_alloc(mm);
|
||||
if (unlikely(!pgd))
|
||||
goto err_pgd;
|
||||
crst_table_init(pgd, _REGION1_ENTRY_EMPTY);
|
||||
pagetable_pgd_ctor(virt_to_ptdesc(pgd));
|
||||
}
|
||||
|
||||
spin_lock_bh(&mm->page_table_lock);
|
||||
|
||||
if (p4d) {
|
||||
__pgd = (unsigned long *) mm->pgd;
|
||||
p4d_populate(mm, (p4d_t *) p4d, (pud_t *) __pgd);
|
||||
mm->pgd = (pgd_t *) p4d;
|
||||
mm->context.asce_limit = _REGION1_SIZE;
|
||||
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
||||
_ASCE_USER_BITS | _ASCE_TYPE_REGION2;
|
||||
mm_inc_nr_puds(mm);
|
||||
}
|
||||
if (pgd) {
|
||||
__pgd = (unsigned long *) mm->pgd;
|
||||
pgd_populate(mm, (pgd_t *) pgd, (p4d_t *) __pgd);
|
||||
mm->pgd = (pgd_t *) pgd;
|
||||
mm->context.asce_limit = TASK_SIZE_MAX;
|
||||
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
||||
_ASCE_USER_BITS | _ASCE_TYPE_REGION1;
|
||||
}
|
||||
|
||||
spin_unlock_bh(&mm->page_table_lock);
|
||||
|
||||
on_each_cpu(__crst_table_upgrade, mm, 0);
|
||||
|
||||
return 0;
|
||||
|
||||
err_pgd:
|
||||
pagetable_dtor(virt_to_ptdesc(p4d));
|
||||
crst_table_free(mm, p4d);
|
||||
err_p4d:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
unsigned long *page_table_alloc_noprof(struct mm_struct *mm)
|
||||
|
|
|
|||
|
|
@ -153,9 +153,6 @@ static ssize_t report_error_write(struct file *filp, struct kobject *kobj,
|
|||
if (off || (count < sizeof(*report)))
|
||||
return -EINVAL;
|
||||
|
||||
if (count < (report->length + sizeof(*report)))
|
||||
return -EINVAL;
|
||||
|
||||
ret = sclp_pci_report(report, zdev->fh, zdev->fid);
|
||||
|
||||
return ret ? ret : count;
|
||||
|
|
|
|||
|
|
@ -982,7 +982,6 @@ SYM_TYPED_FUNC_START(aria_aesni_avx2_encrypt_32way)
|
|||
%ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14,
|
||||
%ymm15, %rax);
|
||||
|
||||
vzeroupper;
|
||||
FRAME_END
|
||||
RET;
|
||||
SYM_FUNC_END(aria_aesni_avx2_encrypt_32way)
|
||||
|
|
@ -1008,7 +1007,6 @@ SYM_TYPED_FUNC_START(aria_aesni_avx2_decrypt_32way)
|
|||
%ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14,
|
||||
%ymm15, %rax);
|
||||
|
||||
vzeroupper;
|
||||
FRAME_END
|
||||
RET;
|
||||
SYM_FUNC_END(aria_aesni_avx2_decrypt_32way)
|
||||
|
|
@ -1211,7 +1209,6 @@ SYM_TYPED_FUNC_START(aria_aesni_avx2_ctr_crypt_32way)
|
|||
%ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14,
|
||||
%ymm15, %r10);
|
||||
|
||||
vzeroupper;
|
||||
FRAME_END
|
||||
RET;
|
||||
SYM_FUNC_END(aria_aesni_avx2_ctr_crypt_32way)
|
||||
|
|
@ -1362,7 +1359,6 @@ SYM_TYPED_FUNC_START(aria_aesni_avx2_gfni_encrypt_32way)
|
|||
%ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14,
|
||||
%ymm15, %rax);
|
||||
|
||||
vzeroupper;
|
||||
FRAME_END
|
||||
RET;
|
||||
SYM_FUNC_END(aria_aesni_avx2_gfni_encrypt_32way)
|
||||
|
|
@ -1388,7 +1384,6 @@ SYM_TYPED_FUNC_START(aria_aesni_avx2_gfni_decrypt_32way)
|
|||
%ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14,
|
||||
%ymm15, %rax);
|
||||
|
||||
vzeroupper;
|
||||
FRAME_END
|
||||
RET;
|
||||
SYM_FUNC_END(aria_aesni_avx2_gfni_decrypt_32way)
|
||||
|
|
@ -1433,7 +1428,6 @@ SYM_TYPED_FUNC_START(aria_aesni_avx2_gfni_ctr_crypt_32way)
|
|||
%ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14,
|
||||
%ymm15, %r10);
|
||||
|
||||
vzeroupper;
|
||||
FRAME_END
|
||||
RET;
|
||||
SYM_FUNC_END(aria_aesni_avx2_gfni_ctr_crypt_32way)
|
||||
|
|
|
|||
|
|
@ -800,7 +800,6 @@ SYM_TYPED_FUNC_START(aria_gfni_avx512_encrypt_64way)
|
|||
%zmm9, %zmm8, %zmm11, %zmm10, %zmm12, %zmm13, %zmm14,
|
||||
%zmm15, %rax);
|
||||
|
||||
vzeroupper;
|
||||
FRAME_END
|
||||
RET;
|
||||
SYM_FUNC_END(aria_gfni_avx512_encrypt_64way)
|
||||
|
|
@ -826,7 +825,6 @@ SYM_TYPED_FUNC_START(aria_gfni_avx512_decrypt_64way)
|
|||
%zmm9, %zmm8, %zmm11, %zmm10, %zmm12, %zmm13, %zmm14,
|
||||
%zmm15, %rax);
|
||||
|
||||
vzeroupper;
|
||||
FRAME_END
|
||||
RET;
|
||||
SYM_FUNC_END(aria_gfni_avx512_decrypt_64way)
|
||||
|
|
@ -968,7 +966,6 @@ SYM_TYPED_FUNC_START(aria_gfni_avx512_ctr_crypt_64way)
|
|||
%zmm9, %zmm8, %zmm11, %zmm10, %zmm12, %zmm13, %zmm14,
|
||||
%zmm15, %r10);
|
||||
|
||||
vzeroupper;
|
||||
FRAME_END
|
||||
RET;
|
||||
SYM_FUNC_END(aria_gfni_avx512_ctr_crypt_64way)
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ static struct pci_dev **amd_roots;
|
|||
|
||||
/* Protect the PCI config register pairs used for SMN. */
|
||||
static DEFINE_MUTEX(smn_mutex);
|
||||
static bool smn_exclusive;
|
||||
|
||||
#define SMN_INDEX_OFFSET 0x60
|
||||
#define SMN_DATA_OFFSET 0x64
|
||||
|
|
@ -90,18 +91,13 @@ static int __amd_smn_rw(u8 i_off, u8 d_off, u16 node, u32 address, u32 *value, b
|
|||
if (node >= amd_num_nodes())
|
||||
return err;
|
||||
|
||||
/*
|
||||
* Uninitialized amd_roots indicates pci_request_config_region_exclusive()
|
||||
* didn't run or failed and thus the kernel cannot rely on having
|
||||
* exclusive access to SMN registers so prevent that.
|
||||
*/
|
||||
if (!amd_roots)
|
||||
return err;
|
||||
|
||||
root = amd_roots[node];
|
||||
if (!root)
|
||||
return err;
|
||||
|
||||
if (!smn_exclusive)
|
||||
return err;
|
||||
|
||||
guard(mutex)(&smn_mutex);
|
||||
|
||||
err = pci_write_config_dword(root, i_off, address);
|
||||
|
|
@ -291,11 +287,6 @@ static int __init amd_smn_init(void)
|
|||
return -ENOMEM;
|
||||
|
||||
roots_per_node = num_roots / num_nodes;
|
||||
if (!roots_per_node) {
|
||||
if (!cpu_feature_enabled(X86_FEATURE_HYPERVISOR))
|
||||
pr_warn(FW_BUG "Error detecting roots per node.\n");
|
||||
roots_per_node = 1;
|
||||
}
|
||||
|
||||
count = 0;
|
||||
node = 0;
|
||||
|
|
@ -317,6 +308,8 @@ static int __init amd_smn_init(void)
|
|||
debugfs_create_file("value", 0600, debugfs_dir, NULL, &smn_value_fops);
|
||||
}
|
||||
|
||||
smn_exclusive = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -865,7 +865,7 @@ static void amd_deferred_error_interrupt(void)
|
|||
|
||||
void mce_amd_handle_storm(unsigned int bank, bool on)
|
||||
{
|
||||
threshold_restart_bank(bank, !on);
|
||||
threshold_restart_bank(bank, on);
|
||||
}
|
||||
|
||||
static void amd_reset_thr_limit(unsigned int bank)
|
||||
|
|
|
|||
|
|
@ -110,14 +110,18 @@ int sched_set_itmt_support(void)
|
|||
arch_debugfs_dir,
|
||||
&sysctl_sched_itmt_enabled,
|
||||
&dfs_sched_itmt_fops);
|
||||
if (IS_ERR(dfs_sched_itmt))
|
||||
if (IS_ERR_OR_NULL(dfs_sched_itmt)) {
|
||||
dfs_sched_itmt = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dfs_sched_core_prio = debugfs_create_file("sched_core_priority", 0644,
|
||||
arch_debugfs_dir, NULL,
|
||||
&sched_core_priority_fops);
|
||||
if (IS_ERR(dfs_sched_core_prio))
|
||||
if (IS_ERR_OR_NULL(dfs_sched_core_prio)) {
|
||||
dfs_sched_core_prio = NULL;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
sched_itmt_capable = true;
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,6 @@
|
|||
#include <linux/bpf_verifier.h>
|
||||
#include <linux/memory.h>
|
||||
#include <linux/sort.h>
|
||||
#include <linux/execmem.h>
|
||||
#include <asm/extable.h>
|
||||
#include <asm/ftrace.h>
|
||||
#include <asm/set_memory.h>
|
||||
|
|
@ -3819,16 +3818,15 @@ int arch_bpf_trampoline_size(const struct btf_func_model *m, u32 flags,
|
|||
*
|
||||
* We cannot use kvmalloc here, because we need image to be in
|
||||
* module memory range.
|
||||
* Since it must be writable use execmem_alloc(EXECMEM_MODULE_DATA)
|
||||
* that returns writable memory in the module address space.
|
||||
* Since it must be writable use bpf_jit_alloc_exec_rw().
|
||||
*/
|
||||
image = execmem_alloc(EXECMEM_MODULE_DATA, PAGE_SIZE);
|
||||
image = bpf_jit_alloc_exec_rw(PAGE_SIZE);
|
||||
if (!image)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = __arch_prepare_bpf_trampoline(&im, image, image + PAGE_SIZE, image,
|
||||
m, flags, tnodes, func_addr);
|
||||
execmem_free(image);
|
||||
bpf_jit_free_exec(image);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -859,7 +859,6 @@ static int __bio_clone(struct bio *bio, struct bio *bio_src, gfp_t gfp)
|
|||
bio->bi_ioprio = bio_src->bi_ioprio;
|
||||
bio->bi_write_hint = bio_src->bi_write_hint;
|
||||
bio->bi_write_stream = bio_src->bi_write_stream;
|
||||
bio->bi_bvec_gap_bit = bio_src->bi_bvec_gap_bit;
|
||||
bio->bi_iter = bio_src->bi_iter;
|
||||
bio->bi_io_vec = bio_src->bi_io_vec;
|
||||
|
||||
|
|
@ -1973,14 +1972,6 @@ struct bio *bio_split(struct bio *bio, int sectors,
|
|||
|
||||
bio_advance(bio, split->bi_iter.bi_size);
|
||||
|
||||
/*
|
||||
* The gap bit is set when splitting to limits and only applies to the
|
||||
* front bio that was split off. The remaining bio will calcualte its
|
||||
* gap value when it is subsequently split to limits, so it is safe to
|
||||
* re-initialize the value back to 0.
|
||||
*/
|
||||
bio->bi_bvec_gap_bit = 0;
|
||||
|
||||
if (bio_flagged(bio, BIO_TRACE_COMPLETION))
|
||||
bio_set_flag(split, BIO_TRACE_COMPLETION);
|
||||
|
||||
|
|
|
|||
|
|
@ -447,13 +447,6 @@ static int __add_disk(struct device *parent, struct gendisk *disk,
|
|||
bdev_set_flag(disk->part0, BD_HAS_SUBMIT_BIO);
|
||||
}
|
||||
|
||||
/*
|
||||
* We do not support partitions with zoned block devices, so do not try
|
||||
* to scan the partitions table.
|
||||
*/
|
||||
if (blk_queue_is_zoned(disk->queue))
|
||||
disk->flags |= GENHD_FL_NO_PART;
|
||||
|
||||
/*
|
||||
* If the driver provides an explicit major number it also must provide
|
||||
* the number of minors numbers supported, and those will be used to
|
||||
|
|
|
|||
|
|
@ -994,7 +994,7 @@ int aie2_cmdlist_multi_execbuf(struct amdxdna_hwctx *hwctx,
|
|||
}
|
||||
|
||||
ccnt = payload->command_count;
|
||||
if (!ccnt || payload_len < struct_size(payload, data, ccnt)) {
|
||||
if (payload_len < struct_size(payload, data, ccnt)) {
|
||||
XDNA_DBG(xdna, "Invalid command count %d", ccnt);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -183,10 +183,8 @@ int amdxdna_cmd_set_error(struct amdxdna_gem_obj *abo,
|
|||
if (!abo)
|
||||
return -EINVAL;
|
||||
cmd = amdxdna_gem_vmap(abo);
|
||||
if (!cmd) {
|
||||
amdxdna_gem_put_obj(abo);
|
||||
if (!cmd)
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
memset(cmd->data, 0xff, abo->mem.size - sizeof(*cmd));
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ struct amdxdna_cmd_chain {
|
|||
u32 submit_index;
|
||||
u32 error_index;
|
||||
u32 reserved[3];
|
||||
u64 data[];
|
||||
u64 data[] __counted_by(command_count);
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1246,9 +1246,6 @@ static int amdxdna_flush_bo(struct amdxdna_gem_obj *abo, u64 offset, u64 size)
|
|||
{
|
||||
u64 end;
|
||||
|
||||
if (is_import_bo(abo))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (offset >= abo->mem.size)
|
||||
return -EINVAL;
|
||||
|
||||
|
|
@ -1256,10 +1253,9 @@ static int amdxdna_flush_bo(struct amdxdna_gem_obj *abo, u64 offset, u64 size)
|
|||
return -EINVAL;
|
||||
|
||||
size = min(abo->mem.size, end) - offset;
|
||||
if (!size)
|
||||
return 0;
|
||||
|
||||
if (amdxdna_gem_vmap(abo))
|
||||
if (is_import_bo(abo))
|
||||
drm_clflush_sg(abo->base.sgt);
|
||||
else if (amdxdna_gem_vmap(abo))
|
||||
drm_clflush_virt_range(amdxdna_gem_vmap(abo) + offset, size);
|
||||
else if (abo->base.pages)
|
||||
drm_clflush_pages(abo->base.pages, abo->mem.size >> PAGE_SHIFT);
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user