From owner-svn-src-all@freebsd.org Thu Nov 30 20:08:57 2017 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 42933E6A706; Thu, 30 Nov 2017 20:08:57 +0000 (UTC) (envelope-from jkim@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2610:1c1:1:6074::16:84]) by mx1.freebsd.org (Postfix) with ESMTP id BB79172814; Thu, 30 Nov 2017 20:08:56 +0000 (UTC) (envelope-from jkim@FreeBSD.org) Subject: Re: svn commit: r326383 - head/sys/x86/cpufreq To: cem@freebsd.org Cc: src-committers , svn-src-all@freebsd.org, svn-src-head@freebsd.org References: <201711300140.vAU1e7dC001292@repo.freebsd.org> From: Jung-uk Kim Message-ID: Date: Thu, 30 Nov 2017 15:08:49 -0500 User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/signed; micalg=pgp-sha256; protocol="application/pgp-signature"; boundary="bVc1ritjhQ9b93OelUSwCTM7HNNNrDC1F" X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Nov 2017 20:08:57 -0000 This is an OpenPGP/MIME signed message (RFC 4880 and 3156) --bVc1ritjhQ9b93OelUSwCTM7HNNNrDC1F Content-Type: multipart/mixed; boundary="C9XaTPafNFwuxQ00RkxowFWtUO9F9IsQ3"; protected-headers="v1" From: Jung-uk Kim To: cem@freebsd.org Cc: src-committers , svn-src-all@freebsd.org, svn-src-head@freebsd.org Message-ID: Subject: Re: svn commit: r326383 - head/sys/x86/cpufreq References: <201711300140.vAU1e7dC001292@repo.freebsd.org> In-Reply-To: --C9XaTPafNFwuxQ00RkxowFWtUO9F9IsQ3 Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: quoted-printable On 11/30/2017 14:32, Conrad Meyer wrote: > Hi, >=20 > I don't think this answers the second question about the conditional. > It seems like PCPU_GET() for the initial CPU should be pulled out of > the loop, which binds the thread to a different CPU every iteration. Ah, good catch. I'll fix it soon. Sorry. > Also, as a side effect of disabling verification, you have fixed PR > 221621, 219213, and probably 218262. Probably. However, I am just trying to fix my FX-8350 and A10-6800 and I don't have Zen processors to verify the MSRs are actually working on those CPUs. Jung-uk Kim > On Thu, Nov 30, 2017 at 11:21 AM, Jung-uk Kim wrote:= >> On 11/30/2017 13:57, Conrad Meyer wrote: >>> Hi Jung-uk, >>> >>> I have some questions about this change. >>> >>> On Wed, Nov 29, 2017 at 5:40 PM, Jung-uk Kim wrote= : >>>> Author: jkim >>>> Date: Thu Nov 30 01:40:07 2017 >>>> New Revision: 326383 >>>> URL: https://svnweb.freebsd.org/changeset/base/326383 >>>> >>>> Log: >>>> Add a tunable "debug.hwpstate_verify" to check P-state after chang= ing it and >>>> turn it off by default. It is very inefficient to verify current = P-state of >>>> each core, especially for CPUs with many cores. When multiple com= mands are >>>> requested to the same power domain before completion of pending tr= ansitions, >>>> the last command is executed according to the manual. Because req= uests are >>>> serialized by the caller, all cores will receive the same command = for each >>>> call. Do not call sched_bind() and sched_unbind(). It is redunda= nt because >>>> the caller does it anyway. >>>> ... >>>> @@ -176,47 +178,57 @@ hwpstate_goto_pstate(device_t dev, int pstate)= >>>> if (limit > id) >>>> id =3D limit; >>>> >>> >>> Should we bind the thread and record PCPU_GET() here? >>> >>>> + HWPSTATE_DEBUG(dev, "setting P%d-state on cpu%d\n", id, >>>> + PCPU_GET(cpuid)); >>>> + /* Go To Px-state */ >>>> + wrmsr(MSR_AMD_10H_11H_CONTROL, id); >>>> + >>>> /* >>>> * We are going to the same Px-state on all cpus. >>>> * Probably should take _PSD into account. >>>> */ >>>> - error =3D 0; >>>> CPU_FOREACH(i) { >>>> + if (i =3D=3D PCPU_GET(cpuid)) >>> >>> It seems like this check could evaluate to a different CPU every time= ? >>> When really we are trying to avoid setting on the CPU we set on >>> initially above? >>> >>>> + continue; >>>> + >>>> /* Bind to each cpu. */ >>>> thread_lock(curthread); >>>> sched_bind(curthread, i); >>>> thread_unlock(curthread); >>>> - HWPSTATE_DEBUG(dev, "setting P%d-state on cpu%d\n", >>>> - id, PCPU_GET(cpuid)); >>>> + HWPSTATE_DEBUG(dev, "setting P%d-state on cpu%d\n", = id, i); >>>> /* Go To Px-state */ >>>> wrmsr(MSR_AMD_10H_11H_CONTROL, id); >>>> } >>>> - CPU_FOREACH(i) { >>>> - /* Bind to each cpu. */ >>>> - thread_lock(curthread); >>>> - sched_bind(curthread, i); >>>> - thread_unlock(curthread); >>>> - /* wait loop (100*100 usec is enough ?) */ >>>> - for (j =3D 0; j < 100; j++) { >>>> - /* get the result. not assure msr=3Did */ >>>> - msr =3D rdmsr(MSR_AMD_10H_11H_STATUS); >>>> - if (msr =3D=3D id) >>>> - break; >>>> - sbt =3D SBT_1MS / 10; >>>> - tsleep_sbt(dev, PZERO, "pstate_goto", sbt, >>>> - sbt >> tc_precexp, 0); >>>> + >>>> + /* >>>> + * Verify whether each core is in the requested P-state. >>>> + */ >>>> + if (hwpstate_verify) { >>>> + CPU_FOREACH(i) { >>>> + thread_lock(curthread); >>>> + sched_bind(curthread, i); >>>> + thread_unlock(curthread); >>>> + /* wait loop (100*100 usec is enough ?) */ >>>> + for (j =3D 0; j < 100; j++) { >>>> + /* get the result. not assure msr=3D= id */ >>>> + msr =3D rdmsr(MSR_AMD_10H_11H_STATUS= ); >>>> + if (msr =3D=3D id) >>>> + break; >>>> + sbt =3D SBT_1MS / 10; >>>> + tsleep_sbt(dev, PZERO, "pstate_goto"= , sbt, >>>> + sbt >> tc_precexp, 0); >>>> + } >>>> + HWPSTATE_DEBUG(dev, "result: P%d-state on cp= u%d\n", >>>> + (int)msr, i); >>>> + if (msr !=3D id) { >>>> + HWPSTATE_DEBUG(dev, >>>> + "error: loop is not enough.\n");= >>> >>> In this error return, should the current thread be unbinded? The old= >>> code did this by setting error and falling through to the ordinary >>> exit path. We could use 'goto out;' to avoid looping through the res= t >>> of the CPUs. >>> >>>> + return (ENXIO); >>>> + } >>>> } >>>> - HWPSTATE_DEBUG(dev, "result: P%d-state on cpu%d\n", >>>> - (int)msr, PCPU_GET(cpuid)); >>>> - if (msr !=3D id) { >>>> - HWPSTATE_DEBUG(dev, "error: loop is not enou= gh.\n"); >>>> - error =3D ENXIO; >>>> - } >>>> } >>>> - thread_lock(curthread); >>>> - sched_unbind(curthread); >>>> - thread_unlock(curthread); >>>> - return (error); >>>> + >>>> + return (0); >>>> } >>>> >>>> static int >>>> >> >> This driver is only called via cpufreq(4) (i.e., sys/kern/kern_cpu.c),= >> and sched_bind()/sched_unbind() is done from cf_set_method() for cpu0.= >> If you want to see the sequence, try "sysctl debug.cpufreq.verbose=3D1= " >> and "sysctl debug.hwpstate_verbose=3D1". --C9XaTPafNFwuxQ00RkxowFWtUO9F9IsQ3-- --bVc1ritjhQ9b93OelUSwCTM7HNNNrDC1F Content-Type: application/pgp-signature; name="signature.asc" Content-Description: OpenPGP digital signature Content-Disposition: attachment; filename="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEEl1bqgKaRyqfWXu/CfJ+WJvzb8UYFAlogZVEACgkQfJ+WJvzb 8UbsLQf/WFyvC0lzNc6gLFVbmkGB92c+M6edhKzzygKNph1XPjxmNh2656EUyxXe nTlEyEZDZCqAWH32FgcmnnEHGAKi7ejn95OTFP4zt13ShyhJxYDgMig+KIiA1mmt l3MPpyqpaELlftmuwctnPJyEj+Mb8iwRMFpzTPWW9L0o7ILZAM0zX71DKh29ABrf f3KKWWocuWFT+e3vKXWxn/qBEOHm22PBg4EY9awOfzfh8EO9lQ4e9oDKe0Xf3FDE StmOmY7dbCRr5b2SnBYmLtQ+x6eGD5dXfdOuF9s/waMd1/QAHdmrccg/CBSEzXjL REHvMcJFLjQTHxG09VhnSjNSh47wzw== =9KZH -----END PGP SIGNATURE----- --bVc1ritjhQ9b93OelUSwCTM7HNNNrDC1F--