--- zzzz-none-000/linux-4.4.271/mm/vmscan.c 2021-06-03 06:22:09.000000000 +0000 +++ hawkeye-5590-750/linux-4.4.271/mm/vmscan.c 2023-04-19 10:22:30.000000000 +0000 @@ -1294,6 +1294,40 @@ ret = -EBUSY; +#if defined(CONFIG_AVM_LOW_MEMORY_STRATEGY) + /* + * ACHTUNG: + * + * Dynamischer Speicherfreigabe Hack zum Verhindern der Freigabe mehrfach + * belegter Blöcke + */ + { + static unsigned int busy_level = 1 << 2; + const unsigned int MAX_BUSY_LEVEL = 10 << 2; + const unsigned int MIN_BUSY_LEVEL = 1 << 2; + + if (unlikely(atomic_read(&(page->_count)) > (busy_level >> 2))) { + /* + * wir haben einen Block nicht freigegeben. Der countwert dieses Blockes war + * größer als busylevel/4. Der Busylevel soll etwas gesenkt werden um die + * Wahrscheinlichkeit start belegt Blöcke freizugeben zu erhöhen + */ + busy_level--; + + if (busy_level < MIN_BUSY_LEVEL) { + busy_level = MIN_BUSY_LEVEL; + } + + return ret; + } + busy_level++; + + if (busy_level > MAX_BUSY_LEVEL) { + busy_level = MAX_BUSY_LEVEL; + } + } +#endif /*--- #if defined(CONFIG_AVM_LOW_MEMORY_STRATEGY) ---*/ + /* * To minimise LRU disruption, the caller can indicate that it only * wants to isolate pages it will be able to operate on without @@ -1940,7 +1974,16 @@ inactive = get_lru_size(lruvec, LRU_INACTIVE_FILE); active = get_lru_size(lruvec, LRU_ACTIVE_FILE); - return active > inactive; +#if defined(CONFIG_AVM_LOW_MEMORY_STRATEGY) + /*--------------------------------------------------------------------------------------*\ + * Hier wird das Verhältniss zwischen activen und inactiven Blöcken geregelt + * Da es sehr teuer ist einen aktiven Block wieder zu rekonstruieren wird das Verhältnis + * nicht 1:1 sondern 1:2 gehalten. + \*--------------------------------------------------------------------------------------*/ + return ((active >> 1) > inactive); +#else + return (active > inactive); +#endif } static bool inactive_list_is_low(struct lruvec *lruvec, enum lru_list lru)