Merge 1ebfa66638 ("drm/amd/display: Add null check for top_pipe_to_program in commit_planes_for_stream") into android12-5.10-lts

Steps on the way to 5.10.227

Change-Id: I5e69192f2ecbbda523c18c2749bb1f181837e99c
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman 2024-11-14 11:32:05 +00:00
commit b48eba851f
33 changed files with 316 additions and 52 deletions

View File

@ -4161,6 +4161,16 @@
printk.time= Show timing data prefixed to each printk message line printk.time= Show timing data prefixed to each printk message line
Format: <bool> (1/Y/y=enable, 0/N/n=disable) Format: <bool> (1/Y/y=enable, 0/N/n=disable)
proc_mem.force_override= [KNL]
Format: {always | ptrace | never}
Traditionally /proc/pid/mem allows memory permissions to be
overridden without restrictions. This option may be set to
restrict that. Can be one of:
- 'always': traditional behavior always allows mem overrides.
- 'ptrace': only allow mem overrides for active ptracers.
- 'never': never allow mem overrides.
If not specified, default is the CONFIG_PROC_MEM_* choice.
processor.max_cstate= [HW,ACPI] processor.max_cstate= [HW,ACPI]
Limit processor to maximum C-state Limit processor to maximum C-state
max_cstate=9 overrides any DMI blacklist limit. max_cstate=9 overrides any DMI blacklist limit.

View File

@ -85,7 +85,12 @@ static inline void syscall_get_arguments(struct task_struct *task,
struct pt_regs *regs, struct pt_regs *regs,
unsigned long *args) unsigned long *args)
{ {
memcpy(args, &regs->bx, 6 * sizeof(args[0])); args[0] = regs->bx;
args[1] = regs->cx;
args[2] = regs->dx;
args[3] = regs->si;
args[4] = regs->di;
args[5] = regs->bp;
} }
static inline void syscall_set_arguments(struct task_struct *task, static inline void syscall_set_arguments(struct task_struct *task,

View File

@ -2022,7 +2022,7 @@ static void ioc_forgive_debts(struct ioc *ioc, u64 usage_us_sum, int nr_debtors,
struct ioc_now *now) struct ioc_now *now)
{ {
struct ioc_gq *iocg; struct ioc_gq *iocg;
u64 dur, usage_pct, nr_cycles; u64 dur, usage_pct, nr_cycles, nr_cycles_shift;
/* if no debtor, reset the cycle */ /* if no debtor, reset the cycle */
if (!nr_debtors) { if (!nr_debtors) {
@ -2084,10 +2084,12 @@ static void ioc_forgive_debts(struct ioc *ioc, u64 usage_us_sum, int nr_debtors,
old_debt = iocg->abs_vdebt; old_debt = iocg->abs_vdebt;
old_delay = iocg->delay; old_delay = iocg->delay;
nr_cycles_shift = min_t(u64, nr_cycles, BITS_PER_LONG - 1);
if (iocg->abs_vdebt) if (iocg->abs_vdebt)
iocg->abs_vdebt = iocg->abs_vdebt >> nr_cycles ?: 1; iocg->abs_vdebt = iocg->abs_vdebt >> nr_cycles_shift ?: 1;
if (iocg->delay) if (iocg->delay)
iocg->delay = iocg->delay >> nr_cycles ?: 1; iocg->delay = iocg->delay >> nr_cycles_shift ?: 1;
iocg_kick_waitq(iocg, true, now); iocg_kick_waitq(iocg, true, now);

View File

@ -174,6 +174,8 @@ acpi_status acpi_db_convert_to_package(char *string, union acpi_object *object)
elements = elements =
ACPI_ALLOCATE_ZEROED(DB_DEFAULT_PKG_ELEMENTS * ACPI_ALLOCATE_ZEROED(DB_DEFAULT_PKG_ELEMENTS *
sizeof(union acpi_object)); sizeof(union acpi_object));
if (!elements)
return (AE_NO_MEMORY);
this = string; this = string;
for (i = 0; i < (DB_DEFAULT_PKG_ELEMENTS - 1); i++) { for (i = 0; i < (DB_DEFAULT_PKG_ELEMENTS - 1); i++) {

View File

@ -437,6 +437,9 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info)
if (info->connection_node) { if (info->connection_node) {
second_desc = info->connection_node->object; second_desc = info->connection_node->object;
if (second_desc == NULL) {
break;
}
if (!(second_desc->common.flags & AOPOBJ_DATA_VALID)) { if (!(second_desc->common.flags & AOPOBJ_DATA_VALID)) {
status = status =
acpi_ds_get_buffer_arguments(second_desc); acpi_ds_get_buffer_arguments(second_desc);

View File

@ -786,6 +786,9 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
unsigned long tmp; unsigned long tmp;
int ret = 0; int ret = 0;
if (t->rdata)
memset(t->rdata, 0, t->rlen);
/* start transaction */ /* start transaction */
spin_lock_irqsave(&ec->lock, tmp); spin_lock_irqsave(&ec->lock, tmp);
/* Enable GPE for command processing (IBF=0/OBF=1) */ /* Enable GPE for command processing (IBF=0/OBF=1) */
@ -822,8 +825,6 @@ static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t)
if (!ec || (!t) || (t->wlen && !t->wdata) || (t->rlen && !t->rdata)) if (!ec || (!t) || (t->wlen && !t->wdata) || (t->rlen && !t->rdata))
return -EINVAL; return -EINVAL;
if (t->rdata)
memset(t->rdata, 0, t->rlen);
mutex_lock(&ec->mutex); mutex_lock(&ec->mutex);
if (ec->global_lock) { if (ec->global_lock) {
@ -850,7 +851,7 @@ static int acpi_ec_burst_enable(struct acpi_ec *ec)
.wdata = NULL, .rdata = &d, .wdata = NULL, .rdata = &d,
.wlen = 0, .rlen = 1}; .wlen = 0, .rlen = 1};
return acpi_ec_transaction(ec, &t); return acpi_ec_transaction_unlocked(ec, &t);
} }
static int acpi_ec_burst_disable(struct acpi_ec *ec) static int acpi_ec_burst_disable(struct acpi_ec *ec)
@ -860,7 +861,7 @@ static int acpi_ec_burst_disable(struct acpi_ec *ec)
.wlen = 0, .rlen = 0}; .wlen = 0, .rlen = 0};
return (acpi_ec_read_status(ec) & ACPI_EC_FLAG_BURST) ? return (acpi_ec_read_status(ec) & ACPI_EC_FLAG_BURST) ?
acpi_ec_transaction(ec, &t) : 0; acpi_ec_transaction_unlocked(ec, &t) : 0;
} }
static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 *data) static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 *data)
@ -876,6 +877,19 @@ static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 *data)
return result; return result;
} }
static int acpi_ec_read_unlocked(struct acpi_ec *ec, u8 address, u8 *data)
{
int result;
u8 d;
struct transaction t = {.command = ACPI_EC_COMMAND_READ,
.wdata = &address, .rdata = &d,
.wlen = 1, .rlen = 1};
result = acpi_ec_transaction_unlocked(ec, &t);
*data = d;
return result;
}
static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data) static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data)
{ {
u8 wdata[2] = { address, data }; u8 wdata[2] = { address, data };
@ -886,6 +900,16 @@ static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data)
return acpi_ec_transaction(ec, &t); return acpi_ec_transaction(ec, &t);
} }
static int acpi_ec_write_unlocked(struct acpi_ec *ec, u8 address, u8 data)
{
u8 wdata[2] = { address, data };
struct transaction t = {.command = ACPI_EC_COMMAND_WRITE,
.wdata = wdata, .rdata = NULL,
.wlen = 2, .rlen = 0};
return acpi_ec_transaction_unlocked(ec, &t);
}
int ec_read(u8 addr, u8 *val) int ec_read(u8 addr, u8 *val)
{ {
int err; int err;
@ -1306,6 +1330,7 @@ acpi_ec_space_handler(u32 function, acpi_physical_address address,
struct acpi_ec *ec = handler_context; struct acpi_ec *ec = handler_context;
int result = 0, i, bytes = bits / 8; int result = 0, i, bytes = bits / 8;
u8 *value = (u8 *)value64; u8 *value = (u8 *)value64;
u32 glk;
if ((address > 0xFF) || !value || !handler_context) if ((address > 0xFF) || !value || !handler_context)
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
@ -1313,13 +1338,25 @@ acpi_ec_space_handler(u32 function, acpi_physical_address address,
if (function != ACPI_READ && function != ACPI_WRITE) if (function != ACPI_READ && function != ACPI_WRITE)
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
mutex_lock(&ec->mutex);
if (ec->global_lock) {
acpi_status status;
status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
if (ACPI_FAILURE(status)) {
result = -ENODEV;
goto unlock;
}
}
if (ec->busy_polling || bits > 8) if (ec->busy_polling || bits > 8)
acpi_ec_burst_enable(ec); acpi_ec_burst_enable(ec);
for (i = 0; i < bytes; ++i, ++address, ++value) { for (i = 0; i < bytes; ++i, ++address, ++value) {
result = (function == ACPI_READ) ? result = (function == ACPI_READ) ?
acpi_ec_read(ec, address, value) : acpi_ec_read_unlocked(ec, address, value) :
acpi_ec_write(ec, address, *value); acpi_ec_write_unlocked(ec, address, *value);
if (result < 0) if (result < 0)
break; break;
} }
@ -1327,6 +1364,12 @@ acpi_ec_space_handler(u32 function, acpi_physical_address address,
if (ec->busy_polling || bits > 8) if (ec->busy_polling || bits > 8)
acpi_ec_burst_disable(ec); acpi_ec_burst_disable(ec);
if (ec->global_lock)
acpi_release_global_lock(glk);
unlock:
mutex_unlock(&ec->mutex);
switch (result) { switch (result) {
case -EINVAL: case -EINVAL:
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;

View File

@ -2614,7 +2614,8 @@ static void commit_planes_for_stream(struct dc *dc,
dc->hwss.pipe_control_lock(dc, top_pipe_to_program, false); dc->hwss.pipe_control_lock(dc, top_pipe_to_program, false);
if ((update_type != UPDATE_TYPE_FAST) && stream->update_flags.bits.dsc_changed) if ((update_type != UPDATE_TYPE_FAST) && stream->update_flags.bits.dsc_changed)
if (top_pipe_to_program->stream_res.tg->funcs->lock_doublebuffer_enable) { if (top_pipe_to_program &&
top_pipe_to_program->stream_res.tg->funcs->lock_doublebuffer_enable) {
top_pipe_to_program->stream_res.tg->funcs->wait_for_state( top_pipe_to_program->stream_res.tg->funcs->wait_for_state(
top_pipe_to_program->stream_res.tg, top_pipe_to_program->stream_res.tg,
CRTC_STATE_VACTIVE); CRTC_STATE_VACTIVE);

View File

@ -206,6 +206,13 @@ static int qcom_smmu_cfg_probe(struct arm_smmu_device *smmu)
u32 smr; u32 smr;
int i; int i;
/*
* MSM8998 LPASS SMMU reports 13 context banks, but accessing
* the last context bank crashes the system.
*/
if (of_device_is_compatible(smmu->dev->of_node, "qcom,msm8998-smmu-v2") && smmu->num_context_banks == 13)
smmu->num_context_banks = 12;
/* /*
* Some platforms support more than the Arm SMMU architected maximum of * Some platforms support more than the Arm SMMU architected maximum of
* 128 stream matching groups. For unknown reasons, the additional * 128 stream matching groups. For unknown reasons, the additional

View File

@ -1193,9 +1193,7 @@ static void free_iommu(struct intel_iommu *iommu)
*/ */
static inline void reclaim_free_desc(struct q_inval *qi) static inline void reclaim_free_desc(struct q_inval *qi)
{ {
while (qi->desc_status[qi->free_tail] == QI_DONE || while (qi->desc_status[qi->free_tail] == QI_FREE && qi->free_tail != qi->free_head) {
qi->desc_status[qi->free_tail] == QI_ABORT) {
qi->desc_status[qi->free_tail] = QI_FREE;
qi->free_tail = (qi->free_tail + 1) % QI_LENGTH; qi->free_tail = (qi->free_tail + 1) % QI_LENGTH;
qi->free_cnt++; qi->free_cnt++;
} }
@ -1350,8 +1348,16 @@ int qi_submit_sync(struct intel_iommu *iommu, struct qi_desc *desc,
raw_spin_lock(&qi->q_lock); raw_spin_lock(&qi->q_lock);
} }
for (i = 0; i < count; i++) /*
qi->desc_status[(index + i) % QI_LENGTH] = QI_DONE; * The reclaim code can free descriptors from multiple submissions
* starting from the tail of the queue. When count == 0, the
* status of the standalone wait descriptor at the tail of the queue
* must be set to QI_FREE to allow the reclaim code to proceed.
* It is also possible that descriptors from one of the previous
* submissions has to be reclaimed by a subsequent submission.
*/
for (i = 0; i <= count; i++)
qi->desc_status[(index + i) % QI_LENGTH] = QI_FREE;
reclaim_free_desc(qi); reclaim_free_desc(qi);
raw_spin_unlock_irqrestore(&qi->q_lock, flags); raw_spin_unlock_irqrestore(&qi->q_lock, flags);

View File

@ -1847,10 +1847,10 @@ static int iommu_init_domains(struct intel_iommu *iommu)
* entry for first-level or pass-through translation modes should * entry for first-level or pass-through translation modes should
* be programmed with a domain id different from those used for * be programmed with a domain id different from those used for
* second-level or nested translation. We reserve a domain id for * second-level or nested translation. We reserve a domain id for
* this purpose. * this purpose. This domain id is also used for identity domain
* in legacy mode.
*/ */
if (sm_supported(iommu)) set_bit(FLPT_DEFAULT_DID, iommu->domain_ids);
set_bit(FLPT_DEFAULT_DID, iommu->domain_ids);
return 0; return 0;
} }

View File

@ -256,7 +256,7 @@ static void aq_ethtool_get_strings(struct net_device *ndev,
const int rx_stat_cnt = ARRAY_SIZE(aq_ethtool_queue_rx_stat_names); const int rx_stat_cnt = ARRAY_SIZE(aq_ethtool_queue_rx_stat_names);
const int tx_stat_cnt = ARRAY_SIZE(aq_ethtool_queue_tx_stat_names); const int tx_stat_cnt = ARRAY_SIZE(aq_ethtool_queue_tx_stat_names);
char tc_string[8]; char tc_string[8];
int tc; unsigned int tc;
memset(tc_string, 0, sizeof(tc_string)); memset(tc_string, 0, sizeof(tc_string));
memcpy(p, aq_ethtool_stat_names, memcpy(p, aq_ethtool_stat_names,
@ -265,7 +265,7 @@ static void aq_ethtool_get_strings(struct net_device *ndev,
for (tc = 0; tc < cfg->tcs; tc++) { for (tc = 0; tc < cfg->tcs; tc++) {
if (cfg->is_qos) if (cfg->is_qos)
snprintf(tc_string, 8, "TC%d ", tc); snprintf(tc_string, 8, "TC%u ", tc);
for (i = 0; i < cfg->vecs; i++) { for (i = 0; i < cfg->vecs; i++) {
for (si = 0; si < rx_stat_cnt; si++) { for (si = 0; si < rx_stat_cnt; si++) {

View File

@ -999,7 +999,7 @@ struct mvpp2 {
unsigned int max_port_rxqs; unsigned int max_port_rxqs;
/* Workqueue to gather hardware statistics */ /* Workqueue to gather hardware statistics */
char queue_name[30]; char queue_name[31];
struct workqueue_struct *stats_queue; struct workqueue_struct *stats_queue;
/* Debugfs root entry */ /* Debugfs root entry */

View File

@ -2631,8 +2631,8 @@ nfp_net_prepare_vector(struct nfp_net *nn, struct nfp_net_r_vector *r_vec,
snprintf(r_vec->name, sizeof(r_vec->name), snprintf(r_vec->name, sizeof(r_vec->name),
"%s-rxtx-%d", nfp_net_name(nn), idx); "%s-rxtx-%d", nfp_net_name(nn), idx);
err = request_irq(r_vec->irq_vector, r_vec->handler, 0, r_vec->name, err = request_irq(r_vec->irq_vector, r_vec->handler, IRQF_NO_AUTOEN,
r_vec); r_vec->name, r_vec);
if (err) { if (err) {
if (nn->dp.netdev) if (nn->dp.netdev)
netif_napi_del(&r_vec->napi); netif_napi_del(&r_vec->napi);
@ -2642,7 +2642,6 @@ nfp_net_prepare_vector(struct nfp_net *nn, struct nfp_net_r_vector *r_vec,
nn_err(nn, "Error requesting IRQ %d\n", r_vec->irq_vector); nn_err(nn, "Error requesting IRQ %d\n", r_vec->irq_vector);
return err; return err;
} }
disable_irq(r_vec->irq_vector);
irq_set_affinity_hint(r_vec->irq_vector, &r_vec->affinity_mask); irq_set_affinity_hint(r_vec->irq_vector, &r_vec->affinity_mask);

View File

@ -2621,7 +2621,7 @@ int ath11k_dp_process_rx(struct ath11k_base *ab, int ring_id,
if (push_reason != if (push_reason !=
HAL_REO_DEST_RING_PUSH_REASON_ROUTING_INSTRUCTION) { HAL_REO_DEST_RING_PUSH_REASON_ROUTING_INSTRUCTION) {
dev_kfree_skb_any(msdu); dev_kfree_skb_any(msdu);
ab->soc_stats.hal_reo_error[dp->reo_dst_ring[ring_id].ring_id]++; ab->soc_stats.hal_reo_error[ring_id]++;
continue; continue;
} }

View File

@ -1593,7 +1593,7 @@ struct host_cmd_ds_802_11_scan_rsp {
struct host_cmd_ds_802_11_scan_ext { struct host_cmd_ds_802_11_scan_ext {
u32 reserved; u32 reserved;
u8 tlv_buffer[1]; u8 tlv_buffer[];
} __packed; } __packed;
struct mwifiex_ie_types_bss_mode { struct mwifiex_ie_types_bss_mode {

View File

@ -2561,8 +2561,7 @@ int mwifiex_ret_802_11_scan_ext(struct mwifiex_private *priv,
ext_scan_resp = &resp->params.ext_scan; ext_scan_resp = &resp->params.ext_scan;
tlv = (void *)ext_scan_resp->tlv_buffer; tlv = (void *)ext_scan_resp->tlv_buffer;
buf_left = le16_to_cpu(resp->size) - (sizeof(*ext_scan_resp) + S_DS_GEN buf_left = le16_to_cpu(resp->size) - (sizeof(*ext_scan_resp) + S_DS_GEN);
- 1);
while (buf_left >= sizeof(struct mwifiex_ie_types_header)) { while (buf_left >= sizeof(struct mwifiex_ie_types_header)) {
type = le16_to_cpu(tlv->type); type = le16_to_cpu(tlv->type);

View File

@ -12,6 +12,7 @@ if RTW88
config RTW88_CORE config RTW88_CORE
tristate tristate
select WANT_DEV_COREDUMP
config RTW88_PCI config RTW88_PCI
tristate tristate

View File

@ -72,9 +72,6 @@ static int brcmstb_restart_handler(struct notifier_block *this,
return NOTIFY_DONE; return NOTIFY_DONE;
} }
while (1)
;
return NOTIFY_DONE; return NOTIFY_DONE;
} }

View File

@ -2408,6 +2408,7 @@ static int pxafb_remove(struct platform_device *dev)
info = &fbi->fb; info = &fbi->fb;
pxafb_overlay_exit(fbi); pxafb_overlay_exit(fbi);
cancel_work_sync(&fbi->task);
unregister_framebuffer(info); unregister_framebuffer(info);
pxafb_disable_controller(fbi); pxafb_disable_controller(fbi);

View File

@ -86,6 +86,7 @@
#include <linux/elf.h> #include <linux/elf.h>
#include <linux/pid_namespace.h> #include <linux/pid_namespace.h>
#include <linux/user_namespace.h> #include <linux/user_namespace.h>
#include <linux/fs_parser.h>
#include <linux/fs_struct.h> #include <linux/fs_struct.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/sched/autogroup.h> #include <linux/sched/autogroup.h>
@ -116,6 +117,40 @@
static u8 nlink_tid __ro_after_init; static u8 nlink_tid __ro_after_init;
static u8 nlink_tgid __ro_after_init; static u8 nlink_tgid __ro_after_init;
enum proc_mem_force {
PROC_MEM_FORCE_ALWAYS,
PROC_MEM_FORCE_PTRACE,
PROC_MEM_FORCE_NEVER
};
static enum proc_mem_force proc_mem_force_override __ro_after_init =
IS_ENABLED(CONFIG_PROC_MEM_NO_FORCE) ? PROC_MEM_FORCE_NEVER :
IS_ENABLED(CONFIG_PROC_MEM_FORCE_PTRACE) ? PROC_MEM_FORCE_PTRACE :
PROC_MEM_FORCE_ALWAYS;
static const struct constant_table proc_mem_force_table[] __initconst = {
{ "always", PROC_MEM_FORCE_ALWAYS },
{ "ptrace", PROC_MEM_FORCE_PTRACE },
{ "never", PROC_MEM_FORCE_NEVER },
{ }
};
static int __init early_proc_mem_force_override(char *buf)
{
if (!buf)
return -EINVAL;
/*
* lookup_constant() defaults to proc_mem_force_override to preseve
* the initial Kconfig choice in case an invalid param gets passed.
*/
proc_mem_force_override = lookup_constant(proc_mem_force_table,
buf, proc_mem_force_override);
return 0;
}
early_param("proc_mem.force_override", early_proc_mem_force_override);
struct pid_entry { struct pid_entry {
const char *name; const char *name;
unsigned int len; unsigned int len;
@ -833,6 +868,28 @@ static int mem_open(struct inode *inode, struct file *file)
return ret; return ret;
} }
static bool proc_mem_foll_force(struct file *file, struct mm_struct *mm)
{
struct task_struct *task;
bool ptrace_active = false;
switch (proc_mem_force_override) {
case PROC_MEM_FORCE_NEVER:
return false;
case PROC_MEM_FORCE_PTRACE:
task = get_proc_task(file_inode(file));
if (task) {
ptrace_active = READ_ONCE(task->ptrace) &&
READ_ONCE(task->mm) == mm &&
READ_ONCE(task->parent) == current;
put_task_struct(task);
}
return ptrace_active;
default:
return true;
}
}
static ssize_t mem_rw(struct file *file, char __user *buf, static ssize_t mem_rw(struct file *file, char __user *buf,
size_t count, loff_t *ppos, int write) size_t count, loff_t *ppos, int write)
{ {
@ -853,7 +910,9 @@ static ssize_t mem_rw(struct file *file, char __user *buf,
if (!mmget_not_zero(mm)) if (!mmget_not_zero(mm))
goto free; goto free;
flags = FOLL_FORCE | (write ? FOLL_WRITE : 0); flags = write ? FOLL_WRITE : 0;
if (proc_mem_foll_force(file, mm))
flags |= FOLL_FORCE;
while (count > 0) { while (count > 0) {
size_t this_len = min_t(size_t, count, PAGE_SIZE); size_t this_len = min_t(size_t, count, PAGE_SIZE);

View File

@ -398,7 +398,7 @@ rcu_scale_writer(void *arg)
udelay(writer_holdoff); udelay(writer_holdoff);
wdp = &wdpp[i]; wdp = &wdpp[i];
*wdp = ktime_get_mono_fast_ns(); *wdp = ktime_get_mono_fast_ns();
if (gp_async) { if (gp_async && !WARN_ON_ONCE(!cur_ops->async)) {
retry: retry:
if (!rhp) if (!rhp)
rhp = kmalloc(sizeof(*rhp), GFP_KERNEL); rhp = kmalloc(sizeof(*rhp), GFP_KERNEL);
@ -454,7 +454,7 @@ rcu_scale_writer(void *arg)
i++; i++;
rcu_scale_wait_shutdown(); rcu_scale_wait_shutdown();
} while (!torture_must_stop()); } while (!torture_must_stop());
if (gp_async) { if (gp_async && cur_ops->async) {
cur_ops->gp_barrier(); cur_ops->gp_barrier();
} }
writer_n_durations[me] = i_max + 1; writer_n_durations[me] = i_max + 1;

View File

@ -1829,10 +1829,11 @@ struct sigqueue *sigqueue_alloc(void)
void sigqueue_free(struct sigqueue *q) void sigqueue_free(struct sigqueue *q)
{ {
unsigned long flags;
spinlock_t *lock = &current->sighand->siglock; spinlock_t *lock = &current->sighand->siglock;
unsigned long flags;
BUG_ON(!(q->flags & SIGQUEUE_PREALLOC)); if (WARN_ON_ONCE(!(q->flags & SIGQUEUE_PREALLOC)))
return;
/* /*
* We must hold ->siglock while testing q->list * We must hold ->siglock while testing q->list
* to serialize with collect_signal() or with * to serialize with collect_signal() or with
@ -1860,7 +1861,10 @@ int send_sigqueue(struct sigqueue *q, struct pid *pid, enum pid_type type)
unsigned long flags; unsigned long flags;
int ret, result; int ret, result;
BUG_ON(!(q->flags & SIGQUEUE_PREALLOC)); if (WARN_ON_ONCE(!(q->flags & SIGQUEUE_PREALLOC)))
return 0;
if (WARN_ON_ONCE(q->info.si_code != SI_TIMER))
return 0;
ret = -1; ret = -1;
rcu_read_lock(); rcu_read_lock();
@ -1879,7 +1883,6 @@ int send_sigqueue(struct sigqueue *q, struct pid *pid, enum pid_type type)
* If an SI_TIMER entry is already queue just increment * If an SI_TIMER entry is already queue just increment
* the overrun count. * the overrun count.
*/ */
BUG_ON(q->info.si_code != SI_TIMER);
q->info.si_overrun++; q->info.si_overrun++;
result = TRACE_SIGNAL_ALREADY_PENDING; result = TRACE_SIGNAL_ALREADY_PENDING;
goto out; goto out;

View File

@ -566,10 +566,6 @@ static int inet_set_ifa(struct net_device *dev, struct in_ifaddr *ifa)
ASSERT_RTNL(); ASSERT_RTNL();
if (!in_dev) {
inet_free_ifa(ifa);
return -ENOBUFS;
}
ipv4_devconf_setall(in_dev); ipv4_devconf_setall(in_dev);
neigh_parms_data_state_setall(in_dev->arp_parms); neigh_parms_data_state_setall(in_dev->arp_parms);
if (ifa->ifa_dev != in_dev) { if (ifa->ifa_dev != in_dev) {
@ -1150,6 +1146,8 @@ int devinet_ioctl(struct net *net, unsigned int cmd, struct ifreq *ifr)
if (!ifa) { if (!ifa) {
ret = -ENOBUFS; ret = -ENOBUFS;
if (!in_dev)
break;
ifa = inet_alloc_ifa(); ifa = inet_alloc_ifa();
if (!ifa) if (!ifa)
break; break;

View File

@ -1334,7 +1334,7 @@ static void nl_fib_lookup(struct net *net, struct fib_result_nl *frn)
struct flowi4 fl4 = { struct flowi4 fl4 = {
.flowi4_mark = frn->fl_mark, .flowi4_mark = frn->fl_mark,
.daddr = frn->fl_addr, .daddr = frn->fl_addr,
.flowi4_tos = frn->fl_tos, .flowi4_tos = frn->fl_tos & IPTOS_RT_MASK,
.flowi4_scope = frn->fl_scope, .flowi4_scope = frn->fl_scope,
}; };
struct fib_table *tb; struct fib_table *tb;

View File

@ -111,6 +111,9 @@ int tcp_twsk_unique(struct sock *sk, struct sock *sktw, void *twp)
const struct tcp_timewait_sock *tcptw = tcp_twsk(sktw); const struct tcp_timewait_sock *tcptw = tcp_twsk(sktw);
struct tcp_sock *tp = tcp_sk(sk); struct tcp_sock *tp = tcp_sk(sk);
if (tw->tw_substate == TCP_FIN_WAIT2)
reuse = 0;
if (reuse == 2) { if (reuse == 2) {
/* Still does not detect *everything* that goes through /* Still does not detect *everything* that goes through
* lo, since we require a loopback src or dst address * lo, since we require a loopback src or dst address

View File

@ -1577,7 +1577,9 @@ static int taprio_change(struct Qdisc *sch, struct nlattr *opt,
goto unlock; goto unlock;
} }
rcu_assign_pointer(q->admin_sched, new_admin); /* Not going to race against advance_sched(), but still */
admin = rcu_replace_pointer(q->admin_sched, new_admin,
lockdep_rtnl_is_held());
if (admin) if (admin)
call_rcu(&admin->rcu, taprio_free_sched_cb); call_rcu(&admin->rcu, taprio_free_sched_cb);
} else { } else {

View File

@ -161,8 +161,12 @@ static int bearer_name_validate(const char *name,
/* return bearer name components, if necessary */ /* return bearer name components, if necessary */
if (name_parts) { if (name_parts) {
strcpy(name_parts->media_name, media_name); if (strscpy(name_parts->media_name, media_name,
strcpy(name_parts->if_name, if_name); TIPC_MAX_MEDIA_NAME) < 0)
return 0;
if (strscpy(name_parts->if_name, if_name,
TIPC_MAX_IF_NAME) < 0)
return 0;
} }
return 1; return 1;
} }

View File

@ -19,6 +19,38 @@ config SECURITY_DMESG_RESTRICT
If you are unsure how to answer this question, answer N. If you are unsure how to answer this question, answer N.
choice
prompt "Allow /proc/pid/mem access override"
default PROC_MEM_ALWAYS_FORCE
help
Traditionally /proc/pid/mem allows users to override memory
permissions for users like ptrace, assuming they have ptrace
capability.
This allows people to limit that - either never override, or
require actual active ptrace attachment.
Defaults to the traditional behavior (for now)
config PROC_MEM_ALWAYS_FORCE
bool "Traditional /proc/pid/mem behavior"
help
This allows /proc/pid/mem accesses to override memory mapping
permissions if you have ptrace access rights.
config PROC_MEM_FORCE_PTRACE
bool "Require active ptrace() use for access override"
help
This allows /proc/pid/mem accesses to override memory mapping
permissions for active ptracers like gdb.
config PROC_MEM_NO_FORCE
bool "Never"
help
Never override memory mapping permissions
endchoice
config SECURITY config SECURITY
bool "Enable different security models" bool "Enable different security models"
depends on SYSFS depends on SYSFS

View File

@ -713,7 +713,7 @@ static u16 HPIMSGX__init(struct hpi_message *phm,
phr->error = HPI_ERROR_PROCESSING_MESSAGE; phr->error = HPI_ERROR_PROCESSING_MESSAGE;
return phr->error; return phr->error;
} }
if (hr.error == 0) { if (hr.error == 0 && hr.u.s.adapter_index < HPI_MAX_ADAPTERS) {
/* the adapter was created successfully /* the adapter was created successfully
save the mapping for future use */ save the mapping for future use */
hpi_entry_points[hr.u.s.adapter_index] = entry_point_func; hpi_entry_points[hr.u.s.adapter_index] = entry_point_func;

View File

@ -1303,8 +1303,10 @@ static int snd_hdsp_midi_output_possible (struct hdsp *hdsp, int id)
static void snd_hdsp_flush_midi_input (struct hdsp *hdsp, int id) static void snd_hdsp_flush_midi_input (struct hdsp *hdsp, int id)
{ {
while (snd_hdsp_midi_input_available (hdsp, id)) int count = 256;
snd_hdsp_midi_read_byte (hdsp, id);
while (snd_hdsp_midi_input_available(hdsp, id) && --count)
snd_hdsp_midi_read_byte(hdsp, id);
} }
static int snd_hdsp_midi_output_write (struct hdsp_midi *hmidi) static int snd_hdsp_midi_output_write (struct hdsp_midi *hmidi)

View File

@ -1839,8 +1839,10 @@ static inline int snd_hdspm_midi_output_possible (struct hdspm *hdspm, int id)
static void snd_hdspm_flush_midi_input(struct hdspm *hdspm, int id) static void snd_hdspm_flush_midi_input(struct hdspm *hdspm, int id)
{ {
while (snd_hdspm_midi_input_available (hdspm, id)) int count = 256;
snd_hdspm_midi_read_byte (hdspm, id);
while (snd_hdspm_midi_input_available(hdspm, id) && --count)
snd_hdspm_midi_read_byte(hdspm, id);
} }
static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi) static int snd_hdspm_midi_output_write (struct hdspm_midi *hmidi)

View File

@ -556,6 +556,12 @@ static const struct usb_audio_device_name usb_audio_names[] = {
/* Creative/Toshiba Multimedia Center SB-0500 */ /* Creative/Toshiba Multimedia Center SB-0500 */
DEVICE_NAME(0x041e, 0x3048, "Toshiba", "SB-0500"), DEVICE_NAME(0x041e, 0x3048, "Toshiba", "SB-0500"),
/* Logitech Audio Devices */
DEVICE_NAME(0x046d, 0x0867, "Logitech, Inc.", "Logi-MeetUp"),
DEVICE_NAME(0x046d, 0x0874, "Logitech, Inc.", "Logi-Tap-Audio"),
DEVICE_NAME(0x046d, 0x087c, "Logitech, Inc.", "Logi-Huddle"),
DEVICE_NAME(0x046d, 0x0898, "Logitech, Inc.", "Logi-RB-Audio"),
DEVICE_NAME(0x046d, 0x08d2, "Logitech, Inc.", "Logi-RBM-Audio"),
DEVICE_NAME(0x046d, 0x0990, "Logitech, Inc.", "QuickCam Pro 9000"), DEVICE_NAME(0x046d, 0x0990, "Logitech, Inc.", "QuickCam Pro 9000"),
/* ASUS ROG Zenith II: this machine has also two devices, one for /* ASUS ROG Zenith II: this machine has also two devices, one for

View File

@ -35,6 +35,83 @@
.bInterfaceClass = USB_CLASS_AUDIO, \ .bInterfaceClass = USB_CLASS_AUDIO, \
.bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL .bInterfaceSubClass = USB_SUBCLASS_AUDIOCONTROL
/* Quirk .driver_info, followed by the definition of the quirk entry;
* put like QUIRK_DRIVER_INFO { ... } in each entry of the quirk table
*/
#define QUIRK_DRIVER_INFO \
.driver_info = (unsigned long)&(const struct snd_usb_audio_quirk)
/*
* Macros for quirk data entries
*/
/* Quirk data entry for ignoring the interface */
#define QUIRK_DATA_IGNORE(_ifno) \
.ifnum = (_ifno), .type = QUIRK_IGNORE_INTERFACE
/* Quirk data entry for a standard audio interface */
#define QUIRK_DATA_STANDARD_AUDIO(_ifno) \
.ifnum = (_ifno), .type = QUIRK_AUDIO_STANDARD_INTERFACE
/* Quirk data entry for a standard MIDI interface */
#define QUIRK_DATA_STANDARD_MIDI(_ifno) \
.ifnum = (_ifno), .type = QUIRK_MIDI_STANDARD_INTERFACE
/* Quirk data entry for a standard mixer interface */
#define QUIRK_DATA_STANDARD_MIXER(_ifno) \
.ifnum = (_ifno), .type = QUIRK_AUDIO_STANDARD_MIXER
/* Quirk data entry for Yamaha MIDI */
#define QUIRK_DATA_MIDI_YAMAHA(_ifno) \
.ifnum = (_ifno), .type = QUIRK_MIDI_YAMAHA
/* Quirk data entry for Edirol UAxx */
#define QUIRK_DATA_EDIROL_UAXX(_ifno) \
.ifnum = (_ifno), .type = QUIRK_AUDIO_EDIROL_UAXX
/* Quirk data entry for raw bytes interface */
#define QUIRK_DATA_RAW_BYTES(_ifno) \
.ifnum = (_ifno), .type = QUIRK_MIDI_RAW_BYTES
/* Quirk composite array terminator */
#define QUIRK_COMPOSITE_END { .ifnum = -1 }
/* Quirk data entry for composite quirks;
* followed by the quirk array that is terminated with QUIRK_COMPOSITE_END
* e.g. QUIRK_DATA_COMPOSITE { { quirk1 }, { quirk2 },..., QUIRK_COMPOSITE_END }
*/
#define QUIRK_DATA_COMPOSITE \
.ifnum = QUIRK_ANY_INTERFACE, \
.type = QUIRK_COMPOSITE, \
.data = &(const struct snd_usb_audio_quirk[])
/* Quirk data entry for a fixed audio endpoint;
* followed by audioformat definition
* e.g. QUIRK_DATA_AUDIOFORMAT(n) { .formats = xxx, ... }
*/
#define QUIRK_DATA_AUDIOFORMAT(_ifno) \
.ifnum = (_ifno), \
.type = QUIRK_AUDIO_FIXED_ENDPOINT, \
.data = &(const struct audioformat)
/* Quirk data entry for a fixed MIDI endpoint;
* followed by snd_usb_midi_endpoint_info definition
* e.g. QUIRK_DATA_MIDI_FIXED_ENDPOINT(n) { .out_cables = x, .in_cables = y }
*/
#define QUIRK_DATA_MIDI_FIXED_ENDPOINT(_ifno) \
.ifnum = (_ifno), \
.type = QUIRK_MIDI_FIXED_ENDPOINT, \
.data = &(const struct snd_usb_midi_endpoint_info)
/* Quirk data entry for a MIDIMAN MIDI endpoint */
#define QUIRK_DATA_MIDI_MIDIMAN(_ifno) \
.ifnum = (_ifno), \
.type = QUIRK_MIDI_MIDIMAN, \
.data = &(const struct snd_usb_midi_endpoint_info)
/* Quirk data entry for a EMAGIC MIDI endpoint */
#define QUIRK_DATA_MIDI_EMAGIC(_ifno) \
.ifnum = (_ifno), \
.type = QUIRK_MIDI_EMAGIC, \
.data = &(const struct snd_usb_midi_endpoint_info)
/*
* Here we go... the quirk table definition begins:
*/
/* FTDI devices */ /* FTDI devices */
{ {
USB_DEVICE(0x0403, 0xb8d8), USB_DEVICE(0x0403, 0xb8d8),