--- zzzz-none-000/linux-4.4.60/mm/vmscan.c 2017-04-08 07:53:53.000000000 +0000 +++ scorpion-7490-727/linux-4.4.60/mm/vmscan.c 2021-02-04 17:41:59.000000000 +0000 @@ -1291,6 +1291,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 @@ -1927,7 +1961,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)