Merge cb36eabcaf ("Merge tag 'perf-urgent-2026-03-01' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip") into android-mainline
Steps on the way to v7.0-rc2 Change-Id: If90b62d1bc20b7a052cc25c0b72363d31c15002a Signed-off-by: Carlos Llamas <cmllamas@google.com>
This commit is contained in:
commit
cede4856e7
17 files changed
+233
-94
No files matched your search
@@ -6212,6 +6212,7 @@ F: drivers/scsi/fnic/
|
||||
|
||||
CISCO SCSI HBA DRIVER
|
||||
M: Karan Tilak Kumar <kartilak@cisco.com>
|
||||
M: Narsimhulu Musini <nmusini@cisco.com>
|
||||
M: Sesidhar Baddela <sebaddel@cisco.com>
|
||||
L: linux-scsi@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
@@ -6497,6 +6497,32 @@ static struct intel_uncore_type gnr_uncore_ubox = {
|
||||
.attr_update = uncore_alias_groups,
|
||||
};
|
||||
|
||||
static struct uncore_event_desc gnr_uncore_imc_events[] = {
|
||||
INTEL_UNCORE_EVENT_DESC(clockticks, "event=0x01,umask=0x00"),
|
||||
INTEL_UNCORE_EVENT_DESC(cas_count_read_sch0, "event=0x05,umask=0xcf"),
|
||||
INTEL_UNCORE_EVENT_DESC(cas_count_read_sch0.scale, "6.103515625e-5"),
|
||||
INTEL_UNCORE_EVENT_DESC(cas_count_read_sch0.unit, "MiB"),
|
||||
INTEL_UNCORE_EVENT_DESC(cas_count_read_sch1, "event=0x06,umask=0xcf"),
|
||||
INTEL_UNCORE_EVENT_DESC(cas_count_read_sch1.scale, "6.103515625e-5"),
|
||||
INTEL_UNCORE_EVENT_DESC(cas_count_read_sch1.unit, "MiB"),
|
||||
INTEL_UNCORE_EVENT_DESC(cas_count_write_sch0, "event=0x05,umask=0xf0"),
|
||||
INTEL_UNCORE_EVENT_DESC(cas_count_write_sch0.scale, "6.103515625e-5"),
|
||||
INTEL_UNCORE_EVENT_DESC(cas_count_write_sch0.unit, "MiB"),
|
||||
INTEL_UNCORE_EVENT_DESC(cas_count_write_sch1, "event=0x06,umask=0xf0"),
|
||||
INTEL_UNCORE_EVENT_DESC(cas_count_write_sch1.scale, "6.103515625e-5"),
|
||||
INTEL_UNCORE_EVENT_DESC(cas_count_write_sch1.unit, "MiB"),
|
||||
{ /* end: all zeroes */ },
|
||||
};
|
||||
|
||||
static struct intel_uncore_type gnr_uncore_imc = {
|
||||
SPR_UNCORE_MMIO_COMMON_FORMAT(),
|
||||
.name = "imc",
|
||||
.fixed_ctr_bits = 48,
|
||||
.fixed_ctr = SNR_IMC_MMIO_PMON_FIXED_CTR,
|
||||
.fixed_ctl = SNR_IMC_MMIO_PMON_FIXED_CTL,
|
||||
.event_descs = gnr_uncore_imc_events,
|
||||
};
|
||||
|
||||
static struct intel_uncore_type gnr_uncore_pciex8 = {
|
||||
SPR_UNCORE_PCI_COMMON_FORMAT(),
|
||||
.name = "pciex8",
|
||||
@@ -6544,7 +6570,7 @@ static struct intel_uncore_type *gnr_uncores[UNCORE_GNR_NUM_UNCORE_TYPES] = {
|
||||
NULL,
|
||||
&spr_uncore_pcu,
|
||||
&gnr_uncore_ubox,
|
||||
&spr_uncore_imc,
|
||||
&gnr_uncore_imc,
|
||||
NULL,
|
||||
&gnr_uncore_upi,
|
||||
NULL,
|
||||
|
||||
@@ -3474,6 +3474,7 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id,
|
||||
int lpi_base;
|
||||
int nr_lpis;
|
||||
int nr_ites;
|
||||
int id_bits;
|
||||
int sz;
|
||||
|
||||
if (!its_alloc_device_table(its, dev_id))
|
||||
@@ -3485,7 +3486,10 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id,
|
||||
/*
|
||||
* Even if the device wants a single LPI, the ITT must be
|
||||
* sized as a power of two (and you need at least one bit...).
|
||||
* Also honor the ITS's own EID limit.
|
||||
*/
|
||||
id_bits = FIELD_GET(GITS_TYPER_IDBITS, its->typer) + 1;
|
||||
nvecs = min_t(unsigned int, nvecs, BIT(id_bits));
|
||||
nr_ites = max(2, nvecs);
|
||||
sz = nr_ites * (FIELD_GET(GITS_TYPER_ITT_ENTRY_SIZE, its->typer) + 1);
|
||||
sz = max(sz, ITS_ITT_ALIGN);
|
||||
|
||||
@@ -125,32 +125,45 @@ static const struct irq_domain_ops extirq_domain_ops = {
|
||||
static int
|
||||
ls_extirq_parse_map(struct ls_extirq_data *priv, struct device_node *node)
|
||||
{
|
||||
struct of_imap_parser imap_parser;
|
||||
struct of_imap_item imap_item;
|
||||
const __be32 *map;
|
||||
u32 mapsize;
|
||||
int ret;
|
||||
|
||||
ret = of_imap_parser_init(&imap_parser, node, &imap_item);
|
||||
if (ret)
|
||||
return ret;
|
||||
map = of_get_property(node, "interrupt-map", &mapsize);
|
||||
if (!map)
|
||||
return -ENOENT;
|
||||
if (mapsize % sizeof(*map))
|
||||
return -EINVAL;
|
||||
mapsize /= sizeof(*map);
|
||||
|
||||
for_each_of_imap_item(&imap_parser, &imap_item) {
|
||||
while (mapsize) {
|
||||
struct device_node *ipar;
|
||||
u32 hwirq;
|
||||
int i;
|
||||
u32 hwirq, intsize, j;
|
||||
|
||||
hwirq = imap_item.child_imap[0];
|
||||
if (hwirq >= MAXIRQ) {
|
||||
of_node_put(imap_item.parent_args.np);
|
||||
if (mapsize < 3)
|
||||
return -EINVAL;
|
||||
hwirq = be32_to_cpup(map);
|
||||
if (hwirq >= MAXIRQ)
|
||||
return -EINVAL;
|
||||
}
|
||||
priv->nirq = max(priv->nirq, hwirq + 1);
|
||||
|
||||
ipar = of_node_get(imap_item.parent_args.np);
|
||||
priv->map[hwirq].fwnode = of_fwnode_handle(ipar);
|
||||
ipar = of_find_node_by_phandle(be32_to_cpup(map + 2));
|
||||
map += 3;
|
||||
mapsize -= 3;
|
||||
if (!ipar)
|
||||
return -EINVAL;
|
||||
priv->map[hwirq].fwnode = &ipar->fwnode;
|
||||
ret = of_property_read_u32(ipar, "#interrupt-cells", &intsize);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
priv->map[hwirq].param_count = imap_item.parent_args.args_count;
|
||||
for (i = 0; i < priv->map[hwirq].param_count; i++)
|
||||
priv->map[hwirq].param[i] = imap_item.parent_args.args[i];
|
||||
if (intsize > mapsize)
|
||||
return -EINVAL;
|
||||
|
||||
priv->map[hwirq].param_count = intsize;
|
||||
for (j = 0; j < intsize; ++j)
|
||||
priv->map[hwirq].param[j] = be32_to_cpup(map++);
|
||||
mapsize -= intsize;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -177,8 +190,10 @@ static int ls_extirq_probe(struct platform_device *pdev)
|
||||
return dev_err_probe(dev, -ENOMEM, "Failed to allocate memory\n");
|
||||
|
||||
priv->intpcr = devm_of_iomap(dev, node, 0, NULL);
|
||||
if (!priv->intpcr)
|
||||
return dev_err_probe(dev, -ENOMEM, "Cannot ioremap OF node %pOF\n", node);
|
||||
if (IS_ERR(priv->intpcr)) {
|
||||
return dev_err_probe(dev, PTR_ERR(priv->intpcr),
|
||||
"Cannot ioremap OF node %pOF\n", node);
|
||||
}
|
||||
|
||||
ret = ls_extirq_parse_map(priv, node);
|
||||
if (ret)
|
||||
|
||||
@@ -136,7 +136,7 @@ static void icu_unmask_irq(struct irq_data *d)
|
||||
}
|
||||
}
|
||||
|
||||
struct irq_chip icu_irq_chip = {
|
||||
static const struct irq_chip icu_irq_chip = {
|
||||
.name = "icu_irq",
|
||||
.irq_mask = icu_mask_irq,
|
||||
.irq_mask_ack = icu_mask_ack_irq,
|
||||
|
||||
@@ -172,8 +172,13 @@ static void plic_irq_disable(struct irq_data *d)
|
||||
static void plic_irq_eoi(struct irq_data *d)
|
||||
{
|
||||
struct plic_handler *handler = this_cpu_ptr(&plic_handlers);
|
||||
u32 __iomem *reg;
|
||||
bool enabled;
|
||||
|
||||
if (unlikely(irqd_irq_disabled(d))) {
|
||||
reg = handler->enable_base + (d->hwirq / 32) * sizeof(u32);
|
||||
enabled = readl(reg) & BIT(d->hwirq % 32);
|
||||
|
||||
if (unlikely(!enabled)) {
|
||||
plic_toggle(handler, d->hwirq, 1);
|
||||
writel(d->hwirq, handler->hart_base + CONTEXT_CLAIM);
|
||||
plic_toggle(handler, d->hwirq, 0);
|
||||
|
||||
@@ -12025,6 +12025,8 @@ lpfc_sli4_pci_mem_unset(struct lpfc_hba *phba)
|
||||
iounmap(phba->sli4_hba.conf_regs_memmap_p);
|
||||
if (phba->sli4_hba.dpp_regs_memmap_p)
|
||||
iounmap(phba->sli4_hba.dpp_regs_memmap_p);
|
||||
if (phba->sli4_hba.dpp_regs_memmap_wc_p)
|
||||
iounmap(phba->sli4_hba.dpp_regs_memmap_wc_p);
|
||||
break;
|
||||
case LPFC_SLI_INTF_IF_TYPE_1:
|
||||
break;
|
||||
|
||||
@@ -15977,6 +15977,32 @@ lpfc_dual_chute_pci_bar_map(struct lpfc_hba *phba, uint16_t pci_barset)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static __maybe_unused void __iomem *
|
||||
lpfc_dpp_wc_map(struct lpfc_hba *phba, uint8_t dpp_barset)
|
||||
{
|
||||
|
||||
/* DPP region is supposed to cover 64-bit BAR2 */
|
||||
if (dpp_barset != WQ_PCI_BAR_4_AND_5) {
|
||||
lpfc_log_msg(phba, KERN_WARNING, LOG_INIT,
|
||||
"3273 dpp_barset x%x != WQ_PCI_BAR_4_AND_5\n",
|
||||
dpp_barset);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!phba->sli4_hba.dpp_regs_memmap_wc_p) {
|
||||
void __iomem *dpp_map;
|
||||
|
||||
dpp_map = ioremap_wc(phba->pci_bar2_map,
|
||||
pci_resource_len(phba->pcidev,
|
||||
PCI_64BIT_BAR4));
|
||||
|
||||
if (dpp_map)
|
||||
phba->sli4_hba.dpp_regs_memmap_wc_p = dpp_map;
|
||||
}
|
||||
|
||||
return phba->sli4_hba.dpp_regs_memmap_wc_p;
|
||||
}
|
||||
|
||||
/**
|
||||
* lpfc_modify_hba_eq_delay - Modify Delay Multiplier on EQs
|
||||
* @phba: HBA structure that EQs are on.
|
||||
@@ -16940,9 +16966,6 @@ lpfc_wq_create(struct lpfc_hba *phba, struct lpfc_queue *wq,
|
||||
uint8_t dpp_barset;
|
||||
uint32_t dpp_offset;
|
||||
uint8_t wq_create_version;
|
||||
#ifdef CONFIG_X86
|
||||
unsigned long pg_addr;
|
||||
#endif
|
||||
|
||||
/* sanity check on queue memory */
|
||||
if (!wq || !cq)
|
||||
@@ -17128,14 +17151,15 @@ lpfc_wq_create(struct lpfc_hba *phba, struct lpfc_queue *wq,
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
/* Enable combined writes for DPP aperture */
|
||||
pg_addr = (unsigned long)(wq->dpp_regaddr) & PAGE_MASK;
|
||||
rc = set_memory_wc(pg_addr, 1);
|
||||
if (rc) {
|
||||
bar_memmap_p = lpfc_dpp_wc_map(phba, dpp_barset);
|
||||
if (!bar_memmap_p) {
|
||||
lpfc_printf_log(phba, KERN_ERR, LOG_INIT,
|
||||
"3272 Cannot setup Combined "
|
||||
"Write on WQ[%d] - disable DPP\n",
|
||||
wq->queue_id);
|
||||
phba->cfg_enable_dpp = 0;
|
||||
} else {
|
||||
wq->dpp_regaddr = bar_memmap_p + dpp_offset;
|
||||
}
|
||||
#else
|
||||
phba->cfg_enable_dpp = 0;
|
||||
|
||||
@@ -785,6 +785,9 @@ struct lpfc_sli4_hba {
|
||||
void __iomem *dpp_regs_memmap_p; /* Kernel memory mapped address for
|
||||
* dpp registers
|
||||
*/
|
||||
void __iomem *dpp_regs_memmap_wc_p;/* Kernel memory mapped address for
|
||||
* dpp registers with write combining
|
||||
*/
|
||||
union {
|
||||
struct {
|
||||
/* IF Type 0, BAR 0 PCI cfg space reg mem map */
|
||||
|
||||
@@ -4807,21 +4807,25 @@ void mpi3mr_memset_buffers(struct mpi3mr_ioc *mrioc)
|
||||
}
|
||||
|
||||
for (i = 0; i < mrioc->num_queues; i++) {
|
||||
mrioc->op_reply_qinfo[i].qid = 0;
|
||||
mrioc->op_reply_qinfo[i].ci = 0;
|
||||
mrioc->op_reply_qinfo[i].num_replies = 0;
|
||||
mrioc->op_reply_qinfo[i].ephase = 0;
|
||||
atomic_set(&mrioc->op_reply_qinfo[i].pend_ios, 0);
|
||||
atomic_set(&mrioc->op_reply_qinfo[i].in_use, 0);
|
||||
mpi3mr_memset_op_reply_q_buffers(mrioc, i);
|
||||
if (mrioc->op_reply_qinfo) {
|
||||
mrioc->op_reply_qinfo[i].qid = 0;
|
||||
mrioc->op_reply_qinfo[i].ci = 0;
|
||||
mrioc->op_reply_qinfo[i].num_replies = 0;
|
||||
mrioc->op_reply_qinfo[i].ephase = 0;
|
||||
atomic_set(&mrioc->op_reply_qinfo[i].pend_ios, 0);
|
||||
atomic_set(&mrioc->op_reply_qinfo[i].in_use, 0);
|
||||
mpi3mr_memset_op_reply_q_buffers(mrioc, i);
|
||||
}
|
||||
|
||||
mrioc->req_qinfo[i].ci = 0;
|
||||
mrioc->req_qinfo[i].pi = 0;
|
||||
mrioc->req_qinfo[i].num_requests = 0;
|
||||
mrioc->req_qinfo[i].qid = 0;
|
||||
mrioc->req_qinfo[i].reply_qid = 0;
|
||||
spin_lock_init(&mrioc->req_qinfo[i].q_lock);
|
||||
mpi3mr_memset_op_req_q_buffers(mrioc, i);
|
||||
if (mrioc->req_qinfo) {
|
||||
mrioc->req_qinfo[i].ci = 0;
|
||||
mrioc->req_qinfo[i].pi = 0;
|
||||
mrioc->req_qinfo[i].num_requests = 0;
|
||||
mrioc->req_qinfo[i].qid = 0;
|
||||
mrioc->req_qinfo[i].reply_qid = 0;
|
||||
spin_lock_init(&mrioc->req_qinfo[i].q_lock);
|
||||
mpi3mr_memset_op_req_q_buffers(mrioc, i);
|
||||
}
|
||||
}
|
||||
|
||||
atomic_set(&mrioc->pend_large_data_sz, 0);
|
||||
|
||||
@@ -525,8 +525,9 @@ int pm8001_queue_command(struct sas_task *task, gfp_t gfp_flags)
|
||||
} else {
|
||||
task->task_done(task);
|
||||
}
|
||||
rc = -ENODEV;
|
||||
goto err_out;
|
||||
spin_unlock_irqrestore(&pm8001_ha->lock, flags);
|
||||
pm8001_dbg(pm8001_ha, IO, "pm8001_task_exec device gone\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
ccb = pm8001_ccb_alloc(pm8001_ha, pm8001_dev, task);
|
||||
|
||||
+2
-3
@@ -528,9 +528,8 @@ struct efd {
|
||||
};
|
||||
|
||||
static int ses_enclosure_find_by_addr(struct enclosure_device *edev,
|
||||
void *data)
|
||||
struct efd *efd)
|
||||
{
|
||||
struct efd *efd = data;
|
||||
int i;
|
||||
struct ses_component *scomp;
|
||||
|
||||
@@ -683,7 +682,7 @@ static void ses_match_to_enclosure(struct enclosure_device *edev,
|
||||
if (efd.addr) {
|
||||
efd.dev = &sdev->sdev_gendev;
|
||||
|
||||
enclosure_for_each_device(ses_enclosure_find_by_addr, &efd);
|
||||
ses_enclosure_find_by_addr(edev, &efd);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -42,8 +42,6 @@ struct vnic_dev {
|
||||
struct vnic_devcmd_notify *notify;
|
||||
struct vnic_devcmd_notify notify_copy;
|
||||
dma_addr_t notify_pa;
|
||||
u32 *linkstatus;
|
||||
dma_addr_t linkstatus_pa;
|
||||
struct vnic_stats *stats;
|
||||
dma_addr_t stats_pa;
|
||||
struct vnic_devcmd_fw_info *fw_info;
|
||||
@@ -650,8 +648,6 @@ int svnic_dev_init(struct vnic_dev *vdev, int arg)
|
||||
|
||||
int svnic_dev_link_status(struct vnic_dev *vdev)
|
||||
{
|
||||
if (vdev->linkstatus)
|
||||
return *vdev->linkstatus;
|
||||
|
||||
if (!vnic_dev_notify_ready(vdev))
|
||||
return 0;
|
||||
@@ -686,11 +682,6 @@ void svnic_dev_unregister(struct vnic_dev *vdev)
|
||||
sizeof(struct vnic_devcmd_notify),
|
||||
vdev->notify,
|
||||
vdev->notify_pa);
|
||||
if (vdev->linkstatus)
|
||||
dma_free_coherent(&vdev->pdev->dev,
|
||||
sizeof(u32),
|
||||
vdev->linkstatus,
|
||||
vdev->linkstatus_pa);
|
||||
if (vdev->stats)
|
||||
dma_free_coherent(&vdev->pdev->dev,
|
||||
sizeof(struct vnic_stats),
|
||||
|
||||
@@ -1856,8 +1856,9 @@ static enum scsi_qc_status storvsc_queuecommand(struct Scsi_Host *host,
|
||||
cmd_request->payload_sz = payload_sz;
|
||||
|
||||
/* Invokes the vsc to start an IO */
|
||||
ret = storvsc_do_io(dev, cmd_request, get_cpu());
|
||||
put_cpu();
|
||||
migrate_disable();
|
||||
ret = storvsc_do_io(dev, cmd_request, smp_processor_id());
|
||||
migrate_enable();
|
||||
|
||||
if (ret)
|
||||
scsi_dma_unmap(scmnd);
|
||||
|
||||
+34
-13
@@ -24,6 +24,7 @@
|
||||
#include <linux/pm_opp.h>
|
||||
#include <linux/regulator/consumer.h>
|
||||
#include <linux/sched/clock.h>
|
||||
#include <linux/sizes.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
#include <scsi/scsi_dbg.h>
|
||||
@@ -524,8 +525,8 @@ static void ufshcd_add_command_trace(struct ufs_hba *hba, struct scsi_cmnd *cmd,
|
||||
|
||||
if (hba->mcq_enabled) {
|
||||
struct ufs_hw_queue *hwq = ufshcd_mcq_req_to_hwq(hba, rq);
|
||||
|
||||
hwq_id = hwq->id;
|
||||
if (hwq)
|
||||
hwq_id = hwq->id;
|
||||
} else {
|
||||
doorbell = ufshcd_readl(hba, REG_UTP_TRANSFER_REQ_DOOR_BELL);
|
||||
}
|
||||
@@ -4420,14 +4421,6 @@ out_unlock:
|
||||
spin_unlock_irqrestore(hba->host->host_lock, flags);
|
||||
mutex_unlock(&hba->uic_cmd_mutex);
|
||||
|
||||
/*
|
||||
* If the h8 exit fails during the runtime resume process, it becomes
|
||||
* stuck and cannot be recovered through the error handler. To fix
|
||||
* this, use link recovery instead of the error handler.
|
||||
*/
|
||||
if (ret && hba->pm_op_in_progress)
|
||||
ret = ufshcd_link_recovery(hba);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -5280,6 +5273,25 @@ static void ufshcd_lu_init(struct ufs_hba *hba, struct scsi_device *sdev)
|
||||
hba->dev_info.rpmb_region_size[1] = desc_buf[RPMB_UNIT_DESC_PARAM_REGION1_SIZE];
|
||||
hba->dev_info.rpmb_region_size[2] = desc_buf[RPMB_UNIT_DESC_PARAM_REGION2_SIZE];
|
||||
hba->dev_info.rpmb_region_size[3] = desc_buf[RPMB_UNIT_DESC_PARAM_REGION3_SIZE];
|
||||
|
||||
if (hba->dev_info.wspecversion <= 0x0220) {
|
||||
/*
|
||||
* These older spec chips have only one RPMB region,
|
||||
* sized between 128 kB minimum and 16 MB maximum.
|
||||
* No per region size fields are provided (respective
|
||||
* REGIONX_SIZE fields always contain zeros), so get
|
||||
* it from the logical block count and size fields for
|
||||
* compatibility
|
||||
*
|
||||
* (See JESD220C-2_2 Section 14.1.4.6
|
||||
* RPMB Unit Descriptor,* offset 13h, 4 bytes)
|
||||
*/
|
||||
hba->dev_info.rpmb_region_size[0] =
|
||||
(get_unaligned_be64(desc_buf
|
||||
+ RPMB_UNIT_DESC_PARAM_LOGICAL_BLK_COUNT)
|
||||
<< desc_buf[RPMB_UNIT_DESC_PARAM_LOGICAL_BLK_SIZE])
|
||||
/ SZ_128K;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5995,6 +6007,7 @@ static int ufshcd_disable_auto_bkops(struct ufs_hba *hba)
|
||||
|
||||
hba->auto_bkops_enabled = false;
|
||||
trace_ufshcd_auto_bkops_state(hba, "Disabled");
|
||||
hba->urgent_bkops_lvl = BKOPS_STATUS_PERF_IMPACT;
|
||||
hba->is_urgent_bkops_lvl_checked = false;
|
||||
out:
|
||||
return err;
|
||||
@@ -6099,7 +6112,7 @@ static void ufshcd_bkops_exception_event_handler(struct ufs_hba *hba)
|
||||
* impacted or critical. Handle these device by determining their urgent
|
||||
* bkops status at runtime.
|
||||
*/
|
||||
if (curr_status < BKOPS_STATUS_PERF_IMPACT) {
|
||||
if ((curr_status > BKOPS_STATUS_NO_OP) && (curr_status < BKOPS_STATUS_PERF_IMPACT)) {
|
||||
dev_err(hba->dev, "%s: device raised urgent BKOPS exception for bkops status %d\n",
|
||||
__func__, curr_status);
|
||||
/* update the current status as the urgent bkops level */
|
||||
@@ -7132,7 +7145,7 @@ static irqreturn_t ufshcd_handle_mcq_cq_events(struct ufs_hba *hba)
|
||||
|
||||
ret = ufshcd_vops_get_outstanding_cqs(hba, &outstanding_cqs);
|
||||
if (ret)
|
||||
outstanding_cqs = (1U << hba->nr_hw_queues) - 1;
|
||||
outstanding_cqs = (1ULL << hba->nr_hw_queues) - 1;
|
||||
|
||||
/* Exclude the poll queues */
|
||||
nr_queues = hba->nr_hw_queues - hba->nr_queues[HCTX_TYPE_POLL];
|
||||
@@ -10214,7 +10227,15 @@ static int __ufshcd_wl_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
|
||||
} else {
|
||||
dev_err(hba->dev, "%s: hibern8 exit failed %d\n",
|
||||
__func__, ret);
|
||||
goto vendor_suspend;
|
||||
/*
|
||||
* If the h8 exit fails during the runtime resume
|
||||
* process, it becomes stuck and cannot be recovered
|
||||
* through the error handler. To fix this, use link
|
||||
* recovery instead of the error handler.
|
||||
*/
|
||||
ret = ufshcd_link_recovery(hba);
|
||||
if (ret)
|
||||
goto vendor_suspend;
|
||||
}
|
||||
} else if (ufshcd_is_link_off(hba)) {
|
||||
/*
|
||||
|
||||
@@ -394,6 +394,7 @@
|
||||
#define GITS_TYPER_VLPIS (1UL << 1)
|
||||
#define GITS_TYPER_ITT_ENTRY_SIZE_SHIFT 4
|
||||
#define GITS_TYPER_ITT_ENTRY_SIZE GENMASK_ULL(7, 4)
|
||||
#define GITS_TYPER_IDBITS GENMASK_ULL(12, 8)
|
||||
#define GITS_TYPER_IDBITS_SHIFT 8
|
||||
#define GITS_TYPER_DEVBITS_SHIFT 13
|
||||
#define GITS_TYPER_DEVBITS GENMASK_ULL(17, 13)
|
||||
|
||||
+64
-23
@@ -4138,7 +4138,8 @@ static int merge_sched_in(struct perf_event *event, void *data)
|
||||
if (*perf_event_fasync(event))
|
||||
event->pending_kill = POLL_ERR;
|
||||
|
||||
perf_event_wakeup(event);
|
||||
event->pending_wakeup = 1;
|
||||
irq_work_queue(&event->pending_irq);
|
||||
} else {
|
||||
struct perf_cpu_pmu_context *cpc = this_cpc(event->pmu_ctx->pmu);
|
||||
|
||||
@@ -7465,29 +7466,29 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
ret = perf_mmap_aux(vma, event, nr_pages);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Since pinned accounting is per vm we cannot allow fork() to copy our
|
||||
* vma.
|
||||
*/
|
||||
vm_flags_set(vma, VM_DONTCOPY | VM_DONTEXPAND | VM_DONTDUMP);
|
||||
vma->vm_ops = &perf_mmap_vmops;
|
||||
|
||||
mapped = get_mapped(event, event_mapped);
|
||||
if (mapped)
|
||||
mapped(event, vma->vm_mm);
|
||||
|
||||
/*
|
||||
* Try to map it into the page table. On fail, invoke
|
||||
* perf_mmap_close() to undo the above, as the callsite expects
|
||||
* full cleanup in this case and therefore does not invoke
|
||||
* vmops::close().
|
||||
*/
|
||||
ret = map_range(event->rb, vma);
|
||||
if (ret)
|
||||
perf_mmap_close(vma);
|
||||
}
|
||||
|
||||
/*
|
||||
* Since pinned accounting is per vm we cannot allow fork() to copy our
|
||||
* vma.
|
||||
*/
|
||||
vm_flags_set(vma, VM_DONTCOPY | VM_DONTEXPAND | VM_DONTDUMP);
|
||||
vma->vm_ops = &perf_mmap_vmops;
|
||||
|
||||
mapped = get_mapped(event, event_mapped);
|
||||
if (mapped)
|
||||
mapped(event, vma->vm_mm);
|
||||
|
||||
/*
|
||||
* Try to map it into the page table. On fail, invoke
|
||||
* perf_mmap_close() to undo the above, as the callsite expects
|
||||
* full cleanup in this case and therefore does not invoke
|
||||
* vmops::close().
|
||||
*/
|
||||
ret = map_range(event->rb, vma);
|
||||
if (ret)
|
||||
perf_mmap_close(vma);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -10777,6 +10778,13 @@ int perf_event_overflow(struct perf_event *event,
|
||||
struct perf_sample_data *data,
|
||||
struct pt_regs *regs)
|
||||
{
|
||||
/*
|
||||
* Entry point from hardware PMI, interrupts should be disabled here.
|
||||
* This serializes us against perf_event_remove_from_context() in
|
||||
* things like perf_event_release_kernel().
|
||||
*/
|
||||
lockdep_assert_irqs_disabled();
|
||||
|
||||
return __perf_event_overflow(event, 1, data, regs);
|
||||
}
|
||||
|
||||
@@ -10853,6 +10861,19 @@ static void perf_swevent_event(struct perf_event *event, u64 nr,
|
||||
{
|
||||
struct hw_perf_event *hwc = &event->hw;
|
||||
|
||||
/*
|
||||
* This is:
|
||||
* - software preempt
|
||||
* - tracepoint preempt
|
||||
* - tp_target_task irq (ctx->lock)
|
||||
* - uprobes preempt/irq
|
||||
* - kprobes preempt/irq
|
||||
* - hw_breakpoint irq
|
||||
*
|
||||
* Any of these are sufficient to hold off RCU and thus ensure @event
|
||||
* exists.
|
||||
*/
|
||||
lockdep_assert_preemption_disabled();
|
||||
local64_add(nr, &event->count);
|
||||
|
||||
if (!regs)
|
||||
@@ -10861,6 +10882,16 @@ static void perf_swevent_event(struct perf_event *event, u64 nr,
|
||||
if (!is_sampling_event(event))
|
||||
return;
|
||||
|
||||
/*
|
||||
* Serialize against event_function_call() IPIs like normal overflow
|
||||
* event handling. Specifically, must not allow
|
||||
* perf_event_release_kernel() -> perf_remove_from_context() to make
|
||||
* progress and 'release' the event from under us.
|
||||
*/
|
||||
guard(irqsave)();
|
||||
if (event->state != PERF_EVENT_STATE_ACTIVE)
|
||||
return;
|
||||
|
||||
if ((event->attr.sample_type & PERF_SAMPLE_PERIOD) && !event->attr.freq) {
|
||||
data->period = nr;
|
||||
return perf_swevent_overflow(event, 1, data, regs);
|
||||
@@ -11359,6 +11390,11 @@ void perf_tp_event(u16 event_type, u64 count, void *record, int entry_size,
|
||||
struct perf_sample_data data;
|
||||
struct perf_event *event;
|
||||
|
||||
/*
|
||||
* Per being a tracepoint, this runs with preemption disabled.
|
||||
*/
|
||||
lockdep_assert_preemption_disabled();
|
||||
|
||||
struct perf_raw_record raw = {
|
||||
.frag = {
|
||||
.size = entry_size,
|
||||
@@ -11691,6 +11727,11 @@ void perf_bp_event(struct perf_event *bp, void *data)
|
||||
struct perf_sample_data sample;
|
||||
struct pt_regs *regs = data;
|
||||
|
||||
/*
|
||||
* Exception context, will have interrupts disabled.
|
||||
*/
|
||||
lockdep_assert_irqs_disabled();
|
||||
|
||||
perf_sample_data_init(&sample, bp->attr.bp_addr, 0);
|
||||
|
||||
if (!bp->hw.state && !perf_exclude_event(bp, regs))
|
||||
@@ -12155,7 +12196,7 @@ static enum hrtimer_restart perf_swevent_hrtimer(struct hrtimer *hrtimer)
|
||||
|
||||
if (regs && !perf_exclude_event(event, regs)) {
|
||||
if (!(event->attr.exclude_idle && is_idle_task(current)))
|
||||
if (__perf_event_overflow(event, 1, &data, regs))
|
||||
if (perf_event_overflow(event, &data, regs))
|
||||
ret = HRTIMER_NORESTART;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user