diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml
index e2ca86c05577..829902945a90 100644
--- a/android/abi_gki_aarch64.xml
+++ b/android/abi_gki_aarch64.xml
@@ -13100,140 +13100,140 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -15148,9 +15148,9 @@
-
+
-
+
@@ -15173,116 +15173,116 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -17943,7 +17943,7 @@
-
+
@@ -17954,13 +17954,19 @@
-
+
-
+
-
+
+
+
+
+
+
+
@@ -18064,56 +18070,56 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -20847,66 +20853,66 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -22592,9 +22598,9 @@
-
+
-
+
@@ -26342,12 +26348,12 @@
-
+
-
+
-
+
@@ -28332,24 +28338,24 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -30146,7 +30152,7 @@
-
+
@@ -32082,7 +32088,7 @@
-
+
@@ -32545,7 +32551,7 @@
-
+
@@ -33511,7 +33517,7 @@
-
+
@@ -33522,13 +33528,19 @@
-
+
-
+
-
+
+
+
+
+
+
+
@@ -33758,21 +33770,21 @@
-
+
-
+
-
+
-
+
-
+
-
+
@@ -47722,11 +47734,7 @@
-
-
-
-
-
+
@@ -48315,14 +48323,14 @@
-
-
-
-
+
+
+
+
-
-
+
+
@@ -49994,48 +50002,48 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -50051,22 +50059,22 @@
-
+
-
+
-
+
-
+
@@ -54028,7 +54036,7 @@
-
+
@@ -55292,14 +55300,14 @@
-
+
-
+
@@ -55308,7 +55316,7 @@
-
+
@@ -55395,7 +55403,7 @@
-
+
@@ -55406,7 +55414,7 @@
-
+
@@ -55743,14 +55751,14 @@
-
-
-
-
+
+
+
+
-
-
+
+
@@ -56079,21 +56087,21 @@
-
+
-
+
-
+
-
+
-
+
-
+
@@ -56129,8 +56137,8 @@
-
-
+
+
@@ -58588,50 +58596,50 @@
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
@@ -61136,18 +61144,18 @@
-
+
-
+
-
+
@@ -64534,7 +64542,7 @@
-
+
@@ -64543,7 +64551,7 @@
-
+
@@ -64690,15 +64698,15 @@
-
-
-
-
+
+
+
+
-
-
-
+
+
+
@@ -64706,23 +64714,23 @@
-
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
+
@@ -67603,23 +67611,23 @@
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
-
+
+
+
+
+
@@ -67627,17 +67635,17 @@
-
-
+
+
-
-
+
+
-
-
-
+
+
+
@@ -74254,27 +74262,27 @@
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
@@ -74311,17 +74319,17 @@
-
-
+
+
-
-
+
+
-
-
-
+
+
+
@@ -82462,14 +82470,14 @@
-
-
+
+
-
-
-
-
+
+
+
+
@@ -89858,14 +89866,14 @@
-
+
-
+
@@ -91794,13 +91802,13 @@
-
+
-
-
-
-
+
+
+
+
@@ -91811,172 +91819,172 @@
-
-
-
-
-
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
+
+
+
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
@@ -104152,18 +104160,18 @@
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
@@ -107887,39 +107895,39 @@
-
-
-
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
@@ -109051,25 +109059,25 @@
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
+
+
-
-
+
+
@@ -109385,7 +109393,7 @@
-
+
@@ -110276,21 +110284,21 @@
-
+
-
+
-
+
-
+
-
+
-
+
@@ -110340,128 +110348,128 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -110834,18 +110842,18 @@
-
+
-
+
-
+
@@ -110861,85 +110869,85 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -111050,69 +111058,69 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -111389,20 +111397,20 @@
-
+
-
+
-
+
-
+
-
+
-
+
@@ -111986,140 +111994,140 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
@@ -112190,11 +112198,11 @@
-
+
-
+
@@ -112262,7 +112270,7 @@
-
+
@@ -112276,7 +112284,7 @@
-
+
@@ -112297,11 +112305,11 @@
-
+
-
+
@@ -112313,7 +112321,7 @@
-
+
@@ -112330,7 +112338,7 @@
-
+
@@ -112384,15 +112392,15 @@
-
+
-
+
-
+
@@ -112445,7 +112453,7 @@
-
+
@@ -112519,16 +112527,16 @@
-
+
-
+
-
+
@@ -114699,37 +114707,37 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -117214,31 +117222,31 @@
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
@@ -117253,14 +117261,14 @@
-
-
-
+
+
+
-
-
-
+
+
+
@@ -118726,7 +118734,7 @@
-
+
@@ -119113,7 +119121,7 @@
-
+
@@ -119135,7 +119143,7 @@
-
+
@@ -119155,7 +119163,7 @@
-
+
@@ -119295,10 +119303,10 @@
-
-
-
-
+
+
+
+
@@ -121558,47 +121566,47 @@
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
@@ -121913,9 +121921,9 @@
-
-
-
+
+
+
@@ -121926,54 +121934,54 @@
-
-
-
+
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
+
+
@@ -121988,56 +121996,56 @@
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
@@ -122052,16 +122060,16 @@
-
-
+
+
-
-
+
+
-
-
+
+
@@ -126192,16 +126200,16 @@
-
-
-
-
-
-
+
+
+
+
+
+
-
-
+
+
@@ -130178,7 +130186,7 @@
-
+
@@ -130192,7 +130200,7 @@
-
+
@@ -133947,7 +133955,7 @@
-
+
@@ -134563,7 +134571,7 @@
-
+
@@ -134654,7 +134662,7 @@
-
+
@@ -135150,18 +135158,18 @@
-
+
-
+
-
+
-
+
-
+
@@ -136178,35 +136186,35 @@
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
+
+
-
-
-
+
+
+
-
+
@@ -136217,33 +136225,33 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -137854,6 +137862,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -138297,17 +138316,6 @@
-
-
-
-
-
-
-
-
-
-
-
@@ -138898,7 +138906,7 @@
-
+
@@ -139071,7 +139079,7 @@
-
+
@@ -140379,7 +140387,7 @@
-
+
@@ -140922,7 +140930,7 @@
-
+
@@ -141168,21 +141176,21 @@
-
-
-
+
+
+
-
-
+
+
-
-
+
+
@@ -141251,7 +141259,7 @@
-
+
@@ -141268,7 +141276,7 @@
-
+
@@ -141283,7 +141291,7 @@
-
+
@@ -141322,7 +141330,7 @@
-
+
@@ -141334,7 +141342,7 @@
-
+
@@ -141343,12 +141351,12 @@
-
+
-
+
@@ -141357,7 +141365,7 @@
-
+
@@ -141369,7 +141377,7 @@
-
+
@@ -144729,9 +144737,9 @@
-
-
-
+
+
+
@@ -144987,7 +144995,7 @@
-
+
@@ -145056,7 +145064,7 @@
-
+
@@ -145575,12 +145583,12 @@
-
-
+
+
-
-
+
+
@@ -145867,7 +145875,7 @@
-
+
@@ -145951,7 +145959,7 @@
-
+
@@ -146131,27 +146139,27 @@
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
@@ -146163,11 +146171,11 @@
-
-
-
-
-
+
+
+
+
+
@@ -146731,14 +146739,14 @@
-
+
-
+
@@ -146869,8 +146877,8 @@
-
-
+
+
@@ -147235,14 +147243,14 @@
-
+
-
+
@@ -147577,12 +147585,6 @@
-
-
-
-
-
-
@@ -147864,7 +147866,7 @@
-
+
@@ -147895,7 +147897,7 @@
-
+
@@ -148051,7 +148053,7 @@
-
+
@@ -148073,6 +148075,11 @@
+
+
+
+
+
@@ -148653,7 +148660,7 @@
-
+
@@ -149540,10 +149547,10 @@
-
-
-
-
+
+
+
+
@@ -149568,14 +149575,14 @@
-
-
+
+
-
-
-
-
+
+
+
+
@@ -149794,9 +149801,8 @@
-
-
-
+
+
@@ -149805,9 +149811,9 @@
-
-
-
+
+
+
@@ -150129,13 +150135,13 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
@@ -150587,12 +150593,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -150683,26 +150689,32 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
@@ -150720,12 +150732,12 @@
-
-
+
+
-
+
@@ -150771,7 +150783,7 @@
-
+
@@ -150928,7 +150940,7 @@
-
+
@@ -151096,7 +151108,7 @@
-
+
@@ -151308,29 +151320,29 @@
-
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
+
-
-
+
+
@@ -156715,123 +156727,123 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -156845,62 +156857,62 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -157056,178 +157068,178 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -164171,40 +164183,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -164212,12 +164191,9 @@
-
-
-
-
+
@@ -164226,12 +164202,9 @@
-
-
-
-
+
@@ -164241,12 +164214,9 @@
-
-
-
-
+
@@ -164257,9 +164227,51 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -164419,12 +164431,12 @@
-
-
+
+
-
-
+
+
@@ -164433,7 +164445,7 @@
-
+
@@ -165302,18 +165314,18 @@
-
-
-
-
-
-
+
+
+
+
+
+
-
-
-
-
+
+
+
+
@@ -165511,26 +165523,26 @@
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
-
+
+
+
+
@@ -166342,12 +166354,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -167070,12 +167082,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -167126,209 +167138,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -167464,18 +167276,7 @@
-
-
-
-
-
-
-
-
-
-
-
@@ -167510,7 +167311,7 @@
-
+
@@ -167664,13 +167465,6 @@
-
-
-
-
-
-
-
@@ -167678,10 +167472,6 @@
-
-
-
-
@@ -167911,8 +167701,8 @@
-
-
+
+
@@ -167952,52 +167742,52 @@
-
-
-
-
-
+
+
+
+
+
-
-
+
+
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
@@ -175393,7 +175183,7 @@
-
+
@@ -177615,7 +177405,7 @@
-
+
@@ -177950,27 +177740,27 @@
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
@@ -178435,13 +178225,224 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -178536,6 +178537,17 @@
+
+
+
+
+
+
+
+
+
+
+
@@ -179970,7 +179982,7 @@
-
+
@@ -179999,7 +180011,7 @@
-
+
@@ -180591,7 +180603,7 @@
-
+
@@ -181551,7 +181563,7 @@
-
+
@@ -184801,9 +184813,9 @@
-
-
-
+
+
+
@@ -185257,7 +185269,7 @@
-
+
@@ -191472,59 +191484,59 @@
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
-
+
+
+
diff --git a/include/linux/rmap.h b/include/linux/rmap.h
index 7121bdd286e9..68389d044fbd 100644
--- a/include/linux/rmap.h
+++ b/include/linux/rmap.h
@@ -38,13 +38,7 @@ struct anon_vma {
*/
atomic_t refcount;
- /*
- * Count of child anon_vmas and VMAs which points to this anon_vma.
- *
- * This counter is used for making decision about reusing anon_vma
- * instead of forking new one. See comments in function anon_vma_clone.
- */
- unsigned degree;
+ unsigned degree; /* ANDROID: KABI preservation, DO NOT USE! */
struct anon_vma *parent; /* Parent of this anon_vma */
@@ -59,6 +53,25 @@ struct anon_vma {
/* Interval tree of private "related" vmas */
struct rb_root_cached rb_root;
+
+ /*
+ * ANDROID: KABI preservation, it's safe to put these at the end of this structure as it's
+ * only passed by a pointer everywhere, the size and internal structures are local to the
+ * core kernel.
+ */
+#ifndef __GENKSYMS__
+ /*
+ * Count of child anon_vmas. Equals to the count of all anon_vmas that
+ * have ->parent pointing to this one, including itself.
+ *
+ * This counter is used for making decision about reusing anon_vma
+ * instead of forking new one. See comments in function anon_vma_clone.
+ */
+ unsigned long num_children;
+ /* Count of VMAs whose ->anon_vma pointer points to this object. */
+ unsigned long num_active_vmas;
+#endif
+
};
/*
diff --git a/mm/rmap.c b/mm/rmap.c
index ffbbd92379cb..f67418b2fc29 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -83,7 +83,8 @@ static inline struct anon_vma *anon_vma_alloc(void)
anon_vma = kmem_cache_alloc(anon_vma_cachep, GFP_KERNEL);
if (anon_vma) {
atomic_set(&anon_vma->refcount, 1);
- anon_vma->degree = 1; /* Reference for first vma */
+ anon_vma->num_children = 0;
+ anon_vma->num_active_vmas = 0;
anon_vma->parent = anon_vma;
/*
* Initialise the anon_vma root to point to itself. If called
@@ -191,6 +192,7 @@ int __anon_vma_prepare(struct vm_area_struct *vma)
anon_vma = anon_vma_alloc();
if (unlikely(!anon_vma))
goto out_enomem_free_avc;
+ anon_vma->num_children++; /* self-parent link for new root */
allocated = anon_vma;
}
@@ -200,8 +202,7 @@ int __anon_vma_prepare(struct vm_area_struct *vma)
if (likely(!vma->anon_vma)) {
vma->anon_vma = anon_vma;
anon_vma_chain_link(vma, avc, anon_vma);
- /* vma reference or self-parent link for new root */
- anon_vma->degree++;
+ anon_vma->num_active_vmas++;
allocated = NULL;
avc = NULL;
}
@@ -280,19 +281,19 @@ int anon_vma_clone(struct vm_area_struct *dst, struct vm_area_struct *src)
anon_vma_chain_link(dst, avc, anon_vma);
/*
- * Reuse existing anon_vma if its degree lower than two,
- * that means it has no vma and only one anon_vma child.
+ * Reuse existing anon_vma if it has no vma and only one
+ * anon_vma child.
*
- * Do not chose parent anon_vma, otherwise first child
- * will always reuse it. Root anon_vma is never reused:
+ * Root anon_vma is never reused:
* it has self-parent reference and at least one child.
*/
- if (!dst->anon_vma && anon_vma != src->anon_vma &&
- anon_vma->degree < 2)
+ if (!dst->anon_vma && src->anon_vma &&
+ anon_vma->num_children < 2 &&
+ anon_vma->num_active_vmas == 0)
dst->anon_vma = anon_vma;
}
if (dst->anon_vma)
- dst->anon_vma->degree++;
+ dst->anon_vma->num_active_vmas++;
unlock_anon_vma_root(root);
return 0;
@@ -342,6 +343,7 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
anon_vma = anon_vma_alloc();
if (!anon_vma)
goto out_error;
+ anon_vma->num_active_vmas++;
avc = anon_vma_chain_alloc(GFP_KERNEL);
if (!avc)
goto out_error_free_anon_vma;
@@ -362,7 +364,7 @@ int anon_vma_fork(struct vm_area_struct *vma, struct vm_area_struct *pvma)
vma->anon_vma = anon_vma;
anon_vma_lock_write(anon_vma);
anon_vma_chain_link(vma, avc, anon_vma);
- anon_vma->parent->degree++;
+ anon_vma->parent->num_children++;
anon_vma_unlock_write(anon_vma);
return 0;
@@ -394,7 +396,7 @@ void unlink_anon_vmas(struct vm_area_struct *vma)
* to free them outside the lock.
*/
if (RB_EMPTY_ROOT(&anon_vma->rb_root.rb_root)) {
- anon_vma->parent->degree--;
+ anon_vma->parent->num_children--;
continue;
}
@@ -402,7 +404,8 @@ void unlink_anon_vmas(struct vm_area_struct *vma)
anon_vma_chain_free(avc);
}
if (vma->anon_vma)
- vma->anon_vma->degree--;
+ vma->anon_vma->num_active_vmas--;
+
unlock_anon_vma_root(root);
/*
@@ -413,7 +416,8 @@ void unlink_anon_vmas(struct vm_area_struct *vma)
list_for_each_entry_safe(avc, next, &vma->anon_vma_chain, same_vma) {
struct anon_vma *anon_vma = avc->anon_vma;
- VM_WARN_ON(anon_vma->degree);
+ VM_WARN_ON(anon_vma->num_children);
+ VM_WARN_ON(anon_vma->num_active_vmas);
put_anon_vma(anon_vma);
list_del(&avc->same_vma);