Merge a68a0262ab
("mm/madvise: remove racy mm ownership check") into android-mainline
Steps on the way to 5.10-rc8/final Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I0d1e2f396425894a7c2e9a2680edf763a223c644
This commit is contained in:
@@ -71,7 +71,7 @@
|
||||
FUNC_NAME: /* %o0=src, %o1=dst, %o2=len */
|
||||
LOAD(prefetch, %o0 + 0x000, #n_reads)
|
||||
xor %o0, %o1, %g1
|
||||
mov 1, %o3
|
||||
mov -1, %o3
|
||||
clr %o4
|
||||
andcc %g1, 0x3, %g0
|
||||
bne,pn %icc, 95f
|
||||
|
@@ -37,7 +37,6 @@
|
||||
#include <linux/poll.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/irq_poll.h>
|
||||
#include <linux/blk-mq-pci.h>
|
||||
|
||||
#include <scsi/scsi.h>
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
@@ -114,10 +113,6 @@ unsigned int enable_sdev_max_qd;
|
||||
module_param(enable_sdev_max_qd, int, 0444);
|
||||
MODULE_PARM_DESC(enable_sdev_max_qd, "Enable sdev max qd as can_queue. Default: 0");
|
||||
|
||||
int host_tagset_enable = 1;
|
||||
module_param(host_tagset_enable, int, 0444);
|
||||
MODULE_PARM_DESC(host_tagset_enable, "Shared host tagset enable/disable Default: enable(1)");
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION(MEGASAS_VERSION);
|
||||
MODULE_AUTHOR("megaraidlinux.pdl@broadcom.com");
|
||||
@@ -3124,19 +3119,6 @@ megasas_bios_param(struct scsi_device *sdev, struct block_device *bdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int megasas_map_queues(struct Scsi_Host *shost)
|
||||
{
|
||||
struct megasas_instance *instance;
|
||||
|
||||
instance = (struct megasas_instance *)shost->hostdata;
|
||||
|
||||
if (shost->nr_hw_queues == 1)
|
||||
return 0;
|
||||
|
||||
return blk_mq_pci_map_queues(&shost->tag_set.map[HCTX_TYPE_DEFAULT],
|
||||
instance->pdev, instance->low_latency_index_start);
|
||||
}
|
||||
|
||||
static void megasas_aen_polling(struct work_struct *work);
|
||||
|
||||
/**
|
||||
@@ -3445,7 +3427,6 @@ static struct scsi_host_template megasas_template = {
|
||||
.eh_timed_out = megasas_reset_timer,
|
||||
.shost_attrs = megaraid_host_attrs,
|
||||
.bios_param = megasas_bios_param,
|
||||
.map_queues = megasas_map_queues,
|
||||
.change_queue_depth = scsi_change_queue_depth,
|
||||
.max_segment_size = 0xffffffff,
|
||||
};
|
||||
@@ -6827,26 +6808,6 @@ static int megasas_io_attach(struct megasas_instance *instance)
|
||||
host->max_lun = MEGASAS_MAX_LUN;
|
||||
host->max_cmd_len = 16;
|
||||
|
||||
/* Use shared host tagset only for fusion adaptors
|
||||
* if there are managed interrupts (smp affinity enabled case).
|
||||
* Single msix_vectors in kdump, so shared host tag is also disabled.
|
||||
*/
|
||||
|
||||
host->host_tagset = 0;
|
||||
host->nr_hw_queues = 1;
|
||||
|
||||
if ((instance->adapter_type != MFI_SERIES) &&
|
||||
(instance->msix_vectors > instance->low_latency_index_start) &&
|
||||
host_tagset_enable &&
|
||||
instance->smp_affinity_enable) {
|
||||
host->host_tagset = 1;
|
||||
host->nr_hw_queues = instance->msix_vectors -
|
||||
instance->low_latency_index_start;
|
||||
}
|
||||
|
||||
dev_info(&instance->pdev->dev,
|
||||
"Max firmware commands: %d shared with nr_hw_queues = %d\n",
|
||||
instance->max_fw_cmds, host->nr_hw_queues);
|
||||
/*
|
||||
* Notify the mid-layer about the new controller
|
||||
*/
|
||||
|
@@ -359,29 +359,24 @@ megasas_get_msix_index(struct megasas_instance *instance,
|
||||
{
|
||||
int sdev_busy;
|
||||
|
||||
/* TBD - if sml remove device_busy in future, driver
|
||||
* should track counter in internal structure.
|
||||
*/
|
||||
sdev_busy = atomic_read(&scmd->device->device_busy);
|
||||
/* nr_hw_queue = 1 for MegaRAID */
|
||||
struct blk_mq_hw_ctx *hctx =
|
||||
scmd->device->request_queue->queue_hw_ctx[0];
|
||||
|
||||
sdev_busy = atomic_read(&hctx->nr_active);
|
||||
|
||||
if (instance->perf_mode == MR_BALANCED_PERF_MODE &&
|
||||
sdev_busy > (data_arms * MR_DEVICE_HIGH_IOPS_DEPTH)) {
|
||||
sdev_busy > (data_arms * MR_DEVICE_HIGH_IOPS_DEPTH))
|
||||
cmd->request_desc->SCSIIO.MSIxIndex =
|
||||
mega_mod64((atomic64_add_return(1, &instance->high_iops_outstanding) /
|
||||
MR_HIGH_IOPS_BATCH_COUNT), instance->low_latency_index_start);
|
||||
} else if (instance->msix_load_balance) {
|
||||
else if (instance->msix_load_balance)
|
||||
cmd->request_desc->SCSIIO.MSIxIndex =
|
||||
(mega_mod64(atomic64_add_return(1, &instance->total_io_count),
|
||||
instance->msix_vectors));
|
||||
} else if (instance->host->nr_hw_queues > 1) {
|
||||
u32 tag = blk_mq_unique_tag(scmd->request);
|
||||
|
||||
cmd->request_desc->SCSIIO.MSIxIndex = blk_mq_unique_tag_to_hwq(tag) +
|
||||
instance->low_latency_index_start;
|
||||
} else {
|
||||
else
|
||||
cmd->request_desc->SCSIIO.MSIxIndex =
|
||||
instance->reply_map[raw_smp_processor_id()];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -961,6 +956,9 @@ megasas_alloc_cmds_fusion(struct megasas_instance *instance)
|
||||
if (megasas_alloc_cmdlist_fusion(instance))
|
||||
goto fail_exit;
|
||||
|
||||
dev_info(&instance->pdev->dev, "Configured max firmware commands: %d\n",
|
||||
instance->max_fw_cmds);
|
||||
|
||||
/* The first 256 bytes (SMID 0) is not used. Don't add to the cmd list */
|
||||
io_req_base = fusion->io_request_frames + MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE;
|
||||
io_req_base_phys = fusion->io_request_frames_phys + MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE;
|
||||
@@ -1104,9 +1102,8 @@ megasas_ioc_init_fusion(struct megasas_instance *instance)
|
||||
MR_HIGH_IOPS_QUEUE_COUNT) && cur_intr_coalescing)
|
||||
instance->perf_mode = MR_BALANCED_PERF_MODE;
|
||||
|
||||
dev_info(&instance->pdev->dev, "Performance mode :%s (latency index = %d)\n",
|
||||
MEGASAS_PERF_MODE_2STR(instance->perf_mode),
|
||||
instance->low_latency_index_start);
|
||||
dev_info(&instance->pdev->dev, "Performance mode :%s\n",
|
||||
MEGASAS_PERF_MODE_2STR(instance->perf_mode));
|
||||
|
||||
instance->fw_sync_cache_support = (scratch_pad_1 &
|
||||
MR_CAN_HANDLE_SYNC_CACHE_OFFSET) ? 1 : 0;
|
||||
|
@@ -230,6 +230,9 @@ static int afs_parse_source(struct fs_context *fc, struct fs_parameter *param)
|
||||
|
||||
_enter(",%s", name);
|
||||
|
||||
if (fc->source)
|
||||
return invalf(fc, "kAFS: Multiple sources not supported");
|
||||
|
||||
if (!name) {
|
||||
printk(KERN_ERR "kAFS: no volume name specified\n");
|
||||
return -EINVAL;
|
||||
|
@@ -168,12 +168,14 @@ EXPORT_SYMBOL(seq_read);
|
||||
ssize_t seq_read_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
{
|
||||
struct seq_file *m = iocb->ki_filp->private_data;
|
||||
size_t size = iov_iter_count(iter);
|
||||
size_t copied = 0;
|
||||
size_t n;
|
||||
void *p;
|
||||
int err = 0;
|
||||
|
||||
if (!iov_iter_count(iter))
|
||||
return 0;
|
||||
|
||||
mutex_lock(&m->lock);
|
||||
|
||||
/*
|
||||
@@ -206,36 +208,34 @@ ssize_t seq_read_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
if (!m->buf)
|
||||
goto Enomem;
|
||||
}
|
||||
/* if not empty - flush it first */
|
||||
// something left in the buffer - copy it out first
|
||||
if (m->count) {
|
||||
n = min(m->count, size);
|
||||
if (copy_to_iter(m->buf + m->from, n, iter) != n)
|
||||
goto Efault;
|
||||
n = copy_to_iter(m->buf + m->from, m->count, iter);
|
||||
m->count -= n;
|
||||
m->from += n;
|
||||
size -= n;
|
||||
copied += n;
|
||||
if (!size)
|
||||
if (m->count) // hadn't managed to copy everything
|
||||
goto Done;
|
||||
}
|
||||
/* we need at least one record in buffer */
|
||||
// get a non-empty record in the buffer
|
||||
m->from = 0;
|
||||
p = m->op->start(m, &m->index);
|
||||
while (1) {
|
||||
err = PTR_ERR(p);
|
||||
if (!p || IS_ERR(p))
|
||||
if (!p || IS_ERR(p)) // EOF or an error
|
||||
break;
|
||||
err = m->op->show(m, p);
|
||||
if (err < 0)
|
||||
if (err < 0) // hard error
|
||||
break;
|
||||
if (unlikely(err))
|
||||
if (unlikely(err)) // ->show() says "skip it"
|
||||
m->count = 0;
|
||||
if (unlikely(!m->count)) {
|
||||
if (unlikely(!m->count)) { // empty record
|
||||
p = m->op->next(m, p, &m->index);
|
||||
continue;
|
||||
}
|
||||
if (m->count < m->size)
|
||||
if (!seq_has_overflowed(m)) // got it
|
||||
goto Fill;
|
||||
// need a bigger buffer
|
||||
m->op->stop(m, p);
|
||||
kvfree(m->buf);
|
||||
m->count = 0;
|
||||
@@ -244,11 +244,14 @@ ssize_t seq_read_iter(struct kiocb *iocb, struct iov_iter *iter)
|
||||
goto Enomem;
|
||||
p = m->op->start(m, &m->index);
|
||||
}
|
||||
// EOF or an error
|
||||
m->op->stop(m, p);
|
||||
m->count = 0;
|
||||
goto Done;
|
||||
Fill:
|
||||
/* they want more? let's try to get some more */
|
||||
// one non-empty record is in the buffer; if they want more,
|
||||
// try to fit more in, but in any case we need to advance
|
||||
// the iterator once for every record shown.
|
||||
while (1) {
|
||||
size_t offs = m->count;
|
||||
loff_t pos = m->index;
|
||||
@@ -259,30 +262,27 @@ Fill:
|
||||
m->op->next);
|
||||
m->index++;
|
||||
}
|
||||
if (!p || IS_ERR(p)) {
|
||||
err = PTR_ERR(p);
|
||||
if (!p || IS_ERR(p)) // no next record for us
|
||||
break;
|
||||
}
|
||||
if (m->count >= size)
|
||||
if (m->count >= iov_iter_count(iter))
|
||||
break;
|
||||
err = m->op->show(m, p);
|
||||
if (seq_has_overflowed(m) || err) {
|
||||
if (err > 0) { // ->show() says "skip it"
|
||||
m->count = offs;
|
||||
if (likely(err <= 0))
|
||||
break;
|
||||
} else if (err || seq_has_overflowed(m)) {
|
||||
m->count = offs;
|
||||
break;
|
||||
}
|
||||
}
|
||||
m->op->stop(m, p);
|
||||
n = min(m->count, size);
|
||||
if (copy_to_iter(m->buf, n, iter) != n)
|
||||
goto Efault;
|
||||
n = copy_to_iter(m->buf, m->count, iter);
|
||||
copied += n;
|
||||
m->count -= n;
|
||||
m->from = n;
|
||||
Done:
|
||||
if (!copied)
|
||||
copied = err;
|
||||
else {
|
||||
if (unlikely(!copied)) {
|
||||
copied = m->count ? -EFAULT : err;
|
||||
} else {
|
||||
iocb->ki_pos += copied;
|
||||
m->read_pos += copied;
|
||||
}
|
||||
@@ -291,9 +291,6 @@ Done:
|
||||
Enomem:
|
||||
err = -ENOMEM;
|
||||
goto Done;
|
||||
Efault:
|
||||
err = -EFAULT;
|
||||
goto Done;
|
||||
}
|
||||
EXPORT_SYMBOL(seq_read_iter);
|
||||
|
||||
|
@@ -163,7 +163,8 @@ static union trace_eval_map_item *trace_eval_maps;
|
||||
#endif /* CONFIG_TRACE_EVAL_MAP_FILE */
|
||||
|
||||
int tracing_set_tracer(struct trace_array *tr, const char *buf);
|
||||
static void ftrace_trace_userstack(struct trace_buffer *buffer,
|
||||
static void ftrace_trace_userstack(struct trace_array *tr,
|
||||
struct trace_buffer *buffer,
|
||||
unsigned long flags, int pc);
|
||||
|
||||
#define MAX_TRACER_SIZE 100
|
||||
@@ -2870,7 +2871,7 @@ void trace_buffer_unlock_commit_regs(struct trace_array *tr,
|
||||
* two. They are not that meaningful.
|
||||
*/
|
||||
ftrace_trace_stack(tr, buffer, flags, regs ? 0 : STACK_SKIP, pc, regs);
|
||||
ftrace_trace_userstack(buffer, flags, pc);
|
||||
ftrace_trace_userstack(tr, buffer, flags, pc);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3056,13 +3057,14 @@ EXPORT_SYMBOL_GPL(trace_dump_stack);
|
||||
static DEFINE_PER_CPU(int, user_stack_count);
|
||||
|
||||
static void
|
||||
ftrace_trace_userstack(struct trace_buffer *buffer, unsigned long flags, int pc)
|
||||
ftrace_trace_userstack(struct trace_array *tr,
|
||||
struct trace_buffer *buffer, unsigned long flags, int pc)
|
||||
{
|
||||
struct trace_event_call *call = &event_user_stack;
|
||||
struct ring_buffer_event *event;
|
||||
struct userstack_entry *entry;
|
||||
|
||||
if (!(global_trace.trace_flags & TRACE_ITER_USERSTACKTRACE))
|
||||
if (!(tr->trace_flags & TRACE_ITER_USERSTACKTRACE))
|
||||
return;
|
||||
|
||||
/*
|
||||
@@ -3101,7 +3103,8 @@ ftrace_trace_userstack(struct trace_buffer *buffer, unsigned long flags, int pc)
|
||||
preempt_enable();
|
||||
}
|
||||
#else /* CONFIG_USER_STACKTRACE_SUPPORT */
|
||||
static void ftrace_trace_userstack(struct trace_buffer *buffer,
|
||||
static void ftrace_trace_userstack(struct trace_array *tr,
|
||||
struct trace_buffer *buffer,
|
||||
unsigned long flags, int pc)
|
||||
{
|
||||
}
|
||||
|
@@ -1204,8 +1204,7 @@ SYSCALL_DEFINE5(process_madvise, int, pidfd, const struct iovec __user *, vec,
|
||||
goto put_pid;
|
||||
}
|
||||
|
||||
if (task->mm != current->mm &&
|
||||
!process_madvise_behavior_valid(behavior)) {
|
||||
if (!process_madvise_behavior_valid(behavior)) {
|
||||
ret = -EINVAL;
|
||||
goto release_task;
|
||||
}
|
||||
|
Reference in New Issue
Block a user