chrome processes stuck at 100% cpu [Re: svn commit: r272566 - head/sys/kern]

Colin Percival cperciva at freebsd.org
Sat Jul 11 03:37:32 UTC 2015


The bug fixed by this commit is causing chrome processes to get stuck
spinning at 100% CPU on my FreeBSD 10.1-RELEASE laptop -- chrome is
trying to read the kern.proc.pid.# sysctl (I think in order to get the
status of a crashed rendering process) and it's going into an infinite
ERESTART loop.

Is anyone else seeing the 100%-CPU-usage chrome problem?  It seems to
be triggered by a crashing chrome rendering process, and I don't know
what's causing that, so it's possible that this isn't affecting many
other people.

Konstantin, if this turns out to be affecting a lot of people, do you
think we could get an errata notice for this?

Colin Percival

On 10/05/14 10:36, Konstantin Belousov wrote:
> Author: kib
> Date: Sun Oct  5 17:35:59 2014
> New Revision: 272566
> URL: https://svnweb.freebsd.org/changeset/base/272566
> 
> Log:
>   On error, sbuf_bcat() returns -1.  Some callers returned this -1 to
>   the upper layers, which interpret it as errno value, which happens to
>   be ERESTART.  The result was spurious restarts of the sysctls in loop,
>   e.g. kern.proc.proc, instead of returning ENOMEM to caller.
>   
>   Convert -1 from sbuf_bcat() to ENOMEM, when returning to the callers
>   expecting errno.
>   
>   In collaboration with:	pho
>   Sponsored by:	The FreeBSD Foundation (kib)
>   MFC after:	1 week
> 
> Modified:
>   head/sys/kern/kern_descrip.c
>   head/sys/kern/kern_proc.c
> 
> Modified: head/sys/kern/kern_descrip.c
> ==============================================================================
> --- head/sys/kern/kern_descrip.c	Sun Oct  5 11:16:16 2014	(r272565)
> +++ head/sys/kern/kern_descrip.c	Sun Oct  5 17:35:59 2014	(r272566)
> @@ -3097,7 +3097,7 @@ export_kinfo_to_sb(struct export_fd_buf 
>  		}
>  		efbuf->remainder -= kif->kf_structsize;
>  	}
> -	return (sbuf_bcat(efbuf->sb, kif, kif->kf_structsize));
> +	return (sbuf_bcat(efbuf->sb, kif, kif->kf_structsize) == 0 ? 0 : ENOMEM);
>  }
>  
>  static int
> 
> Modified: head/sys/kern/kern_proc.c
> ==============================================================================
> --- head/sys/kern/kern_proc.c	Sun Oct  5 11:16:16 2014	(r272565)
> +++ head/sys/kern/kern_proc.c	Sun Oct  5 17:35:59 2014	(r272566)
> @@ -1208,21 +1208,25 @@ kern_proc_out(struct proc *p, struct sbu
>  #ifdef COMPAT_FREEBSD32
>  		if ((flags & KERN_PROC_MASK32) != 0) {
>  			freebsd32_kinfo_proc_out(&ki, &ki32);
> -			error = sbuf_bcat(sb, &ki32, sizeof(ki32));
> +			if (sbuf_bcat(sb, &ki32, sizeof(ki32)) != 0)
> +				error = ENOMEM;
>  		} else
>  #endif
> -			error = sbuf_bcat(sb, &ki, sizeof(ki));
> +			if (sbuf_bcat(sb, &ki, sizeof(ki)) != 0)
> +				error = ENOMEM;
>  	} else {
>  		FOREACH_THREAD_IN_PROC(p, td) {
>  			fill_kinfo_thread(td, &ki, 1);
>  #ifdef COMPAT_FREEBSD32
>  			if ((flags & KERN_PROC_MASK32) != 0) {
>  				freebsd32_kinfo_proc_out(&ki, &ki32);
> -				error = sbuf_bcat(sb, &ki32, sizeof(ki32));
> +				if (sbuf_bcat(sb, &ki32, sizeof(ki32)) != 0)
> +					error = ENOMEM;
>  			} else
>  #endif
> -				error = sbuf_bcat(sb, &ki, sizeof(ki));
> -			if (error)
> +				if (sbuf_bcat(sb, &ki, sizeof(ki)) != 0)
> +					error = ENOMEM;
> +			if (error != 0)
>  				break;
>  		}
>  	}
> @@ -1777,7 +1781,8 @@ proc_getauxv(struct thread *td, struct p
>  		else
>  #endif
>  			size = vsize * sizeof(Elf_Auxinfo);
> -		error = sbuf_bcat(sb, auxv, size);
> +		if (sbuf_bcat(sb, auxv, size) != 0)
> +			error = ENOMEM;
>  		free(auxv, M_TEMP);
>  	}
>  	return (error);
> @@ -2363,9 +2368,10 @@ kern_proc_vmmap_out(struct proc *p, stru
>  		    strlen(kve->kve_path) + 1;
>  		kve->kve_structsize = roundup(kve->kve_structsize,
>  		    sizeof(uint64_t));
> -		error = sbuf_bcat(sb, kve, kve->kve_structsize);
> +		if (sbuf_bcat(sb, kve, kve->kve_structsize) != 0)
> +			error = ENOMEM;
>  		vm_map_lock_read(map);
> -		if (error)
> +		if (error != 0)
>  			break;
>  		if (last_timestamp != map->timestamp) {
>  			vm_map_lookup_entry(map, addr - 1, &tmp_entry);
> 
> 
> 

-- 
Colin Percival
Security Officer Emeritus, FreeBSD | The power to serve
Founder, Tarsnap | www.tarsnap.com | Online backups for the truly paranoid


More information about the freebsd-chromium mailing list