Re: [PATCH v2] powerpc/mm: Add cond_resched() while removing hpte mappings

Christophe Leroy <[email protected]>
Newsgroups org.01.lists.linux-nvdimm,dev.linux.lists.nvdimm,org.ozlabs.lists.linuxppc-dev
Message-ID <[email protected]>

Le 04/04/2021 à 18:31, Vaibhav Jain a écrit :
> While removing large number of mappings from hash page tables for
> large memory systems as soft-lockup is reported because of the time
> spent inside htap_remove_mapping() like one below:
> 
>   watchdog: BUG: soft lockup - CPU#8 stuck for 23s!
>   <snip>
>   NIP plpar_hcall+0x38/0x58
>   LR  pSeries_lpar_hpte_invalidate+0x68/0xb0
>   Call Trace:
>    0x1fffffffffff000 (unreliable)
>    pSeries_lpar_hpte_removebolted+0x9c/0x230
>    hash__remove_section_mapping+0xec/0x1c0
>    remove_section_mapping+0x28/0x3c
>    arch_remove_memory+0xfc/0x150
>    devm_memremap_pages_release+0x180/0x2f0
>    devm_action_release+0x30/0x50
>    release_nodes+0x28c/0x300
>    device_release_driver_internal+0x16c/0x280
>    unbind_store+0x124/0x170
>    drv_attr_store+0x44/0x60
>    sysfs_kf_write+0x64/0x90
>    kernfs_fop_write+0x1b0/0x290
>    __vfs_write+0x3c/0x70
>    vfs_write+0xd4/0x270
>    ksys_write+0xdc/0x130
>    system_call+0x5c/0x70
> 
> Fix this by adding a cond_resched() to the loop in
> htap_remove_mapping() that issues hcall to remove hpte mapping. The
> call to cond_resched() is issued every HZ jiffies which should prevent
> the soft-lockup from being reported.
> 
> Suggested-by: Aneesh Kumar K.V <[email protected]>
> Signed-off-by: Vaibhav Jain <[email protected]>

Reviewed-by: Christophe Leroy <[email protected]>

> 
> ---
> Changelog:
> 
> v2: Issue cond_resched() every HZ jiffies instead of each iteration of
>      the loop. [ Christophe Leroy ]
> ---
>   arch/powerpc/mm/book3s64/hash_utils.c | 13 ++++++++++++-
>   1 file changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/powerpc/mm/book3s64/hash_utils.c b/arch/powerpc/mm/book3s64/hash_utils.c
> index 581b20a2feaf..286e7e8cb919 100644
> --- a/arch/powerpc/mm/book3s64/hash_utils.c
> +++ b/arch/powerpc/mm/book3s64/hash_utils.c
> @@ -338,7 +338,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
>   int htab_remove_mapping(unsigned long vstart, unsigned long vend,
>   		      int psize, int ssize)
>   {
> -	unsigned long vaddr;
> +	unsigned long vaddr, time_limit;
>   	unsigned int step, shift;
>   	int rc;
>   	int ret = 0;
> @@ -351,8 +351,19 @@ int htab_remove_mapping(unsigned long vstart, unsigned long vend,
>   
>   	/* Unmap the full range specificied */
>   	vaddr = ALIGN_DOWN(vstart, step);
> +	time_limit = jiffies + HZ;
> +
>   	for (;vaddr < vend; vaddr += step) {
>   		rc = mmu_hash_ops.hpte_removebolted(vaddr, psize, ssize);
> +
> +		/*
> +		 * For large number of mappings introduce a cond_resched()
> +		 * to prevent softlockup warnings.
> +		 */
> +		if (time_after(jiffies, time_limit)) {
> +			cond_resched();
> +			time_limit = jiffies + HZ;
> +		}
>   		if (rc == -ENOENT) {
>   			ret = -ENOENT;
>   			continue;
> 
_______________________________________________
Linux-nvdimm mailing list -- [email protected]
To unsubscribe send an email to [email protected]
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.