--- zzzz-none-000/linux-4.4.60/mm/vmscan.c 2017-04-08 07:53:53.000000000 +0000 +++ dragonfly-4020-701/linux-4.4.60/mm/vmscan.c 2018-11-08 13:36:17.000000000 +0000 @@ -1291,6 +1291,41 @@ 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 +1962,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)