Merge commit 'b73847a75055daf57295a8d32fd2c3f998d0b72a' into HEAD
Change-Id: I240d1eae11f98e46ac3c3dfbd69805e4343921fd Signed-off-by: Pradosh Das <prados@codeaurora.org>
This commit is contained in:
commit
72b69ffec9
|
@ -51,8 +51,9 @@ show up in /proc/sys/kernel:
|
|||
- overflowuid
|
||||
- panic
|
||||
- panic_on_oops
|
||||
- panic_on_unrecovered_nmi
|
||||
- panic_on_stackoverflow
|
||||
- panic_on_unrecovered_nmi
|
||||
- perf_event_paranoid
|
||||
- pid_max
|
||||
- powersave-nap [ PPC only ]
|
||||
- printk
|
||||
|
@ -427,19 +428,6 @@ the recommended setting is 60.
|
|||
|
||||
==============================================================
|
||||
|
||||
panic_on_unrecovered_nmi:
|
||||
|
||||
The default Linux behaviour on an NMI of either memory or unknown is
|
||||
to continue operation. For many environments such as scientific
|
||||
computing it is preferable that the box is taken out and the error
|
||||
dealt with than an uncorrected parity/ECC error get propagated.
|
||||
|
||||
A small number of systems do generate NMI's for bizarre random reasons
|
||||
such as power management so the default is off. That sysctl works like
|
||||
the existing panic controls already in that directory.
|
||||
|
||||
==============================================================
|
||||
|
||||
panic_on_oops:
|
||||
|
||||
Controls the kernel's behaviour when an oops or BUG is encountered.
|
||||
|
@ -459,7 +447,6 @@ This file shows up if CONFIG_DEBUG_STACKOVERFLOW is enabled.
|
|||
|
||||
0: try to continue operation.
|
||||
|
||||
1: panic immediately.
|
||||
|
||||
==============================================================
|
||||
|
||||
|
@ -489,6 +476,32 @@ allowed to execute.
|
|||
|
||||
==============================================================
|
||||
|
||||
panic_on_unrecovered_nmi:
|
||||
|
||||
The default Linux behaviour on an NMI of either memory or unknown is
|
||||
to continue operation. For many environments such as scientific
|
||||
computing it is preferable that the box is taken out and the error
|
||||
dealt with than an uncorrected parity/ECC error get propagated.
|
||||
|
||||
A small number of systems do generate NMI's for bizarre random reasons
|
||||
such as power management so the default is off. That sysctl works like
|
||||
the existing panic controls already in that directory.
|
||||
|
||||
==============================================================
|
||||
|
||||
perf_event_paranoid:
|
||||
|
||||
Controls use of the performance events system by unprivileged
|
||||
users (without CAP_SYS_ADMIN). The default value is 3 if
|
||||
CONFIG_SECURITY_PERF_EVENTS_RESTRICT is set, or 1 otherwise.
|
||||
|
||||
-1: Allow use of (almost) all events by all users
|
||||
>=0: Disallow raw tracepoint access by users without CAP_IOC_LOCK
|
||||
>=1: Disallow CPU event access by users without CAP_SYS_ADMIN
|
||||
>=2: Disallow kernel profiling by users without CAP_SYS_ADMIN
|
||||
>=3: Disallow all event access by users without CAP_SYS_ADMIN
|
||||
|
||||
==============================================================
|
||||
|
||||
pid_max:
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -115,7 +115,7 @@
|
|||
qcom,saw2-spm-ctl = <0x1>;
|
||||
qcom,saw2-pmic-data0 = <0x02030080>;
|
||||
qcom,saw2-pmic-data1 = <0x00030000>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,pfm-port = <0x2>;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -96,7 +96,7 @@
|
|||
qcom,saw2-spm-ctl = <0x0>;
|
||||
qcom,saw2-pmic-data0 = <0x02030080>;
|
||||
qcom,saw2-pmic-data1 = <0x00030000>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,pfm-port = <0x2>;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -96,7 +96,7 @@
|
|||
qcom,saw2-spm-ctl = <0x0>;
|
||||
qcom,saw2-pmic-data0 = <0x02030080>;
|
||||
qcom,saw2-pmic-data1 = <0x00030000>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,pfm-port = <0x2>;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -96,7 +96,7 @@
|
|||
qcom,saw2-spm-ctl = <0x0>;
|
||||
qcom,saw2-pmic-data0 = <0x02030080>;
|
||||
qcom,saw2-pmic-data1 = <0x00030000>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,pfm-port = <0x2>;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -96,7 +96,7 @@
|
|||
qcom,saw2-spm-ctl = <0x0>;
|
||||
qcom,saw2-pmic-data0 = <0x02030080>;
|
||||
qcom,saw2-pmic-data1 = <0x00030000>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,pfm-port = <0x2>;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -100,7 +100,7 @@
|
|||
qcom,saw2-pmic-data1 = <0x00030000>;
|
||||
qcom,saw2-pmic-data4 = <0x00010080>;
|
||||
qcom,saw2-pmic-data5 = <0x00010000>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,pfm-port = <0x2>;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -90,7 +90,7 @@
|
|||
qcom,saw2-pmic-data1 = <0x00030000>;
|
||||
qcom,saw2-pmic-data4 = <0x00010080>;
|
||||
qcom,saw2-pmic-data5 = <0x00010000>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,pfm-port = <0x2>;
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
qcom,saw2-pmic-data1 = <0x00030000>;
|
||||
qcom,saw2-pmic-data4 = <0x00010080>;
|
||||
qcom,saw2-pmic-data5 = <0x00010000>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,pfm-port = <0x2>;
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
qcom,saw2-spm-dly = <0X3c102800>;
|
||||
qcom,saw2-spm-ctl = <0x8>;
|
||||
qcom,cpu-vctl-list = <&CPU0 &CPU1 &CPU2 &CPU3>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,saw2-pmic-data0 = <0x03030080>; /* VDD_APC0 on */
|
||||
|
@ -42,7 +42,7 @@
|
|||
qcom,saw2-spm-dly = <0x3c11840a>;
|
||||
qcom,saw2-spm-ctl = <0x8>;
|
||||
qcom,cpu-vctl-list = <&CPU4 &CPU5>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,saw2-pmic-data0 = <0x03030080>; /* VDD_APC1 on */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2012-2014, 2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -119,7 +119,7 @@
|
|||
qcom,saw2-spm-ctl = <0x1>;
|
||||
qcom,saw2-pmic-data0 = <0x02030080>;
|
||||
qcom,saw2-pmic-data1 = <0x00030000>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,cpu-vctl-mask = <0xf>;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2013-2014, 2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -120,7 +120,7 @@
|
|||
qcom,saw2-spm-ctl = <0x1>;
|
||||
qcom,saw2-pmic-data0 = <0x02030080>;
|
||||
qcom,saw2-pmic-data1 = <0x00030000>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,pfm-port = <0x2>;
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2013-2014, 2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -124,7 +124,7 @@
|
|||
qcom,saw2-spm-ctl = <0x1>;
|
||||
qcom,saw2-pmic-data0 = <0x02030080>;
|
||||
qcom,saw2-pmic-data1 = <0x00030000>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,pfm-port = <0x2>;
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
qcom,saw2-spm-dly = <0X3c102800>;
|
||||
qcom,saw2-spm-ctl = <0x8>;
|
||||
qcom,cpu-vctl-list = <&CPU0 &CPU1 &CPU2 &CPU3>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,saw2-pmic-data0 = <0x03030080>; /* VDD_APC0 on */
|
||||
|
@ -42,7 +42,7 @@
|
|||
qcom,saw2-spm-dly = <0x3c11840a>;
|
||||
qcom,saw2-spm-ctl = <0x8>;
|
||||
qcom,cpu-vctl-list = <&CPU4 &CPU5 &CPU6 &CPU7>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,saw2-pmic-data0 = <0x03030080>; /* VDD_APC1 on */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -22,7 +22,7 @@
|
|||
qcom,saw2-spm-dly = <0X3c100c00>;
|
||||
qcom,saw2-spm-ctl = <0x0>;
|
||||
qcom,cpu-vctl-list = <&CPU0 &CPU1 &CPU2 &CPU3>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,supports-rpm-hs;
|
||||
|
@ -65,7 +65,7 @@
|
|||
qcom,saw2-spm-dly = <0x3c100c30>;
|
||||
qcom,saw2-spm-ctl = <0x8>;
|
||||
qcom,cpu-vctl-list = <&CPU4 &CPU5>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,saw2-pmic-data0 = <0x00030000>; /* VDD_APC1 off */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -22,7 +22,7 @@
|
|||
qcom,saw2-spm-dly = <0X3c100c00>;
|
||||
qcom,saw2-spm-ctl = <0x0>;
|
||||
qcom,cpu-vctl-list = <&CPU0 &CPU1 &CPU2 &CPU3>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,supports-rpm-hs;
|
||||
|
@ -65,7 +65,7 @@
|
|||
qcom,saw2-spm-dly = <0x3c100c30>;
|
||||
qcom,saw2-spm-ctl = <0x0>;
|
||||
qcom,cpu-vctl-list = <&CPU4 &CPU5 &CPU6 &CPU7>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,saw2-pmic-data0 = <0x00030000>; /* VDD_APC1 off */
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -22,7 +22,7 @@
|
|||
qcom,saw2-spm-dly = <0X3c100c00>;
|
||||
qcom,saw2-spm-ctl = <0x0>;
|
||||
qcom,cpu-vctl-list = <&CPU0 &CPU1 &CPU2 &CPU3>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,supports-rpm-hs;
|
||||
|
@ -65,7 +65,7 @@
|
|||
qcom,saw2-spm-dly = <0x3c100c30>;
|
||||
qcom,saw2-spm-ctl = <0x8>;
|
||||
qcom,cpu-vctl-list = <&CPU4 &CPU5 &CPU6 &CPU7>;
|
||||
qcom,vctl-timeout-us = <50>;
|
||||
qcom,vctl-timeout-us = <500>;
|
||||
qcom,vctl-port = <0x0>;
|
||||
qcom,phase-port = <0x1>;
|
||||
qcom,saw2-pmic-data0 = <0x00030000>; /* VDD_APC1 off */
|
||||
|
|
|
@ -618,6 +618,7 @@ CONFIG_KERNEL_TEXT_RDONLY=y
|
|||
CONFIG_KEYS=y
|
||||
CONFIG_SECURITY=y
|
||||
CONFIG_SECURITY_NETWORK=y
|
||||
CONFIG_SECURITY_PERF_EVENTS_RESTRICT=y
|
||||
CONFIG_LSM_MMAP_MIN_ADDR=4096
|
||||
CONFIG_SECURITY_SELINUX=y
|
||||
CONFIG_CRYPTO=y
|
||||
|
|
|
@ -609,7 +609,6 @@ static void __init armpmu_init(struct arm_pmu *armpmu)
|
|||
.start = armpmu_start,
|
||||
.stop = armpmu_stop,
|
||||
.read = armpmu_read,
|
||||
.events_across_hotplug = 1,
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -428,15 +428,13 @@ int diagfwd_peripheral_init(void)
|
|||
fwd_info->inited = 1;
|
||||
fwd_info->read_bytes = 0;
|
||||
fwd_info->write_bytes = 0;
|
||||
spin_lock_init(&fwd_info->buf_lock);
|
||||
mutex_init(&fwd_info->buf_mutex);
|
||||
mutex_init(&fwd_info->data_mutex);
|
||||
}
|
||||
}
|
||||
|
||||
for (peripheral = 0; peripheral < NUM_PERIPHERALS; peripheral++) {
|
||||
for (type = 0; type < NUM_TYPES; type++) {
|
||||
if (type == TYPE_CNTL)
|
||||
continue;
|
||||
fwd_info = &peripheral_info[type][peripheral];
|
||||
fwd_info->peripheral = peripheral;
|
||||
fwd_info->type = type;
|
||||
|
@ -445,11 +443,16 @@ int diagfwd_peripheral_init(void)
|
|||
fwd_info->ch_open = 0;
|
||||
fwd_info->read_bytes = 0;
|
||||
fwd_info->write_bytes = 0;
|
||||
fwd_info->inited = 1;
|
||||
spin_lock_init(&fwd_info->buf_lock);
|
||||
mutex_init(&fwd_info->buf_mutex);
|
||||
mutex_init(&fwd_info->data_mutex);
|
||||
/*
|
||||
* This state shouldn't be set for Control channels
|
||||
* during initialization. This is set when the feature
|
||||
* mask is received for the first time.
|
||||
*/
|
||||
if (type != TYPE_CNTL)
|
||||
fwd_info->inited = 1;
|
||||
}
|
||||
|
||||
driver->diagfwd_data[peripheral] =
|
||||
&peripheral_info[TYPE_DATA][peripheral];
|
||||
driver->diagfwd_cntl[peripheral] =
|
||||
|
@ -631,12 +634,25 @@ void diagfwd_close_transport(uint8_t transport, uint8_t peripheral)
|
|||
}
|
||||
|
||||
fwd_info = &early_init_info[transport_open][peripheral];
|
||||
if (fwd_info->p_ops && fwd_info->p_ops->close)
|
||||
fwd_info->p_ops->close(fwd_info->ctxt);
|
||||
dest_info = &peripheral_info[TYPE_CNTL][peripheral];
|
||||
memcpy(dest_info, fwd_info, sizeof(struct diagfwd_info));
|
||||
dest_info->inited = 1;
|
||||
dest_info->ctxt = fwd_info->ctxt;
|
||||
dest_info->p_ops = fwd_info->p_ops;
|
||||
dest_info->c_ops = fwd_info->c_ops;
|
||||
dest_info->ch_open = fwd_info->ch_open;
|
||||
dest_info->read_bytes = fwd_info->read_bytes;
|
||||
dest_info->write_bytes = fwd_info->write_bytes;
|
||||
dest_info->inited = fwd_info->inited;
|
||||
dest_info->buf_1 = fwd_info->buf_1;
|
||||
dest_info->buf_2 = fwd_info->buf_2;
|
||||
invalidate_fn(dest_info->ctxt, dest_info);
|
||||
diagfwd_queue_read(dest_info);
|
||||
diagfwd_late_open(dest_info);
|
||||
diagfwd_cntl_open(dest_info);
|
||||
init_fn(peripheral);
|
||||
diag_cntl_channel_open(dest_info);
|
||||
diagfwd_queue_read(&peripheral_info[TYPE_DATA][peripheral]);
|
||||
diagfwd_queue_read(&peripheral_info[TYPE_CMD][peripheral]);
|
||||
}
|
||||
|
||||
int diagfwd_write(uint8_t peripheral, uint8_t type, void *buf, int len)
|
||||
|
@ -957,7 +973,6 @@ static void diagfwd_queue_read(struct diagfwd_info *fwd_info)
|
|||
|
||||
void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!fwd_info)
|
||||
return;
|
||||
|
@ -968,10 +983,10 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
|
|||
return;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&fwd_info->buf_lock, flags);
|
||||
mutex_lock(&fwd_info->buf_mutex);
|
||||
if (!fwd_info->buf_1) {
|
||||
fwd_info->buf_1 = kzalloc(sizeof(struct diagfwd_buf_t),
|
||||
GFP_ATOMIC);
|
||||
GFP_KERNEL);
|
||||
if (!fwd_info->buf_1)
|
||||
goto err;
|
||||
kmemleak_not_leak(fwd_info->buf_1);
|
||||
|
@ -979,7 +994,7 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
|
|||
if (!fwd_info->buf_1->data) {
|
||||
fwd_info->buf_1->data = kzalloc(PERIPHERAL_BUF_SZ +
|
||||
APF_DIAG_PADDING,
|
||||
GFP_ATOMIC);
|
||||
GFP_KERNEL);
|
||||
if (!fwd_info->buf_1->data)
|
||||
goto err;
|
||||
fwd_info->buf_1->len = PERIPHERAL_BUF_SZ;
|
||||
|
@ -991,7 +1006,7 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
|
|||
if (fwd_info->type == TYPE_DATA) {
|
||||
if (!fwd_info->buf_2) {
|
||||
fwd_info->buf_2 = kzalloc(sizeof(struct diagfwd_buf_t),
|
||||
GFP_ATOMIC);
|
||||
GFP_KERNEL);
|
||||
if (!fwd_info->buf_2)
|
||||
goto err;
|
||||
kmemleak_not_leak(fwd_info->buf_2);
|
||||
|
@ -1000,7 +1015,7 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
|
|||
if (!fwd_info->buf_2->data) {
|
||||
fwd_info->buf_2->data = kzalloc(PERIPHERAL_BUF_SZ +
|
||||
APF_DIAG_PADDING,
|
||||
GFP_ATOMIC);
|
||||
GFP_KERNEL);
|
||||
if (!fwd_info->buf_2->data)
|
||||
goto err;
|
||||
fwd_info->buf_2->len = PERIPHERAL_BUF_SZ;
|
||||
|
@ -1016,7 +1031,7 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
|
|||
fwd_info->buf_1->data_raw =
|
||||
kzalloc(PERIPHERAL_BUF_SZ +
|
||||
APF_DIAG_PADDING,
|
||||
GFP_ATOMIC);
|
||||
GFP_KERNEL);
|
||||
if (!fwd_info->buf_1->data_raw)
|
||||
goto err;
|
||||
fwd_info->buf_1->len_raw = PERIPHERAL_BUF_SZ;
|
||||
|
@ -1026,7 +1041,7 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
|
|||
fwd_info->buf_2->data_raw =
|
||||
kzalloc(PERIPHERAL_BUF_SZ +
|
||||
APF_DIAG_PADDING,
|
||||
GFP_ATOMIC);
|
||||
GFP_KERNEL);
|
||||
if (!fwd_info->buf_2->data_raw)
|
||||
goto err;
|
||||
fwd_info->buf_2->len_raw = PERIPHERAL_BUF_SZ;
|
||||
|
@ -1040,7 +1055,7 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
|
|||
if (!fwd_info->buf_1->data_raw) {
|
||||
fwd_info->buf_1->data_raw = kzalloc(PERIPHERAL_BUF_SZ +
|
||||
APF_DIAG_PADDING,
|
||||
GFP_ATOMIC);
|
||||
GFP_KERNEL);
|
||||
if (!fwd_info->buf_1->data_raw)
|
||||
goto err;
|
||||
fwd_info->buf_1->len_raw = PERIPHERAL_BUF_SZ;
|
||||
|
@ -1048,11 +1063,11 @@ void diagfwd_buffers_init(struct diagfwd_info *fwd_info)
|
|||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&fwd_info->buf_lock, flags);
|
||||
mutex_unlock(&fwd_info->buf_mutex);
|
||||
return;
|
||||
|
||||
err:
|
||||
spin_unlock_irqrestore(&fwd_info->buf_lock, flags);
|
||||
mutex_unlock(&fwd_info->buf_mutex);
|
||||
diagfwd_buffers_exit(fwd_info);
|
||||
|
||||
return;
|
||||
|
@ -1060,12 +1075,11 @@ err:
|
|||
|
||||
static void diagfwd_buffers_exit(struct diagfwd_info *fwd_info)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
if (!fwd_info)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&fwd_info->buf_lock, flags);
|
||||
mutex_lock(&fwd_info->buf_mutex);
|
||||
if (fwd_info->buf_1) {
|
||||
kfree(fwd_info->buf_1->data);
|
||||
fwd_info->buf_1->data = NULL;
|
||||
|
@ -1082,6 +1096,6 @@ static void diagfwd_buffers_exit(struct diagfwd_info *fwd_info)
|
|||
kfree(fwd_info->buf_2);
|
||||
fwd_info->buf_2 = NULL;
|
||||
}
|
||||
spin_unlock_irqrestore(&fwd_info->buf_lock, flags);
|
||||
mutex_unlock(&fwd_info->buf_mutex);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -67,7 +67,7 @@ struct diagfwd_info {
|
|||
atomic_t opened;
|
||||
unsigned long read_bytes;
|
||||
unsigned long write_bytes;
|
||||
spinlock_t buf_lock;
|
||||
struct mutex buf_mutex;
|
||||
struct mutex data_mutex;
|
||||
void *ctxt;
|
||||
struct diagfwd_buf_t *buf_1;
|
||||
|
|
|
@ -226,13 +226,6 @@ static void socket_data_ready(struct sock *sk_ptr, int bytes)
|
|||
spin_unlock_irqrestore(&info->lock, flags);
|
||||
diag_ws_on_notify();
|
||||
|
||||
/*
|
||||
* Initialize read buffers for the servers. The servers must read data
|
||||
* first to get the address of its clients.
|
||||
*/
|
||||
if (!atomic_read(&info->opened) && info->port_type == PORT_TYPE_SERVER)
|
||||
diagfwd_buffers_init(info->fwd_ctxt);
|
||||
|
||||
queue_work(info->wq, &(info->read_work));
|
||||
wake_up_interruptible(&info->read_wait_q);
|
||||
return;
|
||||
|
@ -621,6 +614,9 @@ static void socket_read_work_fn(struct work_struct *work)
|
|||
if (!info)
|
||||
return;
|
||||
|
||||
if (!atomic_read(&info->opened) && info->port_type == PORT_TYPE_SERVER)
|
||||
diagfwd_buffers_init(info->fwd_ctxt);
|
||||
|
||||
diagfwd_channel_read(info->fwd_ctxt);
|
||||
}
|
||||
|
||||
|
|
|
@ -2335,7 +2335,7 @@ static long _gpuobj_map_dma_buf(struct kgsl_device *device,
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (buf.fd == 0)
|
||||
if (buf.fd < 0)
|
||||
return -EINVAL;
|
||||
|
||||
*fd = buf.fd;
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2014, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -115,7 +115,7 @@ static inline u32 __readl(void * __iomem addr)
|
|||
{
|
||||
u32 value = 0;
|
||||
|
||||
pr_debug("read %p ", addr);
|
||||
pr_debug("read %pK ", addr);
|
||||
value = readl_relaxed(addr);
|
||||
pr_debug("-> %08x\n", value);
|
||||
|
||||
|
@ -124,7 +124,7 @@ static inline u32 __readl(void * __iomem addr)
|
|||
|
||||
static inline void __writel(u32 val, void * __iomem addr)
|
||||
{
|
||||
pr_debug("write %08x -> %p\n", val, addr);
|
||||
pr_debug("write %08x -> %pK\n", val, addr);
|
||||
writel_relaxed(val, addr);
|
||||
/*
|
||||
* Commit all writes via a mem barrier, as subsequent __readl()
|
||||
|
|
|
@ -4467,6 +4467,8 @@ static void handle_usb_removal(struct smbchg_chip *chip)
|
|||
/* Clear the OV detected status set before */
|
||||
if (chip->usb_ov_det)
|
||||
chip->usb_ov_det = false;
|
||||
/* cancel/wait for hvdcp pending work if any */
|
||||
cancel_delayed_work_sync(&chip->hvdcp_det_work);
|
||||
smbchg_change_usb_supply_type(chip, POWER_SUPPLY_TYPE_UNKNOWN);
|
||||
if (!chip->skip_usb_notification) {
|
||||
pr_smb(PR_MISC, "setting usb psy present = %d\n",
|
||||
|
@ -5281,6 +5283,10 @@ static int smbchg_prepare_for_pulsing_lite(struct smbchg_chip *chip)
|
|||
out:
|
||||
chip->hvdcp_3_det_ignore_uv = false;
|
||||
restore_from_hvdcp_detection(chip);
|
||||
if (!is_src_detect_high(chip)) {
|
||||
pr_smb(PR_MISC, "HVDCP removed - force removal\n");
|
||||
update_usb_status(chip, 0, true);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
@ -5300,6 +5306,10 @@ static int smbchg_unprepare_for_pulsing_lite(struct smbchg_chip *chip)
|
|||
if (rc < 0)
|
||||
pr_err("Couldn't retract HVDCP ICL vote rc=%d\n", rc);
|
||||
|
||||
if (!is_src_detect_high(chip)) {
|
||||
pr_smb(PR_MISC, "HVDCP removed\n");
|
||||
update_usb_status(chip, 0, 0);
|
||||
}
|
||||
/* This could be because allow_hvdcp3 set to false runtime */
|
||||
if (is_usb_present(chip) && !chip->allow_hvdcp3_detection)
|
||||
smbchg_handle_hvdcp3_disable(chip);
|
||||
|
|
|
@ -101,6 +101,12 @@ static const struct voltage_range ult_hf_range1 = {750000, 750000, 1525000,
|
|||
#define QPNP_FTS2_STEP_MARGIN_NUM 4
|
||||
#define QPNP_FTS2_STEP_MARGIN_DEN 5
|
||||
|
||||
/*
|
||||
* Settling delay for FTS2.5
|
||||
* Warm-up=20uS, 0-10% & 90-100% non-linear V-ramp delay = 50uS
|
||||
*/
|
||||
#define FTS2P5_SETTLING_DELAY_US 70
|
||||
|
||||
/* VSET value to decide the range of ULT SMPS */
|
||||
#define ULT_SMPS_RANGE_SPLIT 0x60
|
||||
|
||||
|
@ -141,6 +147,7 @@ static int _spm_regulator_set_voltage(struct regulator_dev *rdev)
|
|||
struct spm_vreg *vreg = rdev_get_drvdata(rdev);
|
||||
bool spm_failed = false;
|
||||
int rc = 0;
|
||||
u32 slew_delay;
|
||||
u8 reg;
|
||||
|
||||
if (vreg->vlevel == vreg->last_set_vlevel)
|
||||
|
@ -181,8 +188,16 @@ static int _spm_regulator_set_voltage(struct regulator_dev *rdev)
|
|||
|
||||
if (vreg->uV > vreg->last_set_uV) {
|
||||
/* Wait for voltage stepping to complete. */
|
||||
udelay(DIV_ROUND_UP(vreg->uV - vreg->last_set_uV,
|
||||
vreg->step_rate));
|
||||
slew_delay = DIV_ROUND_UP(vreg->uV - vreg->last_set_uV,
|
||||
vreg->step_rate);
|
||||
if (vreg->regulator_type == QPNP_TYPE_FTS2p5)
|
||||
slew_delay += FTS2P5_SETTLING_DELAY_US;
|
||||
udelay(slew_delay);
|
||||
} else if (vreg->regulator_type == QPNP_TYPE_FTS2p5) {
|
||||
/* add the ramp-down delay */
|
||||
slew_delay = DIV_ROUND_UP(vreg->last_set_uV - vreg->uV,
|
||||
vreg->step_rate) + FTS2P5_SETTLING_DELAY_US;
|
||||
udelay(slew_delay);
|
||||
}
|
||||
|
||||
if ((vreg->regulator_type == QPNP_TYPE_FTS2)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
|
@ -232,7 +232,7 @@ uint32_t msm_spm_drv_get_sts_curr_pmic_data(
|
|||
struct msm_spm_driver_data *dev)
|
||||
{
|
||||
msm_spm_drv_load_shadow(dev, MSM_SPM_REG_SAW_PMIC_STS);
|
||||
return dev->reg_shadow[MSM_SPM_REG_SAW_PMIC_STS] & 0xFF;
|
||||
return dev->reg_shadow[MSM_SPM_REG_SAW_PMIC_STS] & 0x300FF;
|
||||
}
|
||||
|
||||
static inline void msm_spm_drv_get_saw2_ver(struct msm_spm_driver_data *dev,
|
||||
|
@ -425,10 +425,12 @@ int msm_spm_drv_set_vdd(struct msm_spm_driver_data *dev, unsigned int vlevel)
|
|||
timeout_us = dev->vctl_timeout_us;
|
||||
/* Confirm the voltage we set was what hardware sent */
|
||||
do {
|
||||
new_level = msm_spm_drv_get_sts_curr_pmic_data(dev);
|
||||
if (new_level == vlevel)
|
||||
break;
|
||||
udelay(1);
|
||||
new_level = msm_spm_drv_get_sts_curr_pmic_data(dev);
|
||||
/* FSM is idle */
|
||||
if (((new_level & 0x30000) == 0) &&
|
||||
((new_level & 0xFF) == vlevel))
|
||||
break;
|
||||
} while (--timeout_us);
|
||||
if (!timeout_us) {
|
||||
pr_info("Wrong level %#x\n", new_level);
|
||||
|
|
|
@ -1106,10 +1106,11 @@ static int proc_getdriver(struct dev_state *ps, void __user *arg)
|
|||
|
||||
static int proc_connectinfo(struct dev_state *ps, void __user *arg)
|
||||
{
|
||||
struct usbdevfs_connectinfo ci = {
|
||||
.devnum = ps->dev->devnum,
|
||||
.slow = ps->dev->speed == USB_SPEED_LOW
|
||||
};
|
||||
struct usbdevfs_connectinfo ci;
|
||||
|
||||
memset(&ci, 0, sizeof(ci));
|
||||
ci.devnum = ps->dev->devnum;
|
||||
ci.slow = ps->dev->speed == USB_SPEED_LOW;
|
||||
|
||||
if (copy_to_user(arg, &ci, sizeof(ci)))
|
||||
return -EFAULT;
|
||||
|
|
|
@ -148,6 +148,9 @@ static int mdss_mdp_tearcheck_enable(struct mdss_mdp_ctl *ctl, bool enable)
|
|||
|
||||
sctl = mdss_mdp_get_split_ctl(ctl);
|
||||
te = &ctl->panel_data->panel_info.te;
|
||||
|
||||
pr_debug("%s: enable=%d\n", __func__, enable);
|
||||
|
||||
mdss_mdp_pingpong_write(mixer->pingpong_base,
|
||||
MDSS_MDP_REG_PP_TEAR_CHECK_EN,
|
||||
(te ? te->tear_check_en : 0) && enable);
|
||||
|
@ -177,7 +180,7 @@ static int mdss_mdp_tearcheck_enable(struct mdss_mdp_ctl *ctl, bool enable)
|
|||
}
|
||||
|
||||
static int mdss_mdp_cmd_tearcheck_cfg(struct mdss_mdp_mixer *mixer,
|
||||
struct mdss_mdp_cmd_ctx *ctx, bool enable)
|
||||
struct mdss_mdp_cmd_ctx *ctx)
|
||||
{
|
||||
struct mdss_mdp_pp_tear_check *te = NULL;
|
||||
struct mdss_panel_info *pinfo;
|
||||
|
@ -191,43 +194,41 @@ static int mdss_mdp_cmd_tearcheck_cfg(struct mdss_mdp_mixer *mixer,
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (enable) {
|
||||
pinfo = &ctl->panel_data->panel_info;
|
||||
te = &ctl->panel_data->panel_info.te;
|
||||
pinfo = &ctl->panel_data->panel_info;
|
||||
te = &ctl->panel_data->panel_info.te;
|
||||
|
||||
mdss_mdp_vsync_clk_enable(1);
|
||||
mdss_mdp_vsync_clk_enable(1);
|
||||
|
||||
vsync_clk_speed_hz =
|
||||
mdss_mdp_get_clk_rate(MDSS_CLK_MDP_VSYNC);
|
||||
vsync_clk_speed_hz =
|
||||
mdss_mdp_get_clk_rate(MDSS_CLK_MDP_VSYNC);
|
||||
|
||||
total_lines = mdss_panel_get_vtotal(pinfo);
|
||||
total_lines = mdss_panel_get_vtotal(pinfo);
|
||||
|
||||
total_lines *= pinfo->mipi.frame_rate;
|
||||
total_lines *= pinfo->mipi.frame_rate;
|
||||
|
||||
vclks_line = (total_lines) ? vsync_clk_speed_hz/total_lines : 0;
|
||||
vclks_line = (total_lines) ? vsync_clk_speed_hz/total_lines : 0;
|
||||
|
||||
cfg = BIT(19);
|
||||
if (pinfo->mipi.hw_vsync_mode)
|
||||
cfg |= BIT(20);
|
||||
cfg = BIT(19);
|
||||
if (pinfo->mipi.hw_vsync_mode)
|
||||
cfg |= BIT(20);
|
||||
|
||||
if (te->refx100)
|
||||
vclks_line = vclks_line * pinfo->mipi.frame_rate *
|
||||
100 / te->refx100;
|
||||
else {
|
||||
pr_warn("refx100 cannot be zero! Use 6000 as default\n");
|
||||
vclks_line = vclks_line * pinfo->mipi.frame_rate *
|
||||
100 / 6000;
|
||||
}
|
||||
|
||||
cfg |= vclks_line;
|
||||
|
||||
pr_debug("%s: yres=%d vclks=%x height=%d init=%d rd=%d start=%d\n",
|
||||
__func__, pinfo->yres, vclks_line, te->sync_cfg_height,
|
||||
te->vsync_init_val, te->rd_ptr_irq, te->start_pos);
|
||||
pr_debug("thrd_start =%d thrd_cont=%d\n",
|
||||
te->sync_threshold_start, te->sync_threshold_continue);
|
||||
if (te->refx100) {
|
||||
vclks_line = vclks_line * pinfo->mipi.frame_rate *
|
||||
100 / te->refx100;
|
||||
} else {
|
||||
pr_warn("refx100 cannot be zero! Use 6000 as default\n");
|
||||
vclks_line = vclks_line * pinfo->mipi.frame_rate *
|
||||
100 / 6000;
|
||||
}
|
||||
|
||||
cfg |= vclks_line;
|
||||
|
||||
pr_debug("%s: yres=%d vclks=%x height=%d init=%d rd=%d start=%d\n",
|
||||
__func__, pinfo->yres, vclks_line, te->sync_cfg_height,
|
||||
te->vsync_init_val, te->rd_ptr_irq, te->start_pos);
|
||||
pr_debug("thrd_start =%d thrd_cont=%d\n",
|
||||
te->sync_threshold_start, te->sync_threshold_continue);
|
||||
|
||||
pingpong_base = mixer->pingpong_base;
|
||||
|
||||
if (ctx->pingpong_split_slave)
|
||||
|
@ -258,8 +259,7 @@ static int mdss_mdp_cmd_tearcheck_cfg(struct mdss_mdp_mixer *mixer,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mdss_mdp_cmd_tearcheck_setup(struct mdss_mdp_cmd_ctx *ctx,
|
||||
bool enable)
|
||||
static int mdss_mdp_cmd_tearcheck_setup(struct mdss_mdp_cmd_ctx *ctx)
|
||||
{
|
||||
int rc = 0;
|
||||
struct mdss_mdp_mixer *mixer;
|
||||
|
@ -267,7 +267,7 @@ static int mdss_mdp_cmd_tearcheck_setup(struct mdss_mdp_cmd_ctx *ctx,
|
|||
|
||||
mixer = mdss_mdp_mixer_get(ctl, MDSS_MDP_MIXER_MUX_LEFT);
|
||||
if (mixer) {
|
||||
rc = mdss_mdp_cmd_tearcheck_cfg(mixer, ctx, enable);
|
||||
rc = mdss_mdp_cmd_tearcheck_cfg(mixer, ctx);
|
||||
if (rc)
|
||||
goto err;
|
||||
}
|
||||
|
@ -275,7 +275,7 @@ static int mdss_mdp_cmd_tearcheck_setup(struct mdss_mdp_cmd_ctx *ctx,
|
|||
if (!(ctl->opmode & MDSS_MDP_CTL_OP_PACK_3D_ENABLE)) {
|
||||
mixer = mdss_mdp_mixer_get(ctl, MDSS_MDP_MIXER_MUX_RIGHT);
|
||||
if (mixer)
|
||||
rc = mdss_mdp_cmd_tearcheck_cfg(mixer, ctx, enable);
|
||||
rc = mdss_mdp_cmd_tearcheck_cfg(mixer, ctx);
|
||||
}
|
||||
err:
|
||||
return rc;
|
||||
|
@ -925,6 +925,8 @@ static int mdss_mdp_cmd_panel_on(struct mdss_mdp_ctl *ctl,
|
|||
(void *)&ctx->intf_mdp_callback);
|
||||
|
||||
ctx->intf_stopped = 0;
|
||||
if (sctx)
|
||||
sctx->intf_stopped = 0;
|
||||
} else {
|
||||
pr_err("%s: Panel already on\n", __func__);
|
||||
}
|
||||
|
@ -1140,7 +1142,7 @@ int mdss_mdp_cmd_restore(struct mdss_mdp_ctl *ctl)
|
|||
{
|
||||
pr_debug("%s: called for ctl%d\n", __func__, ctl->num);
|
||||
mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON);
|
||||
if (mdss_mdp_cmd_tearcheck_setup(ctl->intf_ctx[MASTER_CTX], true))
|
||||
if (mdss_mdp_cmd_tearcheck_setup(ctl->intf_ctx[MASTER_CTX]))
|
||||
pr_warn("%s: tearcheck setup failed\n", __func__);
|
||||
else
|
||||
mdss_mdp_tearcheck_enable(ctl, true);
|
||||
|
@ -1212,8 +1214,10 @@ int mdss_mdp_cmd_ctx_stop(struct mdss_mdp_ctl *ctl,
|
|||
|
||||
mdss_mdp_cmd_clk_off(ctx);
|
||||
flush_work(&ctx->pp_done_work);
|
||||
mdss_mdp_cmd_tearcheck_setup(ctx, false);
|
||||
mdss_mdp_tearcheck_enable(ctl, false);
|
||||
|
||||
if (mdss_panel_is_power_off(panel_power_state) ||
|
||||
mdss_panel_is_power_on_ulp(panel_power_state))
|
||||
mdss_mdp_tearcheck_enable(ctl, false);
|
||||
|
||||
if (mdss_panel_is_power_on(panel_power_state)) {
|
||||
pr_debug("%s: intf stopped with panel on\n", __func__);
|
||||
|
@ -1290,6 +1294,7 @@ static int mdss_mdp_cmd_stop_sub(struct mdss_mdp_ctl *ctl,
|
|||
int mdss_mdp_cmd_stop(struct mdss_mdp_ctl *ctl, int panel_power_state)
|
||||
{
|
||||
struct mdss_mdp_cmd_ctx *ctx = ctl->intf_ctx[MASTER_CTX];
|
||||
struct mdss_mdp_cmd_ctx *sctx;
|
||||
struct mdss_mdp_ctl *sctl = mdss_mdp_get_split_ctl(ctl);
|
||||
bool panel_off = false;
|
||||
bool turn_off_clocks = false;
|
||||
|
@ -1316,6 +1321,9 @@ int mdss_mdp_cmd_stop(struct mdss_mdp_ctl *ctl, int panel_power_state)
|
|||
pr_debug("%s: transition from %d --> %d\n", __func__,
|
||||
ctx->panel_power_state, panel_power_state);
|
||||
|
||||
if (sctl)
|
||||
sctx = (struct mdss_mdp_cmd_ctx *) sctl->intf_ctx[MASTER_CTX];
|
||||
|
||||
if (ctl->cmd_autorefresh_en) {
|
||||
int pre_suspend = ctx->autorefresh_pending_frame_cnt;
|
||||
mdss_mdp_cmd_enable_cmd_autorefresh(ctl, 0);
|
||||
|
@ -1360,6 +1368,9 @@ int mdss_mdp_cmd_stop(struct mdss_mdp_ctl *ctl, int panel_power_state)
|
|||
MDSS_EVENT_REGISTER_MDP_CALLBACK,
|
||||
(void *)&ctx->intf_mdp_callback);
|
||||
ctx->intf_stopped = 0;
|
||||
if (sctx)
|
||||
sctx->intf_stopped = 0;
|
||||
|
||||
goto end;
|
||||
}
|
||||
}
|
||||
|
@ -1472,7 +1483,7 @@ static int mdss_mdp_cmd_ctx_setup(struct mdss_mdp_ctl *ctl,
|
|||
mdss_mdp_set_intr_callback(MDSS_MDP_IRQ_PING_PONG_COMP, ctx->pp_num,
|
||||
mdss_mdp_cmd_pingpong_done, ctl);
|
||||
|
||||
ret = mdss_mdp_cmd_tearcheck_setup(ctx, true);
|
||||
ret = mdss_mdp_cmd_tearcheck_setup(ctx);
|
||||
if (ret)
|
||||
pr_err("tearcheck setup failed\n");
|
||||
|
||||
|
|
|
@ -222,7 +222,7 @@ struct ipv6_pinfo {
|
|||
struct ipv6_ac_socklist *ipv6_ac_list;
|
||||
struct ipv6_fl_socklist __rcu *ipv6_fl_list;
|
||||
|
||||
struct ipv6_txoptions *opt;
|
||||
struct ipv6_txoptions __rcu *opt;
|
||||
struct sk_buff *pktoptions;
|
||||
struct sk_buff *rxpmtu;
|
||||
struct {
|
||||
|
|
|
@ -715,6 +715,11 @@ extern int perf_cpu_time_max_percent_handler(struct ctl_table *table, int write,
|
|||
loff_t *ppos);
|
||||
|
||||
|
||||
static inline bool perf_paranoid_any(void)
|
||||
{
|
||||
return sysctl_perf_event_paranoid > 2;
|
||||
}
|
||||
|
||||
static inline bool perf_paranoid_tracepoint_raw(void)
|
||||
{
|
||||
return sysctl_perf_event_paranoid > -1;
|
||||
|
|
|
@ -203,6 +203,7 @@ extern rwlock_t ip6_ra_lock;
|
|||
*/
|
||||
|
||||
struct ipv6_txoptions {
|
||||
atomic_t refcnt;
|
||||
/* Length of this structure */
|
||||
int tot_len;
|
||||
|
||||
|
@ -215,7 +216,7 @@ struct ipv6_txoptions {
|
|||
struct ipv6_opt_hdr *dst0opt;
|
||||
struct ipv6_rt_hdr *srcrt; /* Routing Header */
|
||||
struct ipv6_opt_hdr *dst1opt;
|
||||
|
||||
struct rcu_head rcu;
|
||||
/* Option buffer, as read by IPV6_PKTOPTIONS, starts here. */
|
||||
};
|
||||
|
||||
|
@ -254,6 +255,23 @@ extern void fl6_free_socklist(struct sock *sk);
|
|||
extern int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen);
|
||||
extern int ip6_flowlabel_init(void);
|
||||
extern void ip6_flowlabel_cleanup(void);
|
||||
static inline struct ipv6_txoptions *txopt_get(const struct ipv6_pinfo *np)
|
||||
{
|
||||
struct ipv6_txoptions *opt;
|
||||
|
||||
rcu_read_lock();
|
||||
opt = rcu_dereference(np->opt);
|
||||
if (opt && !atomic_inc_not_zero(&opt->refcnt))
|
||||
opt = NULL;
|
||||
rcu_read_unlock();
|
||||
return opt;
|
||||
}
|
||||
|
||||
static inline void txopt_put(struct ipv6_txoptions *opt)
|
||||
{
|
||||
if (opt && atomic_dec_and_test(&opt->refcnt))
|
||||
kfree_rcu(opt, rcu);
|
||||
}
|
||||
|
||||
static inline void fl6_sock_release(struct ip6_flowlabel *fl)
|
||||
{
|
||||
|
|
|
@ -166,9 +166,12 @@ static struct srcu_struct pmus_srcu;
|
|||
* 0 - disallow raw tracepoint access for unpriv
|
||||
* 1 - disallow cpu events for unpriv
|
||||
* 2 - disallow kernel profiling for unpriv
|
||||
* 3 - disallow all unpriv perf event use
|
||||
*/
|
||||
#ifdef CONFIG_PERF_EVENTS_USERMODE
|
||||
int sysctl_perf_event_paranoid __read_mostly = -1;
|
||||
#elif defined CONFIG_SECURITY_PERF_EVENTS_RESTRICT
|
||||
int sysctl_perf_event_paranoid __read_mostly = 3;
|
||||
#else
|
||||
int sysctl_perf_event_paranoid __read_mostly = 1;
|
||||
#endif
|
||||
|
@ -1408,29 +1411,6 @@ static int __perf_remove_from_context(void *info)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void perf_retry_remove(struct remove_event *rep)
|
||||
{
|
||||
int up_ret;
|
||||
struct perf_event *event = rep->event;
|
||||
/*
|
||||
* CPU was offline. Bring it online so we can
|
||||
* gracefully exit a perf context.
|
||||
*/
|
||||
up_ret = cpu_up(event->cpu);
|
||||
if (!up_ret)
|
||||
/* Try the remove call once again. */
|
||||
cpu_function_call(event->cpu, __perf_remove_from_context, rep);
|
||||
else
|
||||
pr_err("Failed to bring up CPU: %d, ret: %d\n",
|
||||
event->cpu, up_ret);
|
||||
}
|
||||
#else
|
||||
static void perf_retry_remove(struct remove_event *rep)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Remove the event from a task's (or a CPU's) list of events.
|
||||
*
|
||||
|
@ -1462,8 +1442,6 @@ static void __ref perf_remove_from_context(struct perf_event *event, bool detach
|
|||
*/
|
||||
ret = cpu_function_call(event->cpu, __perf_remove_from_context,
|
||||
&re);
|
||||
if (ret == -ENXIO)
|
||||
perf_retry_remove(&re);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -5760,7 +5738,6 @@ static struct pmu perf_swevent = {
|
|||
.read = perf_swevent_read,
|
||||
|
||||
.event_idx = perf_swevent_event_idx,
|
||||
.events_across_hotplug = 1,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_EVENT_TRACING
|
||||
|
@ -5880,7 +5857,6 @@ static struct pmu perf_tracepoint = {
|
|||
.read = perf_swevent_read,
|
||||
|
||||
.event_idx = perf_swevent_event_idx,
|
||||
.events_across_hotplug = 1,
|
||||
};
|
||||
|
||||
static inline void perf_tp_register(void)
|
||||
|
@ -6108,7 +6084,6 @@ static struct pmu perf_cpu_clock = {
|
|||
.read = cpu_clock_event_read,
|
||||
|
||||
.event_idx = perf_swevent_event_idx,
|
||||
.events_across_hotplug = 1,
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -6189,7 +6164,6 @@ static struct pmu perf_task_clock = {
|
|||
.read = task_clock_event_read,
|
||||
|
||||
.event_idx = perf_swevent_event_idx,
|
||||
.events_across_hotplug = 1,
|
||||
};
|
||||
|
||||
static void perf_pmu_nop_void(struct pmu *pmu)
|
||||
|
@ -6855,6 +6829,9 @@ SYSCALL_DEFINE5(perf_event_open,
|
|||
if (flags & ~PERF_FLAG_ALL)
|
||||
return -EINVAL;
|
||||
|
||||
if (perf_paranoid_any() && !capable(CAP_SYS_ADMIN))
|
||||
return -EACCES;
|
||||
|
||||
err = perf_copy_attr(attr_uptr, &attr);
|
||||
if (err)
|
||||
return err;
|
||||
|
|
|
@ -646,7 +646,6 @@ static struct pmu perf_breakpoint = {
|
|||
.read = hw_breakpoint_pmu_read,
|
||||
|
||||
.event_idx = hw_breakpoint_event_idx,
|
||||
.events_across_hotplug = 1,
|
||||
};
|
||||
|
||||
int __init init_hw_breakpoint(void)
|
||||
|
|
|
@ -907,6 +907,14 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev,
|
|||
.dma = dev->dma,
|
||||
.port = dev->if_port,
|
||||
};
|
||||
memset(&map, 0, sizeof(map));
|
||||
map.mem_start = dev->mem_start;
|
||||
map.mem_end = dev->mem_end;
|
||||
map.base_addr = dev->base_addr;
|
||||
map.irq = dev->irq;
|
||||
map.dma = dev->dma;
|
||||
map.port = dev->if_port;
|
||||
|
||||
if (nla_put(skb, IFLA_MAP, sizeof(map), &map))
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
|
|
@ -235,7 +235,9 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req)
|
|||
security_req_classify_flow(req, flowi6_to_flowi(&fl6));
|
||||
|
||||
|
||||
final_p = fl6_update_dst(&fl6, np->opt, &final);
|
||||
rcu_read_lock();
|
||||
final_p = fl6_update_dst(&fl6, rcu_dereference(np->opt), &final);
|
||||
rcu_read_unlock();
|
||||
|
||||
dst = ip6_dst_lookup_flow(sk, &fl6, final_p, false);
|
||||
if (IS_ERR(dst)) {
|
||||
|
@ -252,7 +254,10 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req)
|
|||
&ireq6->loc_addr,
|
||||
&ireq6->rmt_addr);
|
||||
fl6.daddr = ireq6->rmt_addr;
|
||||
err = ip6_xmit(sk, skb, &fl6, np->opt, np->tclass);
|
||||
rcu_read_lock();
|
||||
err = ip6_xmit(sk, skb, &fl6, rcu_dereference(np->opt),
|
||||
np->tclass);
|
||||
rcu_read_unlock();
|
||||
err = net_xmit_eval(err);
|
||||
}
|
||||
|
||||
|
@ -448,6 +453,7 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk,
|
|||
{
|
||||
struct inet6_request_sock *ireq6 = inet6_rsk(req);
|
||||
struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
|
||||
struct ipv6_txoptions *opt;
|
||||
struct inet_sock *newinet;
|
||||
struct dccp6_sock *newdp6;
|
||||
struct sock *newsk;
|
||||
|
@ -571,13 +577,15 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk,
|
|||
* Yes, keeping reference count would be much more clever, but we make
|
||||
* one more one thing there: reattach optmem to newsk.
|
||||
*/
|
||||
if (np->opt != NULL)
|
||||
newnp->opt = ipv6_dup_options(newsk, np->opt);
|
||||
|
||||
opt = rcu_dereference(np->opt);
|
||||
if (opt) {
|
||||
opt = ipv6_dup_options(newsk, opt);
|
||||
RCU_INIT_POINTER(newnp->opt, opt);
|
||||
}
|
||||
inet_csk(newsk)->icsk_ext_hdr_len = 0;
|
||||
if (newnp->opt != NULL)
|
||||
inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen +
|
||||
newnp->opt->opt_flen);
|
||||
if (opt)
|
||||
inet_csk(newsk)->icsk_ext_hdr_len = opt->opt_nflen +
|
||||
opt->opt_flen;
|
||||
|
||||
dccp_sync_mss(newsk, dst_mtu(dst));
|
||||
|
||||
|
@ -829,6 +837,7 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
|
|||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
struct dccp_sock *dp = dccp_sk(sk);
|
||||
struct in6_addr *saddr = NULL, *final_p, final;
|
||||
struct ipv6_txoptions *opt;
|
||||
struct flowi6 fl6;
|
||||
struct dst_entry *dst;
|
||||
int addr_type;
|
||||
|
@ -931,7 +940,8 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
|
|||
fl6.fl6_sport = inet->inet_sport;
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
|
||||
|
||||
final_p = fl6_update_dst(&fl6, np->opt, &final);
|
||||
opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk));
|
||||
final_p = fl6_update_dst(&fl6, opt, &final);
|
||||
|
||||
dst = ip6_dst_lookup_flow(sk, &fl6, final_p, true);
|
||||
if (IS_ERR(dst)) {
|
||||
|
@ -951,9 +961,8 @@ static int dccp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
|
|||
__ip6_dst_store(sk, dst, NULL, NULL);
|
||||
|
||||
icsk->icsk_ext_hdr_len = 0;
|
||||
if (np->opt != NULL)
|
||||
icsk->icsk_ext_hdr_len = (np->opt->opt_flen +
|
||||
np->opt->opt_nflen);
|
||||
if (opt)
|
||||
icsk->icsk_ext_hdr_len = opt->opt_flen + opt->opt_nflen;
|
||||
|
||||
inet->inet_dport = usin->sin6_port;
|
||||
|
||||
|
|
|
@ -448,9 +448,11 @@ void inet6_destroy_sock(struct sock *sk)
|
|||
|
||||
/* Free tx options */
|
||||
|
||||
opt = xchg(&np->opt, NULL);
|
||||
if (opt != NULL)
|
||||
sock_kfree_s(sk, opt, opt->tot_len);
|
||||
opt = xchg((__force struct ipv6_txoptions **)&np->opt, NULL);
|
||||
if (opt) {
|
||||
atomic_sub(opt->tot_len, &sk->sk_omem_alloc);
|
||||
txopt_put(opt);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(inet6_destroy_sock);
|
||||
|
||||
|
@ -697,7 +699,10 @@ int inet6_sk_rebuild_header(struct sock *sk)
|
|||
fl6.flowi6_uid = sock_i_uid(sk);
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
|
||||
|
||||
final_p = fl6_update_dst(&fl6, np->opt, &final);
|
||||
rcu_read_lock();
|
||||
final_p = fl6_update_dst(&fl6, rcu_dereference(np->opt),
|
||||
&final);
|
||||
rcu_read_unlock();
|
||||
|
||||
dst = ip6_dst_lookup_flow(sk, &fl6, final_p, false);
|
||||
if (IS_ERR(dst)) {
|
||||
|
|
|
@ -169,8 +169,10 @@ ipv4_connected:
|
|||
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
|
||||
|
||||
opt = flowlabel ? flowlabel->opt : np->opt;
|
||||
rcu_read_lock();
|
||||
opt = flowlabel ? flowlabel->opt : rcu_dereference(np->opt);
|
||||
final_p = fl6_update_dst(&fl6, opt, &final);
|
||||
rcu_read_unlock();
|
||||
|
||||
dst = ip6_dst_lookup_flow(sk, &fl6, final_p, true);
|
||||
err = 0;
|
||||
|
|
|
@ -727,6 +727,7 @@ ipv6_dup_options(struct sock *sk, struct ipv6_txoptions *opt)
|
|||
*((char **)&opt2->dst1opt) += dif;
|
||||
if (opt2->srcrt)
|
||||
*((char **)&opt2->srcrt) += dif;
|
||||
atomic_set(&opt2->refcnt, 1);
|
||||
}
|
||||
return opt2;
|
||||
}
|
||||
|
@ -790,7 +791,7 @@ ipv6_renew_options(struct sock *sk, struct ipv6_txoptions *opt,
|
|||
return ERR_PTR(-ENOBUFS);
|
||||
|
||||
memset(opt2, 0, tot_len);
|
||||
|
||||
atomic_set(&opt2->refcnt, 1);
|
||||
opt2->tot_len = tot_len;
|
||||
p = (char *)(opt2 + 1);
|
||||
|
||||
|
|
|
@ -78,7 +78,9 @@ struct dst_entry *inet6_csk_route_req(struct sock *sk,
|
|||
memset(fl6, 0, sizeof(*fl6));
|
||||
fl6->flowi6_proto = IPPROTO_TCP;
|
||||
fl6->daddr = treq->rmt_addr;
|
||||
final_p = fl6_update_dst(fl6, np->opt, &final);
|
||||
rcu_read_lock();
|
||||
final_p = fl6_update_dst(fl6, rcu_dereference(np->opt), &final);
|
||||
rcu_read_unlock();
|
||||
fl6->saddr = treq->loc_addr;
|
||||
fl6->flowi6_oif = treq->iif;
|
||||
fl6->flowi6_mark = inet_rsk(req)->ir_mark;
|
||||
|
@ -214,7 +216,9 @@ static struct dst_entry *inet6_csk_route_socket(struct sock *sk,
|
|||
fl6->fl6_dport = inet->inet_dport;
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
|
||||
|
||||
final_p = fl6_update_dst(fl6, np->opt, &final);
|
||||
rcu_read_lock();
|
||||
final_p = fl6_update_dst(fl6, rcu_dereference(np->opt), &final);
|
||||
rcu_read_unlock();
|
||||
|
||||
dst = __inet6_csk_dst_check(sk, np->dst_cookie);
|
||||
if (!dst) {
|
||||
|
@ -248,7 +252,8 @@ int inet6_csk_xmit(struct sk_buff *skb, struct flowi *fl_unused)
|
|||
/* Restore final destination back after routing done */
|
||||
fl6.daddr = np->daddr;
|
||||
|
||||
res = ip6_xmit(sk, skb, &fl6, np->opt, np->tclass);
|
||||
res = ip6_xmit(sk, skb, &fl6, rcu_dereference(np->opt),
|
||||
np->tclass);
|
||||
rcu_read_unlock();
|
||||
return res;
|
||||
}
|
||||
|
|
|
@ -110,10 +110,12 @@ struct ipv6_txoptions *ipv6_update_options(struct sock *sk,
|
|||
icsk->icsk_ext_hdr_len = opt->opt_flen + opt->opt_nflen;
|
||||
icsk->icsk_sync_mss(sk, icsk->icsk_pmtu_cookie);
|
||||
}
|
||||
opt = xchg(&inet6_sk(sk)->opt, opt);
|
||||
opt = xchg((__force struct ipv6_txoptions **)&inet6_sk(sk)->opt,
|
||||
opt);
|
||||
} else {
|
||||
spin_lock(&sk->sk_dst_lock);
|
||||
opt = xchg(&inet6_sk(sk)->opt, opt);
|
||||
opt = xchg((__force struct ipv6_txoptions **)&inet6_sk(sk)->opt,
|
||||
opt);
|
||||
spin_unlock(&sk->sk_dst_lock);
|
||||
}
|
||||
sk_dst_reset(sk);
|
||||
|
@ -213,9 +215,12 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
|||
sk->sk_socket->ops = &inet_dgram_ops;
|
||||
sk->sk_family = PF_INET;
|
||||
}
|
||||
opt = xchg(&np->opt, NULL);
|
||||
if (opt)
|
||||
sock_kfree_s(sk, opt, opt->tot_len);
|
||||
opt = xchg((__force struct ipv6_txoptions **)&np->opt,
|
||||
NULL);
|
||||
if (opt) {
|
||||
atomic_sub(opt->tot_len, &sk->sk_omem_alloc);
|
||||
txopt_put(opt);
|
||||
}
|
||||
pktopt = xchg(&np->pktoptions, NULL);
|
||||
kfree_skb(pktopt);
|
||||
|
||||
|
@ -385,7 +390,8 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
|||
if (optname != IPV6_RTHDR && !ns_capable(net->user_ns, CAP_NET_RAW))
|
||||
break;
|
||||
|
||||
opt = ipv6_renew_options(sk, np->opt, optname,
|
||||
opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk));
|
||||
opt = ipv6_renew_options(sk, opt, optname,
|
||||
(struct ipv6_opt_hdr __user *)optval,
|
||||
optlen);
|
||||
if (IS_ERR(opt)) {
|
||||
|
@ -414,8 +420,10 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
|
|||
retv = 0;
|
||||
opt = ipv6_update_options(sk, opt);
|
||||
sticky_done:
|
||||
if (opt)
|
||||
sock_kfree_s(sk, opt, opt->tot_len);
|
||||
if (opt) {
|
||||
atomic_sub(opt->tot_len, &sk->sk_omem_alloc);
|
||||
txopt_put(opt);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -468,6 +476,7 @@ sticky_done:
|
|||
break;
|
||||
|
||||
memset(opt, 0, sizeof(*opt));
|
||||
atomic_set(&opt->refcnt, 1);
|
||||
opt->tot_len = sizeof(*opt) + optlen;
|
||||
retv = -EFAULT;
|
||||
if (copy_from_user(opt+1, optval, optlen))
|
||||
|
@ -484,8 +493,10 @@ update:
|
|||
retv = 0;
|
||||
opt = ipv6_update_options(sk, opt);
|
||||
done:
|
||||
if (opt)
|
||||
sock_kfree_s(sk, opt, opt->tot_len);
|
||||
if (opt) {
|
||||
atomic_sub(opt->tot_len, &sk->sk_omem_alloc);
|
||||
txopt_put(opt);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case IPV6_UNICAST_HOPS:
|
||||
|
@ -1085,10 +1096,11 @@ static int do_ipv6_getsockopt(struct sock *sk, int level, int optname,
|
|||
case IPV6_RTHDR:
|
||||
case IPV6_DSTOPTS:
|
||||
{
|
||||
struct ipv6_txoptions *opt;
|
||||
|
||||
lock_sock(sk);
|
||||
len = ipv6_getsockopt_sticky(sk, np->opt,
|
||||
optname, optval, len);
|
||||
opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk));
|
||||
len = ipv6_getsockopt_sticky(sk, opt, optname, optval, len);
|
||||
release_sock(sk);
|
||||
/* check if ipv6_getsockopt_sticky() returns err code */
|
||||
if (len < 0)
|
||||
|
|
|
@ -726,6 +726,7 @@ static int rawv6_probe_proto_opt(struct flowi6 *fl6, struct msghdr *msg)
|
|||
static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
|
||||
struct msghdr *msg, size_t len)
|
||||
{
|
||||
struct ipv6_txoptions *opt_to_free = NULL;
|
||||
struct ipv6_txoptions opt_space;
|
||||
struct sockaddr_in6 * sin6 = (struct sockaddr_in6 *) msg->msg_name;
|
||||
struct in6_addr *daddr, *final_p, final;
|
||||
|
@ -833,8 +834,10 @@ static int rawv6_sendmsg(struct kiocb *iocb, struct sock *sk,
|
|||
if (!(opt->opt_nflen|opt->opt_flen))
|
||||
opt = NULL;
|
||||
}
|
||||
if (opt == NULL)
|
||||
opt = np->opt;
|
||||
if (!opt) {
|
||||
opt = txopt_get(np);
|
||||
opt_to_free = opt;
|
||||
}
|
||||
if (flowlabel)
|
||||
opt = fl6_merge_options(&opt_space, flowlabel, opt);
|
||||
opt = ipv6_fixup_options(&opt_space, opt);
|
||||
|
@ -901,7 +904,8 @@ done:
|
|||
dst_release(dst);
|
||||
out:
|
||||
fl6_sock_release(flowlabel);
|
||||
return err<0?err:len;
|
||||
txopt_put(opt_to_free);
|
||||
return err < 0 ? err : len;
|
||||
do_confirm:
|
||||
dst_confirm(dst);
|
||||
if (!(msg->msg_flags & MSG_PROBE) || len)
|
||||
|
|
|
@ -237,7 +237,7 @@ struct sock *cookie_v6_check(struct sock *sk, struct sk_buff *skb)
|
|||
memset(&fl6, 0, sizeof(fl6));
|
||||
fl6.flowi6_proto = IPPROTO_TCP;
|
||||
fl6.daddr = ireq6->rmt_addr;
|
||||
final_p = fl6_update_dst(&fl6, np->opt, &final);
|
||||
final_p = fl6_update_dst(&fl6, rcu_dereference(np->opt), &final);
|
||||
fl6.saddr = ireq6->loc_addr;
|
||||
fl6.flowi6_oif = sk->sk_bound_dev_if;
|
||||
fl6.flowi6_mark = ireq->ir_mark;
|
||||
|
|
|
@ -133,6 +133,7 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
|
|||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
struct tcp_sock *tp = tcp_sk(sk);
|
||||
struct in6_addr *saddr = NULL, *final_p, final;
|
||||
struct ipv6_txoptions *opt;
|
||||
struct rt6_info *rt;
|
||||
struct flowi6 fl6;
|
||||
struct dst_entry *dst;
|
||||
|
@ -254,7 +255,8 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
|
|||
fl6.fl6_sport = inet->inet_sport;
|
||||
fl6.flowi6_uid = sock_i_uid(sk);
|
||||
|
||||
final_p = fl6_update_dst(&fl6, np->opt, &final);
|
||||
opt = rcu_dereference_protected(np->opt, sock_owned_by_user(sk));
|
||||
final_p = fl6_update_dst(&fl6, opt, &final);
|
||||
|
||||
security_sk_classify_flow(sk, flowi6_to_flowi(&fl6));
|
||||
|
||||
|
@ -283,9 +285,9 @@ static int tcp_v6_connect(struct sock *sk, struct sockaddr *uaddr,
|
|||
tcp_fetch_timewait_stamp(sk, dst);
|
||||
|
||||
icsk->icsk_ext_hdr_len = 0;
|
||||
if (np->opt)
|
||||
icsk->icsk_ext_hdr_len = (np->opt->opt_flen +
|
||||
np->opt->opt_nflen);
|
||||
if (opt)
|
||||
icsk->icsk_ext_hdr_len = opt->opt_flen +
|
||||
opt->opt_nflen;
|
||||
|
||||
tp->rx_opt.mss_clamp = IPV6_MIN_MTU - sizeof(struct tcphdr) - sizeof(struct ipv6hdr);
|
||||
|
||||
|
@ -481,7 +483,8 @@ static int tcp_v6_send_synack(struct sock *sk, struct dst_entry *dst,
|
|||
|
||||
fl6->daddr = treq->rmt_addr;
|
||||
skb_set_queue_mapping(skb, queue_mapping);
|
||||
err = ip6_xmit(sk, skb, fl6, np->opt, np->tclass);
|
||||
err = ip6_xmit(sk, skb, fl6, rcu_dereference(np->opt),
|
||||
np->tclass);
|
||||
err = net_xmit_eval(err);
|
||||
}
|
||||
|
||||
|
@ -1090,6 +1093,7 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
|
|||
struct inet6_request_sock *treq;
|
||||
struct ipv6_pinfo *newnp, *np = inet6_sk(sk);
|
||||
struct tcp6_sock *newtcp6sk;
|
||||
struct ipv6_txoptions *opt;
|
||||
struct inet_sock *newinet;
|
||||
struct tcp_sock *newtp;
|
||||
struct sock *newsk;
|
||||
|
@ -1223,13 +1227,15 @@ static struct sock * tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
|
|||
but we make one more one thing there: reattach optmem
|
||||
to newsk.
|
||||
*/
|
||||
if (np->opt)
|
||||
newnp->opt = ipv6_dup_options(newsk, np->opt);
|
||||
|
||||
opt = rcu_dereference(np->opt);
|
||||
if (opt) {
|
||||
opt = ipv6_dup_options(newsk, opt);
|
||||
RCU_INIT_POINTER(newnp->opt, opt);
|
||||
}
|
||||
inet_csk(newsk)->icsk_ext_hdr_len = 0;
|
||||
if (newnp->opt)
|
||||
inet_csk(newsk)->icsk_ext_hdr_len = (newnp->opt->opt_nflen +
|
||||
newnp->opt->opt_flen);
|
||||
if (opt)
|
||||
inet_csk(newsk)->icsk_ext_hdr_len = opt->opt_nflen +
|
||||
opt->opt_flen;
|
||||
|
||||
tcp_mtup_init(newsk);
|
||||
tcp_sync_mss(newsk, dst_mtu(dst));
|
||||
|
|
|
@ -1015,6 +1015,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
|
|||
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) msg->msg_name;
|
||||
struct in6_addr *daddr, *final_p, final;
|
||||
struct ipv6_txoptions *opt = NULL;
|
||||
struct ipv6_txoptions *opt_to_free = NULL;
|
||||
struct ip6_flowlabel *flowlabel = NULL;
|
||||
struct flowi6 fl6;
|
||||
struct dst_entry *dst;
|
||||
|
@ -1169,8 +1170,10 @@ do_udp_sendmsg:
|
|||
opt = NULL;
|
||||
connected = 0;
|
||||
}
|
||||
if (opt == NULL)
|
||||
opt = np->opt;
|
||||
if (!opt) {
|
||||
opt = txopt_get(np);
|
||||
opt_to_free = opt;
|
||||
}
|
||||
if (flowlabel)
|
||||
opt = fl6_merge_options(&opt_space, flowlabel, opt);
|
||||
opt = ipv6_fixup_options(&opt_space, opt);
|
||||
|
@ -1271,6 +1274,7 @@ do_append_data:
|
|||
out:
|
||||
dst_release(dst);
|
||||
fl6_sock_release(flowlabel);
|
||||
txopt_put(opt_to_free);
|
||||
if (!err)
|
||||
return len;
|
||||
/*
|
||||
|
|
|
@ -485,6 +485,7 @@ static int l2tp_ip6_sendmsg(struct kiocb *iocb, struct sock *sk,
|
|||
(struct sockaddr_l2tpip6 *) msg->msg_name;
|
||||
struct in6_addr *daddr, *final_p, final;
|
||||
struct ipv6_pinfo *np = inet6_sk(sk);
|
||||
struct ipv6_txoptions *opt_to_free = NULL;
|
||||
struct ipv6_txoptions *opt = NULL;
|
||||
struct ip6_flowlabel *flowlabel = NULL;
|
||||
struct dst_entry *dst = NULL;
|
||||
|
@ -575,8 +576,10 @@ static int l2tp_ip6_sendmsg(struct kiocb *iocb, struct sock *sk,
|
|||
opt = NULL;
|
||||
}
|
||||
|
||||
if (opt == NULL)
|
||||
opt = np->opt;
|
||||
if (!opt) {
|
||||
opt = txopt_get(np);
|
||||
opt_to_free = opt;
|
||||
}
|
||||
if (flowlabel)
|
||||
opt = fl6_merge_options(&opt_space, flowlabel, opt);
|
||||
opt = ipv6_fixup_options(&opt_space, opt);
|
||||
|
@ -637,6 +640,7 @@ done:
|
|||
dst_release(dst);
|
||||
out:
|
||||
fl6_sock_release(flowlabel);
|
||||
txopt_put(opt_to_free);
|
||||
|
||||
return err < 0 ? err : len;
|
||||
|
||||
|
|
|
@ -1798,6 +1798,8 @@ SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
|
|||
|
||||
if (len > INT_MAX)
|
||||
len = INT_MAX;
|
||||
if (unlikely(!access_ok(VERIFY_READ, buff, len)))
|
||||
return -EFAULT;
|
||||
sock = sockfd_lookup_light(fd, &err, &fput_needed);
|
||||
if (!sock)
|
||||
goto out;
|
||||
|
@ -1857,6 +1859,8 @@ SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
|
|||
|
||||
if (size > INT_MAX)
|
||||
size = INT_MAX;
|
||||
if (unlikely(!access_ok(VERIFY_WRITE, ubuf, size)))
|
||||
return -EFAULT;
|
||||
sock = sockfd_lookup_light(fd, &err, &fput_needed);
|
||||
if (!sock)
|
||||
goto out;
|
||||
|
|
|
@ -18,6 +18,15 @@ config SECURITY_DMESG_RESTRICT
|
|||
|
||||
If you are unsure how to answer this question, answer N.
|
||||
|
||||
config SECURITY_PERF_EVENTS_RESTRICT
|
||||
bool "Restrict unprivileged use of performance events"
|
||||
depends on PERF_EVENTS
|
||||
help
|
||||
If you say Y here, the kernel.perf_event_paranoid sysctl
|
||||
will be set to 3 by default, and no unprivileged use of the
|
||||
perf_event_open syscall will be permitted unless it is
|
||||
changed.
|
||||
|
||||
config SECURITY
|
||||
bool "Enable different security models"
|
||||
depends on SYSFS
|
||||
|
|
|
@ -144,8 +144,10 @@ static struct snd_seq_queue *queue_new(int owner, int locked)
|
|||
static void queue_delete(struct snd_seq_queue *q)
|
||||
{
|
||||
/* stop and release the timer */
|
||||
mutex_lock(&q->timer_mutex);
|
||||
snd_seq_timer_stop(q->timer);
|
||||
snd_seq_timer_close(q);
|
||||
mutex_unlock(&q->timer_mutex);
|
||||
/* wait until access free */
|
||||
snd_use_lock_sync(&q->use_lock);
|
||||
/* release resources... */
|
||||
|
|
|
@ -73,7 +73,7 @@ struct snd_timer_user {
|
|||
struct timespec tstamp; /* trigger tstamp */
|
||||
wait_queue_head_t qchange_sleep;
|
||||
struct fasync_struct *fasync;
|
||||
struct mutex tread_sem;
|
||||
struct mutex ioctl_lock;
|
||||
};
|
||||
|
||||
/* list of timers */
|
||||
|
@ -1184,6 +1184,7 @@ static void snd_timer_user_ccallback(struct snd_timer_instance *timeri,
|
|||
tu->tstamp = *tstamp;
|
||||
if ((tu->filter & (1 << event)) == 0 || !tu->tread)
|
||||
return;
|
||||
memset(&r1, 0, sizeof(r1));
|
||||
r1.event = event;
|
||||
r1.tstamp = *tstamp;
|
||||
r1.val = resolution;
|
||||
|
@ -1218,6 +1219,7 @@ static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri,
|
|||
}
|
||||
if ((tu->filter & (1 << SNDRV_TIMER_EVENT_RESOLUTION)) &&
|
||||
tu->last_resolution != resolution) {
|
||||
memset(&r1, 0, sizeof(r1));
|
||||
r1.event = SNDRV_TIMER_EVENT_RESOLUTION;
|
||||
r1.tstamp = tstamp;
|
||||
r1.val = resolution;
|
||||
|
@ -1266,7 +1268,7 @@ static int snd_timer_user_open(struct inode *inode, struct file *file)
|
|||
return -ENOMEM;
|
||||
spin_lock_init(&tu->qlock);
|
||||
init_waitqueue_head(&tu->qchange_sleep);
|
||||
mutex_init(&tu->tread_sem);
|
||||
mutex_init(&tu->ioctl_lock);
|
||||
tu->ticks = 1;
|
||||
tu->queue_size = 128;
|
||||
tu->queue = kmalloc(tu->queue_size * sizeof(struct snd_timer_read),
|
||||
|
@ -1286,8 +1288,10 @@ static int snd_timer_user_release(struct inode *inode, struct file *file)
|
|||
if (file->private_data) {
|
||||
tu = file->private_data;
|
||||
file->private_data = NULL;
|
||||
mutex_lock(&tu->ioctl_lock);
|
||||
if (tu->timeri)
|
||||
snd_timer_close(tu->timeri);
|
||||
mutex_unlock(&tu->ioctl_lock);
|
||||
kfree(tu->queue);
|
||||
kfree(tu->tqueue);
|
||||
kfree(tu);
|
||||
|
@ -1525,7 +1529,6 @@ static int snd_timer_user_tselect(struct file *file,
|
|||
int err = 0;
|
||||
|
||||
tu = file->private_data;
|
||||
mutex_lock(&tu->tread_sem);
|
||||
if (tu->timeri) {
|
||||
snd_timer_close(tu->timeri);
|
||||
tu->timeri = NULL;
|
||||
|
@ -1569,7 +1572,6 @@ static int snd_timer_user_tselect(struct file *file,
|
|||
}
|
||||
|
||||
__err:
|
||||
mutex_unlock(&tu->tread_sem);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -1683,6 +1685,7 @@ static int snd_timer_user_params(struct file *file,
|
|||
if (tu->timeri->flags & SNDRV_TIMER_IFLG_EARLY_EVENT) {
|
||||
if (tu->tread) {
|
||||
struct snd_timer_tread tread;
|
||||
memset(&tread, 0, sizeof(tread));
|
||||
tread.event = SNDRV_TIMER_EVENT_EARLY;
|
||||
tread.tstamp.tv_sec = 0;
|
||||
tread.tstamp.tv_nsec = 0;
|
||||
|
@ -1782,7 +1785,7 @@ enum {
|
|||
SNDRV_TIMER_IOCTL_PAUSE_OLD = _IO('T', 0x23),
|
||||
};
|
||||
|
||||
static long snd_timer_user_ioctl(struct file *file, unsigned int cmd,
|
||||
static long __snd_timer_user_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
struct snd_timer_user *tu;
|
||||
|
@ -1799,17 +1802,11 @@ static long snd_timer_user_ioctl(struct file *file, unsigned int cmd,
|
|||
{
|
||||
int xarg;
|
||||
|
||||
mutex_lock(&tu->tread_sem);
|
||||
if (tu->timeri) { /* too late */
|
||||
mutex_unlock(&tu->tread_sem);
|
||||
if (tu->timeri) /* too late */
|
||||
return -EBUSY;
|
||||
}
|
||||
if (get_user(xarg, p)) {
|
||||
mutex_unlock(&tu->tread_sem);
|
||||
if (get_user(xarg, p))
|
||||
return -EFAULT;
|
||||
}
|
||||
tu->tread = xarg ? 1 : 0;
|
||||
mutex_unlock(&tu->tread_sem);
|
||||
return 0;
|
||||
}
|
||||
case SNDRV_TIMER_IOCTL_GINFO:
|
||||
|
@ -1842,6 +1839,18 @@ static long snd_timer_user_ioctl(struct file *file, unsigned int cmd,
|
|||
return -ENOTTY;
|
||||
}
|
||||
|
||||
static long snd_timer_user_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long arg)
|
||||
{
|
||||
struct snd_timer_user *tu = file->private_data;
|
||||
long ret;
|
||||
|
||||
mutex_lock(&tu->ioctl_lock);
|
||||
ret = __snd_timer_user_ioctl(file, cmd, arg);
|
||||
mutex_unlock(&tu->ioctl_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int snd_timer_user_fasync(int fd, struct file * file, int on)
|
||||
{
|
||||
struct snd_timer_user *tu;
|
||||
|
|
|
@ -998,6 +998,20 @@ static int msm_ds2_dap_handle_bypass(struct dolby_param_data *dolby_data)
|
|||
copp_idx, rc);
|
||||
}
|
||||
}
|
||||
/* Turn on qti modules */
|
||||
for (j = 1; j < mod_list[0]; j++) {
|
||||
if (!msm_ds2_dap_can_enable_module(
|
||||
mod_list[j]) ||
|
||||
mod_list[j] ==
|
||||
DS2_MODULE_ID)
|
||||
continue;
|
||||
pr_debug("%s: param enable %d\n",
|
||||
__func__, mod_list[j]);
|
||||
adm_param_enable(port_id, copp_idx,
|
||||
mod_list[j],
|
||||
MODULE_ENABLE);
|
||||
}
|
||||
|
||||
/* Add adm api to resend calibration on port */
|
||||
rc = msm_ds2_dap_send_cal_data(i);
|
||||
if (rc < 0) {
|
||||
|
|
|
@ -1515,12 +1515,15 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel,
|
|||
case EPERM:
|
||||
case EACCES:
|
||||
return scnprintf(msg, size,
|
||||
"You may not have permission to collect %sstats.\n"
|
||||
"Consider tweaking /proc/sys/kernel/perf_event_paranoid:\n"
|
||||
" -1 - Not paranoid at all\n"
|
||||
" 0 - Disallow raw tracepoint access for unpriv\n"
|
||||
" 1 - Disallow cpu events for unpriv\n"
|
||||
" 2 - Disallow kernel profiling for unpriv",
|
||||
"You may not have permission to collect %sstats.\n\n"
|
||||
"Consider tweaking /proc/sys/kernel/perf_event_paranoid,\n"
|
||||
"which controls use of the performance events system by\n"
|
||||
"unprivileged users (without CAP_SYS_ADMIN).\n\n"
|
||||
"The default value is 1:\n\n"
|
||||
" -1: Allow use of (almost) all events by all users\n"
|
||||
">= 0: Disallow raw tracepoint access by users without CAP_IOC_LOCK\n"
|
||||
">= 1: Disallow CPU event access by users without CAP_SYS_ADMIN\n"
|
||||
">= 2: Disallow kernel profiling by users without CAP_SYS_ADMIN",
|
||||
target->system_wide ? "system-wide " : "");
|
||||
case ENOENT:
|
||||
return scnprintf(msg, size, "The %s event is not supported.",
|
||||
|
|
Loading…
Reference in New Issue