Author: manu
Date: Thu Jul 19 11:28:14 2018
New Revision: 336477
URL: https://svnweb.freebsd.org/changeset/base/336477

Log:
  kern_cpu: When adding abs frequency allow for unordered insertion
  
  Keep the list ordered as some code assume that it is but allow for
  unordered cf_settings sets.

Modified:
  head/sys/kern/kern_cpu.c

Modified: head/sys/kern/kern_cpu.c
==============================================================================
--- head/sys/kern/kern_cpu.c    Thu Jul 19 11:27:11 2018        (r336476)
+++ head/sys/kern/kern_cpu.c    Thu Jul 19 11:28:14 2018        (r336477)
@@ -680,7 +680,7 @@ cpufreq_insert_abs(struct cpufreq_softc *sc, struct cf
 {
        struct cf_level_lst *list;
        struct cf_level *level, *search;
-       int i;
+       int i, inserted;
 
        CF_MTX_ASSERT(&sc->lock);
 
@@ -693,6 +693,7 @@ cpufreq_insert_abs(struct cpufreq_softc *sc, struct cf
                level->total_set = sets[i];
                level->total_set.dev = NULL;
                sc->all_count++;
+               inserted = 0;
 
                if (TAILQ_EMPTY(list)) {
                        CF_DEBUG("adding abs setting %d at head\n",
@@ -701,15 +702,26 @@ cpufreq_insert_abs(struct cpufreq_softc *sc, struct cf
                        continue;
                }
 
-               TAILQ_FOREACH_REVERSE(search, list, cf_level_lst, link) {
+               TAILQ_FOREACH_REVERSE(search, list, cf_level_lst, link)
                        if (sets[i].freq <= search->total_set.freq) {
                                CF_DEBUG("adding abs setting %d after %d\n",
                                    sets[i].freq, search->total_set.freq);
                                TAILQ_INSERT_AFTER(list, search, level, link);
+                               inserted = 1;
                                break;
                        }
+
+               if (inserted == 0) {
+                       TAILQ_FOREACH(search, list, link)
+                               if (sets[i].freq >= search->total_set.freq) {
+                                       CF_DEBUG("adding abs setting %d before 
%d\n",
+                                           sets[i].freq, 
search->total_set.freq);
+                                       TAILQ_INSERT_BEFORE(search, level, 
link);
+                                       break;
+                               }
                }
        }
+
        return (0);
 }
 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to