Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
fdae5f37
Commit
fdae5f37
authored
Nov 12, 2017
by
David S. Miller
Browse files
Options
Browse Files
Download
Plain Diff
Merge
git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
parents
7c5556de
b3954568
Changes
37
Hide whitespace changes
Inline
Side-by-side
Showing
37 changed files
with
180 additions
and
105 deletions
+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
No files found.
.mailmap
View file @
fdae5f37
...
...
@@ -102,6 +102,7 @@ Leonid I Ananiev <leonid.i.ananiev@intel.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@ascom.ch>
Maciej W. Rozycki <macro@mips.com> <macro@imgtec.com>
Marcin Nowakowski <marcin.nowakowski@mips.com> <marcin.nowakowski@imgtec.com>
Mark Brown <broonie@sirena.org.uk>
Martin Kepplinger <martink@posteo.de> <martin.kepplinger@theobroma-systems.com>
...
...
CREDITS
View file @
fdae5f37
...
...
@@ -2113,6 +2113,10 @@ S: J. Obrechtstr 23
S: NL-5216 GP 's-Hertogenbosch
S: The Netherlands
N: Ashley Lai
E: ashleydlai@gmail.com
D: IBM VTPM driver
N: Savio Lam
E: lam836@cs.cuhk.hk
D: Author of the dialog utility, foundation
...
...
@@ -3333,6 +3337,10 @@ S: Braunschweiger Strasse 79
S: 31134 Hildesheim
S: Germany
N: Marcel Selhorst
E: tpmdd@selhorst.net
D: TPM driver
N: Darren Senn
E: sinster@darkwater.com
D: Whatever I notice needs doing (so far: itimers, /proc)
...
...
@@ -4128,7 +4136,6 @@ D: MD driver
D: EISA/sysfs subsystem
S: France
# Don't add your name here, unless you really _are_ after Marc
# alphabetically. Leonard used to be very proud of being the
# last entry, and he'll get positively pissed if he can't even
...
...
MAINTAINERS
View file @
fdae5f37
...
...
@@ -10349,7 +10349,6 @@ F: drivers/pci/host/vmd.c
PCI DRIVER FOR MICROSEMI SWITCHTEC
M: Kurt Schwemmer <kurt.schwemmer@microsemi.com>
M: Stephen Bates <stephen.bates@microsemi.com>
M: Logan Gunthorpe <logang@deltatee.com>
L: linux-pci@vger.kernel.org
S: Maintained
...
...
@@ -10414,6 +10413,7 @@ F: drivers/pci/dwc/*keystone*
PCI ENDPOINT SUBSYSTEM
M: Kishon Vijay Abraham I <kishon@ti.com>
M: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
L: linux-pci@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kishon/pci-endpoint.git
S: Supported
...
...
@@ -10465,6 +10465,15 @@ F: include/linux/pci*
F: arch/x86/pci/
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
M: Niklas Cassel <niklas.cassel@axis.com>
M: Jesper Nilsson <jesper.nilsson@axis.com>
...
...
@@ -10484,7 +10493,6 @@ F: drivers/pci/host/pci-thunder-*
PCIE DRIVER FOR HISILICON
M: Zhou Wang <wangzhou1@hisilicon.com>
M: Gabriele Paoloni <gabriele.paoloni@huawei.com>
L: linux-pci@vger.kernel.org
S: Maintained
F: Documentation/devicetree/bindings/pci/hisilicon-pcie.txt
...
...
@@ -13621,23 +13629,14 @@ F: drivers/platform/x86/toshiba-wmi.c
TPM DEVICE DRIVER
M: Peter Huewe <peterhuewe@gmx.de>
M: Marcel Selhorst <tpmdd@selhorst.net>
M: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
R: Jason Gunthorpe <jgunthorpe@obsidianresearch.com>
W: http://tpmdd.sourceforge.net
L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
Q: https://patchwork.kernel.org/project/tpmdd-devel/list/
L: linux-integrity@vger.kernel.org
Q: https://patchwork.kernel.org/project/linux-integrity/list/
T: git git://git.infradead.org/users/jjs/linux-tpmdd.git
S: Maintained
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
M: Steven Rostedt <rostedt@goodmis.org>
M: Ingo Molnar <mingo@redhat.com>
...
...
arch/arm/kernel/traps.c
View file @
fdae5f37
...
...
@@ -154,30 +154,26 @@ static void dump_mem(const char *lvl, const char *str, unsigned long bottom,
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
);
const
int
thumb
=
thumb_mode
(
regs
);
const
int
width
=
thumb
?
4
:
8
;
mm_segment_t
fs
;
char
str
[
sizeof
(
"00000000 "
)
*
5
+
2
+
1
],
*
p
=
str
;
int
i
;
/*
* We need to switch to kernel mode so that we can use __get_user
* to safely read from kernel space. Note that we now dump the
* code first, just in case the backtrace kills us.
* Note that we now dump the code first, just in case the backtrace
* kills us.
*/
fs
=
get_fs
();
set_fs
(
KERNEL_DS
);
for
(
i
=
-
4
;
i
<
1
+
!!
thumb
;
i
++
)
{
unsigned
int
val
,
bad
;
if
(
thumb
)
bad
=
__
get_user
(
val
,
&
((
u16
*
)
addr
)[
i
]);
bad
=
get_user
(
val
,
&
((
u16
*
)
addr
)[
i
]);
else
bad
=
__
get_user
(
val
,
&
((
u32
*
)
addr
)[
i
]);
bad
=
get_user
(
val
,
&
((
u32
*
)
addr
)[
i
]);
if
(
!
bad
)
p
+=
sprintf
(
p
,
i
==
0
?
"(%0*x) "
:
"%0*x "
,
...
...
@@ -188,8 +184,20 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
}
}
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
...
...
arch/mips/ar7/platform.c
View file @
fdae5f37
...
...
@@ -575,6 +575,7 @@ static int __init ar7_register_uarts(void)
uart_port
.
type
=
PORT_AR7
;
uart_port
.
uartclk
=
clk_get_rate
(
bus_clk
)
/
2
;
uart_port
.
iotype
=
UPIO_MEM32
;
uart_port
.
flags
=
UPF_FIXED_TYPE
;
uart_port
.
regshift
=
2
;
uart_port
.
line
=
0
;
...
...
@@ -653,6 +654,10 @@ static int __init ar7_register_devices(void)
u32
val
;
int
res
;
res
=
ar7_gpio_init
();
if
(
res
)
pr_warn
(
"unable to register gpios: %d
\n
"
,
res
);
res
=
ar7_register_uarts
();
if
(
res
)
pr_err
(
"unable to setup uart(s): %d
\n
"
,
res
);
...
...
arch/mips/ar7/prom.c
View file @
fdae5f37
...
...
@@ -246,8 +246,6 @@ void __init prom_init(void)
ar7_init_cmdline
(
fw_arg0
,
(
char
**
)
fw_arg1
);
ar7_init_env
((
struct
env_var
*
)
fw_arg2
);
console_config
();
ar7_gpio_init
();
}
#define PORT(offset) (KSEG1ADDR(AR7_REGS_UART0 + (offset * 4)))
...
...
arch/mips/kernel/smp-bmips.c
View file @
fdae5f37
...
...
@@ -591,11 +591,11 @@ void __init bmips_cpu_setup(void)
/* Flush and enable RAC */
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
);
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
);
cfg
=
__raw_readl
(
cbr
+
BMIPS_RAC_ADDRESS_RANGE
);
...
...
arch/powerpc/kvm/book3s_64_mmu_hv.c
View file @
fdae5f37
...
...
@@ -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_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
]
||
rev
->
guest_rpte
!=
hpte
[
2
])
/* HPTE has been changed under us; let the guest retry */
...
...
arch/powerpc/kvm/book3s_hv.c
View file @
fdae5f37
...
...
@@ -2705,11 +2705,14 @@ static noinline void kvmppc_run_core(struct kvmppc_vcore *vc)
* Hard-disable interrupts, and check resched flag and signals.
* If we need to reschedule or deliver a signal, clean up
* 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
();
hard_irq_disable
();
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
();
vc
->
vcore_state
=
VCORE_INACTIVE
;
/* Unlock all except the primary vcore */
...
...
@@ -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
)
{
int
n_ceded
,
i
;
int
n_ceded
,
i
,
r
;
struct
kvmppc_vcore
*
vc
;
struct
kvm_vcpu
*
v
;
...
...
@@ -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
&&
!
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
)
kvmppc_vcore_end_preempt
(
vc
);
...
...
@@ -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 */
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
);
/* 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)
}
mtspr
(
SPRN_VRSAVE
,
user_vrsave
);
out:
vcpu
->
arch
.
state
=
KVMPPC_VCPU_NOTREADY
;
atomic_dec
(
&
vcpu
->
kvm
->
arch
.
vcpus_running
);
return
r
;
...
...
arch/x86/kernel/cpu/Makefile
View file @
fdae5f37
...
...
@@ -22,7 +22,7 @@ obj-y += common.o
obj-y
+=
rdrand.o
obj-y
+=
match.o
obj-y
+=
bugs.o
obj-
y
+=
aperfmperf.o
obj-
$(CONFIG_CPU_FREQ)
+=
aperfmperf.o
obj-$(CONFIG_PROC_FS)
+=
proc.o
obj-$(CONFIG_X86_FEATURE_NAMES)
+=
capflags.o powerflags.o
...
...
arch/x86/kernel/cpu/aperfmperf.c
View file @
fdae5f37
...
...
@@ -42,6 +42,10 @@ static void aperfmperf_snapshot_khz(void *dummy)
s64
time_delta
=
ktime_ms_delta
(
now
,
s
->
time
);
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
);
rdmsrl
(
MSR_IA32_APERF
,
aperf
);
rdmsrl
(
MSR_IA32_MPERF
,
mperf
);
...
...
@@ -70,7 +74,6 @@ static void aperfmperf_snapshot_khz(void *dummy)
unsigned
int
arch_freq_get_on_cpu
(
int
cpu
)
{
s64
time_delta
;
unsigned
int
khz
;
if
(
!
cpu_khz
)
...
...
@@ -79,12 +82,6 @@ unsigned int arch_freq_get_on_cpu(int cpu)
if
(
!
static_cpu_has
(
X86_FEATURE_APERFMPERF
))
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
);
khz
=
per_cpu
(
samples
.
khz
,
cpu
);
if
(
khz
)
...
...
arch/x86/kernel/cpu/proc.c
View file @
fdae5f37
...
...
@@ -78,10 +78,8 @@ static int show_cpuinfo(struct seq_file *m, void *v)
seq_printf
(
m
,
"microcode
\t
: 0x%x
\n
"
,
c
->
microcode
);
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
)
freq
=
cpu_khz
;
seq_printf
(
m
,
"cpu MHz
\t\t
: %u.%03u
\n
"
,
...
...
drivers/block/rbd.c
View file @
fdae5f37
...
...
@@ -2692,7 +2692,7 @@ static int rbd_img_obj_parent_read_full(struct rbd_obj_request *obj_request)
* from the parent.
*/
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
))
{
result
=
PTR_ERR
(
pages
);
pages
=
NULL
;
...
...
@@ -2827,7 +2827,7 @@ static int rbd_img_obj_exists_submit(struct rbd_obj_request *obj_request)
*/
size
=
sizeof
(
__le64
)
+
sizeof
(
__le32
)
+
sizeof
(
__le32
);
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
))
{
ret
=
PTR_ERR
(
pages
);
goto
fail_stat_request
;
...
...
drivers/gpu/drm/i915/i915_gem_execbuffer.c
View file @
fdae5f37
...
...
@@ -2094,6 +2094,11 @@ get_fence_array(struct drm_i915_gem_execbuffer2 *args,
goto
err
;
}
if
(
fence
.
flags
&
__I915_EXEC_FENCE_UNKNOWN_FLAGS
)
{
err
=
-
EINVAL
;
goto
err
;
}
syncobj
=
drm_syncobj_find
(
file
,
fence
.
handle
);
if
(
!
syncobj
)
{
DRM_DEBUG
(
"Invalid syncobj handle provided
\n
"
);
...
...
@@ -2101,6 +2106,9 @@ get_fence_array(struct drm_i915_gem_execbuffer2 *args,
goto
err
;
}
BUILD_BUG_ON
(
~
(
ARCH_KMALLOC_MINALIGN
-
1
)
&
~
__I915_EXEC_FENCE_UNKNOWN_FLAGS
);
fences
[
n
]
=
ptr_pack_bits
(
syncobj
,
fence
.
flags
,
2
);
}
...
...
drivers/gpu/drm/i915/i915_gem_gtt.c
View file @
fdae5f37
...
...
@@ -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
;
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
{
u16
pml4e
;
...
...
@@ -916,11 +920,7 @@ static void gen8_ppgtt_insert_3lvl(struct i915_address_space *vm,
u32
unused
)
{
struct
i915_hw_ppgtt
*
ppgtt
=
i915_vm_to_ppgtt
(
vm
);
struct
sgt_dma
iter
=
{
.
sg
=
vma
->
pages
->
sgl
,
.
dma
=
sg_dma_address
(
iter
.
sg
),
.
max
=
iter
.
dma
+
iter
.
sg
->
length
,
};
struct
sgt_dma
iter
=
sgt_dma
(
vma
);
struct
gen8_insert_pte
idx
=
gen8_insert_pte
(
vma
->
node
.
start
);
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,
u32
unused
)
{
struct
i915_hw_ppgtt
*
ppgtt
=
i915_vm_to_ppgtt
(
vm
);
struct
sgt_dma
iter
=
{
.
sg
=
vma
->
pages
->
sgl
,
.
dma
=
sg_dma_address
(
iter
.
sg
),
.
max
=
iter
.
dma
+
iter
.
sg
->
length
,
};
struct
sgt_dma
iter
=
sgt_dma
(
vma
);
struct
i915_page_directory_pointer
**
pdps
=
ppgtt
->
pml4
.
pdps
;
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,
unsigned
act_pt
=
first_entry
/
GEN6_PTES
;
unsigned
act_pte
=
first_entry
%
GEN6_PTES
;
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
;
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
{
vaddr
[
act_pte
]
=
pte_encode
|
GEN6_PTE_ADDR_ENCODE
(
iter
.
dma
);
...
...
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
View file @
fdae5f37
...
...
@@ -721,7 +721,7 @@ static int vmw_driver_load(struct drm_device *dev, unsigned long chipset)
* allocation taken by fbdev
*/
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
->
prim_bb_mem
=
...
...
drivers/gpu/drm/vmwgfx/vmwgfx_fence.c
View file @
fdae5f37
...
...
@@ -224,7 +224,7 @@ static long vmw_fence_wait(struct dma_fence *f, bool intr, signed long timeout)
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_timeline_name
=
vmw_fence_get_timeline_name
,
.
enable_signaling
=
vmw_fence_enable_signaling
,
...
...
drivers/input/mouse/elan_i2c_core.c
View file @
fdae5f37
...
...
@@ -1258,6 +1258,7 @@ static const struct acpi_device_id elan_acpi_id[] = {
{
"ELAN0605"
,
0
},
{
"ELAN0609"
,
0
},
{
"ELAN060B"
,
0
},
{
"ELAN060C"
,
0
},
{
"ELAN0611"
,
0
},
{
"ELAN1000"
,
0
},
{
}
...
...
drivers/input/rmi4/rmi_smbus.c
View file @
fdae5f37
...
...
@@ -312,7 +312,7 @@ static int rmi_smb_probe(struct i2c_client *client,
rmi_smb
->
xport
.
dev
=
&
client
->
dev
;
rmi_smb
->
xport
.
pdata
=
*
pdata
;
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
;
smbus_version
=
rmi_smb_get_version
(
rmi_smb
);
...
...
@@ -322,7 +322,7 @@ static int rmi_smb_probe(struct i2c_client *client,
rmi_dbg
(
RMI_DEBUG_XPORT
,
&
client
->
dev
,
"Smbus version is %d"
,
smbus_version
);
if
(
smbus_version
!=
2
)
{
if
(
smbus_version
!=
2
&&
smbus_version
!=
3
)
{
dev_err
(
&
client
->
dev
,
"Unrecognized SMB version %d
\n
"
,
smbus_version
);
return
-
ENODEV
;
...
...
drivers/input/touchscreen/tsc200x-core.c
View file @
fdae5f37
...
...
@@ -531,6 +531,7 @@ int tsc200x_probe(struct device *dev, int irq, const struct input_id *tsc_id,
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_abs_params
(
input_dev
,
ABS_X
,
...
...
drivers/net/can/c_can/c_can_pci.c
View file @
fdae5f37
...
...
@@ -178,7 +178,6 @@ static int c_can_pci_probe(struct pci_dev *pdev,
break
;
case
BOSCH_D_CAN
:
priv
->
regs
=
reg_map_d_can
;
priv
->
can
.
ctrlmode_supported
|=
CAN_CTRLMODE_3_SAMPLES
;
break
;
default:
ret
=
-
EINVAL
;
...
...
drivers/net/can/c_can/c_can_platform.c
View file @
fdae5f37
...
...
@@ -320,7 +320,6 @@ static int c_can_plat_probe(struct platform_device *pdev)
break
;
case
BOSCH_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
->
write_reg
=
c_can_plat_write_reg_aligned_to_16bit
;
priv
->
read_reg32
=
d_can_plat_read_reg32
;
...
...
drivers/net/can/ifi_canfd/ifi_canfd.c
View file @
fdae5f37
...
...
@@ -670,9 +670,9 @@ static void ifi_canfd_set_bittiming(struct net_device *ndev)
priv
->
base
+
IFI_CANFD_FTIME
);
/* Configure transmitter delay */
tdc
=
(
dbt
->
brp
*
(
dbt
->
phase_seg1
+
1
))
&
IFI_CANFD_TDELAY_MASK
;
writel
(
IFI_CANFD_TDELAY_EN
|
IFI_CANFD_TDELAY_ABS
|
tdc
,
priv
->
base
+
IFI_CANFD_TDELAY
);
tdc
=
dbt
->
brp
*
(
dbt
->
prop_seg
+
dbt
->
phase_seg1
)
;
tdc
&=
IFI_CANFD_TDELAY_MASK
;
writel
(
IFI_CANFD_TDELAY_EN
|
tdc
,
priv
->
base
+
IFI_CANFD_TDELAY
);
}
static
void
ifi_canfd_set_filter
(
struct
net_device
*
ndev
,
const
u32
id
,
...
...
drivers/net/can/peak_canfd/peak_pciefd_main.c
View file @
fdae5f37
...
...
@@ -29,14 +29,19 @@
#include "peak_canfd_user.h"
MODULE_AUTHOR
(
"Stephane Grosjean <s.grosjean@peak-system.com>"
);
MODULE_DESCRIPTION
(
"Socket-CAN driver for PEAK PCAN PCIe FD family cards"
);
MODULE_SUPPORTED_DEVICE
(
"PEAK PCAN PCIe FD CAN cards"
);
MODULE_DESCRIPTION
(
"Socket-CAN driver for PEAK PCAN PCIe
/M.2
FD family cards"
);
MODULE_SUPPORTED_DEVICE
(
"PEAK PCAN PCIe
/M.2
FD CAN cards"
);
MODULE_LICENSE
(
"GPL v2"
);
#define PCIEFD_DRV_NAME "peak_pciefd"
#define PEAK_PCI_VENDOR_ID 0x001c
/* The PCI device and vendor IDs */
#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 */
#define PCIEFD_BAR0_SIZE (64 * 1024)
...
...
@@ -203,6 +208,11 @@ struct pciefd_board {
/* supported device ids. */
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
,
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
,}
};
...
...
drivers/net/can/sun4i_can.c
View file @
fdae5f37
...
...
@@ -539,6 +539,13 @@ static int sun4i_can_err(struct net_device *dev, u8 isrc, u8 status)
}
stats
->
rx_over_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 */
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)
netif_wake_queue
(
dev
);
can_led_event
(
dev
,
CAN_LED_EVENT_TX
);
}
if
(
isrc
&
SUN4I_INT_RBUF_VLD
)
{
/* receive interrupt */
if
((
isrc
&
SUN4I_INT_RBUF_VLD
)
&&
!
(
isrc
&
SUN4I_INT_DATA_OR
))
{
/* receive interrupt - don't read if overrun occurred */
while
(
status
&
SUN4I_STA_RBUF_RDY
)
{
/* RX buffer is not empty */
sun4i_can_rx
(
dev
);
...
...
drivers/net/ethernet/mellanox/mlx5/core/dev.c
View file @
fdae5f37
...
...
@@ -93,7 +93,7 @@ static void delayed_event_release(struct mlx5_device_context *dev_ctx,
list_splice_init
(
&
priv
->
waiting_events_list
,
&
temp
);
if
(
!
dev_ctx
->
context
)
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
);
out:
...
...
drivers/net/ethernet/mellanox/mlx5/core/en.h
View file @
fdae5f37
...
...
@@ -68,7 +68,7 @@
#define MLX5E_PARAMS_DEFAULT_LOG_RQ_SIZE 0xa
#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_MAXIMUM_LOG_RQ_SIZE_MPW 0x6
...
...
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
View file @
fdae5f37
...
...
@@ -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
,
struct
mlx5e_dma_info
*
dma_info
)
{
struct
page
*
page
;
if
(
mlx5e_rx_cache_get
(
rq
,
dma_info
))
return
0
;
page
=
dev_alloc_pages
(
rq
->
buff
.
page_order
);
if
(
unlikely
(
!
page
))
dma_info
->
page
=
dev_alloc_pages
(
rq
->
buff
.
page_order
);
if
(
unlikely
(
!
dma_info
->
page
))
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
);
if
(
unlikely
(
dma_mapping_error
(
rq
->
pdev
,
dma_info
->
addr
)))
{
put_page
(
page
);
put_page
(
dma_info
->
page
);
dma_info
->
page
=
NULL
;
return
-
ENOMEM
;
}
dma_info
->
page
=
page
;
return
0
;
}
...
...
drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
View file @
fdae5f37
...
...
@@ -49,7 +49,7 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
struct
mlx5e_channel
*
c
=
container_of
(
napi
,
struct
mlx5e_channel
,
napi
);
bool
busy
=
false
;
int
work_done
;
int
work_done
=
0
;
int
i
;
for
(
i
=
0
;
i
<
c
->
num_tc
;
i
++
)
...
...
@@ -58,15 +58,17 @@ int mlx5e_napi_poll(struct napi_struct *napi, int budget)
if
(
c
->
xdp
)
busy
|=
mlx5e_poll_xdpsq_cq
(
&
c
->
rq
.
xdpsq
.
cq
);
work_done
=
mlx5e_poll_rx_cq
(
&
c
->
rq
.
cq
,
budget
);
busy
|=
work_done
==
budget
;
if
(
likely
(
budget
))
{
/* budget=0 means: don't poll rx rings */
work_done
=
mlx5e_poll_rx_cq
(
&
c
->
rq
.
cq
,
budget
);
busy
|=
work_done
==
budget
;
}
busy
|=
c
->
rq
.
post_wqes
(
&
c
->
rq
);
if
(
busy
)
{
if
(
likely
(
mlx5e_channel_no_affinity_change
(
c
)))
return
budget
;
if
(
work_done
==
budget
)
if
(
budget
&&
work_done
==
budget
)
work_done
--
;
}
...
...
drivers/net/ethernet/mellanox/mlx5/core/main.c
View file @
fdae5f37
...
...
@@ -1486,9 +1486,16 @@ static int mlx5_try_fast_unload(struct mlx5_core_dev *dev)
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
);
if
(
ret
)
{
mlx5_core_dbg
(
dev
,
"Firmware couldn't do fast unload error: %d
\n
"
,
ret
);
mlx5_start_health_poll
(
dev
);
return
ret
;
}
...
...
include/linux/sysctl.h
View file @
fdae5f37
...
...
@@ -213,6 +213,11 @@ static inline struct ctl_table_header *register_sysctl_paths(
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
)
{
}
...
...
include/uapi/drm/i915_drm.h
View file @
fdae5f37
...
...
@@ -829,6 +829,7 @@ struct drm_i915_gem_exec_fence {
#define I915_EXEC_FENCE_WAIT (1<<0)
#define I915_EXEC_FENCE_SIGNAL (1<<1)
#define __I915_EXEC_FENCE_UNKNOWN_FLAGS (-(I915_EXEC_FENCE_SIGNAL << 1))
__u32
flags
;
};
...
...
net/8021q/vlan.c
View file @
fdae5f37
...
...
@@ -379,6 +379,9 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
dev
->
name
);
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
);
if
(
!
vlan_info
)
...
...
@@ -426,9 +429,6 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
struct
net_device
*
tmp
;
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. */
vlan_group_for_each_dev
(
grp
,
i
,
vlandev
)
{
flgs
=
vlandev
->
flags
;
...
...
net/dsa/switch.c
View file @
fdae5f37
...
...
@@ -133,6 +133,8 @@ static int dsa_switch_mdb_add(struct dsa_switch *ds,
if
(
err
)
return
err
;
}
return
0
;
}
for_each_set_bit
(
port
,
group
,
ds
->
num_ports
)
...
...
@@ -180,6 +182,8 @@ static int dsa_switch_vlan_add(struct dsa_switch *ds,
if
(
err
)
return
err
;
}
return
0
;
}
for_each_set_bit
(
port
,
members
,
ds
->
num_ports
)
...
...
net/ipv4/tcp_input.c
View file @
fdae5f37
...
...
@@ -2554,7 +2554,6 @@ void tcp_simple_retransmit(struct sock *sk)
struct
tcp_sock
*
tp
=
tcp_sk
(
sk
);
struct
sk_buff
*
skb
;
unsigned
int
mss
=
tcp_current_mss
(
sk
);
u32
prior_lost
=
tp
->
lost_out
;
skb_rbtree_walk
(
skb
,
&
sk
->
tcp_rtx_queue
)
{
if
(
tcp_skb_seglen
(
skb
)
>
mss
&&
...
...
@@ -2569,7 +2568,7 @@ void tcp_simple_retransmit(struct sock *sk)
tcp_clear_retrans_hints_partial
(
tp
);
if
(
prior_lost
==
tp
->
lost_out
)
if
(
!
tp
->
lost_out
)
return
;
if
(
tcp_is_reno
(
tp
))
...
...
net/ipv4/tcp_offload.c
View file @
fdae5f37
...
...
@@ -149,11 +149,19 @@ struct sk_buff *tcp_gso_segment(struct sk_buff *skb,
* is freed by GSO engine
*/
if
(
copy_destructor
)
{
int
delta
;
swap
(
gso_skb
->
sk
,
skb
->
sk
);
swap
(
gso_skb
->
destructor
,
skb
->
destructor
);
sum_truesize
+=
skb
->
truesize
;
refcount_add
(
sum_truesize
-
gso_skb
->
truesize
,
&
skb
->
sk
->
sk_wmem_alloc
);
delta
=
sum_truesize
-
gso_skb
->
truesize
;
/* 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
)
-
...
...
net/rds/ib_recv.c
View file @
fdae5f37
...
...
@@ -410,14 +410,14 @@ void rds_ib_recv_refill(struct rds_connection *conn, int prefill, gfp_t gfp)
break
;
}
/* XXX when can this fail? */
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
,
rdsdebug
(
"recv %p ibinc %p page %p addr %lu
\n
"
,
recv
,
recv
->
r_ibinc
,
sg_page
(
&
recv
->
r_frag
->
f_sg
),
(
long
)
ib_sg_dma_address
(
ic
->
i_cm_id
->
device
,
&
recv
->
r_frag
->
f_sg
),
ret
);
&
recv
->
r_frag
->
f_sg
));
/* XXX when can this fail? */
ret
=
ib_post_recv
(
ic
->
i_cm_id
->
qp
,
&
recv
->
r_wr
,
&
failed_wr
);
if
(
ret
)
{
rds_ib_conn_error
(
conn
,
"recv post on "
"%pI4 returned %d, disconnecting and "
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment