On 11/26/17 20:50, John Baldwin wrote:
On Saturday, November 25, 2017 11:41:05 PM Nathan Whitehorn wrote:
Author: nwhitehorn
Date: Sat Nov 25 23:41:05 2017
New Revision: 326218
URL: https://svnweb.freebsd.org/changeset/base/326218

Log:
   Remove some, but not all, assumptions that the BSP is CPU 0 and that CPUs
   are numbered densely from there to n_cpus.
MFC after: 1 month

Modified:
   head/sys/kern/kern_clock.c
   head/sys/kern/kern_clocksource.c
   head/sys/kern/kern_shutdown.c
   head/sys/kern/kern_timeout.c
   head/sys/kern/sched_ule.c
   head/sys/kern/subr_pcpu.c

Modified: head/sys/kern/kern_clock.c
==============================================================================
--- head/sys/kern/kern_clock.c  Sat Nov 25 23:23:24 2017        (r326217)
+++ head/sys/kern/kern_clock.c  Sat Nov 25 23:41:05 2017        (r326218)
@@ -573,7 +573,9 @@ hardclock_cnt(int cnt, int usermode)
  void
  hardclock_sync(int cpu)
  {
-       int     *t = DPCPU_ID_PTR(cpu, pcputicks);
+       int *t;
+       KASSERT(!CPU_ABSENT(cpu), ("Absent CPU %d", cpu));
Blank line before the KASSERT() perhaps?

+       t = DPCPU_ID_PTR(cpu, pcputicks);
*t = ticks;
Probably don't need this blank line though?

Those are both good ideas.


  }

Modified: head/sys/kern/sched_ule.c
==============================================================================
--- head/sys/kern/sched_ule.c   Sat Nov 25 23:23:24 2017        (r326217)
+++ head/sys/kern/sched_ule.c   Sat Nov 25 23:41:05 2017        (r326218)
@@ -2444,6 +2451,7 @@ sched_add(struct thread *td, int flags)
         * Pick the destination cpu and if it isn't ours transfer to the
         * target cpu.
         */
+       td_get_sched(td)->ts_cpu = curcpu; /* Pick something valid to start */
        cpu = sched_pickcpu(td, flags);
It is not obvious why every sched_add() needs this once you've fixed thread0.
Shouldn't new threads just inherit from thread0's already-fixed value?  If not,
perhaps fix thread0's value sooner?

That's a fair point. I don't remember the rationale for this now; the changes are over a year old from the powernv branch. I do remember setting thread0's CPU early not working, but have forgotten why. I will try to remember...

        tdq = sched_setcpu(td, cpu, flags);
        tdq_add(tdq, td, flags);

Modified: head/sys/kern/subr_pcpu.c
==============================================================================
--- head/sys/kern/subr_pcpu.c   Sat Nov 25 23:23:24 2017        (r326217)
+++ head/sys/kern/subr_pcpu.c   Sat Nov 25 23:41:05 2017        (r326218)
@@ -279,6 +279,8 @@ pcpu_destroy(struct pcpu *pcpu)
  struct pcpu *
  pcpu_find(u_int cpuid)
  {
+       KASSERT(cpuid_to_pcpu[cpuid] != NULL,
+           ("Getting uninitialized PCPU %d", cpuid));
This KASSERT seems unnecessary?  If the caller uses an invalid one, it will
just fault anyway.

It won't necessarily fault. For example, on PowerPC, NULL is a valid address that does not trigger faults. It's unfortunately quite complicated to fix this in a general way. Even if it did fault, this makes the fault more informative (and has found at least one bug on arm64 already).


        return (cpuid_to_pcpu[cpuid]);
  }
@@ -409,7 +411,7 @@ DB_SHOW_ALL_COMMAND(pcpu, db_show_cpu_all)
        int id;
db_printf("Current CPU: %d\n\n", PCPU_GET(cpuid));
-       for (id = 0; id <= mp_maxid; id++) {
+       CPU_FOREACH(id) {
If you remove the KASSERT you don't need this change since it checks the return
value of pcpu_find() (which you didn't change).  In particular, this DDB command
shows all valid pcpu structures safely even if that set is inconsistent with
the all_cpus mask (or the old version did at least).  There is also nothing 
about
this that assumes BSP == 0 either.  CPU_FOREACH() is doing a loop from 0 to
mp_maxid under the covers as well.

True. CPU_FOREACH just seemed simpler here and future-proof if it ever started doing something more complex.
-Nathan


                pc = pcpu_find(id);
                if (pc != NULL) {
                        show_pcpu(pc);



_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to