Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
fdae5f37
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
fdae5f37
编写于
11月 12, 2017
作者:
D
David S. Miller
浏览文件
操作
浏览文件
下载
差异文件
Merge
git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
上级
7c5556de
b3954568
变更
37
隐藏空白更改
内联
并排
Showing
37 changed file
with
180 addition
and
105 deletion
+180
-105
.mailmap
.mailmap
+1
-0
CREDITS
CREDITS
+8
-1
MAINTAINERS
MAINTAINERS
+12
-13
arch/arm/kernel/traps.c
arch/arm/kernel/traps.c
+18
-10
arch/mips/ar7/platform.c
arch/mips/ar7/platform.c
+5
-0
arch/mips/ar7/prom.c
arch/mips/ar7/prom.c
+0
-2
arch/mips/kernel/smp-bmips.c
arch/mips/kernel/smp-bmips.c
+2
-2
arch/powerpc/kvm/book3s_64_mmu_hv.c
arch/powerpc/kvm/book3s_64_mmu_hv.c
+10
-0
arch/powerpc/kvm/book3s_hv.c
arch/powerpc/kvm/book3s_hv.c
+19
-10
arch/x86/kernel/cpu/Makefile
arch/x86/kernel/cpu/Makefile
+1
-1
arch/x86/kernel/cpu/aperfmperf.c
arch/x86/kernel/cpu/aperfmperf.c
+4
-7
arch/x86/kernel/cpu/proc.c
arch/x86/kernel/cpu/proc.c
+1
-3
drivers/block/rbd.c
drivers/block/rbd.c
+2
-2
drivers/gpu/drm/i915/i915_gem_execbuffer.c
drivers/gpu/drm/i915/i915_gem_execbuffer.c
+8
-0
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_gem_gtt.c
+9
-16
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+1
-1
drivers/gpu/drm/vmwgfx/vmwgfx_fence.c
drivers/gpu/drm/vmwgfx/vmwgfx_fence.c
+1
-1
drivers/input/mouse/elan_i2c_core.c
drivers/input/mouse/elan_i2c_core.c
+1
-0
drivers/input/rmi4/rmi_smbus.c
drivers/input/rmi4/rmi_smbus.c
+2
-2
drivers/input/touchscreen/tsc200x-core.c
drivers/input/touchscreen/tsc200x-core.c
+1
-0
drivers/net/can/c_can/c_can_pci.c
drivers/net/can/c_can/c_can_pci.c
+0
-1
drivers/net/can/c_can/c_can_platform.c
drivers/net/can/c_can/c_can_platform.c
+0
-1
drivers/net/can/ifi_canfd/ifi_canfd.c
drivers/net/can/ifi_canfd/ifi_canfd.c
+3
-3
drivers/net/can/peak_canfd/peak_pciefd_main.c
drivers/net/can/peak_canfd/peak_pciefd_main.c
+12
-2
drivers/net/can/sun4i_can.c
drivers/net/can/sun4i_can.c
+10
-2
drivers/net/ethernet/mellanox/mlx5/core/dev.c
drivers/net/ethernet/mellanox/mlx5/core/dev.c
+1
-1
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/en.h
+1
-1
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+5
-7
drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
+6
-4
drivers/net/ethernet/mellanox/mlx5/core/main.c
drivers/net/ethernet/mellanox/mlx5/core/main.c
+7
-0
include/linux/sysctl.h
include/linux/sysctl.h
+5
-0
include/uapi/drm/i915_drm.h
include/uapi/drm/i915_drm.h
+1
-0
net/8021q/vlan.c
net/8021q/vlan.c
+3
-3
net/dsa/switch.c
net/dsa/switch.c
+4
-0
net/ipv4/tcp_input.c
net/ipv4/tcp_input.c
+1
-2
net/ipv4/tcp_offload.c
net/ipv4/tcp_offload.c
+10
-2
net/rds/ib_recv.c
net/rds/ib_recv.c
+5
-5
未找到文件。
.mailmap
浏览文件 @
fdae5f37
...
@@ -102,6 +102,7 @@ Leonid I Ananiev <leonid.i.ananiev@intel.com>
...
@@ -102,6 +102,7 @@ Leonid I Ananiev <leonid.i.ananiev@intel.com>
Linas Vepstas <linas@austin.ibm.com>
Linas Vepstas <linas@austin.ibm.com>
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@web.de>
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@web.de>
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@ascom.ch>
Linus Lüssing <linus.luessing@c0d3.blue> <linus.luessing@ascom.ch>
Maciej W. Rozycki <macro@mips.com> <macro@imgtec.com>
Marcin Nowakowski <marcin.nowakowski@mips.com> <marcin.nowakowski@imgtec.com>
Marcin Nowakowski <marcin.nowakowski@mips.com> <marcin.nowakowski@imgtec.com>
Mark Brown <broonie@sirena.org.uk>
Mark Brown <broonie@sirena.org.uk>
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@theobroma-systems.com>
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@theobroma-systems.com>
...
...
CREDITS
浏览文件 @
fdae5f37
...
@@ -2113,6 +2113,10 @@ S: J. Obrechtstr 23
...
@@ -2113,6 +2113,10 @@ S: J. Obrechtstr 23
S: NL-5216 GP 's-Hertogenbosch
S: NL-5216 GP 's-Hertogenbosch
S: The Netherlands
S: The Netherlands
N: Ashley Lai
E: ashleydlai@gmail.com
D: IBM VTPM driver
N: Savio Lam
N: Savio Lam
E: lam836@cs.cuhk.hk
E: lam836@cs.cuhk.hk
D: Author of the dialog utility, foundation
D: Author of the dialog utility, foundation
...
@@ -3333,6 +3337,10 @@ S: Braunschweiger Strasse 79
...
@@ -3333,6 +3337,10 @@ S: Braunschweiger Strasse 79
S: 31134 Hildesheim
S: 31134 Hildesheim
S: Germany
S: Germany
N: Marcel Selhorst
E: tpmdd@selhorst.net
D: TPM driver
N: Darren Senn
N: Darren Senn
E: sinster@darkwater.com
E: sinster@darkwater.com
D: Whatever I notice needs doing (so far: itimers, /proc)
D: Whatever I notice needs doing (so far: itimers, /proc)
...
@@ -4128,7 +4136,6 @@ D: MD driver
...
@@ -4128,7 +4136,6 @@ D: MD driver
D: EISA/sysfs subsystem
D: EISA/sysfs subsystem
S: France
S: France
# Don't add your name here, unless you really _are_ after Marc
# Don't add your name here, unless you really _are_ after Marc
# alphabetically. Leonard used to be very proud of being the
# alphabetically. Leonard used to be very proud of being the
# last entry, and he'll get positively pissed if he can't even
# last entry, and he'll get positively pissed if he can't even
...
...
MAINTAINERS
浏览文件 @
fdae5f37
...
@@ -10349,7 +10349,6 @@ F: drivers/pci/host/vmd.c
...
@@ -10349,7 +10349,6 @@ F: drivers/pci/host/vmd.c
PCI DRIVER FOR MICROSEMI SWITCHTEC
PCI DRIVER FOR MICROSEMI SWITCHTEC
M: Kurt Schwemmer <kurt.schwemmer@microsemi.com>
M: Kurt Schwemmer <kurt.schwemmer@microsemi.com>
M: Stephen Bates <stephen.bates@microsemi.com>
M: Logan Gunthorpe <logang@deltatee.com>
M: Logan Gunthorpe <logang@deltatee.com>
L: linux-pci@vger.kernel.org
L: linux-pci@vger.kernel.org
S: Maintained
S: Maintained
...
@@ -10414,6 +10413,7 @@ F: drivers/pci/dwc/*keystone*
...
@@ -10414,6 +10413,7 @@ F: drivers/pci/dwc/*keystone*
PCI ENDPOINT SUBSYSTEM
PCI ENDPOINT SUBSYSTEM
M: Kishon Vijay Abraham I <kishon@ti.com>
M: Kishon Vijay Abraham I <kishon@ti.com>
M: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
L: linux-pci@vger.kernel.org
L: linux-pci@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kishon/pci-endpoint.git
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kishon/pci-endpoint.git
S: Supported
S: Supported
...
@@ -10465,6 +10465,15 @@ F: include/linux/pci*
...
@@ -10465,6 +10465,15 @@ F: include/linux/pci*
F: arch/x86/pci/
F: arch/x86/pci/
F: arch/x86/kernel/quirks.c
F: arch/x86/kernel/quirks.c
PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
M: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
L: linux-pci@vger.kernel.org
Q: http://patchwork.ozlabs.org/project/linux-pci/list/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lpieralisi/pci.git/
S: Supported
F: drivers/pci/host/
F: drivers/pci/dwc/
PCIE DRIVER FOR AXIS ARTPEC
PCIE DRIVER FOR AXIS ARTPEC
M: Niklas Cassel <niklas.cassel@axis.com>
M: Niklas Cassel <niklas.cassel@axis.com>
M: Jesper Nilsson <jesper.nilsson@axis.com>
M: Jesper Nilsson <jesper.nilsson@axis.com>
...
@@ -10484,7 +10493,6 @@ F: drivers/pci/host/pci-thunder-*
...
@@ -10484,7 +10493,6 @@ F: drivers/pci/host/pci-thunder-*
PCIE DRIVER FOR HISILICON
PCIE DRIVER FOR HISILICON
M: Zhou Wang <wangzhou1@hisilicon.com>
M: Zhou Wang <wangzhou1@hisilicon.com>
M: Gabriele Paoloni <gabriele.paoloni@huawei.com>
L: linux-pci@vger.kernel.org
L: linux-pci@vger.kernel.org
S: Maintained
S: Maintained
F: Documentation/devicetree/bindings/pci/hisilicon-pcie.txt
F: Documentation/devicetree/bindings/pci/hisilicon-pcie.txt
...
@@ -13621,23 +13629,14 @@ F: drivers/platform/x86/toshiba-wmi.c
...
@@ -13621,23 +13629,14 @@ F: drivers/platform/x86/toshiba-wmi.c
TPM DEVICE DRIVER
TPM DEVICE DRIVER
M: Peter Huewe <peterhuewe@gmx.de>
M: Peter Huewe <peterhuewe@gmx.de>
M: Marcel Selhorst <tpmdd@selhorst.net>
M: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
M: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
R: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
R: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
W: http://tpmdd.sourceforge.net
L: linux-integrity@vger.kernel.org
L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
Q: https://patchwork.kernel.org/project/linux-integrity/list/
Q: https://patchwork.kernel.org/project/tpmdd-devel/list/
T: git git://git.infradead.org/users/jjs/linux-tpmdd.git
T: git git://git.infradead.org/users/jjs/linux-tpmdd.git
S: Maintained
S: Maintained
F: drivers/char/tpm/
F: drivers/char/tpm/
TPM IBM_VTPM DEVICE DRIVER
M: Ashley Lai <ashleydlai@gmail.com>
W: http://tpmdd.sourceforge.net
L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
S: Maintained
F: drivers/char/tpm/tpm_ibmvtpm*
TRACING
TRACING
M: Steven Rostedt <rostedt@goodmis.org>
M: Steven Rostedt <rostedt@goodmis.org>
M: Ingo Molnar <mingo@redhat.com>
M: Ingo Molnar <mingo@redhat.com>
...
...
arch/arm/kernel/traps.c
浏览文件 @
fdae5f37
...
@@ -154,30 +154,26 @@ static void dump_mem(const char *lvl, const char *str, unsigned long bottom,
...
@@ -154,30 +154,26 @@ static void dump_mem(const char *lvl, const char *str, unsigned long bottom,
set_fs
(
fs
);
set_fs
(
fs
);
}
}
static
void
dump_instr
(
const
char
*
lvl
,
struct
pt_regs
*
regs
)
static
void
__
dump_instr
(
const
char
*
lvl
,
struct
pt_regs
*
regs
)
{
{
unsigned
long
addr
=
instruction_pointer
(
regs
);
unsigned
long
addr
=
instruction_pointer
(
regs
);
const
int
thumb
=
thumb_mode
(
regs
);
const
int
thumb
=
thumb_mode
(
regs
);
const
int
width
=
thumb
?
4
:
8
;
const
int
width
=
thumb
?
4
:
8
;
mm_segment_t
fs
;
char
str
[
sizeof
(
"00000000 "
)
*
5
+
2
+
1
],
*
p
=
str
;
char
str
[
sizeof
(
"00000000 "
)
*
5
+
2
+
1
],
*
p
=
str
;
int
i
;
int
i
;
/*
/*
* We need to switch to kernel mode so that we can use __get_user
* Note that we now dump the code first, just in case the backtrace
* to safely read from kernel space. Note that we now dump the
* kills us.
* code first, just in case the backtrace kills us.
*/
*/
fs
=
get_fs
();
set_fs
(
KERNEL_DS
);
for
(
i
=
-
4
;
i
<
1
+
!!
thumb
;
i
++
)
{
for
(
i
=
-
4
;
i
<
1
+
!!
thumb
;
i
++
)
{
unsigned
int
val
,
bad
;
unsigned
int
val
,
bad
;
if
(
thumb
)
if
(
thumb
)
bad
=
__
get_user
(
val
,
&
((
u16
*
)
addr
)[
i
]);
bad
=
get_user
(
val
,
&
((
u16
*
)
addr
)[
i
]);
else
else
bad
=
__
get_user
(
val
,
&
((
u32
*
)
addr
)[
i
]);
bad
=
get_user
(
val
,
&
((
u32
*
)
addr
)[
i
]);
if
(
!
bad
)
if
(
!
bad
)
p
+=
sprintf
(
p
,
i
==
0
?
"(%0*x) "
:
"%0*x "
,
p
+=
sprintf
(
p
,
i
==
0
?
"(%0*x) "
:
"%0*x "
,
...
@@ -188,8 +184,20 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
...
@@ -188,8 +184,20 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
}
}
}
}
printk
(
"%sCode: %s
\n
"
,
lvl
,
str
);
printk
(
"%sCode: %s
\n
"
,
lvl
,
str
);
}
set_fs
(
fs
);
static
void
dump_instr
(
const
char
*
lvl
,
struct
pt_regs
*
regs
)
{
mm_segment_t
fs
;
if
(
!
user_mode
(
regs
))
{
fs
=
get_fs
();
set_fs
(
KERNEL_DS
);
__dump_instr
(
lvl
,
regs
);
set_fs
(
fs
);
}
else
{
__dump_instr
(
lvl
,
regs
);
}
}
}
#ifdef CONFIG_ARM_UNWIND
#ifdef CONFIG_ARM_UNWIND
...
...
arch/mips/ar7/platform.c
浏览文件 @
fdae5f37
...
@@ -575,6 +575,7 @@ static int __init ar7_register_uarts(void)
...
@@ -575,6 +575,7 @@ static int __init ar7_register_uarts(void)
uart_port
.
type
=
PORT_AR7
;
uart_port
.
type
=
PORT_AR7
;
uart_port
.
uartclk
=
clk_get_rate
(
bus_clk
)
/
2
;
uart_port
.
uartclk
=
clk_get_rate
(
bus_clk
)
/
2
;
uart_port
.
iotype
=
UPIO_MEM32
;
uart_port
.
iotype
=
UPIO_MEM32
;
uart_port
.
flags
=
UPF_FIXED_TYPE
;
uart_port
.
regshift
=
2
;
uart_port
.
regshift
=
2
;
uart_port
.
line
=
0
;
uart_port
.
line
=
0
;
...
@@ -653,6 +654,10 @@ static int __init ar7_register_devices(void)
...
@@ -653,6 +654,10 @@ static int __init ar7_register_devices(void)
u32
val
;
u32
val
;
int
res
;
int
res
;
res
=
ar7_gpio_init
();
if
(
res
)
pr_warn
(
"unable to register gpios: %d
\n
"
,
res
);
res
=
ar7_register_uarts
();
res
=
ar7_register_uarts
();
if
(
res
)
if
(
res
)
pr_err
(
"unable to setup uart(s): %d
\n
"
,
res
);
pr_err
(
"unable to setup uart(s): %d
\n
"
,
res
);
...
...
arch/mips/ar7/prom.c
浏览文件 @
fdae5f37
...
@@ -246,8 +246,6 @@ void __init prom_init(void)
...
@@ -246,8 +246,6 @@ void __init prom_init(void)
ar7_init_cmdline
(
fw_arg0
,
(
char
**
)
fw_arg1
);
ar7_init_cmdline
(
fw_arg0
,
(
char
**
)
fw_arg1
);
ar7_init_env
((
struct
env_var
*
)
fw_arg2
);
ar7_init_env
((
struct
env_var
*
)
fw_arg2
);
console_config
();
console_config
();
ar7_gpio_init
();
}
}
#define PORT(offset) (KSEG1ADDR(AR7_REGS_UART0 + (offset * 4)))
#define PORT(offset) (KSEG1ADDR(AR7_REGS_UART0 + (offset * 4)))
...
...
arch/mips/kernel/smp-bmips.c
浏览文件 @
fdae5f37
...
@@ -591,11 +591,11 @@ void __init bmips_cpu_setup(void)
...
@@ -591,11 +591,11 @@ void __init bmips_cpu_setup(void)
/* Flush and enable RAC */
/* Flush and enable RAC */
cfg
=
__raw_readl
(
cbr
+
BMIPS_RAC_CONFIG
);
cfg
=
__raw_readl
(
cbr
+
BMIPS_RAC_CONFIG
);
__raw_writel
(
cfg
|
0x100
,
BMIPS_RAC_CONFIG
);
__raw_writel
(
cfg
|
0x100
,
cbr
+
BMIPS_RAC_CONFIG
);
__raw_readl
(
cbr
+
BMIPS_RAC_CONFIG
);
__raw_readl
(
cbr
+
BMIPS_RAC_CONFIG
);
cfg
=
__raw_readl
(
cbr
+
BMIPS_RAC_CONFIG
);
cfg
=
__raw_readl
(
cbr
+
BMIPS_RAC_CONFIG
);
__raw_writel
(
cfg
|
0xf
,
BMIPS_RAC_CONFIG
);
__raw_writel
(
cfg
|
0xf
,
cbr
+
BMIPS_RAC_CONFIG
);
__raw_readl
(
cbr
+
BMIPS_RAC_CONFIG
);
__raw_readl
(
cbr
+
BMIPS_RAC_CONFIG
);
cfg
=
__raw_readl
(
cbr
+
BMIPS_RAC_ADDRESS_RANGE
);
cfg
=
__raw_readl
(
cbr
+
BMIPS_RAC_ADDRESS_RANGE
);
...
...
arch/powerpc/kvm/book3s_64_mmu_hv.c
浏览文件 @
fdae5f37
...
@@ -646,6 +646,16 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
...
@@ -646,6 +646,16 @@ int kvmppc_book3s_hv_page_fault(struct kvm_run *run, struct kvm_vcpu *vcpu,
hnow_v
=
hpte_new_to_old_v
(
hnow_v
,
hnow_r
);
hnow_v
=
hpte_new_to_old_v
(
hnow_v
,
hnow_r
);
hnow_r
=
hpte_new_to_old_r
(
hnow_r
);
hnow_r
=
hpte_new_to_old_r
(
hnow_r
);
}
}
/*
* If the HPT is being resized, don't update the HPTE,
* instead let the guest retry after the resize operation is complete.
* The synchronization for hpte_setup_done test vs. set is provided
* by the HPTE lock.
*/
if
(
!
kvm
->
arch
.
hpte_setup_done
)
goto
out_unlock
;
if
((
hnow_v
&
~
HPTE_V_HVLOCK
)
!=
hpte
[
0
]
||
hnow_r
!=
hpte
[
1
]
||
if
((
hnow_v
&
~
HPTE_V_HVLOCK
)
!=
hpte
[
0
]
||
hnow_r
!=
hpte
[
1
]
||
rev
->
guest_rpte
!=
hpte
[
2
])
rev
->
guest_rpte
!=
hpte
[
2
])
/* HPTE has been changed under us; let the guest retry */
/* HPTE has been changed under us; let the guest retry */
...
...
arch/powerpc/kvm/book3s_hv.c
浏览文件 @
fdae5f37
...
@@ -2705,11 +2705,14 @@ static noinline void kvmppc_run_core(struct kvmppc_vcore *vc)
...
@@ -2705,11 +2705,14 @@ static noinline void kvmppc_run_core(struct kvmppc_vcore *vc)
* Hard-disable interrupts, and check resched flag and signals.
* Hard-disable interrupts, and check resched flag and signals.
* If we need to reschedule or deliver a signal, clean up
* If we need to reschedule or deliver a signal, clean up
* and return without going into the guest(s).
* and return without going into the guest(s).
* If the hpte_setup_done flag has been cleared, don't go into the
* guest because that means a HPT resize operation is in progress.
*/
*/
local_irq_disable
();
local_irq_disable
();
hard_irq_disable
();
hard_irq_disable
();
if
(
lazy_irq_pending
()
||
need_resched
()
||
if
(
lazy_irq_pending
()
||
need_resched
()
||
recheck_signals
(
&
core_info
))
{
recheck_signals
(
&
core_info
)
||
(
!
kvm_is_radix
(
vc
->
kvm
)
&&
!
vc
->
kvm
->
arch
.
hpte_setup_done
))
{
local_irq_enable
();
local_irq_enable
();
vc
->
vcore_state
=
VCORE_INACTIVE
;
vc
->
vcore_state
=
VCORE_INACTIVE
;
/* Unlock all except the primary vcore */
/* Unlock all except the primary vcore */
...
@@ -3078,7 +3081,7 @@ static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc)
...
@@ -3078,7 +3081,7 @@ static void kvmppc_vcore_blocked(struct kvmppc_vcore *vc)
static
int
kvmppc_run_vcpu
(
struct
kvm_run
*
kvm_run
,
struct
kvm_vcpu
*
vcpu
)
static
int
kvmppc_run_vcpu
(
struct
kvm_run
*
kvm_run
,
struct
kvm_vcpu
*
vcpu
)
{
{
int
n_ceded
,
i
;
int
n_ceded
,
i
,
r
;
struct
kvmppc_vcore
*
vc
;
struct
kvmppc_vcore
*
vc
;
struct
kvm_vcpu
*
v
;
struct
kvm_vcpu
*
v
;
...
@@ -3132,6 +3135,20 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
...
@@ -3132,6 +3135,20 @@ static int kvmppc_run_vcpu(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
while
(
vcpu
->
arch
.
state
==
KVMPPC_VCPU_RUNNABLE
&&
while
(
vcpu
->
arch
.
state
==
KVMPPC_VCPU_RUNNABLE
&&
!
signal_pending
(
current
))
{
!
signal_pending
(
current
))
{
/* See if the HPT and VRMA are ready to go */
if
(
!
kvm_is_radix
(
vcpu
->
kvm
)
&&
!
vcpu
->
kvm
->
arch
.
hpte_setup_done
)
{
spin_unlock
(
&
vc
->
lock
);
r
=
kvmppc_hv_setup_htab_rma
(
vcpu
);
spin_lock
(
&
vc
->
lock
);
if
(
r
)
{
kvm_run
->
exit_reason
=
KVM_EXIT_FAIL_ENTRY
;
kvm_run
->
fail_entry
.
hardware_entry_failure_reason
=
0
;
vcpu
->
arch
.
ret
=
r
;
break
;
}
}
if
(
vc
->
vcore_state
==
VCORE_PREEMPT
&&
vc
->
runner
==
NULL
)
if
(
vc
->
vcore_state
==
VCORE_PREEMPT
&&
vc
->
runner
==
NULL
)
kvmppc_vcore_end_preempt
(
vc
);
kvmppc_vcore_end_preempt
(
vc
);
...
@@ -3249,13 +3266,6 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)
...
@@ -3249,13 +3266,6 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)
/* Order vcpus_running vs. hpte_setup_done, see kvmppc_alloc_reset_hpt */
/* Order vcpus_running vs. hpte_setup_done, see kvmppc_alloc_reset_hpt */
smp_mb
();
smp_mb
();
/* On the first time here, set up HTAB and VRMA */
if
(
!
kvm_is_radix
(
vcpu
->
kvm
)
&&
!
vcpu
->
kvm
->
arch
.
hpte_setup_done
)
{
r
=
kvmppc_hv_setup_htab_rma
(
vcpu
);
if
(
r
)
goto
out
;
}
flush_all_to_thread
(
current
);
flush_all_to_thread
(
current
);
/* Save userspace EBB and other register values */
/* Save userspace EBB and other register values */
...
@@ -3303,7 +3313,6 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)
...
@@ -3303,7 +3313,6 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)
}
}
mtspr
(
SPRN_VRSAVE
,
user_vrsave
);
mtspr
(
SPRN_VRSAVE
,
user_vrsave
);
out:
vcpu
->
arch
.
state
=
KVMPPC_VCPU_NOTREADY
;
vcpu
->
arch
.
state
=
KVMPPC_VCPU_NOTREADY
;
atomic_dec
(
&
vcpu
->
kvm
->
arch
.
vcpus_running
);
atomic_dec
(
&
vcpu
->
kvm
->
arch
.
vcpus_running
);
return
r
;
return
r
;
...
...
arch/x86/kernel/cpu/Makefile
浏览文件 @
fdae5f37
...
@@ -22,7 +22,7 @@ obj-y += common.o
...
@@ -22,7 +22,7 @@ obj-y += common.o
obj-y
+=
rdrand.o
obj-y
+=
rdrand.o
obj-y
+=
match.o
obj-y
+=
match.o
obj-y
+=
bugs.o
obj-y
+=
bugs.o
obj-
y
+=
aperfmperf.o
obj-
$(CONFIG_CPU_FREQ)
+=
aperfmperf.o
obj-$(CONFIG_PROC_FS)
+=
proc.o
obj-$(CONFIG_PROC_FS)
+=
proc.o
obj-$(CONFIG_X86_FEATURE_NAMES)
+=
capflags.o powerflags.o
obj-$(CONFIG_X86_FEATURE_NAMES)
+=
capflags.o powerflags.o
...
...
arch/x86/kernel/cpu/aperfmperf.c
浏览文件 @
fdae5f37
...
@@ -42,6 +42,10 @@ static void aperfmperf_snapshot_khz(void *dummy)
...
@@ -42,6 +42,10 @@ static void aperfmperf_snapshot_khz(void *dummy)
s64
time_delta
=
ktime_ms_delta
(
now
,
s
->
time
);
s64
time_delta
=
ktime_ms_delta
(
now
,
s
->
time
);
unsigned
long
flags
;
unsigned
long
flags
;
/* Don't bother re-computing within the cache threshold time. */
if
(
time_delta
<
APERFMPERF_CACHE_THRESHOLD_MS
)
return
;
local_irq_save
(
flags
);
local_irq_save
(
flags
);
rdmsrl
(
MSR_IA32_APERF
,
aperf
);
rdmsrl
(
MSR_IA32_APERF
,
aperf
);
rdmsrl
(
MSR_IA32_MPERF
,
mperf
);
rdmsrl
(
MSR_IA32_MPERF
,
mperf
);
...
@@ -70,7 +74,6 @@ static void aperfmperf_snapshot_khz(void *dummy)
...
@@ -70,7 +74,6 @@ static void aperfmperf_snapshot_khz(void *dummy)
unsigned
int
arch_freq_get_on_cpu
(
int
cpu
)
unsigned
int
arch_freq_get_on_cpu
(
int
cpu
)
{
{
s64
time_delta
;
unsigned
int
khz
;
unsigned
int
khz
;
if
(
!
cpu_khz
)
if
(
!
cpu_khz
)
...
@@ -79,12 +82,6 @@ unsigned int arch_freq_get_on_cpu(int cpu)
...
@@ -79,12 +82,6 @@ unsigned int arch_freq_get_on_cpu(int cpu)
if
(
!
static_cpu_has
(
X86_FEATURE_APERFMPERF
))
if
(
!
static_cpu_has
(
X86_FEATURE_APERFMPERF
))
return
0
;
return
0
;
/* Don't bother re-computing within the cache threshold time. */
time_delta
=
ktime_ms_delta
(
ktime_get
(),
per_cpu
(
samples
.
time
,
cpu
));
khz
=
per_cpu
(
samples
.
khz
,
cpu
);
if
(
khz
&&
time_delta
<
APERFMPERF_CACHE_THRESHOLD_MS
)
return
khz
;
smp_call_function_single
(
cpu
,
aperfmperf_snapshot_khz
,
NULL
,
1
);
smp_call_function_single
(
cpu
,
aperfmperf_snapshot_khz
,
NULL
,
1
);
khz
=
per_cpu
(
samples
.
khz
,
cpu
);
khz
=
per_cpu
(
samples
.
khz
,
cpu
);
if
(
khz
)
if
(
khz
)
...
...
arch/x86/kernel/cpu/proc.c
浏览文件 @
fdae5f37
...
@@ -78,10 +78,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
...
@@ -78,10 +78,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
seq_printf
(
m
,
"microcode
\t
: 0x%x
\n
"
,
c
->
microcode
);
seq_printf
(
m
,
"microcode
\t
: 0x%x
\n
"
,
c
->
microcode
);
if
(
cpu_has
(
c
,
X86_FEATURE_TSC
))
{
if
(
cpu_has
(
c
,
X86_FEATURE_TSC
))
{
unsigned
int
freq
=
arch_freq_get_on_cpu
(
cpu
);
unsigned
int
freq
=
cpufreq_quick_get
(
cpu
);
if
(
!
freq
)
freq
=
cpufreq_quick_get
(
cpu
);
if
(
!
freq
)
if
(
!
freq
)
freq
=
cpu_khz
;
freq
=
cpu_khz
;
seq_printf
(
m
,
"cpu MHz
\t\t
: %u.%03u
\n
"
,
seq_printf
(
m
,
"cpu MHz
\t\t
: %u.%03u
\n
"
,
...
...
drivers/block/rbd.c
浏览文件 @
fdae5f37
...
@@ -2692,7 +2692,7 @@ static int rbd_img_obj_parent_read_full(struct rbd_obj_request *obj_request)
...
@@ -2692,7 +2692,7 @@ static int rbd_img_obj_parent_read_full(struct rbd_obj_request *obj_request)
* from the parent.
* from the parent.
*/
*/
page_count
=
(
u32
)
calc_pages_for
(
0
,
length
);
page_count
=
(
u32
)
calc_pages_for
(
0
,
length
);
pages
=
ceph_alloc_page_vector
(
page_count
,
GFP_
KERNEL
);
pages
=
ceph_alloc_page_vector
(
page_count
,
GFP_
NOIO
);
if
(
IS_ERR
(
pages
))
{
if
(
IS_ERR
(
pages
))
{
result
=
PTR_ERR
(
pages
);
result
=
PTR_ERR
(
pages
);
pages
=
NULL
;
pages
=
NULL
;
...
@@ -2827,7 +2827,7 @@ static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request)
...
@@ -2827,7 +2827,7 @@ static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request)
*/
*/
size
=
sizeof
(
__le64
)
+
sizeof
(
__le32
)
+
sizeof
(
__le32
);
size
=
sizeof
(
__le64
)
+
sizeof
(
__le32
)
+
sizeof
(
__le32
);
page_count
=
(
u32
)
calc_pages_for
(
0
,
size
);
page_count
=
(
u32
)
calc_pages_for
(
0
,
size
);
pages
=
ceph_alloc_page_vector
(
page_count
,
GFP_
KERNEL
);
pages
=
ceph_alloc_page_vector
(
page_count
,
GFP_
NOIO
);
if
(
IS_ERR
(
pages
))
{
if
(
IS_ERR
(
pages
))
{
ret
=
PTR_ERR
(
pages
);
ret
=
PTR_ERR
(
pages
);
goto
fail_stat_request
;
goto
fail_stat_request
;
...
...
drivers/gpu/drm/i915/i915_gem_execbuffer.c
浏览文件 @
fdae5f37
...
@@ -2094,6 +2094,11 @@ get_fence_array(struct drm_i915_gem_execbuffer2 *args,
...
@@ -2094,6 +2094,11 @@ get_fence_array(struct drm_i915_gem_execbuffer2 *args,
goto
err
;
goto
err
;
}
}
if
(
fence
.
flags
&
__I915_EXEC_FENCE_UNKNOWN_FLAGS
)
{
err
=
-
EINVAL
;
goto
err
;
}
syncobj
=
drm_syncobj_find
(
file
,
fence
.
handle
);
syncobj
=
drm_syncobj_find
(
file
,
fence
.
handle
);
if
(
!
syncobj
)
{
if
(
!
syncobj
)
{
DRM_DEBUG
(
"Invalid syncobj handle provided
\n
"
);
DRM_DEBUG
(
"Invalid syncobj handle provided
\n
"
);
...
@@ -2101,6 +2106,9 @@ get_fence_array(struct drm_i915_gem_execbuffer2 *args,
...
@@ -2101,6 +2106,9 @@ get_fence_array(struct drm_i915_gem_execbuffer2 *args,
goto
err
;
goto
err
;
}
}
BUILD_BUG_ON
(
~
(
ARCH_KMALLOC_MINALIGN
-
1
)
&
~
__I915_EXEC_FENCE_UNKNOWN_FLAGS
);
fences
[
n
]
=
ptr_pack_bits
(
syncobj
,
fence
.
flags
,
2
);
fences
[
n
]
=
ptr_pack_bits
(
syncobj
,
fence
.
flags
,
2
);
}
}
...
...
drivers/gpu/drm/i915/i915_gem_gtt.c
浏览文件 @
fdae5f37
...
@@ -832,10 +832,14 @@ static void gen8_ppgtt_clear_4lvl(struct i915_address_space *vm,
...
@@ -832,10 +832,14 @@ static void gen8_ppgtt_clear_4lvl(struct i915_address_space *vm,
}
}
}
}
struct
sgt_dma
{
st
atic
inline
st
ruct
sgt_dma
{
struct
scatterlist
*
sg
;
struct
scatterlist
*
sg
;
dma_addr_t
dma
,
max
;
dma_addr_t
dma
,
max
;
};
}
sgt_dma
(
struct
i915_vma
*
vma
)
{
struct
scatterlist
*
sg
=
vma
->
pages
->
sgl
;
dma_addr_t
addr
=
sg_dma_address
(
sg
);
return
(
struct
sgt_dma
)
{
sg
,
addr
,
addr
+
sg
->
length
};
}
struct
gen8_insert_pte
{
struct
gen8_insert_pte
{
u16
pml4e
;
u16
pml4e
;
...
@@ -916,11 +920,7 @@ static void gen8_ppgtt_insert_3lvl(struct i915_address_space *vm,
...
@@ -916,11 +920,7 @@ static void gen8_ppgtt_insert_3lvl(struct i915_address_space *vm,
u32
unused
)
u32
unused
)
{
{
struct
i915_hw_ppgtt
*
ppgtt
=
i915_vm_to_ppgtt
(
vm
);
struct
i915_hw_ppgtt
*
ppgtt
=
i915_vm_to_ppgtt
(
vm
);
struct
sgt_dma
iter
=
{
struct
sgt_dma
iter
=
sgt_dma
(
vma
);
.
sg
=
vma
->
pages
->
sgl
,
.
dma
=
sg_dma_address
(
iter
.
sg
),
.
max
=
iter
.
dma
+
iter
.
sg
->
length
,
};
struct
gen8_insert_pte
idx
=
gen8_insert_pte
(
vma
->
node
.
start
);
struct
gen8_insert_pte
idx
=
gen8_insert_pte
(
vma
->
node
.
start
);
gen8_ppgtt_insert_pte_entries
(
ppgtt
,
&
ppgtt
->
pdp
,
&
iter
,
&
idx
,
gen8_ppgtt_insert_pte_entries
(
ppgtt
,
&
ppgtt
->
pdp
,
&
iter
,
&
idx
,
...
@@ -933,11 +933,7 @@ static void gen8_ppgtt_insert_4lvl(struct i915_address_space *vm,
...
@@ -933,11 +933,7 @@ static void gen8_ppgtt_insert_4lvl(struct i915_address_space *vm,
u32
unused
)
u32
unused
)
{
{
struct
i915_hw_ppgtt
*
ppgtt
=
i915_vm_to_ppgtt
(
vm
);
struct
i915_hw_ppgtt
*
ppgtt
=
i915_vm_to_ppgtt
(
vm
);
struct
sgt_dma
iter
=
{
struct
sgt_dma
iter
=
sgt_dma
(
vma
);
.
sg
=
vma
->
pages
->
sgl
,
.
dma
=
sg_dma_address
(
iter
.
sg
),
.
max
=
iter
.
dma
+
iter
.
sg
->
length
,
};
struct
i915_page_directory_pointer
**
pdps
=
ppgtt
->
pml4
.
pdps
;
struct
i915_page_directory_pointer
**
pdps
=
ppgtt
->
pml4
.
pdps
;
struct
gen8_insert_pte
idx
=
gen8_insert_pte
(
vma
->
node
.
start
);
struct
gen8_insert_pte
idx
=
gen8_insert_pte
(
vma
->
node
.
start
);
...
@@ -1632,13 +1628,10 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
...
@@ -1632,13 +1628,10 @@ static void gen6_ppgtt_insert_entries(struct i915_address_space *vm,
unsigned
act_pt
=
first_entry
/
GEN6_PTES
;
unsigned
act_pt
=
first_entry
/
GEN6_PTES
;
unsigned
act_pte
=
first_entry
%
GEN6_PTES
;
unsigned
act_pte
=
first_entry
%
GEN6_PTES
;
const
u32
pte_encode
=
vm
->
pte_encode
(
0
,
cache_level
,
flags
);
const
u32
pte_encode
=
vm
->
pte_encode
(
0
,
cache_level
,
flags
);
struct
sgt_dma
iter
;
struct
sgt_dma
iter
=
sgt_dma
(
vma
)
;
gen6_pte_t
*
vaddr
;
gen6_pte_t
*
vaddr
;
vaddr
=
kmap_atomic_px
(
ppgtt
->
pd
.
page_table
[
act_pt
]);
vaddr
=
kmap_atomic_px
(
ppgtt
->
pd
.
page_table
[
act_pt
]);
iter
.
sg
=
vma
->
pages
->
sgl
;
iter
.
dma
=
sg_dma_address
(
iter
.
sg
);
iter
.
max
=
iter
.
dma
+
iter
.
sg
->
length
;
do
{
do
{
vaddr
[
act_pte
]
=
pte_encode
|
GEN6_PTE_ADDR_ENCODE
(
iter
.
dma
);
vaddr
[
act_pte
]
=
pte_encode
|
GEN6_PTE_ADDR_ENCODE
(
iter
.
dma
);
...
...
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
浏览文件 @
fdae5f37
...
@@ -721,7 +721,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
...
@@ -721,7 +721,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
* allocation taken by fbdev
* allocation taken by fbdev
*/
*/
if
(
!
(
dev_priv
->
capabilities
&
SVGA_CAP_3D
))
if
(
!
(
dev_priv
->
capabilities
&
SVGA_CAP_3D
))
mem_size
*=
2
;
mem_size
*=
3
;
dev_priv
->
max_mob_pages
=
mem_size
*
1024
/
PAGE_SIZE
;
dev_priv
->
max_mob_pages
=
mem_size
*
1024
/
PAGE_SIZE
;
dev_priv
->
prim_bb_mem
=
dev_priv
->
prim_bb_mem
=
...
...
drivers/gpu/drm/vmwgfx/vmwgfx_fence.c
浏览文件 @
fdae5f37
...
@@ -224,7 +224,7 @@ static long vmw_fence_wait(struct dma_fence *f, bool intr, signed long timeout)
...
@@ -224,7 +224,7 @@ static long vmw_fence_wait(struct dma_fence *f, bool intr, signed long timeout)
return
ret
;
return
ret
;
}
}
static
struct
dma_fence_ops
vmw_fence_ops
=
{
static
const
struct
dma_fence_ops
vmw_fence_ops
=
{
.
get_driver_name
=
vmw_fence_get_driver_name
,
.
get_driver_name
=
vmw_fence_get_driver_name
,
.
get_timeline_name
=
vmw_fence_get_timeline_name
,
.
get_timeline_name
=
vmw_fence_get_timeline_name
,
.
enable_signaling
=
vmw_fence_enable_signaling
,
.
enable_signaling
=
vmw_fence_enable_signaling
,
...
...
drivers/input/mouse/elan_i2c_core.c
浏览文件 @
fdae5f37
...
@@ -1258,6 +1258,7 @@ static const struct acpi_device_id elan_acpi_id[] = {
...
@@ -1258,6 +1258,7 @@ static const struct acpi_device_id elan_acpi_id[] = {
{
"ELAN0605"
,
0
},
{
"ELAN0605"
,
0
},
{
"ELAN0609"
,
0
},
{
"ELAN0609"
,
0
},
{
"ELAN060B"
,
0
},
{
"ELAN060B"
,
0
},
{
"ELAN060C"
,
0
},
{
"ELAN0611"
,
0
},
{
"ELAN0611"
,
0
},
{
"ELAN1000"
,
0
},
{
"ELAN1000"
,
0
},
{
}
{
}
...
...
drivers/input/rmi4/rmi_smbus.c
浏览文件 @
fdae5f37
...
@@ -312,7 +312,7 @@ static int rmi_smb_probe(struct i2c_client *client,
...
@@ -312,7 +312,7 @@ static int rmi_smb_probe(struct i2c_client *client,
rmi_smb
->
xport
.
dev
=
&
client
->
dev
;
rmi_smb
->
xport
.
dev
=
&
client
->
dev
;
rmi_smb
->
xport
.
pdata
=
*
pdata
;
rmi_smb
->
xport
.
pdata
=
*
pdata
;
rmi_smb
->
xport
.
pdata
.
irq
=
client
->
irq
;
rmi_smb
->
xport
.
pdata
.
irq
=
client
->
irq
;
rmi_smb
->
xport
.
proto_name
=
"smb
2
"
;
rmi_smb
->
xport
.
proto_name
=
"smb"
;
rmi_smb
->
xport
.
ops
=
&
rmi_smb_ops
;
rmi_smb
->
xport
.
ops
=
&
rmi_smb_ops
;
smbus_version
=
rmi_smb_get_version
(
rmi_smb
);
smbus_version
=
rmi_smb_get_version
(
rmi_smb
);
...
@@ -322,7 +322,7 @@ static int rmi_smb_probe(struct i2c_client *client,
...
@@ -322,7 +322,7 @@ static int rmi_smb_probe(struct i2c_client *client,
rmi_dbg
(
RMI_DEBUG_XPORT
,
&
client
->
dev
,
"Smbus version is %d"
,
rmi_dbg
(
RMI_DEBUG_XPORT
,
&
client
->
dev
,
"Smbus version is %d"
,
smbus_version
);
smbus_version
);
if
(
smbus_version
!=
2
)
{
if
(
smbus_version
!=
2
&&
smbus_version
!=
3
)
{
dev_err
(
&
client
->
dev
,
"Unrecognized SMB version %d
\n
"
,
dev_err
(
&
client
->
dev
,
"Unrecognized SMB version %d
\n
"
,
smbus_version
);
smbus_version
);
return
-
ENODEV
;
return
-
ENODEV
;
...
...
drivers/input/touchscreen/tsc200x-core.c
浏览文件 @
fdae5f37
...
@@ -531,6 +531,7 @@ int tsc200x_probe(struct device *dev, int irq, const struct input_id *tsc_id,
...
@@ -531,6 +531,7 @@ int tsc200x_probe(struct device *dev, int irq, const struct input_id *tsc_id,
input_set_drvdata
(
input_dev
,
ts
);
input_set_drvdata
(
input_dev
,
ts
);
__set_bit
(
INPUT_PROP_DIRECT
,
input_dev
->
propbit
);
input_set_capability
(
input_dev
,
EV_KEY
,
BTN_TOUCH
);
input_set_capability
(
input_dev
,
EV_KEY
,
BTN_TOUCH
);
input_set_abs_params
(
input_dev
,
ABS_X
,
input_set_abs_params
(
input_dev
,
ABS_X
,
...
...
drivers/net/can/c_can/c_can_pci.c
浏览文件 @
fdae5f37
...
@@ -178,7 +178,6 @@ static int c_can_pci_probe(struct pci_dev *pdev,
...
@@ -178,7 +178,6 @@ static int c_can_pci_probe(struct pci_dev *pdev,
break
;
break
;
case
BOSCH_D_CAN
:
case
BOSCH_D_CAN
:
priv
->
regs
=
reg_map_d_can
;
priv
->
regs
=
reg_map_d_can
;
priv
->
can
.
ctrlmode_supported
|=
CAN_CTRLMODE_3_SAMPLES
;
break
;
break
;
default:
default:
ret
=
-
EINVAL
;
ret
=
-
EINVAL
;
...
...
drivers/net/can/c_can/c_can_platform.c
浏览文件 @
fdae5f37
...
@@ -320,7 +320,6 @@ static int c_can_plat_probe(struct platform_device *pdev)
...
@@ -320,7 +320,6 @@ static int c_can_plat_probe(struct platform_device *pdev)
break
;
break
;
case
BOSCH_D_CAN
:
case
BOSCH_D_CAN
:
priv
->
regs
=
reg_map_d_can
;
priv
->
regs
=
reg_map_d_can
;
priv
->
can
.
ctrlmode_supported
|=
CAN_CTRLMODE_3_SAMPLES
;
priv
->
read_reg
=
c_can_plat_read_reg_aligned_to_16bit
;
priv
->
read_reg
=
c_can_plat_read_reg_aligned_to_16bit
;
priv
->
write_reg
=
c_can_plat_write_reg_aligned_to_16bit
;
priv
->
write_reg
=
c_can_plat_write_reg_aligned_to_16bit
;
priv
->
read_reg32
=
d_can_plat_read_reg32
;
priv
->
read_reg32
=
d_can_plat_read_reg32
;
...
...
drivers/net/can/ifi_canfd/ifi_canfd.c
浏览文件 @
fdae5f37
...
@@ -670,9 +670,9 @@ static void ifi_canfd_set_bittiming(struct net_device *ndev)
...
@@ -670,9 +670,9 @@ static void ifi_canfd_set_bittiming(struct net_device *ndev)
priv
->
base
+
IFI_CANFD_FTIME
);
priv
->
base
+
IFI_CANFD_FTIME
);
/* Configure transmitter delay */
/* Configure transmitter delay */
tdc
=
(
dbt
->
brp
*
(
dbt
->
phase_seg1
+
1
))
&
IFI_CANFD_TDELAY_MASK
;
tdc
=
dbt
->
brp
*
(
dbt
->
prop_seg
+
dbt
->
phase_seg1
)
;
writel
(
IFI_CANFD_TDELAY_EN
|
IFI_CANFD_TDELAY_ABS
|
tdc
,
tdc
&=
IFI_CANFD_TDELAY_MASK
;
priv
->
base
+
IFI_CANFD_TDELAY
);
writel
(
IFI_CANFD_TDELAY_EN
|
tdc
,
priv
->
base
+
IFI_CANFD_TDELAY
);
}
}
static
void
ifi_canfd_set_filter
(
struct
net_device
*
ndev
,
const
u32
id
,
static
void
ifi_canfd_set_filter
(
struct
net_device
*
ndev
,
const
u32
id
,
...
...
drivers/net/can/peak_canfd/peak_pciefd_main.c
浏览文件 @
fdae5f37
...
@@ -29,14 +29,19 @@
...
@@ -29,14 +29,19 @@
#include "peak_canfd_user.h"
#include "peak_canfd_user.h"
MODULE_AUTHOR
(
"Stephane Grosjean <s.grosjean@peak-system.com>"
);
MODULE_AUTHOR
(
"Stephane Grosjean <s.grosjean@peak-system.com>"
);
MODULE_DESCRIPTION
(
"Socket-CAN driver for PEAK PCAN PCIe FD family cards"
);
MODULE_DESCRIPTION
(
"Socket-CAN driver for PEAK PCAN PCIe
/M.2
FD family cards"
);
MODULE_SUPPORTED_DEVICE
(
"PEAK PCAN PCIe FD CAN cards"
);
MODULE_SUPPORTED_DEVICE
(
"PEAK PCAN PCIe
/M.2
FD CAN cards"
);
MODULE_LICENSE
(
"GPL v2"
);
MODULE_LICENSE
(
"GPL v2"
);
#define PCIEFD_DRV_NAME "peak_pciefd"
#define PCIEFD_DRV_NAME "peak_pciefd"
#define PEAK_PCI_VENDOR_ID 0x001c
/* The PCI device and vendor IDs */
#define PEAK_PCI_VENDOR_ID 0x001c
/* The PCI device and vendor IDs */
#define PEAK_PCIEFD_ID 0x0013
/* for PCIe slot cards */
#define PEAK_PCIEFD_ID 0x0013
/* for PCIe slot cards */
#define PCAN_CPCIEFD_ID 0x0014
/* for Compact-PCI Serial slot cards */
#define PCAN_PCIE104FD_ID 0x0017
/* for PCIe-104 Express slot cards */
#define PCAN_MINIPCIEFD_ID 0x0018
/* for mini-PCIe slot cards */
#define PCAN_PCIEFD_OEM_ID 0x0019
/* for PCIe slot OEM cards */
#define PCAN_M2_ID 0x001a
/* for M2 slot cards */
/* PEAK PCIe board access description */
/* PEAK PCIe board access description */
#define PCIEFD_BAR0_SIZE (64 * 1024)
#define PCIEFD_BAR0_SIZE (64 * 1024)
...
@@ -203,6 +208,11 @@ struct pciefd_board {
...
@@ -203,6 +208,11 @@ struct pciefd_board {
/* supported device ids. */
/* supported device ids. */
static
const
struct
pci_device_id
peak_pciefd_tbl
[]
=
{
static
const
struct
pci_device_id
peak_pciefd_tbl
[]
=
{
{
PEAK_PCI_VENDOR_ID
,
PEAK_PCIEFD_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,},
{
PEAK_PCI_VENDOR_ID
,
PEAK_PCIEFD_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,},
{
PEAK_PCI_VENDOR_ID
,
PCAN_CPCIEFD_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,},
{
PEAK_PCI_VENDOR_ID
,
PCAN_PCIE104FD_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,},
{
PEAK_PCI_VENDOR_ID
,
PCAN_MINIPCIEFD_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,},
{
PEAK_PCI_VENDOR_ID
,
PCAN_PCIEFD_OEM_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,},
{
PEAK_PCI_VENDOR_ID
,
PCAN_M2_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,},
{
0
,}
{
0
,}
};
};
...
...
drivers/net/can/sun4i_can.c
浏览文件 @
fdae5f37
...
@@ -539,6 +539,13 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
...
@@ -539,6 +539,13 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
}
}
stats
->
rx_over_errors
++
;
stats
->
rx_over_errors
++
;
stats
->
rx_errors
++
;
stats
->
rx_errors
++
;
/* reset the CAN IP by entering reset mode
* ignoring timeout error
*/
set_reset_mode
(
dev
);
set_normal_mode
(
dev
);
/* clear bit */
/* clear bit */
sun4i_can_write_cmdreg
(
priv
,
SUN4I_CMD_CLEAR_OR_FLAG
);
sun4i_can_write_cmdreg
(
priv
,
SUN4I_CMD_CLEAR_OR_FLAG
);
}
}
...
@@ -653,8 +660,9 @@ static irqreturn_t sun4i_can_interrupt(int irq, void *dev_id)
...
@@ -653,8 +660,9 @@ static irqreturn_t sun4i_can_interrupt(int irq, void *dev_id)
netif_wake_queue
(
dev
);
netif_wake_queue
(
dev
);
can_led_event
(
dev
,
CAN_LED_EVENT_TX
);
can_led_event
(
dev
,
CAN_LED_EVENT_TX
);
}
}
if
(
isrc
&
SUN4I_INT_RBUF_VLD
)
{
if
((
isrc
&
SUN4I_INT_RBUF_VLD
)
&&
/* receive interrupt */
!
(
isrc
&
SUN4I_INT_DATA_OR
))
{
/* receive interrupt - don't read if overrun occurred */
while
(
status
&
SUN4I_STA_RBUF_RDY
)
{
while
(
status
&
SUN4I_STA_RBUF_RDY
)
{
/* RX buffer is not empty */
/* RX buffer is not empty */
sun4i_can_rx
(
dev
);
sun4i_can_rx
(
dev
);
...
...
drivers/net/ethernet/mellanox/mlx5/core/dev.c
浏览文件 @
fdae5f37
...
@@ -93,7 +93,7 @@ static void delayed_event_release(struct mlx5_device_context *dev_ctx,
...
@@ -93,7 +93,7 @@ static void delayed_event_release(struct mlx5_device_context *dev_ctx,
list_splice_init
(
&
priv
->
waiting_events_list
,
&
temp
);
list_splice_init
(
&
priv
->
waiting_events_list
,
&
temp
);
if
(
!
dev_ctx
->
context
)
if
(
!
dev_ctx
->
context
)
goto
out
;
goto
out
;
list_for_each_entry_safe
(
de
,
n
,
&
priv
->
waiting_events_list
,
list
)
list_for_each_entry_safe
(
de
,
n
,
&
temp
,
list
)
dev_ctx
->
intf
->
event
(
dev
,
dev_ctx
->
context
,
de
->
event
,
de
->
param
);
dev_ctx
->
intf
->
event
(
dev
,
dev_ctx
->
context
,
de
->
event
,
de
->
param
);
out:
out:
...
...
drivers/net/ethernet/mellanox/mlx5/core/en.h
浏览文件 @
fdae5f37
...
@@ -68,7 +68,7 @@
...
@@ -68,7 +68,7 @@
#define MLX5E_PARAMS_DEFAULT_LOG_RQ_SIZE 0xa
#define MLX5E_PARAMS_DEFAULT_LOG_RQ_SIZE 0xa
#define MLX5E_PARAMS_MAXIMUM_LOG_RQ_SIZE 0xd
#define MLX5E_PARAMS_MAXIMUM_LOG_RQ_SIZE 0xd
#define MLX5E_PARAMS_MINIMUM_LOG_RQ_SIZE_MPW 0x
1
#define MLX5E_PARAMS_MINIMUM_LOG_RQ_SIZE_MPW 0x
2
#define MLX5E_PARAMS_DEFAULT_LOG_RQ_SIZE_MPW 0x3
#define MLX5E_PARAMS_DEFAULT_LOG_RQ_SIZE_MPW 0x3
#define MLX5E_PARAMS_MAXIMUM_LOG_RQ_SIZE_MPW 0x6
#define MLX5E_PARAMS_MAXIMUM_LOG_RQ_SIZE_MPW 0x6
...
...
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
浏览文件 @
fdae5f37
...
@@ -216,22 +216,20 @@ static inline bool mlx5e_rx_cache_get(struct mlx5e_rq *rq,
...
@@ -216,22 +216,20 @@ static inline bool mlx5e_rx_cache_get(struct mlx5e_rq *rq,
static
inline
int
mlx5e_page_alloc_mapped
(
struct
mlx5e_rq
*
rq
,
static
inline
int
mlx5e_page_alloc_mapped
(
struct
mlx5e_rq
*
rq
,
struct
mlx5e_dma_info
*
dma_info
)
struct
mlx5e_dma_info
*
dma_info
)
{
{
struct
page
*
page
;
if
(
mlx5e_rx_cache_get
(
rq
,
dma_info
))
if
(
mlx5e_rx_cache_get
(
rq
,
dma_info
))
return
0
;
return
0
;
page
=
dev_alloc_pages
(
rq
->
buff
.
page_order
);
dma_info
->
page
=
dev_alloc_pages
(
rq
->
buff
.
page_order
);
if
(
unlikely
(
!
page
))
if
(
unlikely
(
!
dma_info
->
page
))
return
-
ENOMEM
;
return
-
ENOMEM
;
dma_info
->
addr
=
dma_map_page
(
rq
->
pdev
,
page
,
0
,
dma_info
->
addr
=
dma_map_page
(
rq
->
pdev
,
dma_info
->
page
,
0
,
RQ_PAGE_SIZE
(
rq
),
rq
->
buff
.
map_dir
);
RQ_PAGE_SIZE
(
rq
),
rq
->
buff
.
map_dir
);
if
(
unlikely
(
dma_mapping_error
(
rq
->
pdev
,
dma_info
->
addr
)))
{
if
(
unlikely
(
dma_mapping_error
(
rq
->
pdev
,
dma_info
->
addr
)))
{
put_page
(
page
);
put_page
(
dma_info
->
page
);
dma_info
->
page
=
NULL
;
return
-
ENOMEM
;
return
-
ENOMEM
;
}
}
dma_info
->
page
=
page
;
return
0
;
return
0
;
}
}
...
...
drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
浏览文件 @
fdae5f37
...
@@ -49,7 +49,7 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
...
@@ -49,7 +49,7 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
struct
mlx5e_channel
*
c
=
container_of
(
napi
,
struct
mlx5e_channel
,
struct
mlx5e_channel
*
c
=
container_of
(
napi
,
struct
mlx5e_channel
,
napi
);
napi
);
bool
busy
=
false
;
bool
busy
=
false
;
int
work_done
;
int
work_done
=
0
;
int
i
;
int
i
;
for
(
i
=
0
;
i
<
c
->
num_tc
;
i
++
)
for
(
i
=
0
;
i
<
c
->
num_tc
;
i
++
)
...
@@ -58,15 +58,17 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
...
@@ -58,15 +58,17 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
if
(
c
->
xdp
)
if
(
c
->
xdp
)
busy
|=
mlx5e_poll_xdpsq_cq
(
&
c
->
rq
.
xdpsq
.
cq
);
busy
|=
mlx5e_poll_xdpsq_cq
(
&
c
->
rq
.
xdpsq
.
cq
);
work_done
=
mlx5e_poll_rx_cq
(
&
c
->
rq
.
cq
,
budget
);
if
(
likely
(
budget
))
{
/* budget=0 means: don't poll rx rings */
busy
|=
work_done
==
budget
;
work_done
=
mlx5e_poll_rx_cq
(
&
c
->
rq
.
cq
,
budget
);
busy
|=
work_done
==
budget
;
}
busy
|=
c
->
rq
.
post_wqes
(
&
c
->
rq
);
busy
|=
c
->
rq
.
post_wqes
(
&
c
->
rq
);
if
(
busy
)
{
if
(
busy
)
{
if
(
likely
(
mlx5e_channel_no_affinity_change
(
c
)))
if
(
likely
(
mlx5e_channel_no_affinity_change
(
c
)))
return
budget
;
return
budget
;
if
(
work_done
==
budget
)
if
(
budget
&&
work_done
==
budget
)
work_done
--
;
work_done
--
;
}
}
...
...
drivers/net/ethernet/mellanox/mlx5/core/main.c
浏览文件 @
fdae5f37
...
@@ -1486,9 +1486,16 @@ static int mlx5_try_fast_unload(struct mlx5_core_dev *dev)
...
@@ -1486,9 +1486,16 @@ static int mlx5_try_fast_unload(struct mlx5_core_dev *dev)
return
-
EAGAIN
;
return
-
EAGAIN
;
}
}
/* Panic tear down fw command will stop the PCI bus communication
* with the HCA, so the health polll is no longer needed.
*/
mlx5_drain_health_wq
(
dev
);
mlx5_stop_health_poll
(
dev
);
ret
=
mlx5_cmd_force_teardown_hca
(
dev
);
ret
=
mlx5_cmd_force_teardown_hca
(
dev
);
if
(
ret
)
{
if
(
ret
)
{
mlx5_core_dbg
(
dev
,
"Firmware couldn't do fast unload error: %d
\n
"
,
ret
);
mlx5_core_dbg
(
dev
,
"Firmware couldn't do fast unload error: %d
\n
"
,
ret
);
mlx5_start_health_poll
(
dev
);
return
ret
;
return
ret
;
}
}
...
...
include/linux/sysctl.h
浏览文件 @
fdae5f37
...
@@ -213,6 +213,11 @@ static inline struct ctl_table_header *register_sysctl_paths(
...
@@ -213,6 +213,11 @@ static inline struct ctl_table_header *register_sysctl_paths(
return
NULL
;
return
NULL
;
}
}
static
inline
struct
ctl_table_header
*
register_sysctl
(
const
char
*
path
,
struct
ctl_table
*
table
)
{
return
NULL
;
}
static
inline
void
unregister_sysctl_table
(
struct
ctl_table_header
*
table
)
static
inline
void
unregister_sysctl_table
(
struct
ctl_table_header
*
table
)
{
{
}
}
...
...
include/uapi/drm/i915_drm.h
浏览文件 @
fdae5f37
...
@@ -829,6 +829,7 @@ struct drm_i915_gem_exec_fence {
...
@@ -829,6 +829,7 @@ struct drm_i915_gem_exec_fence {
#define I915_EXEC_FENCE_WAIT (1<<0)
#define I915_EXEC_FENCE_WAIT (1<<0)
#define I915_EXEC_FENCE_SIGNAL (1<<1)
#define I915_EXEC_FENCE_SIGNAL (1<<1)
#define __I915_EXEC_FENCE_UNKNOWN_FLAGS (-(I915_EXEC_FENCE_SIGNAL << 1))
__u32
flags
;
__u32
flags
;
};
};
...
...
net/8021q/vlan.c
浏览文件 @
fdae5f37
...
@@ -379,6 +379,9 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
...
@@ -379,6 +379,9 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
dev
->
name
);
dev
->
name
);
vlan_vid_add
(
dev
,
htons
(
ETH_P_8021Q
),
0
);
vlan_vid_add
(
dev
,
htons
(
ETH_P_8021Q
),
0
);
}
}
if
(
event
==
NETDEV_DOWN
&&
(
dev
->
features
&
NETIF_F_HW_VLAN_CTAG_FILTER
))
vlan_vid_del
(
dev
,
htons
(
ETH_P_8021Q
),
0
);
vlan_info
=
rtnl_dereference
(
dev
->
vlan_info
);
vlan_info
=
rtnl_dereference
(
dev
->
vlan_info
);
if
(
!
vlan_info
)
if
(
!
vlan_info
)
...
@@ -426,9 +429,6 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
...
@@ -426,9 +429,6 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
struct
net_device
*
tmp
;
struct
net_device
*
tmp
;
LIST_HEAD
(
close_list
);
LIST_HEAD
(
close_list
);
if
(
dev
->
features
&
NETIF_F_HW_VLAN_CTAG_FILTER
)
vlan_vid_del
(
dev
,
htons
(
ETH_P_8021Q
),
0
);
/* Put all VLANs for this dev in the down state too. */
/* Put all VLANs for this dev in the down state too. */
vlan_group_for_each_dev
(
grp
,
i
,
vlandev
)
{
vlan_group_for_each_dev
(
grp
,
i
,
vlandev
)
{
flgs
=
vlandev
->
flags
;
flgs
=
vlandev
->
flags
;
...
...
net/dsa/switch.c
浏览文件 @
fdae5f37
...
@@ -133,6 +133,8 @@ static int dsa_switch_mdb_add(struct dsa_switch *ds,
...
@@ -133,6 +133,8 @@ static int dsa_switch_mdb_add(struct dsa_switch *ds,
if
(
err
)
if
(
err
)
return
err
;
return
err
;
}
}
return
0
;
}
}
for_each_set_bit
(
port
,
group
,
ds
->
num_ports
)
for_each_set_bit
(
port
,
group
,
ds
->
num_ports
)
...
@@ -180,6 +182,8 @@ static int dsa_switch_vlan_add(struct dsa_switch *ds,
...
@@ -180,6 +182,8 @@ static int dsa_switch_vlan_add(struct dsa_switch *ds,
if
(
err
)
if
(
err
)
return
err
;
return
err
;
}
}
return
0
;
}
}
for_each_set_bit
(
port
,
members
,
ds
->
num_ports
)
for_each_set_bit
(
port
,
members
,
ds
->
num_ports
)
...
...
net/ipv4/tcp_input.c
浏览文件 @
fdae5f37
...
@@ -2554,7 +2554,6 @@ void tcp_simple_retransmit(struct sock *sk)
...
@@ -2554,7 +2554,6 @@ void tcp_simple_retransmit(struct sock *sk)
struct
tcp_sock
*
tp
=
tcp_sk
(
sk
);
struct
tcp_sock
*
tp
=
tcp_sk
(
sk
);
struct
sk_buff
*
skb
;
struct
sk_buff
*
skb
;
unsigned
int
mss
=
tcp_current_mss
(
sk
);
unsigned
int
mss
=
tcp_current_mss
(
sk
);
u32
prior_lost
=
tp
->
lost_out
;
skb_rbtree_walk
(
skb
,
&
sk
->
tcp_rtx_queue
)
{
skb_rbtree_walk
(
skb
,
&
sk
->
tcp_rtx_queue
)
{
if
(
tcp_skb_seglen
(
skb
)
>
mss
&&
if
(
tcp_skb_seglen
(
skb
)
>
mss
&&
...
@@ -2569,7 +2568,7 @@ void tcp_simple_retransmit(struct sock *sk)
...
@@ -2569,7 +2568,7 @@ void tcp_simple_retransmit(struct sock *sk)
tcp_clear_retrans_hints_partial
(
tp
);
tcp_clear_retrans_hints_partial
(
tp
);
if
(
prior_lost
==
tp
->
lost_out
)
if
(
!
tp
->
lost_out
)
return
;
return
;
if
(
tcp_is_reno
(
tp
))
if
(
tcp_is_reno
(
tp
))
...
...
net/ipv4/tcp_offload.c
浏览文件 @
fdae5f37
...
@@ -149,11 +149,19 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
...
@@ -149,11 +149,19 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
* is freed by GSO engine
* is freed by GSO engine
*/
*/
if
(
copy_destructor
)
{
if
(
copy_destructor
)
{
int
delta
;
swap
(
gso_skb
->
sk
,
skb
->
sk
);
swap
(
gso_skb
->
sk
,
skb
->
sk
);
swap
(
gso_skb
->
destructor
,
skb
->
destructor
);
swap
(
gso_skb
->
destructor
,
skb
->
destructor
);
sum_truesize
+=
skb
->
truesize
;
sum_truesize
+=
skb
->
truesize
;
refcount_add
(
sum_truesize
-
gso_skb
->
truesize
,
delta
=
sum_truesize
-
gso_skb
->
truesize
;
&
skb
->
sk
->
sk_wmem_alloc
);
/* In some pathological cases, delta can be negative.
* We need to either use refcount_add() or refcount_sub_and_test()
*/
if
(
likely
(
delta
>=
0
))
refcount_add
(
delta
,
&
skb
->
sk
->
sk_wmem_alloc
);
else
WARN_ON_ONCE
(
refcount_sub_and_test
(
-
delta
,
&
skb
->
sk
->
sk_wmem_alloc
));
}
}
delta
=
htonl
(
oldlen
+
(
skb_tail_pointer
(
skb
)
-
delta
=
htonl
(
oldlen
+
(
skb_tail_pointer
(
skb
)
-
...
...
net/rds/ib_recv.c
浏览文件 @
fdae5f37
...
@@ -410,14 +410,14 @@ void rds_ib_recv_refill(struct rds_connection *conn, int prefill, gfp_t gfp)
...
@@ -410,14 +410,14 @@ void rds_ib_recv_refill(struct rds_connection *conn, int prefill, gfp_t gfp)
break
;
break
;
}
}
/* XXX when can this fail? */
rdsdebug
(
"recv %p ibinc %p page %p addr %lu
\n
"
,
recv
,
ret
=
ib_post_recv
(
ic
->
i_cm_id
->
qp
,
&
recv
->
r_wr
,
&
failed_wr
);
rdsdebug
(
"recv %p ibinc %p page %p addr %lu ret %d
\n
"
,
recv
,
recv
->
r_ibinc
,
sg_page
(
&
recv
->
r_frag
->
f_sg
),
recv
->
r_ibinc
,
sg_page
(
&
recv
->
r_frag
->
f_sg
),
(
long
)
ib_sg_dma_address
(
(
long
)
ib_sg_dma_address
(
ic
->
i_cm_id
->
device
,
ic
->
i_cm_id
->
device
,
&
recv
->
r_frag
->
f_sg
),
&
recv
->
r_frag
->
f_sg
));
ret
);
/* XXX when can this fail? */
ret
=
ib_post_recv
(
ic
->
i_cm_id
->
qp
,
&
recv
->
r_wr
,
&
failed_wr
);
if
(
ret
)
{
if
(
ret
)
{
rds_ib_conn_error
(
conn
,
"recv post on "
rds_ib_conn_error
(
conn
,
"recv post on "
"%pI4 returned %d, disconnecting and "
"%pI4 returned %d, disconnecting and "
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录