Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 348287cf authored by Prateek Sood's avatar Prateek Sood Committed by Gerrit - the friendly Code Review server
Browse files

minidump: use *_irqsave() and *_irqrestore() API's for minidump locks



Use *_irqsave() and *_irqrestore() API's for minidump locks.
Since with minidump current task stack feature, minidump
locks can be acquired from interrupt context also.

Change-Id: I9e86a3c46f1f7fcedb14d8ec713420198f1b8cd1
Signed-off-by: default avatarPrateek Sood <prsood@codeaurora.org>
parent 35f68aa2
Loading
Loading
Loading
Loading
+18 −13
Original line number Original line Diff line number Diff line
@@ -171,13 +171,14 @@ static void md_update_ss_toc(const struct md_region *entry)
bool msm_minidump_enabled(void)
bool msm_minidump_enabled(void)
{
{
	bool ret = false;
	bool ret = false;
	unsigned long flags;


	spin_lock(&mdt_lock);
	spin_lock_irqsave(&mdt_lock, flags);
	if (minidump_table.md_ss_toc &&
	if (minidump_table.md_ss_toc &&
		(minidump_table.md_ss_toc->md_ss_enable_status ==
		(minidump_table.md_ss_toc->md_ss_enable_status ==
		 MD_SS_ENABLED))
		 MD_SS_ENABLED))
		ret = true;
		ret = true;
	spin_unlock(&mdt_lock);
	spin_unlock_irqrestore(&mdt_lock, flags);
	return ret;
	return ret;
}
}
EXPORT_SYMBOL(msm_minidump_enabled);
EXPORT_SYMBOL(msm_minidump_enabled);
@@ -204,6 +205,7 @@ int msm_minidump_update_region(int regno, const struct md_region *entry)
	struct elfhdr *hdr = minidump_elfheader.ehdr;
	struct elfhdr *hdr = minidump_elfheader.ehdr;
	struct elf_shdr *shdr;
	struct elf_shdr *shdr;
	struct elf_phdr *phdr;
	struct elf_phdr *phdr;
	unsigned long flags;


	/* Ensure that init completes before we update regions */
	/* Ensure that init completes before we update regions */
	if (!smp_load_acquire(&md_init_done))
	if (!smp_load_acquire(&md_init_done))
@@ -212,7 +214,7 @@ int msm_minidump_update_region(int regno, const struct md_region *entry)
	if (validate_region(entry) || (regno >= MAX_NUM_ENTRIES))
	if (validate_region(entry) || (regno >= MAX_NUM_ENTRIES))
		return -EINVAL;
		return -EINVAL;


	read_lock(&mdt_remove_lock);
	read_lock_irqsave(&mdt_remove_lock, flags);


	if (regno >= first_removed_entry) {
	if (regno >= first_removed_entry) {
		pr_err("Region:[%s] was moved\n", entry->name);
		pr_err("Region:[%s] was moved\n", entry->name);
@@ -241,7 +243,7 @@ int msm_minidump_update_region(int regno, const struct md_region *entry)
	phdr->p_paddr = entry->phys_addr;
	phdr->p_paddr = entry->phys_addr;


err_unlock:
err_unlock:
	read_unlock(&mdt_remove_lock);
	read_unlock_irqrestore(&mdt_remove_lock, flags);


	return ret;
	return ret;
}
}
@@ -251,21 +253,22 @@ int msm_minidump_add_region(const struct md_region *entry)
{
{
	u32 entries;
	u32 entries;
	struct md_region *mdr;
	struct md_region *mdr;
	unsigned long flags;


	if (validate_region(entry))
	if (validate_region(entry))
		return -EINVAL;
		return -EINVAL;


	spin_lock(&mdt_lock);
	spin_lock_irqsave(&mdt_lock, flags);
	if (md_entry_num(entry) >= 0) {
	if (md_entry_num(entry) >= 0) {
		pr_err("Entry name already exist.\n");
		pr_err("Entry name already exist.\n");
		spin_unlock(&mdt_lock);
		spin_unlock_irqrestore(&mdt_lock, flags);
		return -EINVAL;
		return -EINVAL;
	}
	}


	entries = minidump_table.num_regions;
	entries = minidump_table.num_regions;
	if (entries >= MAX_NUM_ENTRIES) {
	if (entries >= MAX_NUM_ENTRIES) {
		pr_err("Maximum entries reached.\n");
		pr_err("Maximum entries reached.\n");
		spin_unlock(&mdt_lock);
		spin_unlock_irqrestore(&mdt_lock, flags);
		return -ENOMEM;
		return -ENOMEM;
	}
	}


@@ -285,7 +288,7 @@ int msm_minidump_add_region(const struct md_region *entry)
	else
	else
		pendings++;
		pendings++;


	spin_unlock(&mdt_lock);
	spin_unlock_irqrestore(&mdt_lock, flags);


	return entries;
	return entries;
}
}
@@ -369,13 +372,14 @@ int msm_minidump_clear_headers(const struct md_region *entry)
int msm_minidump_remove_region(const struct md_region *entry)
int msm_minidump_remove_region(const struct md_region *entry)
{
{
	int rcount, ecount, seq = 0, rgno, ret;
	int rcount, ecount, seq = 0, rgno, ret;
	unsigned long flags;


	if (!entry || !minidump_table.md_ss_toc ||
	if (!entry || !minidump_table.md_ss_toc ||
		(minidump_table.md_ss_toc->md_ss_enable_status !=
		(minidump_table.md_ss_toc->md_ss_enable_status !=
						MD_SS_ENABLED))
						MD_SS_ENABLED))
		return -EINVAL;
		return -EINVAL;


	spin_lock(&mdt_lock);
	spin_lock_irqsave(&mdt_lock, flags);
	write_lock(&mdt_remove_lock);
	write_lock(&mdt_remove_lock);
	ecount = minidump_table.num_regions;
	ecount = minidump_table.num_regions;
	rcount = minidump_table.md_ss_toc->ss_region_count;
	rcount = minidump_table.md_ss_toc->ss_region_count;
@@ -417,11 +421,11 @@ int msm_minidump_remove_region(const struct md_region *entry)


	minidump_table.num_regions--;
	minidump_table.num_regions--;
	write_unlock(&mdt_remove_lock);
	write_unlock(&mdt_remove_lock);
	spin_unlock(&mdt_lock);
	spin_unlock_irqrestore(&mdt_lock, flags);
	return 0;
	return 0;
out:
out:
	write_unlock(&mdt_remove_lock);
	write_unlock(&mdt_remove_lock);
	spin_unlock(&mdt_lock);
	spin_unlock_irqrestore(&mdt_lock, flags);
	pr_err("Minidump is broken..disable Minidump collection\n");
	pr_err("Minidump is broken..disable Minidump collection\n");
	return -EINVAL;
	return -EINVAL;
}
}
@@ -537,6 +541,7 @@ static int __init msm_minidump_init(void)
	struct md_region *mdr;
	struct md_region *mdr;
	struct md_global_toc *md_global_toc;
	struct md_global_toc *md_global_toc;
	struct md_ss_toc *md_ss_toc;
	struct md_ss_toc *md_ss_toc;
	unsigned long flags;


	/* Get Minidump table */
	/* Get Minidump table */
	md_global_toc = qcom_smem_get(QCOM_SMEM_HOST_ANY, SBL_MINIDUMP_SMEM_ID,
	md_global_toc = qcom_smem_get(QCOM_SMEM_HOST_ANY, SBL_MINIDUMP_SMEM_ID,
@@ -573,7 +578,7 @@ static int __init msm_minidump_init(void)
	msm_minidump_add_header();
	msm_minidump_add_header();


	/* Add pending entries to HLOS TOC */
	/* Add pending entries to HLOS TOC */
	spin_lock(&mdt_lock);
	spin_lock_irqsave(&mdt_lock, flags);
	md_ss_toc->md_ss_toc_init = 1;
	md_ss_toc->md_ss_toc_init = 1;
	md_ss_toc->md_ss_enable_status = MD_SS_ENABLED;
	md_ss_toc->md_ss_enable_status = MD_SS_ENABLED;
	for (i = 0; i < pendings; i++) {
	for (i = 0; i < pendings; i++) {
@@ -582,7 +587,7 @@ static int __init msm_minidump_init(void)
	}
	}


	pendings = 0;
	pendings = 0;
	spin_unlock(&mdt_lock);
	spin_unlock_irqrestore(&mdt_lock, flags);


	pr_info("Enabled with max number of regions %d\n",
	pr_info("Enabled with max number of regions %d\n",
		CONFIG_MINIDUMP_MAX_ENTRIES);
		CONFIG_MINIDUMP_MAX_ENTRIES);