diff --git a/BUILD.bazel b/BUILD.bazel index 885571722c52..8a7f131ba6e7 100644 --- a/BUILD.bazel +++ b/BUILD.bazel @@ -19,8 +19,27 @@ package( load("//build/kernel/kleaf:common_kernels.bzl", "define_common_kernels") -# This uses android/abi_gki_aarch64* in kmi_configs. If the list of -# glob(["android/abi_gki_aarch64*"]) differs from -# KMI_SYMBOL_LIST + ADDITIONAL_KMI_SYMBOL_LISTS in build.config.gki.aarch64, -# or TRIM_NONLISTED_KMI changes, override kmi_configs here. -define_common_kernels() +_aarch64_additional_kmi_symbol_lists = [ + # keep sorted + "android/abi_gki_aarch64_core", + "android/abi_gki_aarch64_db845c", + "android/abi_gki_aarch64_fips140", + "android/abi_gki_aarch64_generic", + "android/abi_gki_aarch64_hikey960", + "android/abi_gki_aarch64_type_visibility", + "android/abi_gki_aarch64_virtual_device", +] + +define_common_kernels(target_configs = { + # Sync with build.config.gki.aarch64 + "kernel_aarch64": { + "kmi_symbol_list": "android/abi_gki_aarch64", + "additional_kmi_symbol_lists": _aarch64_additional_kmi_symbol_lists, + "abi_definition": "android/abi_gki_aarch64.xml", + }, + "kernel_aarch64_debug": { + "kmi_symbol_list": "android/abi_gki_aarch64", + "additional_kmi_symbol_lists": _aarch64_additional_kmi_symbol_lists, + "abi_definition": "android/abi_gki_aarch64.xml", + }, +}) diff --git a/Documentation/filesystems/f2fs.rst b/Documentation/filesystems/f2fs.rst index 5fda320354a6..b8cdd1fcb83e 100644 --- a/Documentation/filesystems/f2fs.rst +++ b/Documentation/filesystems/f2fs.rst @@ -342,6 +342,11 @@ discard_unit=%s Control discard unit, the argument can be "block", "segment" default, it is helpful for large sized SMR or ZNS devices to reduce memory cost by getting rid of fs metadata supports small discard. +memory=%s Control memory mode. This supports "normal" and "low" modes. + "low" mode is introduced to support low memory devices. + Because of the nature of low memory devices, in this mode, f2fs + will try to save memory sometimes by sacrificing performance. + "normal" mode is the default mode and same as before. ======================== ============================================================ Debugfs Entries diff --git a/android/abi_gki_aarch64.xml b/android/abi_gki_aarch64.xml index 631ec84b350a..532be833ec36 100644 --- a/android/abi_gki_aarch64.xml +++ b/android/abi_gki_aarch64.xml @@ -23,6 +23,7 @@ + @@ -259,6 +260,7 @@ + @@ -272,6 +274,8 @@ + + @@ -339,6 +343,7 @@ + @@ -1195,6 +1200,7 @@ + @@ -1415,6 +1421,7 @@ + @@ -1909,6 +1916,7 @@ + @@ -2269,6 +2277,7 @@ + @@ -2998,7 +3007,10 @@ + + + @@ -3710,6 +3722,8 @@ + + @@ -3771,6 +3785,7 @@ + @@ -3784,6 +3799,8 @@ + + @@ -3883,6 +3900,7 @@ + @@ -3961,7 +3979,7 @@ - + @@ -4112,16 +4130,16 @@ - + - + - + - + @@ -4353,7 +4371,20 @@ - + + + + + + + + + + + + + + @@ -4430,7 +4461,7 @@ - + @@ -4465,7 +4496,7 @@ - + @@ -4888,7 +4919,7 @@ - + @@ -4920,11 +4951,60 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -5058,6 +5138,14 @@ + + + + + + + + @@ -5147,6 +5235,7 @@ + @@ -5177,6 +5266,14 @@ + + + + + + + + @@ -5334,9 +5431,12 @@ - + + + + @@ -5400,6 +5500,7 @@ + @@ -5463,6 +5564,7 @@ + @@ -5613,6 +5715,7 @@ + @@ -5759,6 +5862,7 @@ + @@ -6148,6 +6252,7 @@ + @@ -6369,43 +6474,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -6420,6 +6489,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -6489,6 +6594,7 @@ + @@ -6909,7 +7015,7 @@ - + @@ -7049,12 +7155,20 @@ + + + + + + + + - + @@ -7307,6 +7421,7 @@ + @@ -7316,6 +7431,23 @@ + + + + + + + + + + + + + + + + + @@ -7582,7 +7714,7 @@ - + @@ -7591,6 +7723,9 @@ + + + @@ -7619,43 +7754,43 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -7807,6 +7942,12 @@ + + + + + + @@ -8160,6 +8301,17 @@ + + + + + + + + + + + @@ -8287,42 +8439,42 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -8339,7 +8491,19 @@ + + + + + + + + + + + + @@ -8728,7 +8892,7 @@ - + @@ -8786,6 +8950,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -8855,6 +9043,7 @@ + @@ -9014,6 +9203,7 @@ + @@ -9111,7 +9301,62 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -9141,7 +9386,7 @@ - + @@ -9317,6 +9562,17 @@ + + + + + + + + + + + @@ -9338,6 +9594,14 @@ + + + + + + + + @@ -9354,7 +9618,7 @@ - + @@ -9614,14 +9878,16 @@ + - + + @@ -9841,7 +10107,7 @@ - + @@ -9853,7 +10119,7 @@ - + @@ -9880,10 +10146,10 @@ - + - + @@ -10714,7 +10980,7 @@ - + @@ -10743,52 +11009,60 @@ - - + - - - - - - - + - + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + @@ -11302,18 +11576,18 @@ - + - + - + - + - + @@ -11353,7 +11627,7 @@ - + @@ -11401,6 +11675,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -11412,15 +11727,15 @@ - + - + - + - + @@ -11457,7 +11772,7 @@ - + @@ -11564,7 +11879,7 @@ - + @@ -11626,7 +11941,7 @@ - + @@ -11819,7 +12134,7 @@ - + @@ -12162,6 +12477,7 @@ + @@ -12204,7 +12520,7 @@ - + @@ -12641,21 +12957,38 @@ - + - + - + - + - + + + + + + + + + + + + + + + + + + @@ -12686,7 +13019,29 @@ - + + + + + + + + + + + + + + + + + + + + + + + @@ -12948,72 +13303,72 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -13028,7 +13383,7 @@ - + @@ -13314,6 +13669,7 @@ + @@ -13332,6 +13688,12 @@ + + + + + + @@ -13383,7 +13745,7 @@ - + @@ -13541,6 +13903,14 @@ + + + + + + + + @@ -13696,6 +14066,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -13749,6 +14142,7 @@ + @@ -13781,7 +14175,65 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -14008,6 +14460,12 @@ + + + + + + @@ -14074,7 +14532,7 @@ - + @@ -14456,6 +14914,10 @@ + + + + @@ -14504,7 +14966,7 @@ - + @@ -14633,6 +15095,7 @@ + @@ -14670,6 +15133,12 @@ + + + + + + @@ -14749,9 +15218,12 @@ - + + + + @@ -15325,6 +15797,20 @@ + + + + + + + + + + + + + + @@ -15357,8 +15843,9 @@ + - + @@ -15398,11 +15885,12 @@ + - + @@ -15584,6 +16072,7 @@ + @@ -15807,7 +16296,7 @@ - + @@ -15825,39 +16314,39 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -15998,6 +16487,8 @@ + + @@ -16218,6 +16709,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -16297,7 +16871,7 @@ - + @@ -16391,7 +16965,7 @@ - + @@ -16787,6 +17361,7 @@ + @@ -17237,7 +17812,194 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -17295,6 +18057,12 @@ + + + + + + @@ -17805,7 +18573,7 @@ - + @@ -17923,6 +18691,7 @@ + @@ -18096,7 +18865,20 @@ - + + + + + + + + + + + + + + @@ -18194,6 +18976,7 @@ + @@ -18765,6 +19548,14 @@ + + + + + + + + @@ -18796,6 +19587,7 @@ + @@ -18838,7 +19630,7 @@ - + @@ -19086,6 +19878,7 @@ + @@ -19413,6 +20206,23 @@ + + + + + + + + + + + + + + + + + @@ -19639,6 +20449,7 @@ + @@ -19885,7 +20696,7 @@ - + @@ -20400,6 +21211,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -20509,7 +21385,7 @@ - + @@ -20658,7 +21534,7 @@ - + @@ -20960,13 +21836,21 @@ + + + + + + + + - + @@ -20986,6 +21870,7 @@ + @@ -21070,6 +21955,7 @@ + @@ -21079,7 +21965,7 @@ - + @@ -21098,6 +21984,7 @@ + @@ -21129,6 +22016,20 @@ + + + + + + + + + + + + + + @@ -21434,6 +22335,7 @@ + @@ -21579,6 +22481,16 @@ + + + + + + + + + + @@ -21650,6 +22562,10 @@ + + + + @@ -22036,6 +22952,9 @@ + + + @@ -22109,6 +23028,12 @@ + + + + + + @@ -22119,6 +23044,7 @@ + @@ -22440,6 +23366,7 @@ + @@ -22512,6 +23439,7 @@ + @@ -22852,7 +23780,7 @@ - + @@ -22905,6 +23833,7 @@ + @@ -23084,6 +24013,7 @@ + @@ -23139,6 +24069,12 @@ + + + + + + @@ -23234,6 +24170,11 @@ + + + + + @@ -23333,7 +24274,7 @@ - + @@ -23939,6 +24880,14 @@ + + + + + + + + @@ -24374,6 +25323,7 @@ + @@ -24384,6 +25334,7 @@ + @@ -25287,7 +26238,7 @@ - + @@ -25343,6 +26294,14 @@ + + + + + + + + @@ -25658,6 +26617,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -25667,6 +26649,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -25768,7 +26791,7 @@ - + @@ -26319,27 +27342,27 @@ - + - + - + - + - + - + - + - + @@ -26421,6 +27444,9 @@ + + + @@ -26541,6 +27567,7 @@ + @@ -26745,6 +27772,12 @@ + + + + + + @@ -26864,7 +27897,7 @@ - + @@ -26915,7 +27948,7 @@ - + @@ -26923,6 +27956,9 @@ + + + @@ -27132,7 +28168,7 @@ - + @@ -27178,7 +28214,7 @@ - + @@ -27289,7 +28325,7 @@ - + @@ -27469,6 +28505,23 @@ + + + + + + + + + + + + + + + + + @@ -27489,7 +28542,7 @@ - + @@ -27502,6 +28555,11 @@ + + + + + @@ -27623,6 +28681,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -28095,11 +29185,12 @@ - + + @@ -28434,6 +29525,12 @@ + + + + + + @@ -28463,12 +29560,12 @@ - + - + @@ -28704,6 +29801,10 @@ + + + + @@ -28712,6 +29813,7 @@ + @@ -28784,6 +29886,7 @@ + @@ -28794,7 +29897,7 @@ - + @@ -28951,7 +30054,7 @@ - + @@ -29042,6 +30145,14 @@ + + + + + + + + @@ -29095,6 +30206,7 @@ + @@ -29857,6 +30969,12 @@ + + + + + + @@ -30127,7 +31245,7 @@ - + @@ -30180,6 +31298,7 @@ + @@ -30258,7 +31377,7 @@ - + @@ -30309,6 +31428,12 @@ + + + + + + @@ -30581,6 +31706,10 @@ + + + + @@ -30739,6 +31868,7 @@ + @@ -31205,6 +32335,14 @@ + + + + + + + + @@ -31788,6 +32926,10 @@ + + + + @@ -31903,6 +33045,13 @@ + + + + + + + @@ -32330,7 +33479,7 @@ - + @@ -32341,7 +33490,14 @@ - + + + + + + + + @@ -32477,24 +33633,24 @@ - + - + - + - + - + - + - + @@ -32728,7 +33884,7 @@ - + @@ -32903,7 +34059,7 @@ - + @@ -32941,6 +34097,14 @@ + + + + + + + + @@ -33117,7 +34281,7 @@ - + @@ -33337,6 +34501,7 @@ + @@ -33491,7 +34656,22 @@ + + + + + + + + + + + + + + + @@ -33538,18 +34718,18 @@ - + - + - + - + - + @@ -34115,6 +35295,17 @@ + + + + + + + + + + + @@ -34234,7 +35425,7 @@ - + @@ -34300,7 +35491,7 @@ - + @@ -34656,6 +35847,7 @@ + @@ -34756,13 +35948,13 @@ - + - + - + @@ -34786,7 +35978,7 @@ - + @@ -34804,13 +35996,13 @@ - + - + @@ -34819,7 +36011,7 @@ - + @@ -34828,7 +36020,7 @@ - + @@ -35200,6 +36392,14 @@ + + + + + + + + @@ -35471,7 +36671,7 @@ - + @@ -35750,13 +36950,13 @@ - + - + @@ -35774,7 +36974,7 @@ - + @@ -35868,10 +37068,17 @@ + + + + + + + @@ -35977,6 +37184,7 @@ + @@ -36145,6 +37353,7 @@ + @@ -36788,6 +37997,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -36861,6 +38096,7 @@ + @@ -36883,7 +38119,29 @@ - + + + + + + + + + + + + + + + + + + + + + + + @@ -37064,7 +38322,7 @@ - + @@ -37073,7 +38331,7 @@ - + @@ -37532,7 +38790,23 @@ - + + + + + + + + + + + + + + + + + @@ -37810,7 +39084,7 @@ - + @@ -38366,6 +39640,12 @@ + + + + + + @@ -38376,7 +39656,7 @@ - + @@ -39052,6 +40332,7 @@ + @@ -39082,7 +40363,7 @@ - + @@ -39435,6 +40716,14 @@ + + + + + + + + @@ -39686,9 +40975,15 @@ - + + + + + + + @@ -39904,6 +41199,7 @@ + @@ -40055,6 +41351,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -40143,6 +41487,20 @@ + + + + + + + + + + + + + + @@ -40848,7 +42206,7 @@ - + @@ -40914,6 +42272,7 @@ + @@ -41045,6 +42404,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -41370,7 +42752,7 @@ - + @@ -41847,6 +43229,7 @@ + @@ -41963,7 +43346,7 @@ - + @@ -42012,6 +43395,11 @@ + + + + + @@ -42112,7 +43500,35 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -42466,6 +43882,11 @@ + + + + + @@ -42620,7 +44041,7 @@ - + @@ -42636,6 +44057,7 @@ + @@ -43239,6 +44661,7 @@ + @@ -43920,6 +45343,7 @@ + @@ -44079,6 +45503,7 @@ + @@ -44131,6 +45556,7 @@ + @@ -44393,6 +45819,12 @@ + + + + + + @@ -44609,6 +46041,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -44641,7 +46111,77 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -44681,7 +46221,7 @@ - + @@ -44830,7 +46370,7 @@ - + @@ -45135,6 +46675,9 @@ + + + @@ -45853,81 +47396,81 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -46167,6 +47710,13 @@ + + + + + + + @@ -46269,6 +47819,7 @@ + @@ -46421,13 +47972,13 @@ - + - + - + @@ -46436,7 +47987,7 @@ - + @@ -46450,7 +48001,7 @@ - + @@ -46473,7 +48024,7 @@ - + @@ -46519,7 +48070,7 @@ - + @@ -46614,6 +48165,14 @@ + + + + + + + + @@ -47057,6 +48616,10 @@ + + + + @@ -47131,6 +48694,23 @@ + + + + + + + + + + + + + + + + + @@ -47700,7 +49280,7 @@ - + @@ -47813,6 +49393,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -47904,6 +49516,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -47975,6 +49607,14 @@ + + + + + + + + @@ -48040,6 +49680,20 @@ + + + + + + + + + + + + + + @@ -48484,6 +50138,7 @@ + @@ -48597,7 +50252,7 @@ - + @@ -48760,6 +50415,12 @@ + + + + + + @@ -49165,12 +50826,34 @@ + + + + + + + + + + + + + + + + + + + + + + @@ -49389,7 +51072,7 @@ - + @@ -49527,6 +51210,7 @@ + @@ -49673,7 +51357,29 @@ - + + + + + + + + + + + + + + + + + + + + + + + @@ -50408,7 +52114,7 @@ - + @@ -50450,30 +52156,30 @@ - + - + - + - + - + - + - + - + - + @@ -50874,6 +52580,7 @@ + @@ -51000,7 +52707,7 @@ - + @@ -51139,6 +52846,7 @@ + @@ -51290,7 +52998,7 @@ - + @@ -51326,6 +53034,7 @@ + @@ -51489,7 +53198,146 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -51675,6 +53523,7 @@ + @@ -52101,6 +53950,11 @@ + + + + + @@ -52109,7 +53963,7 @@ - + @@ -52204,6 +54058,14 @@ + + + + + + + + @@ -52354,6 +54216,15 @@ + + + + + + + + + @@ -52512,7 +54383,7 @@ - + @@ -52545,6 +54416,11 @@ + + + + + @@ -52936,6 +54812,20 @@ + + + + + + + + + + + + + + @@ -53124,6 +55014,14 @@ + + + + + + + + @@ -53248,7 +55146,7 @@ - + @@ -53281,10 +55179,10 @@ - + - + @@ -53309,6 +55207,7 @@ + @@ -53477,7 +55376,7 @@ - + @@ -53584,6 +55483,7 @@ + @@ -53806,7 +55706,7 @@ - + @@ -53978,7 +55878,7 @@ - + @@ -54069,7 +55969,7 @@ - + @@ -54087,6 +55987,7 @@ + @@ -54572,10 +56473,15 @@ - + + + + + + @@ -54601,7 +56507,7 @@ - + @@ -54814,24 +56720,24 @@ - + - + - + - + - + - + - + @@ -55160,7 +57066,7 @@ - + @@ -55168,6 +57074,7 @@ + @@ -55436,7 +57343,20 @@ - + + + + + + + + + + + + + + @@ -55505,7 +57425,7 @@ - + @@ -56007,7 +57927,7 @@ - + @@ -56069,13 +57989,13 @@ - + - + @@ -56227,61 +58147,61 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -56321,7 +58241,7 @@ - + @@ -56371,6 +58291,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -56413,16 +58353,16 @@ - + - + - + - + @@ -56566,7 +58506,53 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -57514,15 +59500,15 @@ - + - + - + - + @@ -57712,6 +59698,9 @@ + + + @@ -57781,6 +59770,13 @@ + + + + + + + @@ -57849,6 +59845,10 @@ + + + + @@ -57963,6 +59963,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -58208,7 +60234,7 @@ - + @@ -58398,72 +60424,72 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -58506,6 +60532,7 @@ + @@ -58525,6 +60552,13 @@ + + + + + + + @@ -58899,7 +60933,7 @@ - + @@ -58978,6 +61012,12 @@ + + + + + + @@ -59207,6 +61247,20 @@ + + + + + + + + + + + + + + @@ -59263,7 +61317,7 @@ - + @@ -59342,15 +61396,15 @@ - + - + - + - + @@ -59693,7 +61747,7 @@ - + @@ -59765,6 +61819,15 @@ + + + + + + + + + @@ -59775,7 +61838,7 @@ - + @@ -59877,6 +61940,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -59935,6 +62021,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -60094,7 +62203,7 @@ - + @@ -60135,6 +62244,7 @@ + @@ -60278,7 +62388,7 @@ - + @@ -60307,6 +62417,13 @@ + + + + + + + @@ -60345,13 +62462,13 @@ - + - + @@ -60363,7 +62480,7 @@ - + @@ -60622,7 +62739,7 @@ - + @@ -60742,6 +62859,7 @@ + @@ -60927,12 +63045,12 @@ - + - + - + @@ -61109,6 +63227,17 @@ + + + + + + + + + + + @@ -61241,7 +63370,7 @@ - + @@ -61341,7 +63470,191 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -62084,6 +64397,7 @@ + @@ -62328,7 +64642,7 @@ - + @@ -62400,7 +64714,7 @@ - + @@ -62844,6 +65158,7 @@ + @@ -63235,6 +65550,7 @@ + @@ -63286,7 +65602,7 @@ - + @@ -63299,7 +65615,7 @@ - + @@ -63419,7 +65735,7 @@ - + @@ -63538,7 +65854,7 @@ - + @@ -63556,7 +65872,7 @@ - + @@ -63583,7 +65899,7 @@ - + @@ -63831,16 +66147,27 @@ - + - + - + + + + + + + + + + + + @@ -63974,6 +66301,7 @@ + @@ -64241,7 +66569,7 @@ - + @@ -64486,6 +66814,9 @@ + + + @@ -64613,6 +66944,7 @@ + @@ -64736,6 +67068,7 @@ + @@ -64779,69 +67112,69 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -64932,6 +67265,7 @@ + @@ -64959,7 +67293,7 @@ - + @@ -65093,25 +67427,25 @@ - + - + - + - + - + - + - + @@ -65264,6 +67598,7 @@ + @@ -65324,7 +67659,7 @@ - + @@ -65393,15 +67728,15 @@ - + - + - + @@ -65461,7 +67796,7 @@ - + @@ -65636,6 +67971,9 @@ + + + @@ -65899,11 +68237,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -66019,7 +68385,7 @@ - + @@ -66064,6 +68430,7 @@ + @@ -66075,6 +68442,7 @@ + @@ -66176,12 +68544,12 @@ - + - + - + @@ -66204,7 +68572,7 @@ - + @@ -66323,6 +68691,10 @@ + + + + @@ -66578,6 +68950,7 @@ + @@ -66689,7 +69062,7 @@ - + @@ -66830,6 +69203,7 @@ + @@ -66844,6 +69218,7 @@ + @@ -66913,7 +69288,7 @@ - + @@ -66980,59 +69355,65 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + @@ -67055,7 +69436,7 @@ - + @@ -67211,7 +69592,7 @@ - + @@ -67397,7 +69778,7 @@ - + @@ -67657,7 +70038,7 @@ - + @@ -67684,7 +70065,7 @@ - + @@ -67695,7 +70076,7 @@ - + @@ -67746,66 +70127,160 @@ - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - - - + - - - - - - - - - - - - - - - - - + - + - + @@ -67822,23 +70297,23 @@ - + - + - + - + - + @@ -67849,15 +70324,15 @@ - + - + - + - + @@ -67874,7 +70349,7 @@ - + @@ -67882,7 +70357,7 @@ - + @@ -67893,12 +70368,12 @@ - + - + @@ -67906,7 +70381,7 @@ - + @@ -67914,7 +70389,7 @@ - + @@ -67922,7 +70397,7 @@ - + @@ -67930,7 +70405,7 @@ - + @@ -67947,7 +70422,7 @@ - + @@ -67964,21 +70439,21 @@ - + - + - + - + - + - + @@ -67989,7 +70464,7 @@ - + @@ -67997,12 +70472,12 @@ - + - + @@ -68010,7 +70485,7 @@ - + @@ -68021,7 +70496,7 @@ - + @@ -68032,7 +70507,7 @@ - + @@ -68043,12 +70518,12 @@ - + - + - + @@ -68056,13 +70531,13 @@ - + - + - + @@ -68070,7 +70545,7 @@ - + @@ -68078,7 +70553,7 @@ - + @@ -68086,7 +70561,7 @@ - + @@ -68094,7 +70569,7 @@ - + @@ -68105,7 +70580,7 @@ - + @@ -68119,7 +70594,7 @@ - + @@ -68127,7 +70602,7 @@ - + @@ -68135,7 +70610,7 @@ - + @@ -68143,7 +70618,7 @@ - + @@ -68169,12 +70644,12 @@ - + - + @@ -68182,23 +70657,23 @@ - + - + - + - + - + - + - + @@ -68206,7 +70681,7 @@ - + @@ -68232,7 +70707,7 @@ - + @@ -68243,7 +70718,7 @@ - + @@ -68251,7 +70726,7 @@ - + @@ -68259,7 +70734,7 @@ - + @@ -68270,7 +70745,7 @@ - + @@ -68278,7 +70753,7 @@ - + @@ -68289,7 +70764,7 @@ - + @@ -68297,7 +70772,7 @@ - + @@ -68308,7 +70783,7 @@ - + @@ -68319,7 +70794,7 @@ - + @@ -68327,7 +70802,7 @@ - + @@ -68347,19 +70822,19 @@ - + - + - + - - + + @@ -68367,7 +70842,7 @@ - + @@ -68375,7 +70850,7 @@ - + @@ -68383,7 +70858,7 @@ - + @@ -68391,7 +70866,7 @@ - + @@ -68402,15 +70877,15 @@ - + - + - + @@ -68418,15 +70893,15 @@ - + - + - + @@ -68434,7 +70909,7 @@ - + @@ -68442,7 +70917,7 @@ - + @@ -68450,10 +70925,10 @@ - + - + @@ -68461,7 +70936,7 @@ - + @@ -68469,7 +70944,7 @@ - + @@ -68480,7 +70955,7 @@ - + @@ -68491,15 +70966,15 @@ - + - + - + @@ -68507,7 +70982,7 @@ - + @@ -68515,31 +70990,31 @@ - + - + - + - + - + - + - + @@ -68547,33 +71022,33 @@ - + - + - + - + - + - + - + - + - + @@ -68587,7 +71062,7 @@ - + @@ -68595,15 +71070,15 @@ - + - + - + @@ -68611,10 +71086,10 @@ - + - + @@ -68622,15 +71097,15 @@ - + - + - + @@ -68641,7 +71116,7 @@ - + @@ -68649,7 +71124,7 @@ - + @@ -68660,7 +71135,7 @@ - + @@ -68668,15 +71143,15 @@ - + - + - + @@ -68690,31 +71165,31 @@ - + - + - + - + - + - + - + - + @@ -68722,7 +71197,7 @@ - + @@ -68733,7 +71208,7 @@ - + @@ -68741,7 +71216,15 @@ - + + + + + + + + + @@ -68749,7 +71232,7 @@ - + @@ -68757,7 +71240,7 @@ - + @@ -68768,7 +71251,7 @@ - + @@ -68776,7 +71259,7 @@ - + @@ -68784,7 +71267,7 @@ - + @@ -68792,37 +71275,37 @@ - + - + - + - + - + - + - + - + - + - + @@ -68830,7 +71313,7 @@ - + @@ -68838,7 +71321,7 @@ - + @@ -68846,23 +71329,23 @@ - + - + - + - + - + @@ -68870,15 +71353,15 @@ - + - + - + @@ -68886,7 +71369,7 @@ - + @@ -68900,15 +71383,15 @@ - + - + - + - + @@ -68916,7 +71399,7 @@ - + @@ -68930,7 +71413,7 @@ - + @@ -68944,15 +71427,15 @@ - + - + - + @@ -68960,9 +71443,9 @@ - + - + @@ -68974,7 +71457,7 @@ - + @@ -68982,7 +71465,7 @@ - + @@ -68990,12 +71473,12 @@ - + - + - + @@ -69003,15 +71486,15 @@ - + - + - + @@ -69031,7 +71514,7 @@ - + @@ -69039,18 +71522,18 @@ - + - + - + - + - + @@ -69058,7 +71541,7 @@ - + @@ -69066,7 +71549,7 @@ - + @@ -69074,7 +71557,7 @@ - + @@ -69088,7 +71571,7 @@ - + @@ -69108,7 +71591,7 @@ - + @@ -69117,26 +71600,26 @@ - + - + - + - + - + - + @@ -69144,15 +71627,15 @@ - + - + - + @@ -69160,7 +71643,7 @@ - + @@ -69171,7 +71654,7 @@ - + @@ -69179,7 +71662,7 @@ - + @@ -69190,7 +71673,7 @@ - + @@ -69201,7 +71684,7 @@ - + @@ -69215,7 +71698,7 @@ - + @@ -69223,7 +71706,7 @@ - + @@ -69240,7 +71723,7 @@ - + @@ -69248,15 +71731,15 @@ - + - + - + @@ -69264,7 +71747,7 @@ - + @@ -69290,12 +71773,12 @@ - + - + @@ -69336,7 +71819,7 @@ - + @@ -69344,7 +71827,7 @@ - + @@ -69352,7 +71835,7 @@ - + @@ -69360,7 +71843,7 @@ - + @@ -69368,15 +71851,15 @@ - + - + - + - + @@ -69384,7 +71867,7 @@ - + @@ -69392,7 +71875,7 @@ - + @@ -69400,18 +71883,18 @@ - + - + - + - + @@ -69419,32 +71902,32 @@ - + - + - + - + - + - + - + - + - + - + @@ -69452,30 +71935,49 @@ - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + @@ -69483,7 +71985,23 @@ - + + + + + + + + + + + + + + + + + @@ -69494,38 +72012,38 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -69534,15 +72052,15 @@ - + - + - + @@ -69550,7 +72068,7 @@ - + @@ -69558,101 +72076,101 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -69660,38 +72178,38 @@ - + - + - + - + - + - + - + - + - + - + @@ -69699,7 +72217,7 @@ - + @@ -69707,7 +72225,7 @@ - + @@ -69715,7 +72233,7 @@ - + @@ -69723,7 +72241,7 @@ - + @@ -69731,7 +72249,7 @@ - + @@ -69739,7 +72257,7 @@ - + @@ -69750,7 +72268,7 @@ - + @@ -69758,7 +72276,7 @@ - + @@ -69768,6 +72286,7 @@ + @@ -69802,7 +72321,7 @@ - + @@ -70086,7 +72605,14 @@ - + + + + + + + + @@ -70228,6 +72754,7 @@ + @@ -70822,6 +73349,7 @@ + @@ -70856,6 +73384,7 @@ + @@ -70972,7 +73501,26 @@ - + + + + + + + + + + + + + + + + + + + + @@ -71210,45 +73758,46 @@ - + + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -71659,6 +74208,7 @@ + @@ -71981,6 +74531,7 @@ + @@ -72162,6 +74713,11 @@ + + + + + @@ -72375,6 +74931,11 @@ + + + + + @@ -72405,10 +74966,12 @@ + + @@ -72516,7 +75079,7 @@ - + @@ -72550,6 +75113,11 @@ + + + + + @@ -72620,19 +75188,20 @@ + - + - + - + - + @@ -72686,10 +75255,26 @@ - + + + + + + + + + + + + + + + + + + - @@ -72914,7 +75499,7 @@ - + @@ -73024,6 +75609,12 @@ + + + + + + @@ -73399,7 +75990,7 @@ - + @@ -73630,6 +76221,7 @@ + @@ -73877,6 +76469,7 @@ + @@ -74024,6 +76617,7 @@ + @@ -74073,7 +76667,7 @@ - + @@ -74220,7 +76814,7 @@ - + @@ -74231,7 +76825,7 @@ - + @@ -74853,7 +77447,7 @@ - + @@ -74998,6 +77592,7 @@ + @@ -75489,12 +78084,12 @@ - + - + - + @@ -75690,7 +78285,7 @@ - + @@ -75792,7 +78387,7 @@ - + @@ -75812,6 +78407,9 @@ + + + @@ -76566,7 +79164,7 @@ - + @@ -76704,312 +79302,312 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -77318,6 +79916,10 @@ + + + + @@ -77747,6 +80349,7 @@ + @@ -77964,7 +80567,7 @@ - + @@ -78183,6 +80786,12 @@ + + + + + + @@ -78197,6 +80806,7 @@ + @@ -78272,6 +80882,14 @@ + + + + + + + + @@ -78280,6 +80898,7 @@ + @@ -78304,6 +80923,7 @@ + @@ -78393,6 +81013,20 @@ + + + + + + + + + + + + + + @@ -78401,6 +81035,7 @@ + @@ -78435,7 +81070,7 @@ - + @@ -78513,6 +81148,7 @@ + @@ -78820,6 +81456,20 @@ + + + + + + + + + + + + + + @@ -78879,7 +81529,7 @@ - + @@ -78918,6 +81568,12 @@ + + + + + + @@ -79000,10 +81656,10 @@ - + - + @@ -79106,6 +81762,23 @@ + + + + + + + + + + + + + + + + + @@ -79372,7 +82045,7 @@ - + @@ -79707,7 +82380,7 @@ - + @@ -79809,7 +82482,7 @@ - + @@ -79826,7 +82499,7 @@ - + @@ -79888,6 +82561,13 @@ + + + + + + + @@ -79919,6 +82599,7 @@ + @@ -80012,6 +82693,7 @@ + @@ -80183,6 +82865,14 @@ + + + + + + + + @@ -81039,6 +83729,12 @@ + + + + + + @@ -81484,6 +84180,7 @@ + @@ -81572,6 +84269,7 @@ + @@ -81756,6 +84454,10 @@ + + + + @@ -81973,15 +84675,15 @@ - + - + - + - + @@ -82194,7 +84896,7 @@ - + @@ -82307,7 +85009,7 @@ - + @@ -82397,7 +85099,7 @@ - + @@ -82429,6 +85131,7 @@ + @@ -82798,7 +85501,7 @@ - + @@ -82834,7 +85537,7 @@ - + @@ -83138,6 +85841,7 @@ + @@ -83605,13 +86309,13 @@ - + - + @@ -83709,7 +86413,7 @@ - + @@ -83823,7 +86527,7 @@ - + @@ -83837,7 +86541,7 @@ - + @@ -83959,13 +86663,13 @@ - + - + - + @@ -84013,7 +86717,7 @@ - + @@ -84119,6 +86823,14 @@ + + + + + + + + @@ -84236,7 +86948,7 @@ - + @@ -84316,22 +87028,22 @@ - + - + - + - + - + - + @@ -84478,6 +87190,17 @@ + + + + + + + + + + + @@ -84813,6 +87536,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -84891,7 +87670,7 @@ - + @@ -85117,7 +87896,7 @@ - + @@ -85252,7 +88031,7 @@ - + @@ -85357,7 +88136,7 @@ - + @@ -85569,6 +88348,7 @@ + @@ -85683,6 +88463,7 @@ + @@ -85715,7 +88496,28 @@ + + + + + + + + + + + + + + + + + + + + + @@ -85819,6 +88621,7 @@ + @@ -85962,7 +88765,7 @@ - + @@ -86145,7 +88948,7 @@ - + @@ -86216,6 +89019,17 @@ + + + + + + + + + + + @@ -86753,6 +89567,11 @@ + + + + + @@ -87123,7 +89942,7 @@ - + @@ -87132,7 +89951,7 @@ - + @@ -87528,6 +90347,9 @@ + + + @@ -87692,6 +90514,7 @@ + @@ -87731,6 +90554,7 @@ + @@ -88130,7 +90954,7 @@ - + @@ -88207,7 +91031,7 @@ - + @@ -88217,6 +91041,14 @@ + + + + + + + + @@ -88371,10 +91203,10 @@ - + - + @@ -89217,10 +92049,10 @@ - + - + @@ -89232,7 +92064,7 @@ - + @@ -89390,6 +92222,7 @@ + @@ -89590,6 +92423,26 @@ + + + + + + + + + + + + + + + + + + + + @@ -89615,6 +92468,14 @@ + + + + + + + + @@ -89651,6 +92512,10 @@ + + + + @@ -89672,6 +92537,17 @@ + + + + + + + + + + + @@ -89751,7 +92627,86 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -89909,7 +92864,7 @@ - + @@ -90010,7 +92965,7 @@ - + @@ -90228,7 +93183,44 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -90315,6 +93307,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -90392,7 +93407,7 @@ - + @@ -90439,12 +93454,12 @@ - + - + - + @@ -90890,6 +93905,7 @@ + @@ -91550,6 +94566,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -91675,6 +94720,12 @@ + + + + + + @@ -91859,7 +94910,7 @@ - + @@ -91883,6 +94934,11 @@ + + + + + @@ -92021,7 +95077,7 @@ - + @@ -92292,7 +95348,7 @@ - + @@ -92377,7 +95433,7 @@ - + @@ -92599,6 +95655,11 @@ + + + + + @@ -93708,7 +96769,7 @@ - + @@ -93941,21 +97002,21 @@ - + - + - + - + - + - + @@ -94007,6 +97068,9 @@ + + + @@ -94243,7 +97307,206 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -94251,7 +97514,15 @@ - + + + + + + + + + @@ -94259,7 +97530,7 @@ - + @@ -94267,7 +97538,7 @@ - + @@ -94314,7 +97585,7 @@ - + @@ -94325,7 +97596,7 @@ - + @@ -94345,7 +97616,7 @@ - + @@ -94368,7 +97639,7 @@ - + @@ -94388,26 +97659,26 @@ - + - + - + - + - + @@ -94421,7 +97692,7 @@ - + @@ -94429,7 +97700,7 @@ - + @@ -94449,7 +97720,7 @@ - + @@ -94472,7 +97743,7 @@ - + @@ -94480,7 +97751,7 @@ - + @@ -94488,7 +97759,7 @@ - + @@ -94496,7 +97767,7 @@ - + @@ -94504,7 +97775,7 @@ - + @@ -94530,17 +97801,17 @@ - + - + - + @@ -94548,17 +97819,17 @@ - + - + - + @@ -94575,7 +97846,7 @@ - + @@ -94589,7 +97860,7 @@ - + @@ -94603,7 +97874,7 @@ - + @@ -94632,7 +97903,7 @@ - + @@ -94649,7 +97920,7 @@ - + @@ -94663,7 +97934,7 @@ - + @@ -94677,7 +97948,7 @@ - + @@ -94691,7 +97962,7 @@ - + @@ -94702,7 +97973,7 @@ - + @@ -94716,15 +97987,15 @@ - + - + - + @@ -94732,7 +98003,7 @@ - + @@ -94746,12 +98017,12 @@ - + - + @@ -94759,7 +98030,7 @@ - + @@ -94767,7 +98038,7 @@ - + @@ -94778,7 +98049,7 @@ - + @@ -94786,7 +98057,7 @@ - + @@ -94794,7 +98065,7 @@ - + @@ -94805,7 +98076,7 @@ - + @@ -94813,7 +98084,7 @@ - + @@ -94830,7 +98101,7 @@ - + @@ -94838,7 +98109,7 @@ - + @@ -94846,7 +98117,7 @@ - + @@ -94860,7 +98131,7 @@ - + @@ -94874,14 +98145,14 @@ - + - + - + @@ -94890,10 +98161,10 @@ - + - + @@ -94910,7 +98181,7 @@ - + @@ -94921,7 +98192,7 @@ - + @@ -94932,13 +98203,13 @@ - + - + @@ -94946,7 +98217,7 @@ - + @@ -94957,7 +98228,7 @@ - + @@ -94968,7 +98239,7 @@ - + @@ -94976,7 +98247,7 @@ - + @@ -95152,13 +98423,13 @@ - + - + @@ -95169,7 +98440,7 @@ - + @@ -95177,10 +98448,10 @@ - + - + @@ -95188,7 +98459,7 @@ - + @@ -95196,7 +98467,7 @@ - + @@ -95210,7 +98481,7 @@ - + @@ -95218,7 +98489,7 @@ - + @@ -95226,7 +98497,7 @@ - + @@ -95234,7 +98505,7 @@ - + @@ -95242,7 +98513,7 @@ - + @@ -95253,7 +98524,7 @@ - + @@ -95261,7 +98532,7 @@ - + @@ -95275,7 +98546,7 @@ - + @@ -95286,7 +98557,7 @@ - + @@ -95294,7 +98565,7 @@ - + @@ -95302,7 +98573,7 @@ - + @@ -95310,7 +98581,7 @@ - + @@ -95330,7 +98601,7 @@ - + @@ -95338,13 +98609,13 @@ - + - + @@ -95361,7 +98632,7 @@ - + @@ -95375,7 +98646,7 @@ - + @@ -95389,7 +98660,7 @@ - + @@ -95397,7 +98668,7 @@ - + @@ -95411,7 +98682,7 @@ - + @@ -95422,7 +98693,7 @@ - + @@ -95439,15 +98710,15 @@ - + - + - + @@ -95455,7 +98726,7 @@ - + @@ -95466,7 +98737,7 @@ - + @@ -95477,7 +98748,7 @@ - + @@ -95485,7 +98756,7 @@ - + @@ -95502,7 +98773,7 @@ - + @@ -95525,7 +98796,7 @@ - + @@ -95533,7 +98804,7 @@ - + @@ -95544,7 +98815,7 @@ - + @@ -95558,18 +98829,18 @@ - + - + - + - + @@ -95595,7 +98866,7 @@ - + @@ -95606,7 +98877,7 @@ - + @@ -95614,7 +98885,7 @@ - + @@ -95634,7 +98905,7 @@ - + @@ -95645,7 +98916,7 @@ - + @@ -95656,12 +98927,12 @@ - + - + @@ -95669,7 +98940,7 @@ - + @@ -95677,7 +98948,7 @@ - + @@ -95685,7 +98956,7 @@ - + @@ -95693,12 +98964,12 @@ - + - + @@ -95706,7 +98977,7 @@ - + @@ -95714,7 +98985,7 @@ - + @@ -95722,7 +98993,7 @@ - + @@ -95730,7 +99001,7 @@ - + @@ -95738,7 +99009,7 @@ - + @@ -95746,7 +99017,7 @@ - + @@ -95787,7 +99058,7 @@ - + @@ -95795,13 +99066,13 @@ - + - + @@ -95827,7 +99098,7 @@ - + @@ -95892,7 +99163,7 @@ - + @@ -95903,7 +99174,7 @@ - + @@ -95920,7 +99191,7 @@ - + @@ -95964,9 +99235,9 @@ - + - + @@ -95975,7 +99246,7 @@ - + @@ -95986,7 +99257,7 @@ - + @@ -96006,7 +99277,7 @@ - + @@ -96014,7 +99285,7 @@ - + @@ -96031,7 +99302,7 @@ - + @@ -96060,12 +99331,12 @@ - + - + @@ -96074,10 +99345,10 @@ - + - + @@ -96091,17 +99362,17 @@ - + - + - + @@ -96109,7 +99380,7 @@ - + @@ -96120,7 +99391,7 @@ - + @@ -96128,7 +99399,7 @@ - + @@ -96169,7 +99440,7 @@ - + @@ -96177,7 +99448,7 @@ - + @@ -96185,7 +99456,7 @@ - + @@ -96199,7 +99470,7 @@ - + @@ -96219,7 +99490,7 @@ - + @@ -96227,7 +99498,7 @@ - + @@ -96235,7 +99506,7 @@ - + @@ -96243,12 +99514,12 @@ - + - + @@ -96256,7 +99527,7 @@ - + @@ -96264,10 +99535,10 @@ - + - + @@ -96275,23 +99546,23 @@ - + - + - - + + - + @@ -96300,12 +99571,12 @@ - + - + @@ -96313,12 +99584,12 @@ - + - + @@ -96326,12 +99597,12 @@ - + - + @@ -96348,7 +99619,7 @@ - + @@ -96356,7 +99627,7 @@ - + @@ -96364,12 +99635,12 @@ - + - + @@ -96377,7 +99648,7 @@ - + @@ -96385,9 +99656,9 @@ - + - + @@ -96402,12 +99673,12 @@ - + - + @@ -96433,7 +99704,7 @@ - + @@ -96444,7 +99715,7 @@ - + @@ -96464,7 +99735,7 @@ - + @@ -96487,53 +99758,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -96547,12 +99772,12 @@ - + - + @@ -96563,7 +99788,7 @@ - + @@ -96577,7 +99802,7 @@ - + @@ -96588,7 +99813,7 @@ - + @@ -96602,7 +99827,7 @@ - + @@ -96616,20 +99841,20 @@ - + - + - + - + @@ -96643,7 +99868,7 @@ - + @@ -96651,7 +99876,7 @@ - + @@ -96662,7 +99887,7 @@ - + @@ -96679,7 +99904,7 @@ - + @@ -96699,7 +99924,7 @@ - + @@ -96716,7 +99941,7 @@ - + @@ -96727,7 +99952,7 @@ - + @@ -96735,7 +99960,7 @@ - + @@ -96743,7 +99968,7 @@ - + @@ -96751,7 +99976,7 @@ - + @@ -96765,7 +99990,7 @@ - + @@ -96773,7 +99998,7 @@ - + @@ -96784,7 +100009,7 @@ - + @@ -96801,7 +100026,7 @@ - + @@ -96827,7 +100052,7 @@ - + @@ -96838,7 +100063,7 @@ - + @@ -96849,7 +100074,7 @@ - + @@ -97155,6 +100380,29 @@ + + + + + + + + + + + + + + + + + + + + + + + @@ -97216,7 +100464,7 @@ - + @@ -97235,6 +100483,14 @@ + + + + + + + + @@ -97410,7 +100666,7 @@ - + @@ -97581,7 +100837,7 @@ - + @@ -97613,6 +100869,7 @@ + @@ -97715,30 +100972,30 @@ - + - + - + - + - + - + - + - + - + @@ -98496,6 +101753,7 @@ + @@ -98505,6 +101763,7 @@ + @@ -98706,6 +101965,7 @@ + @@ -98893,7 +102153,7 @@ - + @@ -98949,7 +102209,7 @@ - + @@ -98976,7 +102236,7 @@ - + @@ -99104,24 +102364,25 @@ - + + - + - + - + - + - + - + @@ -99244,84 +102505,84 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -99357,12 +102618,12 @@ - + - + @@ -99501,6 +102762,13 @@ + + + + + + + @@ -100073,6 +103341,9 @@ + + + @@ -100093,7 +103364,7 @@ - + @@ -100387,6 +103658,23 @@ + + + + + + + + + + + + + + + + + @@ -100526,7 +103814,7 @@ - + @@ -100789,10 +104077,10 @@ - + - + @@ -101096,6 +104384,20 @@ + + + + + + + + + + + + + + @@ -101200,7 +104502,7 @@ - + @@ -101339,6 +104641,7 @@ + @@ -101377,6 +104680,7 @@ + @@ -101450,7 +104754,7 @@ - + @@ -101501,7 +104805,7 @@ - + @@ -101532,7 +104836,7 @@ - + @@ -101972,7 +105276,7 @@ - + @@ -102087,6 +105391,7 @@ + @@ -102162,7 +105467,7 @@ - + @@ -102221,6 +105526,7 @@ + @@ -102315,7 +105621,7 @@ - + @@ -102893,6 +106199,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -102949,12 +106281,12 @@ - + - + @@ -103037,6 +106369,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -103251,6 +106675,7 @@ + @@ -103319,7 +106744,7 @@ - + @@ -103377,6 +106802,7 @@ + @@ -103530,6 +106956,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -103793,7 +107245,7 @@ - + @@ -103942,6 +107394,10 @@ + + + + @@ -103967,6 +107423,7 @@ + @@ -104195,6 +107652,7 @@ + @@ -104247,7 +107705,7 @@ - + @@ -104470,6 +107928,7 @@ + @@ -104998,7 +108457,7 @@ - + @@ -105070,7 +108529,7 @@ - + @@ -105091,7 +108550,7 @@ - + @@ -105103,7 +108562,7 @@ - + @@ -105143,6 +108602,23 @@ + + + + + + + + + + + + + + + + + @@ -105201,13 +108677,13 @@ - + - + @@ -105545,7 +109021,7 @@ - + @@ -105700,6 +109176,7 @@ + @@ -105838,6 +109315,7 @@ + @@ -105860,6 +109338,17 @@ + + + + + + + + + + + @@ -105938,6 +109427,8 @@ + + @@ -105974,11 +109465,11 @@ - - - - - + + + + + @@ -106036,6 +109527,13 @@ + + + + + + + @@ -106423,14 +109921,14 @@ - - - + + + - - - + + + @@ -106639,9 +110137,9 @@ - - - + + + @@ -106699,8 +110197,8 @@ - - + + @@ -106780,9 +110278,9 @@ - - - + + + @@ -107084,12 +110582,12 @@ - - + + - - + + @@ -107103,101 +110601,93 @@ - - - - - - - - - - - - - + - - - - - - + + + + - - - - - - - - - - - + + + + + - - - + + + + + - - - - + + + + + + + + + + + - - - - - - + + + - - - - - + + + + - - - - - + + + + + + - - - - + + + + + - - - - - - + + + + + - - - - - - + + + + - + + + + + + + + + @@ -107205,40 +110695,48 @@ - - - - - - + + + + + + - - - - + + + + + + - - - - - + + + + - - - - - + + + + + - - - - - - + + + + + + + + + + + + + @@ -107253,15 +110751,15 @@ - - - - + + + + - - - + + + @@ -107276,45 +110774,45 @@ - - - - + + + + - - - + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - + + + + - - - - + + + + @@ -107332,161 +110830,166 @@ - - - - - - - + + + + + + + - - - - - - + + + + + + - - - + + + - - - - + + + + - - - + + + - - - - - + + + + + - - - - - + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - - - + + + + + + - - - - + + + + - - - - - - - - + + + + + + + + - - - + + + - - - - + + + + - - - - + + + + - - - - - - - + + + + + + + - - - - + + + + - - - - - + + + + + + + + + + @@ -107495,50 +110998,50 @@ - - - - + + + + - - - - + + + + - - - + + + - - - + + + - - - - + + + + - - - - + + + + - - - + + + - - - - - + + + + + @@ -107547,62 +111050,73 @@ - - - - - - - + + + + + + + - - - - + + + + - - - - - - - - + + + + - - - - - + + + - - - + + + + + + + + - - - - - + + + + + - - - - - - + + + - - - - + + + + + + + + + + + + + + + + + + + @@ -107623,10 +111137,10 @@ - - - - + + + + @@ -107635,17 +111149,17 @@ - - - - - - + + + + + + - - - + + + @@ -107682,76 +111196,76 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + - - - + + + + - - - + + + + + + - - - - - + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -107907,102 +111421,105 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + + + - + - - + + - - - - - - - - - - - + + + + + + + + + + + @@ -108107,6 +111624,13 @@ + + + + + + + @@ -108309,9 +111833,9 @@ - - - + + + @@ -108407,9 +111931,9 @@ - - - + + + @@ -108420,10 +111944,10 @@ - - - - + + + + @@ -108515,8 +112039,8 @@ - - + + @@ -109363,16 +112887,16 @@ - - + + - - + + - - + + @@ -110721,7 +114245,7 @@ - + @@ -110901,16 +114425,16 @@ - - + + - - + + @@ -112691,8 +116215,8 @@ - - + + @@ -112741,6 +116265,11 @@ + + + + + @@ -113862,6 +117391,12 @@ + + + + + + @@ -114555,16 +118090,16 @@ - - + + - - + + - - + + @@ -114601,14 +118136,14 @@ - - - + + + - - - + + + @@ -114948,8 +118483,8 @@ - - + + @@ -116173,6 +119708,7 @@ + @@ -116333,11 +119869,11 @@ - + - - + + @@ -116413,6 +119949,10 @@ + + + + @@ -116776,7 +120316,7 @@ - + @@ -116832,7 +120372,7 @@ - + @@ -117034,7 +120574,7 @@ - + @@ -117870,11 +121410,11 @@ - - - - - + + + + + @@ -117882,16 +121422,16 @@ - - - - - - + + + + + + - - + + @@ -118231,6 +121771,11 @@ + + + + + @@ -118888,14 +122433,14 @@ - - - - + + + + - - + + @@ -119677,7 +123222,7 @@ - + @@ -119801,10 +123346,10 @@ - + - + @@ -120043,17 +123588,17 @@ - - - - - + + + + + - - - - + + + + @@ -120748,7 +124293,7 @@ - + @@ -120937,67 +124482,67 @@ - - + + - - - + + + - - - - + + + + - - - - + + + + - - + + - - + + - - + + - - - - + + + + - - + + - - + + - - + + - - + + - - + + - + @@ -121277,10 +124822,10 @@ - - - - + + + + @@ -121423,9 +124968,9 @@ - - - + + + @@ -122034,10 +125579,27 @@ - - - - + + + + + + + + + + + + + + + + + + + + + @@ -123180,12 +126742,12 @@ - - - + + + - - + + @@ -123200,19 +126762,19 @@ - - - - + + + + - - + + - - - + + + @@ -123351,10 +126913,10 @@ - - - - + + + + @@ -123481,8 +127043,8 @@ - - + + @@ -125376,8 +128938,8 @@ - - + + @@ -125474,8 +129036,8 @@ - - + + @@ -125630,8 +129192,8 @@ - - + + @@ -125667,9 +129229,9 @@ - - - + + + diff --git a/android/abi_gki_aarch64_db845c b/android/abi_gki_aarch64_db845c index 69be1905a229..ec944e48a1b9 100644 --- a/android/abi_gki_aarch64_db845c +++ b/android/abi_gki_aarch64_db845c @@ -54,7 +54,6 @@ cpumask_next cpu_number __cpu_online_mask - crc32_le debugfs_create_dir debugfs_create_file debugfs_create_u32 @@ -185,7 +184,6 @@ free_irq generic_handle_irq get_device - get_random_bytes gic_nonsecure_priorities gpiochip_add_data_with_key gpiochip_add_pin_range @@ -419,7 +417,6 @@ preempt_schedule_notrace prepare_to_wait_event printk - pskb_expand_head put_device __put_task_struct qcom_smem_state_register @@ -505,7 +502,6 @@ simple_read_from_buffer single_open single_release - skb_clone skb_dequeue skb_pull skb_push @@ -553,6 +549,7 @@ strlen strncmp strncpy + strnlen strpbrk strsep __sw_hweight32 @@ -655,9 +652,11 @@ cfg80211_vendor_cmd_reply cpu_latency_qos_add_request cpu_latency_qos_remove_request + crc32_le device_get_mac_address device_set_wakeup_enable firmware_request_nowarn + get_random_bytes guid_gen idr_for_each ieee80211_alloc_hw_nm @@ -710,11 +709,13 @@ init_uts_ns __kfifo_alloc __kfifo_free + ktime_get_with_offset __local_bh_enable_ip memmove __nla_parse nla_put param_ops_ulong + pskb_expand_head regulatory_hint rfc1042_header skb_copy @@ -751,44 +752,6 @@ devm_clk_bulk_get_optional iommu_map -# required by ax88179_178a.ko - eth_platform_get_mac_address - ethtool_op_get_link - ethtool_op_get_ts_info - eth_validate_addr - generic_mii_ioctl - mii_ethtool_get_link_ksettings - mii_ethtool_gset - mii_ethtool_set_link_ksettings - mii_nway_restart - netdev_err - netdev_info - netdev_warn - netif_carrier_on - usb_deregister - usbnet_disconnect - usbnet_get_endpoints - usbnet_get_msglevel - usbnet_get_stats64 - usbnet_link_change - usbnet_nway_reset - usbnet_open - usbnet_probe - usbnet_read_cmd - usbnet_read_cmd_nopm - usbnet_resume - usbnet_set_msglevel - usbnet_skb_return - usbnet_start_xmit - usbnet_stop - usbnet_suspend - usbnet_tx_timeout - usbnet_update_max_qlen - usbnet_write_cmd - usbnet_write_cmd_async - usbnet_write_cmd_nopm - usb_register_driver - # required by bam_dma.ko dma_async_device_register dma_async_device_unregister @@ -1303,9 +1266,6 @@ usb_put_hcd usb_remove_hcd -# required by pdr_interface.ko - strnlen - # required by phy-qcom-qmp.ko of_clk_get_by_name __of_reset_control_get @@ -1489,6 +1449,7 @@ refcount_dec_and_mutex_lock release_sock sk_alloc + skb_clone skb_copy_bits skb_copy_datagram_iter skb_free_datagram @@ -1577,7 +1538,9 @@ snd_ctl_add snd_ctl_new1 snd_pcm_add_chmap_ctls - snd_pcm_create_iec958_consumer_hw_params + snd_pcm_create_iec958_consumer_default + snd_pcm_fill_iec958_consumer + snd_pcm_fill_iec958_consumer_hw_params snd_pcm_hw_constraint_eld # required by snd-soc-qcom-common.ko @@ -1701,3 +1664,42 @@ # required by wcd934x.ko mfd_add_devices mfd_remove_devices + +# preserved by --additions-only + eth_platform_get_mac_address + ethtool_op_get_link + ethtool_op_get_ts_info + eth_validate_addr + generic_mii_ioctl + mii_ethtool_get_link_ksettings + mii_ethtool_gset + mii_ethtool_set_link_ksettings + mii_nway_restart + netdev_err + netdev_info + netdev_warn + netif_carrier_on + snd_pcm_create_iec958_consumer_hw_params + usb_deregister + usbnet_disconnect + usbnet_get_endpoints + usbnet_get_msglevel + usbnet_get_stats64 + usbnet_link_change + usbnet_nway_reset + usbnet_open + usbnet_probe + usbnet_read_cmd + usbnet_read_cmd_nopm + usbnet_resume + usbnet_set_msglevel + usbnet_skb_return + usbnet_start_xmit + usbnet_stop + usbnet_suspend + usbnet_tx_timeout + usbnet_update_max_qlen + usbnet_write_cmd + usbnet_write_cmd_async + usbnet_write_cmd_nopm + usb_register_driver diff --git a/android/abi_gki_aarch64_generic b/android/abi_gki_aarch64_generic index 23ab56e53ad8..81746e107e32 100644 --- a/android/abi_gki_aarch64_generic +++ b/android/abi_gki_aarch64_generic @@ -78,6 +78,7 @@ __bitmap_set bitmap_to_arr32 __bitmap_weight + __bitmap_xor blk_abort_request blk_alloc_queue blk_check_plugged @@ -628,6 +629,7 @@ drm_add_modes_noedid drm_atomic_add_affected_connectors drm_atomic_add_affected_planes + drm_atomic_bridge_chain_disable drm_atomic_commit drm_atomic_get_connector_state drm_atomic_get_crtc_state @@ -753,6 +755,7 @@ drm_mode_object_find drm_mode_object_get drm_mode_object_put + drm_mode_parse_command_line_for_connector drm_mode_probed_add drm_modeset_acquire_fini drm_modeset_acquire_init @@ -963,6 +966,7 @@ gpiod_get_raw_value_cansleep gpiod_get_value gpiod_get_value_cansleep + gpiod_set_debounce gpiod_set_raw_value gpiod_set_raw_value_cansleep gpiod_set_value @@ -1051,6 +1055,7 @@ __init_swait_queue_head init_task init_timer_key + init_user_ns init_wait_entry __init_waitqueue_head input_alloc_absinfo @@ -1092,6 +1097,7 @@ iommu_device_sysfs_remove iommu_device_unlink iommu_device_unregister + iommu_dma_enable_best_fit_algo iommu_domain_alloc iommu_domain_free iommu_fwspec_add_ids @@ -1373,6 +1379,7 @@ nr_cpu_ids nr_irqs ns_capable + ns_capable_noaudit nsec_to_clock_t ns_to_timespec64 __num_online_cpus @@ -2237,6 +2244,7 @@ __traceiter_android_vh_cpu_idle_exit __traceiter_android_vh_dump_throttled_rt_tasks __traceiter_android_vh_dup_task_struct + __traceiter_android_vh_early_resume_begin __traceiter_android_vh_enable_thermal_genl_check __traceiter_android_vh_ep_create_wakeup_source __traceiter_android_vh_get_user_pages @@ -2249,6 +2257,8 @@ __traceiter_android_vh_of_i2c_get_board_info __traceiter_android_vh_pagecache_get_page __traceiter_android_vh_pin_user_pages + __traceiter_android_vh_rebuild_root_domains_bypass + __traceiter_android_vh_resume_end __traceiter_android_vh_rmqueue __traceiter_android_vh_sched_setaffinity_early __traceiter_android_vh_scheduler_tick @@ -2351,6 +2361,7 @@ __tracepoint_android_vh_cpu_idle_exit __tracepoint_android_vh_dump_throttled_rt_tasks __tracepoint_android_vh_dup_task_struct + __tracepoint_android_vh_early_resume_begin __tracepoint_android_vh_enable_thermal_genl_check __tracepoint_android_vh_ep_create_wakeup_source __tracepoint_android_vh_get_user_pages @@ -2363,6 +2374,8 @@ __tracepoint_android_vh_of_i2c_get_board_info __tracepoint_android_vh_pagecache_get_page __tracepoint_android_vh_pin_user_pages + __tracepoint_android_vh_rebuild_root_domains_bypass + __tracepoint_android_vh_resume_end __tracepoint_android_vh_rmqueue __tracepoint_android_vh_sched_setaffinity_early __tracepoint_android_vh_scheduler_tick @@ -2666,6 +2679,7 @@ xa_find xa_find_after xa_get_mark + __xa_insert xa_load xa_set_mark xa_store diff --git a/android/abi_gki_aarch64_type_visibility b/android/abi_gki_aarch64_type_visibility new file mode 100644 index 000000000000..8a98e59ea81b --- /dev/null +++ b/android/abi_gki_aarch64_type_visibility @@ -0,0 +1,5 @@ +[abi_symbol_list] + +# for type visibility + GKI_struct_blk_mq_alloc_data + GKI_struct_cgroup_taskset diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile index 175213d7a1aa..37c3036cd468 100644 --- a/arch/arm/boot/compressed/Makefile +++ b/arch/arm/boot/compressed/Makefile @@ -76,10 +76,10 @@ CPPFLAGS_vmlinux.lds += -DTEXT_OFFSET="$(TEXT_OFFSET)" CPPFLAGS_vmlinux.lds += -DMALLOC_SIZE="$(MALLOC_SIZE)" compress-$(CONFIG_KERNEL_GZIP) = gzip -compress-$(CONFIG_KERNEL_LZO) = lzo -compress-$(CONFIG_KERNEL_LZMA) = lzma -compress-$(CONFIG_KERNEL_XZ) = xzkern -compress-$(CONFIG_KERNEL_LZ4) = lz4 +compress-$(CONFIG_KERNEL_LZO) = lzo_with_size +compress-$(CONFIG_KERNEL_LZMA) = lzma_with_size +compress-$(CONFIG_KERNEL_XZ) = xzkern_with_size +compress-$(CONFIG_KERNEL_LZ4) = lz4_with_size libfdt_objs := fdt_rw.o fdt_ro.o fdt_wip.o fdt.o diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c index 176221e31299..916caf2e110d 100644 --- a/arch/arm64/kernel/smp.c +++ b/arch/arm64/kernel/smp.c @@ -919,7 +919,7 @@ static void do_handle_IPI(int ipinr) break; case IPI_CPU_STOP: - trace_android_vh_ipi_stop_rcuidle(get_irq_regs()); + trace_android_vh_ipi_stop(get_irq_regs()); local_cpu_stop(); break; diff --git a/arch/arm64/kvm/arm.c b/arch/arm64/kvm/arm.c index 86cbee644a39..8e22c300752c 100644 --- a/arch/arm64/kvm/arm.c +++ b/arch/arm64/kvm/arm.c @@ -2286,6 +2286,16 @@ static int __init early_kvm_mode_cfg(char *arg) if (!arg) return -EINVAL; + if (strcmp(arg, "none") == 0) { + kvm_mode = KVM_MODE_NONE; + return 0; + } + + if (!is_hyp_mode_available()) { + pr_warn_once("KVM is not available. Ignoring kvm-arm.mode\n"); + return 0; + } + if (strcmp(arg, "protected") == 0) { if (!is_kernel_in_hyp_mode()) kvm_mode = KVM_MODE_PROTECTED; @@ -2300,11 +2310,6 @@ static int __init early_kvm_mode_cfg(char *arg) return 0; } - if (strcmp(arg, "none") == 0) { - kvm_mode = KVM_MODE_NONE; - return 0; - } - return -EINVAL; } early_param("kvm-arm.mode", early_kvm_mode_cfg); diff --git a/arch/arm64/kvm/hyp/nvhe/pkvm.c b/arch/arm64/kvm/hyp/nvhe/pkvm.c index 9b2e303dd124..50717a46e735 100644 --- a/arch/arm64/kvm/hyp/nvhe/pkvm.c +++ b/arch/arm64/kvm/hyp/nvhe/pkvm.c @@ -414,6 +414,15 @@ static int set_host_vcpus(struct shadow_vcpu_state *shadow_vcpus, int nr_vcpus, return 0; } +static int init_ptrauth(struct kvm_vcpu *shadow_vcpu) +{ + int ret = 0; + if (test_bit(KVM_ARM_VCPU_PTRAUTH_ADDRESS, shadow_vcpu->arch.features) || + test_bit(KVM_ARM_VCPU_PTRAUTH_GENERIC, shadow_vcpu->arch.features)) + ret = kvm_vcpu_enable_ptrauth(shadow_vcpu); + return ret; +} + static int init_shadow_structs(struct kvm *kvm, struct kvm_shadow_vm *vm, struct kvm_vcpu **vcpu_array, int nr_vcpus) { @@ -438,6 +447,10 @@ static int init_shadow_structs(struct kvm *kvm, struct kvm_shadow_vm *vm, if (ret) return ret; + ret = init_ptrauth(shadow_vcpu); + if (ret) + return ret; + if (test_bit(KVM_ARM_VCPU_SVE, shadow_vcpu->arch.features)) { size_t sve_state_size; void *sve_state; @@ -851,14 +864,7 @@ void pkvm_reset_vcpu(struct kvm_vcpu *vcpu) WARN_ON(!reset_state->reset); - if (test_bit(KVM_ARM_VCPU_PTRAUTH_ADDRESS, vcpu->arch.features) || - test_bit(KVM_ARM_VCPU_PTRAUTH_GENERIC, vcpu->arch.features)) { - /* - * This call should not fail since we've already checked for - * feature support on initialization. - */ - WARN_ON(kvm_vcpu_enable_ptrauth(vcpu)); - } + init_ptrauth(vcpu); /* Reset core registers */ memset(vcpu_gp_regs(vcpu), 0, sizeof(*vcpu_gp_regs(vcpu))); diff --git a/arch/h8300/boot/compressed/Makefile b/arch/h8300/boot/compressed/Makefile index 5942793f77a0..6ab2fa5ba105 100644 --- a/arch/h8300/boot/compressed/Makefile +++ b/arch/h8300/boot/compressed/Makefile @@ -30,9 +30,11 @@ $(obj)/vmlinux.bin: vmlinux FORCE suffix-$(CONFIG_KERNEL_GZIP) := gzip suffix-$(CONFIG_KERNEL_LZO) := lzo +compress-$(CONFIG_KERNEL_GZIP) := gzip +compress-$(CONFIG_KERNEL_LZO) := lzo_with_size $(obj)/vmlinux.bin.$(suffix-y): $(obj)/vmlinux.bin FORCE - $(call if_changed,$(suffix-y)) + $(call if_changed,$(compress-y)) LDFLAGS_piggy.o := -r --format binary --oformat elf32-h8300-linux -T OBJCOPYFLAGS := -O binary diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile index eae0fad30f27..69eda7ab110a 100644 --- a/arch/mips/boot/compressed/Makefile +++ b/arch/mips/boot/compressed/Makefile @@ -71,12 +71,12 @@ $(obj)/vmlinux.bin: $(KBUILD_IMAGE) FORCE $(call if_changed,objcopy) tool_$(CONFIG_KERNEL_GZIP) = gzip -tool_$(CONFIG_KERNEL_BZIP2) = bzip2 -tool_$(CONFIG_KERNEL_LZ4) = lz4 -tool_$(CONFIG_KERNEL_LZMA) = lzma -tool_$(CONFIG_KERNEL_LZO) = lzo -tool_$(CONFIG_KERNEL_XZ) = xzkern -tool_$(CONFIG_KERNEL_ZSTD) = zstd22 +tool_$(CONFIG_KERNEL_BZIP2) = bzip2_with_size +tool_$(CONFIG_KERNEL_LZ4) = lz4_with_size +tool_$(CONFIG_KERNEL_LZMA) = lzma_with_size +tool_$(CONFIG_KERNEL_LZO) = lzo_with_size +tool_$(CONFIG_KERNEL_XZ) = xzkern_with_size +tool_$(CONFIG_KERNEL_ZSTD) = zstd22_with_size targets += vmlinux.bin.z $(obj)/vmlinux.bin.z: $(obj)/vmlinux.bin FORCE diff --git a/arch/parisc/boot/compressed/Makefile b/arch/parisc/boot/compressed/Makefile index dff453687530..c09300a6ba98 100644 --- a/arch/parisc/boot/compressed/Makefile +++ b/arch/parisc/boot/compressed/Makefile @@ -73,15 +73,15 @@ suffix-$(CONFIG_KERNEL_XZ) := xz $(obj)/vmlinux.bin.gz: $(vmlinux.bin.all-y) $(call if_changed,gzip) $(obj)/vmlinux.bin.bz2: $(vmlinux.bin.all-y) - $(call if_changed,bzip2) + $(call if_changed,bzip2_with_size) $(obj)/vmlinux.bin.lz4: $(vmlinux.bin.all-y) - $(call if_changed,lz4) + $(call if_changed,lz4_with_size) $(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) - $(call if_changed,lzma) + $(call if_changed,lzma_with_size) $(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) - $(call if_changed,lzo) + $(call if_changed,lzo_with_size) $(obj)/vmlinux.bin.xz: $(vmlinux.bin.all-y) - $(call if_changed,xzkern) + $(call if_changed,xzkern_with_size) LDFLAGS_piggy.o := -r --format binary --oformat $(LD_BFD) -T $(obj)/piggy.o: $(obj)/vmlinux.scr $(obj)/vmlinux.bin.$(suffix-y) diff --git a/arch/s390/boot/compressed/Makefile b/arch/s390/boot/compressed/Makefile index b235ed95a3d8..0e4b585885f0 100644 --- a/arch/s390/boot/compressed/Makefile +++ b/arch/s390/boot/compressed/Makefile @@ -49,15 +49,15 @@ suffix-$(CONFIG_KERNEL_XZ) := .xz $(obj)/vmlinux.bin.gz: $(vmlinux.bin.all-y) FORCE $(call if_changed,gzip) $(obj)/vmlinux.bin.bz2: $(vmlinux.bin.all-y) FORCE - $(call if_changed,bzip2) + $(call if_changed,bzip2_with_size) $(obj)/vmlinux.bin.lz4: $(vmlinux.bin.all-y) FORCE - $(call if_changed,lz4) + $(call if_changed,lz4_with_size) $(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) FORCE - $(call if_changed,lzma) + $(call if_changed,lzma_with_size) $(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) FORCE - $(call if_changed,lzo) + $(call if_changed,lzo_with_size) $(obj)/vmlinux.bin.xz: $(vmlinux.bin.all-y) FORCE - $(call if_changed,xzkern) + $(call if_changed,xzkern_with_size) OBJCOPYFLAGS_piggy.o := -I binary -O elf64-s390 -B s390:64-bit --rename-section .data=.vmlinux.bin.compressed $(obj)/piggy.o: $(obj)/vmlinux.bin$(suffix-y) FORCE diff --git a/arch/sh/boot/compressed/Makefile b/arch/sh/boot/compressed/Makefile index 589d2d8a573d..0525d8abdf45 100644 --- a/arch/sh/boot/compressed/Makefile +++ b/arch/sh/boot/compressed/Makefile @@ -58,13 +58,13 @@ vmlinux.bin.all-y := $(obj)/vmlinux.bin $(obj)/vmlinux.bin.gz: $(vmlinux.bin.all-y) FORCE $(call if_changed,gzip) $(obj)/vmlinux.bin.bz2: $(vmlinux.bin.all-y) FORCE - $(call if_changed,bzip2) + $(call if_changed,bzip2_with_size) $(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) FORCE - $(call if_changed,lzma) + $(call if_changed,lzma_with_size) $(obj)/vmlinux.bin.xz: $(vmlinux.bin.all-y) FORCE - $(call if_changed,xzkern) + $(call if_changed,xzkern_with_size) $(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) FORCE - $(call if_changed,lzo) + $(call if_changed,lzo_with_size) OBJCOPYFLAGS += -R .empty_zero_page diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile index bf91e0a36d77..57820a9763df 100644 --- a/arch/x86/boot/compressed/Makefile +++ b/arch/x86/boot/compressed/Makefile @@ -125,17 +125,17 @@ vmlinux.bin.all-$(CONFIG_X86_NEED_RELOCS) += $(obj)/vmlinux.relocs $(obj)/vmlinux.bin.gz: $(vmlinux.bin.all-y) FORCE $(call if_changed,gzip) $(obj)/vmlinux.bin.bz2: $(vmlinux.bin.all-y) FORCE - $(call if_changed,bzip2) + $(call if_changed,bzip2_with_size) $(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) FORCE - $(call if_changed,lzma) + $(call if_changed,lzma_with_size) $(obj)/vmlinux.bin.xz: $(vmlinux.bin.all-y) FORCE - $(call if_changed,xzkern) + $(call if_changed,xzkern_with_size) $(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) FORCE - $(call if_changed,lzo) + $(call if_changed,lzo_with_size) $(obj)/vmlinux.bin.lz4: $(vmlinux.bin.all-y) FORCE - $(call if_changed,lz4) + $(call if_changed,lz4_with_size) $(obj)/vmlinux.bin.zst: $(vmlinux.bin.all-y) FORCE - $(call if_changed,zstd22) + $(call if_changed,zstd22_with_size) suffix-$(CONFIG_KERNEL_GZIP) := gz suffix-$(CONFIG_KERNEL_BZIP2) := bz2 diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index a5d6d79b023b..0ecdb3a81f95 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -7289,7 +7289,7 @@ int kvm_skip_emulated_instruction(struct kvm_vcpu *vcpu) } EXPORT_SYMBOL_GPL(kvm_skip_emulated_instruction); -static bool kvm_vcpu_check_breakpoint(struct kvm_vcpu *vcpu, int *r) +static bool kvm_vcpu_check_code_breakpoint(struct kvm_vcpu *vcpu, int *r) { if (unlikely(vcpu->guest_debug & KVM_GUESTDBG_USE_HW_BP) && (vcpu->arch.guest_debug_dr7 & DR7_BP_EN_MASK)) { @@ -7358,25 +7358,23 @@ static bool is_vmware_backdoor_opcode(struct x86_emulate_ctxt *ctxt) } /* - * Decode to be emulated instruction. Return EMULATION_OK if success. + * Decode an instruction for emulation. The caller is responsible for handling + * code breakpoints. Note, manually detecting code breakpoints is unnecessary + * (and wrong) when emulating on an intercepted fault-like exception[*], as + * code breakpoints have higher priority and thus have already been done by + * hardware. + * + * [*] Except #MC, which is higher priority, but KVM should never emulate in + * response to a machine check. */ int x86_decode_emulated_instruction(struct kvm_vcpu *vcpu, int emulation_type, void *insn, int insn_len) { - int r = EMULATION_OK; struct x86_emulate_ctxt *ctxt = vcpu->arch.emulate_ctxt; + int r; init_emulate_ctxt(vcpu); - /* - * We will reenter on the same instruction since we do not set - * complete_userspace_io. This does not handle watchpoints yet, - * those would be handled in the emulate_ops. - */ - if (!(emulation_type & EMULTYPE_SKIP) && - kvm_vcpu_check_breakpoint(vcpu, &r)) - return r; - ctxt->ud = emulation_type & EMULTYPE_TRAP_UD; r = x86_decode_insn(ctxt, insn, insn_len); @@ -7411,6 +7409,15 @@ int x86_emulate_instruction(struct kvm_vcpu *vcpu, gpa_t cr2_or_gpa, if (!(emulation_type & EMULTYPE_NO_DECODE)) { kvm_clear_exception_queue(vcpu); + /* + * Return immediately if RIP hits a code breakpoint, such #DBs + * are fault-like and are higher priority than any faults on + * the code fetch itself. + */ + if (!(emulation_type & EMULTYPE_SKIP) && + kvm_vcpu_check_code_breakpoint(vcpu, &r)) + return r; + r = x86_decode_emulated_instruction(vcpu, emulation_type, insn, insn_len); if (r != EMULATION_OK) { diff --git a/block/Makefile b/block/Makefile index af3d044abaf1..05daaf8282a1 100644 --- a/block/Makefile +++ b/block/Makefile @@ -39,3 +39,4 @@ obj-$(CONFIG_BLK_SED_OPAL) += sed-opal.o obj-$(CONFIG_BLK_PM) += blk-pm.o obj-$(CONFIG_BLK_INLINE_ENCRYPTION) += keyslot-manager.o blk-crypto.o obj-$(CONFIG_BLK_INLINE_ENCRYPTION_FALLBACK) += blk-crypto-fallback.o +obj-$(CONFIG_ANDROID_VENDOR_HOOKS) += vendor_hooks.o diff --git a/block/vendor_hooks.c b/block/vendor_hooks.c new file mode 100644 index 000000000000..db033b9e2835 --- /dev/null +++ b/block/vendor_hooks.c @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* vendor_hook.c + * + * Copyright 2022 Google LLC + */ +#include "blk.h" +#include "blk-mq-tag.h" +#include "blk-mq.h" +#include + +#define CREATE_TRACE_POINTS +#include +#include +#include + +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_alloc_rqs); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_rq_ctx_init); + +/* + * For type visibility + */ +const struct blk_mq_alloc_data *GKI_struct_blk_mq_alloc_data; +EXPORT_SYMBOL_GPL(GKI_struct_blk_mq_alloc_data); + diff --git a/build.config.gki.aarch64 b/build.config.gki.aarch64 index 479bed504395..dde70d69dd33 100644 --- a/build.config.gki.aarch64 +++ b/build.config.gki.aarch64 @@ -7,11 +7,11 @@ Image.lz4 Image.gz " +# Sync with BUILD.bazel ABI_DEFINITION=android/abi_gki_aarch64.xml -# Update BUILD.bazel, define_common_kernels() if the list differs from -# android/abi_gki_aarch64* in the filesystem. KMI_SYMBOL_LIST=android/abi_gki_aarch64 ADDITIONAL_KMI_SYMBOL_LISTS=" +android/abi_gki_aarch64_type_visibility android/abi_gki_aarch64_core android/abi_gki_aarch64_fips140 android/abi_gki_aarch64_generic diff --git a/build.config.gki.x86_64 b/build.config.gki.x86_64 index 7ecd1dfe7dcb..3d81fea6aacb 100644 --- a/build.config.gki.x86_64 +++ b/build.config.gki.x86_64 @@ -5,5 +5,7 @@ BUILD_SYSTEM_DLKM=1 MODULES_LIST=${ROOT_DIR}/${KERNEL_DIR}/android/gki_system_dlkm_modules +BUILD_GKI_CERTIFICATION_TOOLS=1 + BUILD_GKI_ARTIFACTS=1 BUILD_GKI_BOOT_IMG_SIZE=67108864 diff --git a/crypto/jitterentropy.c b/crypto/jitterentropy.c index 37c4c308339e..423c55d0e165 100644 --- a/crypto/jitterentropy.c +++ b/crypto/jitterentropy.c @@ -117,6 +117,22 @@ struct rand_data { #define JENT_EHEALTH 9 /* Health test failed during initialization */ #define JENT_ERCT 10 /* RCT failed during initialization */ +/* + * The output n bits can receive more than n bits of min entropy, of course, + * but the fixed output of the conditioning function can only asymptotically + * approach the output size bits of min entropy, not attain that bound. Random + * maps will tend to have output collisions, which reduces the creditable + * output entropy (that is what SP 800-90B Section 3.1.5.1.2 attempts to bound). + * + * The value "64" is justified in Appendix A.4 of the current 90C draft, + * and aligns with NIST's in "epsilon" definition in this document, which is + * that a string can be considered "full entropy" if you can bound the min + * entropy in each bit of output to at least 1-epsilon, where epsilon is + * required to be <= 2^(-32). + */ +#define JENT_ENTROPY_SAFETY_FACTOR 64 + +#include #include "jitterentropy.h" /*************************************************************************** @@ -546,7 +562,10 @@ static int jent_measure_jitter(struct rand_data *ec) */ static void jent_gen_entropy(struct rand_data *ec) { - unsigned int k = 0; + unsigned int k = 0, safety_factor = 0; + + if (fips_enabled) + safety_factor = JENT_ENTROPY_SAFETY_FACTOR; /* priming of the ->prev_time value */ jent_measure_jitter(ec); @@ -560,7 +579,7 @@ static void jent_gen_entropy(struct rand_data *ec) * We multiply the loop value with ->osr to obtain the * oversampling rate requested by the caller */ - if (++k >= (DATA_SIZE_BITS * ec->osr)) + if (++k >= ((DATA_SIZE_BITS + safety_factor) * ec->osr)) break; } } diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 3607c500f192..73efd5503d2f 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -5,6 +5,28 @@ * * Copyright 2020 Google LLC */ +#ifndef __GENKSYMS__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include <../drivers/net/wireless/intel/ipw2x00/libipw.h> +#include <../fs/mount.h> +#include <../fs/kernfs/kernfs-internal.h> +#include <../kernel/audit.h> +#include <../net/can/af_can.h> +#include <../net/tipc/bearer.h> +#include <../net/xdp/xsk_queue.h> +#include <../security/keys/internal.h> +#endif #define CREATE_TRACE_POINTS #include @@ -19,7 +41,6 @@ #include #include #include -#include #include #include #include @@ -40,8 +61,9 @@ #include #include #include -#include +#ifdef __GENKSYMS__ #include +#endif #include #include #include @@ -83,7 +105,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_select_task_rq_fair); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_select_task_rq_rt); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_select_task_rq_dl); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_select_fallback_rq); -EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_refrigerator); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_scheduler_tick); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_enqueue_task); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_dequeue_task); @@ -126,7 +147,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cpu_idle_exit); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mpam_set); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_find_busiest_group); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_gic_resume); -EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_wq_lockup_pool); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ipi_stop); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sysrq_crash); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_dump_throttled_rt_tasks); @@ -228,8 +248,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_uclamp_eff_get); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_uclamp_task_util); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_uclamp_rq_util_with); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpufreq_transition); -EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cgroup_set_task); -EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cgroup_force_kthread_migration); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_syscall_prctl_finished); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_create_worker); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_tick); @@ -248,8 +266,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_insert); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_node_delete); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_node_replace); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_avc_lookup); -EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_alloc_rqs); -EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_blk_rq_ctx_init); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_commit_creds); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_exit_creds); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_override_creds); @@ -296,7 +312,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_tune_swappiness); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_shrink_slab_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_psi_event); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_psi_group); -EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpuset_fork); EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_set_cpus_allowed_comm); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_sched_setaffinity_early); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_free_task); @@ -314,7 +329,6 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_selinux_is_initialized); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_tune_inactive_ratio); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_update_topology_flags_workfn); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_of_i2c_get_board_info); -EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cgroup_attach); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mm_dirty_limits); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_oom_check_panic); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_uninterruptible_tasks); @@ -395,3 +409,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_mmput); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_early_resume_begin); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_pages_reclaim_bypass); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alloc_pages_failure_bypass); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_rebuild_root_domains_bypass); diff --git a/drivers/md/dm-verity-target.c b/drivers/md/dm-verity-target.c index 9d5c6dd5b756..2c355b58d078 100644 --- a/drivers/md/dm-verity-target.c +++ b/drivers/md/dm-verity-target.c @@ -1252,6 +1252,7 @@ bad: static struct target_type verity_target = { .name = "verity", .version = {1, 7, 0}, + .features = DM_TARGET_IMMUTABLE, .module = THIS_MODULE, .ctr = verity_ctr, .dtr = verity_dtr, diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c index 6911e588e578..9157257925e1 100644 --- a/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c @@ -597,7 +597,7 @@ struct mac80211_hwsim_data { bool ps_poll_pending; struct dentry *debugfs; - uintptr_t pending_cookie; + atomic_t pending_cookie; struct sk_buff_head pending; /* packets pending */ /* * Only radios in the same group can communicate together (the @@ -1273,8 +1273,7 @@ static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw, goto nla_put_failure; /* We create a cookie to identify this skb */ - data->pending_cookie++; - cookie = data->pending_cookie; + cookie = atomic_inc_return(&data->pending_cookie); info->rate_driver_data[0] = (void *)cookie; if (nla_put_u64_64bit(skb, HWSIM_ATTR_COOKIE, cookie, HWSIM_ATTR_PAD)) goto nla_put_failure; @@ -3511,6 +3510,7 @@ static int hwsim_tx_info_frame_received_nl(struct sk_buff *skb_2, const u8 *src; unsigned int hwsim_flags; int i; + unsigned long flags; bool found = false; if (!info->attrs[HWSIM_ATTR_ADDR_TRANSMITTER] || @@ -3538,18 +3538,20 @@ static int hwsim_tx_info_frame_received_nl(struct sk_buff *skb_2, } /* look for the skb matching the cookie passed back from user */ + spin_lock_irqsave(&data2->pending.lock, flags); skb_queue_walk_safe(&data2->pending, skb, tmp) { - u64 skb_cookie; + uintptr_t skb_cookie; txi = IEEE80211_SKB_CB(skb); - skb_cookie = (u64)(uintptr_t)txi->rate_driver_data[0]; + skb_cookie = (uintptr_t)txi->rate_driver_data[0]; if (skb_cookie == ret_skb_cookie) { - skb_unlink(skb, &data2->pending); + __skb_unlink(skb, &data2->pending); found = true; break; } } + spin_unlock_irqrestore(&data2->pending.lock, flags); /* not found */ if (!found) diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index b9df2db533d2..45ee1adefc08 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -4553,7 +4553,7 @@ static int ufshcd_complete_dev_init(struct ufs_hba *hba) QUERY_FLAG_IDN_FDEVICEINIT, 0, &flag_res); if (!flag_res) break; - usleep_range(5000, 10000); + usleep_range(500, 1000); } while (ktime_before(ktime_get(), timeout)); if (err) { diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c index 03a3dafc82f3..bff7bf2f7586 100644 --- a/fs/erofs/zdata.c +++ b/fs/erofs/zdata.c @@ -770,12 +770,9 @@ static void z_erofs_decompress_kickoff(struct z_erofs_decompressqueue *io, /* wake up the caller thread for sync decompression */ if (sync) { - unsigned long flags; - - spin_lock_irqsave(&io->u.wait.lock, flags); if (!atomic_add_return(bios, &io->pending_bios)) - wake_up_locked(&io->u.wait); - spin_unlock_irqrestore(&io->u.wait.lock, flags); + complete(&io->u.done); + return; } @@ -1186,7 +1183,7 @@ jobqueue_init(struct super_block *sb, } else { fg_out: q = fgq; - init_waitqueue_head(&fgq->u.wait); + init_completion(&fgq->u.done); atomic_set(&fgq->pending_bios, 0); } q->sb = sb; @@ -1360,8 +1357,7 @@ static void z_erofs_runqueue(struct super_block *sb, return; /* wait until all bios are completed */ - io_wait_event(io[JQ_SUBMIT].u.wait, - !atomic_read(&io[JQ_SUBMIT].pending_bios)); + wait_for_completion_io(&io[JQ_SUBMIT].u.done); /* handle synchronous decompress queue in the caller context */ z_erofs_decompress_queue(&io[JQ_SUBMIT], pagepool); diff --git a/fs/erofs/zdata.h b/fs/erofs/zdata.h index 4a69515dea75..5e9a0eb54c89 100644 --- a/fs/erofs/zdata.h +++ b/fs/erofs/zdata.h @@ -89,7 +89,7 @@ struct z_erofs_decompressqueue { z_erofs_next_pcluster_t head; union { - wait_queue_head_t wait; + struct completion done; struct work_struct work; } u; }; diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c index d93db6d29704..bf8059060766 100644 --- a/fs/f2fs/checkpoint.c +++ b/fs/f2fs/checkpoint.c @@ -26,12 +26,16 @@ static struct kmem_cache *ino_entry_slab; struct kmem_cache *f2fs_inode_entry_slab; -void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io) +void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io, + unsigned char reason) { f2fs_build_fault_attr(sbi, 0, 0); set_ckpt_flags(sbi, CP_ERROR_FLAG); - if (!end_io) + if (!end_io) { f2fs_flush_merged_writes(sbi); + + f2fs_handle_stop(sbi, reason); + } } /* @@ -122,7 +126,7 @@ retry: if (PTR_ERR(page) == -EIO && ++count <= DEFAULT_RETRY_IO_COUNT) goto retry; - f2fs_stop_checkpoint(sbi, false); + f2fs_stop_checkpoint(sbi, false, STOP_CP_REASON_META_PAGE); } return page; } @@ -1895,15 +1899,27 @@ int f2fs_start_ckpt_thread(struct f2fs_sb_info *sbi) void f2fs_stop_ckpt_thread(struct f2fs_sb_info *sbi) { struct ckpt_req_control *cprc = &sbi->cprc_info; + struct task_struct *ckpt_task; - if (cprc->f2fs_issue_ckpt) { - struct task_struct *ckpt_task = cprc->f2fs_issue_ckpt; + if (!cprc->f2fs_issue_ckpt) + return; - cprc->f2fs_issue_ckpt = NULL; - kthread_stop(ckpt_task); + ckpt_task = cprc->f2fs_issue_ckpt; + cprc->f2fs_issue_ckpt = NULL; + kthread_stop(ckpt_task); - flush_remained_ckpt_reqs(sbi, NULL); - } + f2fs_flush_ckpt_thread(sbi); +} + +void f2fs_flush_ckpt_thread(struct f2fs_sb_info *sbi) +{ + struct ckpt_req_control *cprc = &sbi->cprc_info; + + flush_remained_ckpt_reqs(sbi, NULL); + + /* Let's wait for the previous dispatched checkpoint. */ + while (atomic_read(&cprc->queued_ckpt)) + io_schedule_timeout(DEFAULT_IO_TIMEOUT); } void f2fs_init_ckpt_req_control(struct f2fs_sb_info *sbi) diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c index e98a0ef71941..1e76c80a3eeb 100644 --- a/fs/f2fs/compress.c +++ b/fs/f2fs/compress.c @@ -728,14 +728,19 @@ out: return ret; } -void f2fs_decompress_cluster(struct decompress_io_ctx *dic) +static int f2fs_prepare_decomp_mem(struct decompress_io_ctx *dic, + bool pre_alloc); +static void f2fs_release_decomp_mem(struct decompress_io_ctx *dic, + bool bypass_destroy_callback, bool pre_alloc); + +void f2fs_decompress_cluster(struct decompress_io_ctx *dic, bool in_task) { struct f2fs_sb_info *sbi = F2FS_I_SB(dic->inode); struct f2fs_inode_info *fi = F2FS_I(dic->inode); const struct f2fs_compress_ops *cops = f2fs_cops[fi->i_compress_algorithm]; + bool bypass_callback = false; int ret; - int i; trace_f2fs_decompress_pages_start(dic->inode, dic->cluster_idx, dic->cluster_size, fi->i_compress_algorithm); @@ -745,41 +750,10 @@ void f2fs_decompress_cluster(struct decompress_io_ctx *dic) goto out_end_io; } - dic->tpages = page_array_alloc(dic->inode, dic->cluster_size); - if (!dic->tpages) { - ret = -ENOMEM; - goto out_end_io; - } - - for (i = 0; i < dic->cluster_size; i++) { - if (dic->rpages[i]) { - dic->tpages[i] = dic->rpages[i]; - continue; - } - - dic->tpages[i] = f2fs_compress_alloc_page(); - if (!dic->tpages[i]) { - ret = -ENOMEM; - goto out_end_io; - } - } - - if (cops->init_decompress_ctx) { - ret = cops->init_decompress_ctx(dic); - if (ret) - goto out_end_io; - } - - dic->rbuf = f2fs_vmap(dic->tpages, dic->cluster_size); - if (!dic->rbuf) { - ret = -ENOMEM; - goto out_destroy_decompress_ctx; - } - - dic->cbuf = f2fs_vmap(dic->cpages, dic->nr_cpages); - if (!dic->cbuf) { - ret = -ENOMEM; - goto out_vunmap_rbuf; + ret = f2fs_prepare_decomp_mem(dic, false); + if (ret) { + bypass_callback = true; + goto out_release; } dic->clen = le32_to_cpu(dic->cbuf->clen); @@ -787,7 +761,7 @@ void f2fs_decompress_cluster(struct decompress_io_ctx *dic) if (dic->clen > PAGE_SIZE * dic->nr_cpages - COMPRESS_HEADER_SIZE) { ret = -EFSCORRUPTED; - goto out_vunmap_cbuf; + goto out_release; } ret = cops->decompress_pages(dic); @@ -808,17 +782,13 @@ void f2fs_decompress_cluster(struct decompress_io_ctx *dic) } } -out_vunmap_cbuf: - vm_unmap_ram(dic->cbuf, dic->nr_cpages); -out_vunmap_rbuf: - vm_unmap_ram(dic->rbuf, dic->cluster_size); -out_destroy_decompress_ctx: - if (cops->destroy_decompress_ctx) - cops->destroy_decompress_ctx(dic); +out_release: + f2fs_release_decomp_mem(dic, bypass_callback, false); + out_end_io: trace_f2fs_decompress_pages_end(dic->inode, dic->cluster_idx, dic->clen, ret); - f2fs_decompress_end_io(dic, ret); + f2fs_decompress_end_io(dic, ret, in_task); } /* @@ -828,7 +798,7 @@ out_end_io: * (or in the case of a failure, cleans up without actually decompressing). */ void f2fs_end_read_compressed_page(struct page *page, bool failed, - block_t blkaddr) + block_t blkaddr, bool in_task) { struct decompress_io_ctx *dic = (struct decompress_io_ctx *)page_private(page); @@ -838,12 +808,12 @@ void f2fs_end_read_compressed_page(struct page *page, bool failed, if (failed) WRITE_ONCE(dic->failed, true); - else if (blkaddr) + else if (blkaddr && in_task) f2fs_cache_compressed_page(sbi, page, dic->inode->i_ino, blkaddr); if (atomic_dec_and_test(&dic->remaining_pages)) - f2fs_decompress_cluster(dic); + f2fs_decompress_cluster(dic, in_task); } static bool is_page_in_cluster(struct compress_ctx *cc, pgoff_t index) @@ -1551,16 +1521,85 @@ destroy_out: return err; } -static void f2fs_free_dic(struct decompress_io_ctx *dic); +static inline bool allow_memalloc_for_decomp(struct f2fs_sb_info *sbi, + bool pre_alloc) +{ + return pre_alloc ^ f2fs_low_mem_mode(sbi); +} + +static int f2fs_prepare_decomp_mem(struct decompress_io_ctx *dic, + bool pre_alloc) +{ + const struct f2fs_compress_ops *cops = + f2fs_cops[F2FS_I(dic->inode)->i_compress_algorithm]; + int i; + + if (!allow_memalloc_for_decomp(F2FS_I_SB(dic->inode), pre_alloc)) + return 0; + + dic->tpages = page_array_alloc(dic->inode, dic->cluster_size); + if (!dic->tpages) + return -ENOMEM; + + for (i = 0; i < dic->cluster_size; i++) { + if (dic->rpages[i]) { + dic->tpages[i] = dic->rpages[i]; + continue; + } + + dic->tpages[i] = f2fs_compress_alloc_page(); + if (!dic->tpages[i]) + return -ENOMEM; + } + + dic->rbuf = f2fs_vmap(dic->tpages, dic->cluster_size); + if (!dic->rbuf) + return -ENOMEM; + + dic->cbuf = f2fs_vmap(dic->cpages, dic->nr_cpages); + if (!dic->cbuf) + return -ENOMEM; + + if (cops->init_decompress_ctx) { + int ret = cops->init_decompress_ctx(dic); + + if (ret) + return ret; + } + + return 0; +} + +static void f2fs_release_decomp_mem(struct decompress_io_ctx *dic, + bool bypass_destroy_callback, bool pre_alloc) +{ + const struct f2fs_compress_ops *cops = + f2fs_cops[F2FS_I(dic->inode)->i_compress_algorithm]; + + if (!allow_memalloc_for_decomp(F2FS_I_SB(dic->inode), pre_alloc)) + return; + + if (!bypass_destroy_callback && cops->destroy_decompress_ctx) + cops->destroy_decompress_ctx(dic); + + if (dic->cbuf) + vm_unmap_ram(dic->cbuf, dic->nr_cpages); + + if (dic->rbuf) + vm_unmap_ram(dic->rbuf, dic->cluster_size); +} + +static void f2fs_free_dic(struct decompress_io_ctx *dic, + bool bypass_destroy_callback); struct decompress_io_ctx *f2fs_alloc_dic(struct compress_ctx *cc) { struct decompress_io_ctx *dic; pgoff_t start_idx = start_idx_of_cluster(cc); - int i; + struct f2fs_sb_info *sbi = F2FS_I_SB(cc->inode); + int i, ret; - dic = f2fs_kmem_cache_alloc(dic_entry_slab, GFP_F2FS_ZERO, - false, F2FS_I_SB(cc->inode)); + dic = f2fs_kmem_cache_alloc(dic_entry_slab, GFP_F2FS_ZERO, false, sbi); if (!dic) return ERR_PTR(-ENOMEM); @@ -1586,32 +1625,43 @@ struct decompress_io_ctx *f2fs_alloc_dic(struct compress_ctx *cc) dic->nr_rpages = cc->cluster_size; dic->cpages = page_array_alloc(dic->inode, dic->nr_cpages); - if (!dic->cpages) + if (!dic->cpages) { + ret = -ENOMEM; goto out_free; + } for (i = 0; i < dic->nr_cpages; i++) { struct page *page; page = f2fs_compress_alloc_page(); - if (!page) + if (!page) { + ret = -ENOMEM; goto out_free; + } f2fs_set_compressed_page(page, cc->inode, start_idx + i + 1, dic); dic->cpages[i] = page; } + ret = f2fs_prepare_decomp_mem(dic, true); + if (ret) + goto out_free; + return dic; out_free: - f2fs_free_dic(dic); - return ERR_PTR(-ENOMEM); + f2fs_free_dic(dic, true); + return ERR_PTR(ret); } -static void f2fs_free_dic(struct decompress_io_ctx *dic) +static void f2fs_free_dic(struct decompress_io_ctx *dic, + bool bypass_destroy_callback) { int i; + f2fs_release_decomp_mem(dic, bypass_destroy_callback, true); + if (dic->tpages) { for (i = 0; i < dic->cluster_size; i++) { if (dic->rpages[i]) @@ -1636,17 +1686,33 @@ static void f2fs_free_dic(struct decompress_io_ctx *dic) kmem_cache_free(dic_entry_slab, dic); } -static void f2fs_put_dic(struct decompress_io_ctx *dic) +static void f2fs_late_free_dic(struct work_struct *work) { - if (refcount_dec_and_test(&dic->refcnt)) - f2fs_free_dic(dic); + struct decompress_io_ctx *dic = + container_of(work, struct decompress_io_ctx, free_work); + + f2fs_free_dic(dic, false); +} + +static void f2fs_put_dic(struct decompress_io_ctx *dic, bool in_task) +{ + if (refcount_dec_and_test(&dic->refcnt)) { + if (in_task) { + f2fs_free_dic(dic, false); + } else { + INIT_WORK(&dic->free_work, f2fs_late_free_dic); + queue_work(F2FS_I_SB(dic->inode)->post_read_wq, + &dic->free_work); + } + } } /* * Update and unlock the cluster's pagecache pages, and release the reference to * the decompress_io_ctx that was being held for I/O completion. */ -static void __f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed) +static void __f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed, + bool in_task) { int i; @@ -1667,7 +1733,7 @@ static void __f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed) unlock_page(rpage); } - f2fs_put_dic(dic); + f2fs_put_dic(dic, in_task); } static void f2fs_verify_cluster(struct work_struct *work) @@ -1684,14 +1750,15 @@ static void f2fs_verify_cluster(struct work_struct *work) SetPageError(rpage); } - __f2fs_decompress_end_io(dic, false); + __f2fs_decompress_end_io(dic, false, true); } /* * This is called when a compressed cluster has been decompressed * (or failed to be read and/or decompressed). */ -void f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed) +void f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed, + bool in_task) { if (!failed && dic->need_verity) { /* @@ -1703,7 +1770,7 @@ void f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed) INIT_WORK(&dic->verity_work, f2fs_verify_cluster); fsverity_enqueue_verify_work(&dic->verity_work); } else { - __f2fs_decompress_end_io(dic, failed); + __f2fs_decompress_end_io(dic, failed, in_task); } } @@ -1712,12 +1779,12 @@ void f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed) * * This is called when the page is no longer needed and can be freed. */ -void f2fs_put_page_dic(struct page *page) +void f2fs_put_page_dic(struct page *page, bool in_task) { struct decompress_io_ctx *dic = (struct decompress_io_ctx *)page_private(page); - f2fs_put_dic(dic); + f2fs_put_dic(dic, in_task); } /* diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 46a4322401b1..0b2196e997b8 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -122,7 +122,7 @@ struct bio_post_read_ctx { block_t fs_blkaddr; }; -static void f2fs_finish_read_bio(struct bio *bio) +static void f2fs_finish_read_bio(struct bio *bio, bool in_task) { struct bio_vec *bv; struct bvec_iter_all iter_all; @@ -136,8 +136,9 @@ static void f2fs_finish_read_bio(struct bio *bio) if (f2fs_is_compressed_page(page)) { if (bio->bi_status) - f2fs_end_read_compressed_page(page, true, 0); - f2fs_put_page_dic(page); + f2fs_end_read_compressed_page(page, true, 0, + in_task); + f2fs_put_page_dic(page, in_task); continue; } @@ -194,7 +195,7 @@ static void f2fs_verify_bio(struct work_struct *work) fsverity_verify_bio(bio); } - f2fs_finish_read_bio(bio); + f2fs_finish_read_bio(bio, true); } /* @@ -206,7 +207,7 @@ static void f2fs_verify_bio(struct work_struct *work) * can involve reading verity metadata pages from the file, and these verity * metadata pages may be encrypted and/or compressed. */ -static void f2fs_verify_and_finish_bio(struct bio *bio) +static void f2fs_verify_and_finish_bio(struct bio *bio, bool in_task) { struct bio_post_read_ctx *ctx = bio->bi_private; @@ -214,7 +215,7 @@ static void f2fs_verify_and_finish_bio(struct bio *bio) INIT_WORK(&ctx->work, f2fs_verify_bio); fsverity_enqueue_verify_work(&ctx->work); } else { - f2fs_finish_read_bio(bio); + f2fs_finish_read_bio(bio, in_task); } } @@ -227,7 +228,8 @@ static void f2fs_verify_and_finish_bio(struct bio *bio) * that the bio includes at least one compressed page. The actual decompression * is done on a per-cluster basis, not a per-bio basis. */ -static void f2fs_handle_step_decompress(struct bio_post_read_ctx *ctx) +static void f2fs_handle_step_decompress(struct bio_post_read_ctx *ctx, + bool in_task) { struct bio_vec *bv; struct bvec_iter_all iter_all; @@ -240,7 +242,7 @@ static void f2fs_handle_step_decompress(struct bio_post_read_ctx *ctx) /* PG_error was set if decryption failed. */ if (f2fs_is_compressed_page(page)) f2fs_end_read_compressed_page(page, PageError(page), - blkaddr); + blkaddr, in_task); else all_compressed = false; @@ -265,15 +267,16 @@ static void f2fs_post_read_work(struct work_struct *work) fscrypt_decrypt_bio(ctx->bio); if (ctx->enabled_steps & STEP_DECOMPRESS) - f2fs_handle_step_decompress(ctx); + f2fs_handle_step_decompress(ctx, true); - f2fs_verify_and_finish_bio(ctx->bio); + f2fs_verify_and_finish_bio(ctx->bio, true); } static void f2fs_read_end_io(struct bio *bio) { struct f2fs_sb_info *sbi = F2FS_P_SB(bio_first_page_all(bio)); struct bio_post_read_ctx *ctx; + bool intask = in_task(); iostat_update_and_unbind_ctx(bio, 0); ctx = bio->bi_private; @@ -284,16 +287,29 @@ static void f2fs_read_end_io(struct bio *bio) } if (bio->bi_status) { - f2fs_finish_read_bio(bio); + f2fs_finish_read_bio(bio, intask); return; } - if (ctx && (ctx->enabled_steps & (STEP_DECRYPT | STEP_DECOMPRESS))) { - INIT_WORK(&ctx->work, f2fs_post_read_work); - queue_work(ctx->sbi->post_read_wq, &ctx->work); - } else { - f2fs_verify_and_finish_bio(bio); + if (ctx) { + unsigned int enabled_steps = ctx->enabled_steps & + (STEP_DECRYPT | STEP_DECOMPRESS); + + /* + * If we have only decompression step between decompression and + * decrypt, we don't need post processing for this. + */ + if (enabled_steps == STEP_DECOMPRESS && + !f2fs_low_mem_mode(sbi)) { + f2fs_handle_step_decompress(ctx, intask); + } else if (enabled_steps) { + INIT_WORK(&ctx->work, f2fs_post_read_work); + queue_work(ctx->sbi->post_read_wq, &ctx->work); + return; + } } + + f2fs_verify_and_finish_bio(bio, intask); } static void f2fs_write_end_io(struct bio *bio) @@ -320,7 +336,8 @@ static void f2fs_write_end_io(struct bio *bio) mempool_free(page, sbi->write_io_dummy); if (unlikely(bio->bi_status)) - f2fs_stop_checkpoint(sbi, true); + f2fs_stop_checkpoint(sbi, true, + STOP_CP_REASON_WRITE_FAIL); continue; } @@ -336,7 +353,8 @@ static void f2fs_write_end_io(struct bio *bio) if (unlikely(bio->bi_status)) { mapping_set_error(page->mapping, -EIO); if (type == F2FS_WB_CP_DATA) - f2fs_stop_checkpoint(sbi, true); + f2fs_stop_checkpoint(sbi, true, + STOP_CP_REASON_WRITE_FAIL); } f2fs_bug_on(sbi, page->mapping == NODE_MAPPING(sbi) && @@ -2228,7 +2246,7 @@ skip_reading_dnode: if (f2fs_load_compressed_page(sbi, page, blkaddr)) { if (atomic_dec_and_test(&dic->remaining_pages)) - f2fs_decompress_cluster(dic); + f2fs_decompress_cluster(dic, true); continue; } @@ -2246,7 +2264,7 @@ submit_and_realloc: page->index, for_write); if (IS_ERR(bio)) { ret = PTR_ERR(bio); - f2fs_decompress_end_io(dic, ret); + f2fs_decompress_end_io(dic, ret, true); f2fs_put_dnode(&dn); *bio_ret = NULL; return ret; @@ -2533,7 +2551,7 @@ bool f2fs_should_update_inplace(struct inode *inode, struct f2fs_io_info *fio) return true; /* if this is cold file, we should overwrite to avoid fragmentation */ - if (file_is_cold(inode)) + if (file_is_cold(inode) && !is_inode_flag_set(inode, FI_OPU_WRITE)) return true; return check_inplace_update_policy(inode, fio); diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 63cb39d2e4b0..f40fe37f2455 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -159,6 +159,7 @@ struct f2fs_mount_info { int fsync_mode; /* fsync policy */ int fs_mode; /* fs mode: LFS or ADAPTIVE */ int bggc_mode; /* bggc mode: off, on or sync */ + int memory_mode; /* memory mode */ int discard_unit; /* * discard command's offset/size should * be aligned to this unit: block, @@ -1369,6 +1370,13 @@ enum { DISCARD_UNIT_SECTION, /* basic discard unit is section */ }; +enum { + MEMORY_MODE_NORMAL, /* memory mode for normal devices */ + MEMORY_MODE_LOW, /* memory mode for low memry devices */ +}; + + + static inline int f2fs_test_bit(unsigned int nr, char *addr); static inline void f2fs_set_bit(unsigned int nr, char *addr); static inline void f2fs_clear_bit(unsigned int nr, char *addr); @@ -1589,6 +1597,7 @@ struct decompress_io_ctx { void *private; /* payload buffer for specified decompression algorithm */ void *private2; /* extra payload buffer */ struct work_struct verity_work; /* work to verify the decompressed pages */ + struct work_struct free_work; /* work for late free this structure itself */ }; #define NULL_CLUSTER ((unsigned int)(~0)) @@ -1721,7 +1730,6 @@ struct f2fs_sb_info { unsigned int gc_mode; /* current GC state */ unsigned int next_victim_seg[2]; /* next segment in victim section */ spinlock_t gc_urgent_high_lock; - bool gc_urgent_high_limited; /* indicates having limited trial count */ unsigned int gc_urgent_high_remaining; /* remaining trial count for GC_URGENT_HIGH */ /* for skip statistic */ @@ -3512,6 +3520,7 @@ int f2fs_enable_quota_files(struct f2fs_sb_info *sbi, bool rdonly); int f2fs_quota_sync(struct super_block *sb, int type); loff_t max_file_blocks(struct inode *inode); void f2fs_quota_off_umount(struct super_block *sb); +void f2fs_handle_stop(struct f2fs_sb_info *sbi, unsigned char reason); int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover); int f2fs_sync_fs(struct super_block *sb, int sync); int f2fs_sanity_check_ckpt(struct f2fs_sb_info *sbi); @@ -3676,7 +3685,9 @@ static inline bool f2fs_need_rand_seg(struct f2fs_sb_info *sbi) /* * checkpoint.c */ -void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io); +void f2fs_stop_checkpoint(struct f2fs_sb_info *sbi, bool end_io, + unsigned char reason); +void f2fs_flush_ckpt_thread(struct f2fs_sb_info *sbi); struct page *f2fs_grab_meta_page(struct f2fs_sb_info *sbi, pgoff_t index); struct page *f2fs_get_meta_page(struct f2fs_sb_info *sbi, pgoff_t index); struct page *f2fs_get_meta_page_retry(struct f2fs_sb_info *sbi, pgoff_t index); @@ -4181,9 +4192,9 @@ void f2fs_compress_write_end_io(struct bio *bio, struct page *page); bool f2fs_is_compress_backend_ready(struct inode *inode); int f2fs_init_compress_mempool(void); void f2fs_destroy_compress_mempool(void); -void f2fs_decompress_cluster(struct decompress_io_ctx *dic); +void f2fs_decompress_cluster(struct decompress_io_ctx *dic, bool in_task); void f2fs_end_read_compressed_page(struct page *page, bool failed, - block_t blkaddr); + block_t blkaddr, bool in_task); bool f2fs_cluster_is_empty(struct compress_ctx *cc); bool f2fs_cluster_can_merge_page(struct compress_ctx *cc, pgoff_t index); bool f2fs_all_cluster_page_loaded(struct compress_ctx *cc, struct pagevec *pvec, @@ -4202,8 +4213,9 @@ int f2fs_read_multi_pages(struct compress_ctx *cc, struct bio **bio_ret, unsigned nr_pages, sector_t *last_block_in_bio, bool is_readahead, bool for_write); struct decompress_io_ctx *f2fs_alloc_dic(struct compress_ctx *cc); -void f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed); -void f2fs_put_page_dic(struct page *page); +void f2fs_decompress_end_io(struct decompress_io_ctx *dic, bool failed, + bool in_task); +void f2fs_put_page_dic(struct page *page, bool in_task); unsigned int f2fs_cluster_blocks_are_contiguous(struct dnode_of_data *dn); int f2fs_init_compress_ctx(struct compress_ctx *cc); void f2fs_destroy_compress_ctx(struct compress_ctx *cc, bool reuse); @@ -4249,13 +4261,14 @@ static inline struct page *f2fs_compress_control_page(struct page *page) } static inline int f2fs_init_compress_mempool(void) { return 0; } static inline void f2fs_destroy_compress_mempool(void) { } -static inline void f2fs_decompress_cluster(struct decompress_io_ctx *dic) { } +static inline void f2fs_decompress_cluster(struct decompress_io_ctx *dic, + bool in_task) { } static inline void f2fs_end_read_compressed_page(struct page *page, - bool failed, block_t blkaddr) + bool failed, block_t blkaddr, bool in_task) { WARN_ON_ONCE(1); } -static inline void f2fs_put_page_dic(struct page *page) +static inline void f2fs_put_page_dic(struct page *page, bool in_task) { WARN_ON_ONCE(1); } @@ -4427,6 +4440,11 @@ static inline bool f2fs_lfs_mode(struct f2fs_sb_info *sbi) return F2FS_OPTION(sbi).fs_mode == FS_MODE_LFS; } +static inline bool f2fs_low_mem_mode(struct f2fs_sb_info *sbi) +{ + return F2FS_OPTION(sbi).memory_mode == MEMORY_MODE_LOW; +} + static inline bool f2fs_may_compress(struct inode *inode) { if (IS_SWAPFILE(inode) || f2fs_is_pinned_file(inode) || diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index a1d6b941fd60..39795c03d3ea 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -2294,7 +2294,8 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg) if (ret) { if (ret == -EROFS) { ret = 0; - f2fs_stop_checkpoint(sbi, false); + f2fs_stop_checkpoint(sbi, false, + STOP_CP_REASON_SHUTDOWN); set_sbi_flag(sbi, SBI_IS_SHUTDOWN); trace_f2fs_shutdown(sbi, in, ret); } @@ -2307,7 +2308,7 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg) ret = freeze_bdev(sb->s_bdev); if (ret) goto out; - f2fs_stop_checkpoint(sbi, false); + f2fs_stop_checkpoint(sbi, false, STOP_CP_REASON_SHUTDOWN); set_sbi_flag(sbi, SBI_IS_SHUTDOWN); thaw_bdev(sb->s_bdev); break; @@ -2316,16 +2317,16 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg) ret = f2fs_sync_fs(sb, 1); if (ret) goto out; - f2fs_stop_checkpoint(sbi, false); + f2fs_stop_checkpoint(sbi, false, STOP_CP_REASON_SHUTDOWN); set_sbi_flag(sbi, SBI_IS_SHUTDOWN); break; case F2FS_GOING_DOWN_NOSYNC: - f2fs_stop_checkpoint(sbi, false); + f2fs_stop_checkpoint(sbi, false, STOP_CP_REASON_SHUTDOWN); set_sbi_flag(sbi, SBI_IS_SHUTDOWN); break; case F2FS_GOING_DOWN_METAFLUSH: f2fs_sync_meta_pages(sbi, META, LONG_MAX, FS_META_IO); - f2fs_stop_checkpoint(sbi, false); + f2fs_stop_checkpoint(sbi, false, STOP_CP_REASON_SHUTDOWN); set_sbi_flag(sbi, SBI_IS_SHUTDOWN); break; case F2FS_GOING_DOWN_NEED_FSCK: diff --git a/fs/f2fs/gc.c b/fs/f2fs/gc.c index 79dc38eacb19..f48b60553630 100644 --- a/fs/f2fs/gc.c +++ b/fs/f2fs/gc.c @@ -70,7 +70,8 @@ static int gc_thread_func(void *data) if (time_to_inject(sbi, FAULT_CHECKPOINT)) { f2fs_show_injection_info(sbi, FAULT_CHECKPOINT); - f2fs_stop_checkpoint(sbi, false); + f2fs_stop_checkpoint(sbi, false, + STOP_CP_REASON_FAULT_INJECT); } if (!sb_start_write_trylock(sbi->sb)) { @@ -93,14 +94,10 @@ static int gc_thread_func(void *data) */ if (sbi->gc_mode == GC_URGENT_HIGH) { spin_lock(&sbi->gc_urgent_high_lock); - if (sbi->gc_urgent_high_limited) { - if (!sbi->gc_urgent_high_remaining) { - sbi->gc_urgent_high_limited = false; - spin_unlock(&sbi->gc_urgent_high_lock); - sbi->gc_mode = GC_NORMAL; - continue; - } + if (sbi->gc_urgent_high_remaining) { sbi->gc_urgent_high_remaining--; + if (!sbi->gc_urgent_high_remaining) + sbi->gc_mode = GC_NORMAL; } spin_unlock(&sbi->gc_urgent_high_lock); } @@ -1655,7 +1652,8 @@ static int do_garbage_collect(struct f2fs_sb_info *sbi, f2fs_err(sbi, "Inconsistent segment (%u) type [%d, %d] in SSA and SIT", segno, type, GET_SUM_TYPE((&sum->footer))); set_sbi_flag(sbi, SBI_NEED_FSCK); - f2fs_stop_checkpoint(sbi, false); + f2fs_stop_checkpoint(sbi, false, + STOP_CP_REASON_CORRUPTED_SUMMARY); goto skip; } diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index 5fffc2268964..d9757673f45e 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -700,7 +700,8 @@ retry: cond_resched(); goto retry; } else if (err != -ENOENT) { - f2fs_stop_checkpoint(sbi, false); + f2fs_stop_checkpoint(sbi, false, + STOP_CP_REASON_UPDATE_INODE); } return; } diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index de1f4ac8191a..af6b14191076 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -498,7 +498,7 @@ void f2fs_balance_fs(struct f2fs_sb_info *sbi, bool need) { if (time_to_inject(sbi, FAULT_CHECKPOINT)) { f2fs_show_injection_info(sbi, FAULT_CHECKPOINT); - f2fs_stop_checkpoint(sbi, false); + f2fs_stop_checkpoint(sbi, false, STOP_CP_REASON_FAULT_INJECT); } /* balance_fs_bg is able to be pending */ @@ -809,7 +809,8 @@ int f2fs_flush_device_cache(struct f2fs_sb_info *sbi) } while (ret && --count); if (ret) { - f2fs_stop_checkpoint(sbi, false); + f2fs_stop_checkpoint(sbi, false, + STOP_CP_REASON_FLUSH_FAIL); break; } diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index ae566f92d36f..8570a2249196 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -160,6 +160,7 @@ enum { Opt_gc_merge, Opt_nogc_merge, Opt_discard_unit, + Opt_memory_mode, Opt_err, }; @@ -237,6 +238,7 @@ static match_table_t f2fs_tokens = { {Opt_gc_merge, "gc_merge"}, {Opt_nogc_merge, "nogc_merge"}, {Opt_discard_unit, "discard_unit=%s"}, + {Opt_memory_mode, "memory=%s"}, {Opt_err, NULL}, }; @@ -307,10 +309,10 @@ static void f2fs_destroy_casefold_cache(void) { } static inline void limit_reserve_root(struct f2fs_sb_info *sbi) { - block_t limit = min((sbi->user_block_count << 1) / 1000, + block_t limit = min((sbi->user_block_count >> 3), sbi->user_block_count - sbi->reserved_blocks); - /* limit is 0.2% */ + /* limit is 12.5% */ if (test_opt(sbi, RESERVE_ROOT) && F2FS_OPTION(sbi).root_reserved_blocks > limit && F2FS_OPTION(sbi).root_reserved_blocks > MIN_ROOT_RESERVED_BLOCKS) { @@ -1247,6 +1249,22 @@ static int parse_options(struct super_block *sb, char *options, bool is_remount) } kfree(name); break; + case Opt_memory_mode: + name = match_strdup(&args[0]); + if (!name) + return -ENOMEM; + if (!strcmp(name, "normal")) { + F2FS_OPTION(sbi).memory_mode = + MEMORY_MODE_NORMAL; + } else if (!strcmp(name, "low")) { + F2FS_OPTION(sbi).memory_mode = + MEMORY_MODE_LOW; + } else { + kfree(name); + return -EINVAL; + } + kfree(name); + break; default: f2fs_err(sbi, "Unrecognized mount option \"%s\" or missing value", p); @@ -1674,9 +1692,8 @@ static int f2fs_freeze(struct super_block *sb) if (is_sbi_flag_set(F2FS_SB(sb), SBI_IS_DIRTY)) return -EINVAL; - /* ensure no checkpoint required */ - if (!llist_empty(&F2FS_SB(sb)->cprc_info.issue_list)) - return -EINVAL; + /* Let's flush checkpoints and stop the thread. */ + f2fs_flush_ckpt_thread(F2FS_SB(sb)); /* to avoid deadlock on f2fs_evict_inode->SB_FREEZE_FS */ set_sbi_flag(F2FS_SB(sb), SBI_IS_FREEZING); @@ -2032,6 +2049,11 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root) else if (F2FS_OPTION(sbi).discard_unit == DISCARD_UNIT_SECTION) seq_printf(seq, ",discard_unit=%s", "section"); + if (F2FS_OPTION(sbi).memory_mode == MEMORY_MODE_NORMAL) + seq_printf(seq, ",memory=%s", "normal"); + else if (F2FS_OPTION(sbi).memory_mode == MEMORY_MODE_LOW) + seq_printf(seq, ",memory=%s", "low"); + return 0; } @@ -2054,6 +2076,7 @@ static void default_options(struct f2fs_sb_info *sbi) F2FS_OPTION(sbi).compress_ext_cnt = 0; F2FS_OPTION(sbi).compress_mode = COMPR_MODE_FS; F2FS_OPTION(sbi).bggc_mode = BGGC_MODE_ON; + F2FS_OPTION(sbi).memory_mode = MEMORY_MODE_NORMAL; sbi->sb->s_flags &= ~SB_INLINECRYPT; @@ -2174,6 +2197,9 @@ static void f2fs_enable_checkpoint(struct f2fs_sb_info *sbi) f2fs_up_write(&sbi->gc_lock); f2fs_sync_fs(sbi->sb, 1); + + /* Let's ensure there's no pending checkpoint anymore */ + f2fs_flush_ckpt_thread(sbi); } static int f2fs_remount(struct super_block *sb, int *flags, char *data) @@ -2340,6 +2366,9 @@ static int f2fs_remount(struct super_block *sb, int *flags, char *data) f2fs_stop_ckpt_thread(sbi); need_restart_ckpt = true; } else { + /* Flush if the prevous checkpoint, if exists. */ + f2fs_flush_ckpt_thread(sbi); + err = f2fs_start_ckpt_thread(sbi); if (err) { f2fs_err(sbi, @@ -3836,6 +3865,26 @@ int f2fs_commit_super(struct f2fs_sb_info *sbi, bool recover) return err; } +void f2fs_handle_stop(struct f2fs_sb_info *sbi, unsigned char reason) +{ + struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); + int err; + + f2fs_bug_on(sbi, reason >= MAX_STOP_REASON); + + f2fs_down_write(&sbi->sb_lock); + + if (raw_super->s_stop_reason[reason] < ((1 << BITS_PER_BYTE) - 1)) + raw_super->s_stop_reason[reason]++; + + err = f2fs_commit_super(sbi, false); + if (err) + f2fs_err(sbi, "f2fs_commit_super fails to record reason:%u err:%d", + reason, err); + + f2fs_up_write(&sbi->sb_lock); +} + static int f2fs_scan_devices(struct f2fs_sb_info *sbi) { struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); diff --git a/fs/f2fs/sysfs.c b/fs/f2fs/sysfs.c index f240f5593394..3ccbbee77cff 100644 --- a/fs/f2fs/sysfs.c +++ b/fs/f2fs/sysfs.c @@ -513,7 +513,6 @@ out: if (!strcmp(a->attr.name, "gc_urgent_high_remaining")) { spin_lock(&sbi->gc_urgent_high_lock); - sbi->gc_urgent_high_limited = t != 0; sbi->gc_urgent_high_remaining = t; spin_unlock(&sbi->gc_urgent_high_lock); diff --git a/fs/fuse/backing.c b/fs/fuse/backing.c index b536fd9e99b7..9f78384b021f 100644 --- a/fs/fuse/backing.c +++ b/fs/fuse/backing.c @@ -23,6 +23,9 @@ struct fuse_bpf_aio_req { static struct kmem_cache *fuse_bpf_aio_request_cachep; +static void fuse_stat_to_attr(struct fuse_conn *fc, struct inode *inode, + struct kstat *stat, struct fuse_attr *attr); + static void fuse_file_accessed(struct file *dst_file, struct file *src_file) { struct inode *dst_inode; @@ -181,8 +184,10 @@ void *fuse_open_finalize(struct fuse_bpf_args *fa, struct fuse_file *ff = file->private_data; struct fuse_open_out *foo = fa->out_args[0].value; - if (ff) + if (ff) { ff->fh = foo->fh; + ff->nodeid = get_fuse_inode(inode)->nodeid; + } return 0; } @@ -1153,6 +1158,9 @@ int fuse_lookup_backing(struct fuse_bpf_args *fa, struct inode *dir, struct dentry *dir_backing_entry = dir_fuse_entry->backing_path.dentry; struct inode *dir_backing_inode = dir_backing_entry->d_inode; struct dentry *backing_entry; + struct fuse_entry_out *feo = (void *)fa->out_args[0].value; + struct kstat stat; + int err; /* TODO this will not handle lookups over mount points */ inode_lock_nested(dir_backing_inode, I_MUTEX_PARENT); @@ -1165,10 +1173,23 @@ int fuse_lookup_backing(struct fuse_bpf_args *fa, struct inode *dir, fuse_entry->backing_path = (struct path) { .dentry = backing_entry, - .mnt = dir_fuse_entry->backing_path.mnt, + .mnt = mntget(dir_fuse_entry->backing_path.mnt), }; - mntget(fuse_entry->backing_path.mnt); + if (d_is_negative(backing_entry)) { + fa->error_in = -ENOENT; + return 0; + } + + err = vfs_getattr(&fuse_entry->backing_path, &stat, + STATX_BASIC_STATS, 0); + if (err) { + path_put_init(&fuse_entry->backing_path); + return err; + } + + fuse_stat_to_attr(get_fuse_conn(dir), + backing_entry->d_inode, &stat, &feo->attr); return 0; } diff --git a/fs/incfs/vfs.c b/fs/incfs/vfs.c index e97b843a4da5..7d349ee73bc3 100644 --- a/fs/incfs/vfs.c +++ b/fs/incfs/vfs.c @@ -1592,6 +1592,10 @@ static int incfs_setattr(struct dentry *dentry, struct iattr *ia) if (ia->ia_valid & ATTR_SIZE) return -EINVAL; + if ((ia->ia_valid & (ATTR_KILL_SUID|ATTR_KILL_SGID)) && + (ia->ia_valid & ATTR_MODE)) + return -EINVAL; + if (!di) return -EINVAL; backing_dentry = di->backing_path.dentry; diff --git a/fs/pipe.c b/fs/pipe.c index 9f2ca1b1c17a..434b0a274468 100644 --- a/fs/pipe.c +++ b/fs/pipe.c @@ -1244,30 +1244,33 @@ unsigned int round_pipe_size(unsigned long size) /* * Resize the pipe ring to a number of slots. + * + * Note the pipe can be reduced in capacity, but only if the current + * occupancy doesn't exceed nr_slots; if it does, EBUSY will be + * returned instead. */ int pipe_resize_ring(struct pipe_inode_info *pipe, unsigned int nr_slots) { struct pipe_buffer *bufs; unsigned int head, tail, mask, n; - /* - * We can shrink the pipe, if arg is greater than the ring occupancy. - * Since we don't expect a lot of shrink+grow operations, just free and - * allocate again like we would do for growing. If the pipe currently - * contains more buffers than arg, then return busy. - */ - mask = pipe->ring_size - 1; - head = pipe->head; - tail = pipe->tail; - n = pipe_occupancy(pipe->head, pipe->tail); - if (nr_slots < n) - return -EBUSY; - bufs = kcalloc(nr_slots, sizeof(*bufs), GFP_KERNEL_ACCOUNT | __GFP_NOWARN); if (unlikely(!bufs)) return -ENOMEM; + spin_lock_irq(&pipe->rd_wait.lock); + mask = pipe->ring_size - 1; + head = pipe->head; + tail = pipe->tail; + + n = pipe_occupancy(head, tail); + if (nr_slots < n) { + spin_unlock_irq(&pipe->rd_wait.lock); + kfree(bufs); + return -EBUSY; + } + /* * The pipe array wraps around, so just start the new one at zero * and adjust the indices. @@ -1299,6 +1302,8 @@ int pipe_resize_ring(struct pipe_inode_info *pipe, unsigned int nr_slots) pipe->tail = tail; pipe->head = head; + spin_unlock_irq(&pipe->rd_wait.lock); + /* This might have made more room for writers */ wake_up_interruptible(&pipe->wr_wait); return 0; diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h index d445150c5350..5dd1e52b8997 100644 --- a/include/linux/f2fs_fs.h +++ b/include/linux/f2fs_fs.h @@ -73,6 +73,20 @@ struct f2fs_device { __le32 total_segments; } __packed; +/* reason of stop_checkpoint */ +enum stop_cp_reason { + STOP_CP_REASON_SHUTDOWN, + STOP_CP_REASON_FAULT_INJECT, + STOP_CP_REASON_META_PAGE, + STOP_CP_REASON_WRITE_FAIL, + STOP_CP_REASON_CORRUPTED_SUMMARY, + STOP_CP_REASON_UPDATE_INODE, + STOP_CP_REASON_FLUSH_FAIL, + STOP_CP_REASON_MAX, +}; + +#define MAX_STOP_REASON 32 + struct f2fs_super_block { __le32 magic; /* Magic Number */ __le16 major_ver; /* Major Version */ @@ -116,7 +130,8 @@ struct f2fs_super_block { __u8 hot_ext_count; /* # of hot file extension */ __le16 s_encoding; /* Filename charset encoding */ __le16 s_encoding_flags; /* Filename charset encoding flags */ - __u8 reserved[306]; /* valid reserved region */ + __u8 s_stop_reason[MAX_STOP_REASON]; /* stop checkpoint reason */ + __u8 reserved[274]; /* valid reserved region */ __le32 crc; /* checksum of superblock */ } __packed; diff --git a/include/trace/hooks/binder.h b/include/trace/hooks/binder.h index 001780156c5d..c46264c38dde 100644 --- a/include/trace/hooks/binder.h +++ b/include/trace/hooks/binder.h @@ -10,7 +10,6 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct binder_alloc; struct binder_proc; struct binder_thread; @@ -18,18 +17,7 @@ struct binder_transaction; struct task_struct; struct seq_file; struct binder_transaction_data; -#else -/* struct binder_alloc */ -#include <../drivers/android/binder_alloc.h> -/* struct binder_proc, struct binder_thread, struct binder_transaction */ -#include <../drivers/android/binder_internal.h> -/* struct task_struct */ -#include -/* struct seq_file */ -#include -/* struct binder_transaction_data */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_binder_transaction_init, TP_PROTO(struct binder_transaction *t), TP_ARGS(t)); diff --git a/include/trace/hooks/block.h b/include/trace/hooks/block.h index 0828a306ea13..e8bee374f989 100644 --- a/include/trace/hooks/block.h +++ b/include/trace/hooks/block.h @@ -9,18 +9,9 @@ #include -#ifdef __GENKSYMS__ struct blk_mq_tags; struct blk_mq_alloc_data; struct blk_mq_tag_set; -#else -/* struct blk_mq_tags */ -#include <../block/blk-mq-tag.h> -/* struct blk_mq_alloc_data */ -#include <../block/blk-mq.h> -/* struct blk_mq_tag_set */ -#include -#endif /* __GENKSYMS__ */ DECLARE_HOOK(android_vh_blk_alloc_rqs, TP_PROTO(size_t *rq_size, struct blk_mq_tag_set *set, diff --git a/include/trace/hooks/cgroup.h b/include/trace/hooks/cgroup.h index 5546d390cb50..116a2afabf99 100644 --- a/include/trace/hooks/cgroup.h +++ b/include/trace/hooks/cgroup.h @@ -7,18 +7,10 @@ #define _TRACE_HOOK_CGROUP_H #include -#ifdef __GENKSYMS__ struct cgroup_taskset; struct cgroup_subsys; struct task_struct; -#else -/* Including ../kernel/cgroup/cgroup-internal.h breaks builds. */ -struct cgroup_taskset; -/* struct cgroup_subsys */ -#include -/* struct task_struct */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_cgroup_set_task, TP_PROTO(int ret, struct task_struct *task), TP_ARGS(ret, task)); diff --git a/include/trace/hooks/cpufreq.h b/include/trace/hooks/cpufreq.h index 70f90a3ef25c..2739a0f9a547 100644 --- a/include/trace/hooks/cpufreq.h +++ b/include/trace/hooks/cpufreq.h @@ -6,10 +6,15 @@ #if !defined(_TRACE_HOOK_CPUFREQ_H) || defined(TRACE_HEADER_MULTI_READ) #define _TRACE_HOOK_CPUFREQ_H - -#include #include +#ifdef __GENKSYMS__ +#include +#endif + +struct cpufreq_policy; +struct task_struct; + DECLARE_HOOK(android_vh_show_max_freq, TP_PROTO(struct cpufreq_policy *policy, unsigned int *max_freq), TP_ARGS(policy, max_freq)); diff --git a/include/trace/hooks/cpuidle.h b/include/trace/hooks/cpuidle.h index 9addbdf32913..c2ddabe37b00 100644 --- a/include/trace/hooks/cpuidle.h +++ b/include/trace/hooks/cpuidle.h @@ -9,12 +9,7 @@ #include -#ifdef __GENKSYMS__ struct cpuidle_device; -#else -/* struct cpuidle_device */ -#include -#endif /* __GENKSYMS__ */ DECLARE_HOOK(android_vh_cpu_idle_enter, TP_PROTO(int *state, struct cpuidle_device *dev), diff --git a/include/trace/hooks/cpuidle_psci.h b/include/trace/hooks/cpuidle_psci.h index 4881f35712c0..3ca307a3d82b 100644 --- a/include/trace/hooks/cpuidle_psci.h +++ b/include/trace/hooks/cpuidle_psci.h @@ -10,12 +10,8 @@ * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct cpuidle_device; -#else -/* struct cpuidle_device */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_cpuidle_psci_enter, TP_PROTO(struct cpuidle_device *dev, bool s2idle), TP_ARGS(dev, s2idle)); diff --git a/include/trace/hooks/creds.h b/include/trace/hooks/creds.h index 9544ee2e827c..12f92be91c24 100644 --- a/include/trace/hooks/creds.h +++ b/include/trace/hooks/creds.h @@ -10,15 +10,9 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct cred; struct task_struct; -#else -/* struct cred */ -#include -/* struct task_struct */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_commit_creds, TP_PROTO(const struct task_struct *task, const struct cred *new), TP_ARGS(task, new)); diff --git a/include/trace/hooks/debug.h b/include/trace/hooks/debug.h index 892c60ac6f34..5a20141d742b 100644 --- a/include/trace/hooks/debug.h +++ b/include/trace/hooks/debug.h @@ -9,21 +9,11 @@ #include -#if defined(CONFIG_TRACEPOINTS) && defined(CONFIG_ANDROID_VENDOR_HOOKS) -#ifdef __GENKSYMS__ struct pt_regs; -#else -/* struct pt_regs */ -#include -#endif /* __GENKSYMS__ */ DECLARE_HOOK(android_vh_ipi_stop, TP_PROTO(struct pt_regs *regs), TP_ARGS(regs)) -#else -#define trace_android_vh_ipi_stop(regs) -#define trace_android_vh_ipi_stop_rcuidle(regs) -#endif #endif /* _TRACE_HOOK_DEBUG_H */ /* This part must be outside protection */ diff --git a/include/trace/hooks/dtask.h b/include/trace/hooks/dtask.h index be037865cdbc..749dc5b4078b 100644 --- a/include/trace/hooks/dtask.h +++ b/include/trace/hooks/dtask.h @@ -10,21 +10,11 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct mutex; struct rt_mutex; struct rw_semaphore; struct task_struct; -#else -/* struct mutex */ -#include -/* struct rt_mutex */ -#include -/* struct rw_semaphore */ -#include -/* struct task_struct */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_mutex_wait_start, TP_PROTO(struct mutex *lock), TP_ARGS(lock)); diff --git a/include/trace/hooks/fault.h b/include/trace/hooks/fault.h index 920772177bb0..1b6e0b0911f5 100644 --- a/include/trace/hooks/fault.h +++ b/include/trace/hooks/fault.h @@ -10,12 +10,8 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct pt_regs; -#else -/* struct pt_regs */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_RESTRICTED_HOOK(android_rvh_die_kernel_fault, TP_PROTO(struct pt_regs *regs, unsigned int esr, unsigned long addr, const char *msg), TP_ARGS(regs, esr, addr, msg), 1); diff --git a/include/trace/hooks/fips140.h b/include/trace/hooks/fips140.h index 6a777771a6c8..fd4a42c013c7 100644 --- a/include/trace/hooks/fips140.h +++ b/include/trace/hooks/fips140.h @@ -7,12 +7,7 @@ #define _TRACE_HOOK_FIPS140_H #include -#ifdef __GENKSYMS__ struct crypto_aes_ctx; -#else -/* struct crypto_aes_ctx */ -#include -#endif /* __GENKSYMS__ */ /* * These hooks exist only for the benefit of the FIPS140 crypto module, which diff --git a/include/trace/hooks/ftrace_dump.h b/include/trace/hooks/ftrace_dump.h index b63d9c809426..0594e8bee2e2 100644 --- a/include/trace/hooks/ftrace_dump.h +++ b/include/trace/hooks/ftrace_dump.h @@ -6,11 +6,14 @@ #if !defined(_TRACE_HOOK_FTRACE_DUMP_H) || defined(TRACE_HEADER_MULTI_READ) #define _TRACE_HOOK_FTRACE_DUMP_H +#include +#ifdef __GENKSYMS__ #include #include +#endif -#include +struct trace_seq; DECLARE_HOOK(android_vh_ftrace_oops_enter, TP_PROTO(bool *ftrace_check), diff --git a/include/trace/hooks/gic_v3.h b/include/trace/hooks/gic_v3.h index 8db98581eebc..647514f8d7a4 100644 --- a/include/trace/hooks/gic_v3.h +++ b/include/trace/hooks/gic_v3.h @@ -9,15 +9,9 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct cpumask; struct irq_data; -#else -/* struct cpumask */ -#include -/* struct irq_data */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_gic_v3_affinity_init, TP_PROTO(int irq, u32 offset, u64 *affinity), TP_ARGS(irq, offset, affinity)); diff --git a/include/trace/hooks/gpiolib.h b/include/trace/hooks/gpiolib.h index 24cb3f54fb82..20115981de55 100644 --- a/include/trace/hooks/gpiolib.h +++ b/include/trace/hooks/gpiolib.h @@ -8,15 +8,16 @@ #define _TRACE_HOOK_GPIOLIB_H #include -#include "../drivers/gpio/gpiolib.h" -#if defined(CONFIG_TRACEPOINTS) && defined(CONFIG_ANDROID_VENDOR_HOOKS) +#ifdef __GENKSYMS__ +#include "../drivers/gpio/gpiolib.h" +#endif + +struct gpio_device; + DECLARE_HOOK(android_vh_gpio_block_read, TP_PROTO(struct gpio_device *gdev, bool *block_gpio_read), TP_ARGS(gdev, block_gpio_read)); -#else -#define trace_android_vh_gpio_block_read(gdev, block_gpio_read) -#endif #endif /* _TRACE_HOOK_GPIOLIB_H */ /* This part must be outside protection */ diff --git a/include/trace/hooks/gup.h b/include/trace/hooks/gup.h index 3135cd538a92..47ea47eeede4 100644 --- a/include/trace/hooks/gup.h +++ b/include/trace/hooks/gup.h @@ -7,12 +7,7 @@ #define _TRACE_HOOK_GUP_H #include -#ifdef __GENKSYMS__ struct page; -#else -/* struct page */ -#include -#endif /* __GENKSYMS__ */ DECLARE_HOOK(android_vh_try_grab_compound_head, TP_PROTO(struct page *page, int refs, unsigned int flags, bool *ret), diff --git a/include/trace/hooks/iommu.h b/include/trace/hooks/iommu.h index 6c30cb7932fa..c09f1a4bf65a 100644 --- a/include/trace/hooks/iommu.h +++ b/include/trace/hooks/iommu.h @@ -11,7 +11,6 @@ #include -#if defined(CONFIG_TRACEPOINTS) && defined(CONFIG_ANDROID_VENDOR_HOOKS) DECLARE_RESTRICTED_HOOK(android_rvh_iommu_setup_dma_ops, TP_PROTO(struct device *dev, u64 dma_base, u64 size), TP_ARGS(dev, dma_base, size), 1); @@ -23,13 +22,6 @@ DECLARE_HOOK(android_vh_iommu_alloc_iova, DECLARE_HOOK(android_vh_iommu_free_iova, TP_PROTO(dma_addr_t iova, size_t size), TP_ARGS(iova, size)); -#else - -#define trace_android_rvh_iommu_setup_dma_ops(dev, dma_base, size) -#define trace_android_vh_iommu_alloc_iova(dev, iova, size) -#define trace_android_vh_iommu_free_iova(iova, size) - -#endif #endif /* _TRACE_HOOK_IOMMU_H */ diff --git a/include/trace/hooks/logbuf.h b/include/trace/hooks/logbuf.h index caec0d062476..c5ad3ba85174 100644 --- a/include/trace/hooks/logbuf.h +++ b/include/trace/hooks/logbuf.h @@ -9,13 +9,8 @@ #include -#ifdef __GENKSYMS__ struct printk_record; struct printk_ringbuffer; -#else -/* struct printk_record, struct printk_ringbuffer */ -#include <../kernel/printk/printk_ringbuffer.h> -#endif /* __GENKSYMS__ */ DECLARE_HOOK(android_vh_logbuf, TP_PROTO(struct printk_ringbuffer *rb, struct printk_record *r), diff --git a/include/trace/hooks/mm.h b/include/trace/hooks/mm.h index 9e8f234545b1..263b867d453c 100644 --- a/include/trace/hooks/mm.h +++ b/include/trace/hooks/mm.h @@ -8,32 +8,23 @@ #define _TRACE_HOOK_MM_H #include - -#include -#include #include #ifdef __GENKSYMS__ +#include +#include +#endif + +struct oom_control; struct cma; struct acr_info; struct compact_control; struct slabinfo; struct cgroup_subsys_state; struct mem_cgroup; -#else -/* struct compact_control */ -#include <../mm/internal.h> -/* struct slabinfo */ -#include <../mm/slab.h> -/* struct cgroup_subsys_state */ -#include -/* struct acr_info */ -#include -/* struct mem_cgroup */ -#include -#endif /* __GENKSYMS__ */ struct cma; struct acr_info; +struct vm_unmapped_area_info; DECLARE_RESTRICTED_HOOK(android_rvh_set_skip_swapcache_flags, TP_PROTO(gfp_t *flags), diff --git a/include/trace/hooks/mmc_core.h b/include/trace/hooks/mmc_core.h index 1889cc54a2b3..c59b4accc9fd 100644 --- a/include/trace/hooks/mmc_core.h +++ b/include/trace/hooks/mmc_core.h @@ -9,18 +9,9 @@ #include -#ifdef __GENKSYMS__ struct sdhci_host; struct mmc_card; struct mmc_host; -#else -/* struct sdhci_host */ -#include <../drivers/mmc/host/sdhci.h> -/* struct mmc_card */ -#include -/* struct mmc_host */ -#include -#endif /* __GENKSYMS__ */ DECLARE_HOOK(android_vh_mmc_blk_reset, TP_PROTO(struct mmc_host *host, int err, bool *allow), diff --git a/include/trace/hooks/mpam.h b/include/trace/hooks/mpam.h index f7f5e468bcef..06b96b1309f8 100644 --- a/include/trace/hooks/mpam.h +++ b/include/trace/hooks/mpam.h @@ -10,12 +10,8 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct task_struct; -#else -/* struct task_struct */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_mpam_set, TP_PROTO(struct task_struct *prev, struct task_struct *next), TP_ARGS(prev, next)); diff --git a/include/trace/hooks/net.h b/include/trace/hooks/net.h index 97f15ba6ae3c..4fcd632b2f96 100644 --- a/include/trace/hooks/net.h +++ b/include/trace/hooks/net.h @@ -8,24 +8,12 @@ #define _TRACE_HOOK_NET_VH_H #include -#ifdef __GENKSYMS__ struct packet_type; struct sk_buff; struct list_head; struct nf_conn; struct sock; -#else -/* struct packet_type */ -#include -/* struct sk_buff */ -#include -/* struct list_head */ -#include -/* struct nf_conn */ -#include -/* struct sock */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_ptype_head, TP_PROTO(const struct packet_type *pt, struct list_head *vendor_pt), TP_ARGS(pt, vendor_pt)); diff --git a/include/trace/hooks/pci.h b/include/trace/hooks/pci.h index 00d38980ec49..40255448c83c 100644 --- a/include/trace/hooks/pci.h +++ b/include/trace/hooks/pci.h @@ -6,6 +6,9 @@ #if !defined(_TRACE_HOOK_PCI_H) || defined(TRACE_HEADER_MULTI_READ) #define _TRACE_HOOK_PCI_H #include + +struct pci_dev; + /* * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality diff --git a/include/trace/hooks/pm_domain.h b/include/trace/hooks/pm_domain.h index 1a8ce26ccc3d..eaee85b9c00c 100644 --- a/include/trace/hooks/pm_domain.h +++ b/include/trace/hooks/pm_domain.h @@ -10,12 +10,8 @@ #include -#ifdef __GENKSYMS__ struct generic_pm_domain; -#else -/* struct generic_pm_domain */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_allow_domain_state, TP_PROTO(struct generic_pm_domain *genpd, uint32_t idx, bool *allow), TP_ARGS(genpd, idx, allow)) diff --git a/include/trace/hooks/power.h b/include/trace/hooks/power.h index 3c735b7a5abd..f9b7bbec1531 100644 --- a/include/trace/hooks/power.h +++ b/include/trace/hooks/power.h @@ -10,17 +10,14 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ -enum freq_qos_req_type; + +/* needed for enum freq_qos_req_types */ +#include + struct freq_constraints; struct freq_qos_request; struct task_struct; -#else -/* enum freq_qos_req_type, struct freq_constraints, struct freq_qos_request */ -#include -/* struct task_struct */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_try_to_freeze_todo, TP_PROTO(unsigned int todo, unsigned int elapsed_msecs, bool wq_busy), TP_ARGS(todo, elapsed_msecs, wq_busy)); diff --git a/include/trace/hooks/psi.h b/include/trace/hooks/psi.h index ffda9543357e..deeb3dfbeeb0 100644 --- a/include/trace/hooks/psi.h +++ b/include/trace/hooks/psi.h @@ -9,15 +9,9 @@ #include -#if defined(CONFIG_TRACEPOINTS) && defined(CONFIG_ANDROID_VENDOR_HOOKS) - -#ifdef __GENKSYMS__ struct psi_group; struct psi_trigger; -#else -/* struct psi_group, struct psi_trigger */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_psi_event, TP_PROTO(struct psi_trigger *t), TP_ARGS(t)); @@ -26,11 +20,6 @@ DECLARE_HOOK(android_vh_psi_group, TP_PROTO(struct psi_group *group), TP_ARGS(group)); -#else -#define trace_android_vh_psi_event(t) -#define trace_android_vh_psi_group(group) -#endif - #endif /* _TRACE_HOOK_PSI_H */ /* This part must be outside protection */ diff --git a/include/trace/hooks/remoteproc.h b/include/trace/hooks/remoteproc.h index 4d3311b1fee4..ee0a2f0ea147 100644 --- a/include/trace/hooks/remoteproc.h +++ b/include/trace/hooks/remoteproc.h @@ -9,12 +9,7 @@ #include -#ifdef __GENKSYMS__ struct rproc; -#else -/* struct rproc */ -#include -#endif /* __GENKSYMS__ */ DECLARE_HOOK(android_vh_rproc_recovery, TP_PROTO(struct rproc *rproc), diff --git a/include/trace/hooks/rwsem.h b/include/trace/hooks/rwsem.h index 3d6877f166ed..e3fd21729eee 100644 --- a/include/trace/hooks/rwsem.h +++ b/include/trace/hooks/rwsem.h @@ -9,13 +9,9 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct rw_semaphore; struct rwsem_waiter; -#else -/* struct rw_semaphore, struct rwsem_waiter */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_rwsem_init, TP_PROTO(struct rw_semaphore *sem), TP_ARGS(sem)); diff --git a/include/trace/hooks/sched.h b/include/trace/hooks/sched.h index 3a8eee2345af..4233384f6ff8 100644 --- a/include/trace/hooks/sched.h +++ b/include/trace/hooks/sched.h @@ -9,7 +9,6 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct cgroup_taskset; struct cgroup_subsys_state; struct cpufreq_policy; @@ -18,20 +17,7 @@ enum uclamp_id; struct sched_entity; struct task_struct; struct uclamp_se; -#else -/* Including ../kernel/cgroup/cgroup-internal.h breaks builds. */ -struct cgroup_taskset; -/* struct cgroup_subsys_state */ -#include -/* struct cpufreq_policy */ -#include -/* struct em_perf_domain */ -#include -/* enum uclamp_id, struct sched_entity, struct task_struct, struct uclamp_se */ -#include -/* Only defined with CONFIG_UCLAMP_TASK, so declare unconditionally. */ -struct uclamp_se; -#endif /* __GENKSYMS__ */ + DECLARE_RESTRICTED_HOOK(android_rvh_select_task_rq_fair, TP_PROTO(struct task_struct *p, int prev_cpu, int sd_flag, int wake_flags, int *new_cpu), TP_ARGS(p, prev_cpu, sd_flag, wake_flags, new_cpu), 1); @@ -406,6 +392,10 @@ DECLARE_HOOK(android_vh_pidfd_open, DECLARE_HOOK(android_vh_mmput, TP_PROTO(void *unused), TP_ARGS(unused)); + +DECLARE_HOOK(android_vh_rebuild_root_domains_bypass, + TP_PROTO(bool tasks_frozen, bool *bypass), + TP_ARGS(tasks_frozen, bypass)); /* macro versions of hooks are no longer required */ #endif /* _TRACE_HOOK_SCHED_H */ diff --git a/include/trace/hooks/shmem_fs.h b/include/trace/hooks/shmem_fs.h index adfd05825928..29c45d1e0571 100644 --- a/include/trace/hooks/shmem_fs.h +++ b/include/trace/hooks/shmem_fs.h @@ -7,12 +7,8 @@ #define _TRACE_HOOK_SHMEM_FS_H #include -#ifdef __GENKSYMS__ struct page; -#else -/* struct page */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_shmem_alloc_page, TP_PROTO(struct page **page), TP_ARGS(page)); diff --git a/include/trace/hooks/signal.h b/include/trace/hooks/signal.h index 04976ed38cc7..6338274f27c4 100644 --- a/include/trace/hooks/signal.h +++ b/include/trace/hooks/signal.h @@ -7,12 +7,8 @@ #define _TRACE_HOOK_SIGNAL_H #include -#ifdef __GENKSYMS__ struct task_struct; -#else -/* struct task_struct */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_do_send_sig_info, TP_PROTO(int sig, struct task_struct *killer, struct task_struct *dst), TP_ARGS(sig, killer, dst)); diff --git a/include/trace/hooks/softlockup.h b/include/trace/hooks/softlockup.h index d90571a3f0fc..d9806aeb5aa8 100644 --- a/include/trace/hooks/softlockup.h +++ b/include/trace/hooks/softlockup.h @@ -10,12 +10,8 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct pt_regs; -#else -/* struct pt_regs */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_watchdog_timer_softlockup, TP_PROTO(int duration, struct pt_regs *regs, bool is_panic), TP_ARGS(duration, regs, is_panic)); diff --git a/include/trace/hooks/sys.h b/include/trace/hooks/sys.h index 819a126ce0ae..a14bd4135410 100644 --- a/include/trace/hooks/sys.h +++ b/include/trace/hooks/sys.h @@ -7,12 +7,8 @@ #define _TRACE_HOOK_SYS_H #include -#ifdef __GENKSYMS__ struct task_struct; -#else -/* struct task_struct */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_syscall_prctl_finished, TP_PROTO(int option, struct task_struct *task), TP_ARGS(option, task)); diff --git a/include/trace/hooks/syscall_check.h b/include/trace/hooks/syscall_check.h index aa563ad1c510..c906ff6b8e7f 100644 --- a/include/trace/hooks/syscall_check.h +++ b/include/trace/hooks/syscall_check.h @@ -10,15 +10,9 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct file; union bpf_attr; -#else -/* struct file */ -#include -/* union bpf_attr */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_check_mmap_file, TP_PROTO(const struct file *file, unsigned long prot, unsigned long flag, unsigned long ret), diff --git a/include/trace/hooks/thermal.h b/include/trace/hooks/thermal.h index e9a9a4ae3e07..97074725fb08 100644 --- a/include/trace/hooks/thermal.h +++ b/include/trace/hooks/thermal.h @@ -10,12 +10,8 @@ #include #include -#ifdef __GENKSYMS__ struct thermal_zone_device; -#else -/* struct thermal_zone_device */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_enable_thermal_genl_check, TP_PROTO(int event, int tz_id, int *enable_thermal_genl), TP_ARGS(event, tz_id, enable_thermal_genl)); diff --git a/include/trace/hooks/topology.h b/include/trace/hooks/topology.h index 5d29893ba477..e924c97ab4d9 100644 --- a/include/trace/hooks/topology.h +++ b/include/trace/hooks/topology.h @@ -8,7 +8,12 @@ #define _TRACE_HOOK_TOPOLOGY_H #include + +#ifdef __GENKSYMS__ #include +#endif + +struct cpumask; DECLARE_HOOK(android_vh_arch_set_freq_scale, TP_PROTO(const struct cpumask *cpus, unsigned long freq, diff --git a/include/trace/hooks/traps.h b/include/trace/hooks/traps.h index 6b9b986f7a30..f0ede1e69b15 100644 --- a/include/trace/hooks/traps.h +++ b/include/trace/hooks/traps.h @@ -10,12 +10,8 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct pt_regs; -#else -/* struct pt_regs */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_RESTRICTED_HOOK(android_rvh_do_undefinstr, TP_PROTO(struct pt_regs *regs, bool user), TP_ARGS(regs, user), diff --git a/include/trace/hooks/ufshcd.h b/include/trace/hooks/ufshcd.h index 32a7f98da4c1..ad2c067f02c4 100644 --- a/include/trace/hooks/ufshcd.h +++ b/include/trace/hooks/ufshcd.h @@ -9,20 +9,11 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct ufs_hba; struct ufshcd_lrb; struct uic_command; struct request; struct scsi_device; -#else -/* struct ufs_hba, struct ufshcd_lrb, struct uic_command */ -#include <../drivers/scsi/ufs/ufshcd.h> -/* struct request */ -#include -/* struct scsi_device */ -#include -#endif /* __GENKSYMS__ */ DECLARE_HOOK(android_vh_ufs_fill_prdt, TP_PROTO(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, diff --git a/include/trace/hooks/usb.h b/include/trace/hooks/usb.h index f4d5ff04b6b8..3a22a2971c24 100644 --- a/include/trace/hooks/usb.h +++ b/include/trace/hooks/usb.h @@ -5,8 +5,14 @@ #define TRACE_INCLUDE_PATH trace/hooks #if !defined(_TRACE_HOOK_USB_H) || defined(TRACE_HEADER_MULTI_READ) #define _TRACE_HOOK_USB_H -#include #include + +#ifdef __GENKSYMS__ +#include +#endif + +struct usb_device; + /* * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality diff --git a/include/trace/hooks/user.h b/include/trace/hooks/user.h index 6a39785a52e1..1a41c12edd58 100644 --- a/include/trace/hooks/user.h +++ b/include/trace/hooks/user.h @@ -7,12 +7,8 @@ #define _TRACE_HOOK_USER_H #include -#ifdef __GENKSYMS__ struct user_struct; -#else -/* struct user_struct */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_alloc_uid, TP_PROTO(struct user_struct *user), TP_ARGS(user)); diff --git a/include/trace/hooks/v4l2core.h b/include/trace/hooks/v4l2core.h index 3dec47042a86..e209621cd66c 100644 --- a/include/trace/hooks/v4l2core.h +++ b/include/trace/hooks/v4l2core.h @@ -9,7 +9,6 @@ #include -#ifdef __GENKSYMS__ struct v4l2_subdev; struct v4l2_subdev_pad_config; struct v4l2_subdev_format; @@ -17,14 +16,7 @@ struct v4l2_subdev_frame_interval; struct v4l2_subdev_selection; struct v4l2_fmtdesc; struct v4l2_format; -#else -/* struct v4l2_subdev, struct v4l2_subdev_pad_config */ -#include -/* struct v4l2_subdev_format, struct v4l2_subdev_frame_interval, struct v4l2_subdev_selection */ -#include -/* struct v4l2_fmtdesc, struct v4l2_format */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_clear_reserved_fmt_fields, TP_PROTO(struct v4l2_format *fmt, int *ret), TP_ARGS(fmt, ret)); diff --git a/include/trace/hooks/v4l2mc.h b/include/trace/hooks/v4l2mc.h index 332a3a09680d..cafc74f14e9b 100644 --- a/include/trace/hooks/v4l2mc.h +++ b/include/trace/hooks/v4l2mc.h @@ -9,15 +9,9 @@ #include -#ifdef __GENKSYMS__ struct media_link; struct media_link_desc; -#else -/* struct media_link */ -#include -/* struct media_link_desc */ -#include -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_media_device_setup_link, TP_PROTO(struct media_link *link, struct media_link_desc *linkd, int *ret), TP_ARGS(link, linkd, ret)); diff --git a/include/trace/hooks/workqueue.h b/include/trace/hooks/workqueue.h index 3d6d0d61040d..284b3ff86fa8 100644 --- a/include/trace/hooks/workqueue.h +++ b/include/trace/hooks/workqueue.h @@ -10,12 +10,8 @@ * Following tracepoints are not exported in tracefs and provide a * mechanism for vendor modules to hook and extend functionality */ -#ifdef __GENKSYMS__ struct worker; -#else -/* struct worker */ -#include <../kernel/workqueue_internal.h> -#endif /* __GENKSYMS__ */ + DECLARE_HOOK(android_vh_create_worker, TP_PROTO(struct worker *worker, struct workqueue_attrs *attrs), TP_ARGS(worker, attrs)); diff --git a/include/trace/hooks/wqlockup.h b/include/trace/hooks/wqlockup.h deleted file mode 100644 index 2572ebf5eff4..000000000000 --- a/include/trace/hooks/wqlockup.h +++ /dev/null @@ -1,21 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#undef TRACE_SYSTEM -#define TRACE_SYSTEM wqlockup -#define TRACE_INCLUDE_PATH trace/hooks - -#if !defined(_TRACE_HOOK_WQLOCKUP_H) || defined(TRACE_HEADER_MULTI_READ) -#define _TRACE_HOOK_WQLOCKUP_H -#include -/* - * Following tracepoints are not exported in tracefs and provide a - * mechanism for vendor modules to hook and extend functionality - */ -DECLARE_HOOK(android_vh_wq_lockup_pool, - TP_PROTO(int cpu, unsigned long pool_ts), - TP_ARGS(cpu, pool_ts)); - -/* macro versions of hooks are no longer required */ - -#endif /* _TRACE_HOOK_WQLOCKUP_H */ -/* This part must be outside protection */ -#include diff --git a/kernel/cgroup/Makefile b/kernel/cgroup/Makefile index 5d7a76bfbbb7..c8bc5cbe1d45 100644 --- a/kernel/cgroup/Makefile +++ b/kernel/cgroup/Makefile @@ -6,3 +6,4 @@ obj-$(CONFIG_CGROUP_PIDS) += pids.o obj-$(CONFIG_CGROUP_RDMA) += rdma.o obj-$(CONFIG_CPUSETS) += cpuset.o obj-$(CONFIG_CGROUP_DEBUG) += debug.o +obj-$(CONFIG_ANDROID_VENDOR_HOOKS) += vendor_hooks.o diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index 3a0204d880db..76440c9e545b 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -941,6 +941,12 @@ static void rebuild_root_domains(void) { struct cpuset *cs = NULL; struct cgroup_subsys_state *pos_css; + bool bypass = false; + + trace_android_vh_rebuild_root_domains_bypass(cpuhp_tasks_frozen, &bypass); + + if (bypass) + return; lockdep_assert_held(&cpuset_mutex); lockdep_assert_cpus_held(); diff --git a/kernel/cgroup/vendor_hooks.c b/kernel/cgroup/vendor_hooks.c new file mode 100644 index 000000000000..95f7e3410d7d --- /dev/null +++ b/kernel/cgroup/vendor_hooks.c @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* vendor_hook.c + * + * Android Vendor Hook Support + * + * Copyright 2022 Google LLC + */ +#ifndef __GENKSYMS__ +#include "cgroup-internal.h" +#else +/* + * Needed to preserve CRC for cgroup-related hooks + */ +#include +#include <../drivers/gpio/gpiolib.h> +#endif + +#define CREATE_TRACE_POINTS +#include +#include +#include + +/* + * Export tracepoints that act as a bare tracehook (ie: have no trace event + * associated with them) to allow external modules to probe them. + */ +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cgroup_set_task); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cpuset_fork); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_cgroup_force_kthread_migration); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_refrigerator); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cgroup_attach); + +/* + * For type visibility + */ +const struct cgroup_taskset *GKI_struct_cgroup_taskset; +EXPORT_SYMBOL_GPL(GKI_struct_cgroup_taskset); diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 731e79844739..e4c5dcf91033 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c @@ -440,7 +440,6 @@ static int suspend_enter(suspend_state_t state, bool *wakeup) BUG_ON(!irqs_disabled()); system_state = SYSTEM_SUSPEND; - trace_android_vh_early_resume_begin(NULL); error = syscore_suspend(); if (!error) { *wakeup = pm_wakeup_pending(); @@ -450,6 +449,7 @@ static int suspend_enter(suspend_state_t state, bool *wakeup) error = suspend_ops->enter(state); trace_suspend_resume(TPS("machine_suspend"), state, false); + trace_android_vh_early_resume_begin(NULL); } else if (*wakeup) { error = -EBUSY; } diff --git a/kernel/sched/cpupri.c b/kernel/sched/cpupri.c index 450a724b4542..2896860c8333 100644 --- a/kernel/sched/cpupri.c +++ b/kernel/sched/cpupri.c @@ -150,7 +150,7 @@ int cpupri_find_fitness(struct cpupri *cp, struct task_struct *p, { int task_pri = convert_prio(p->prio); int idx, cpu; - bool drop_nopreempts = task_pri <= MAX_RT_PRIO; + bool drop_nopreempts = task_pri <= MAX_RT_PRIO + 1; BUG_ON(task_pri >= CPUPRI_NR_PRIORITIES); diff --git a/kernel/watch_queue.c b/kernel/watch_queue.c index e3f144d96026..0d9f302a1bbe 100644 --- a/kernel/watch_queue.c +++ b/kernel/watch_queue.c @@ -34,6 +34,27 @@ MODULE_LICENSE("GPL"); #define WATCH_QUEUE_NOTE_SIZE 128 #define WATCH_QUEUE_NOTES_PER_PAGE (PAGE_SIZE / WATCH_QUEUE_NOTE_SIZE) +/* + * This must be called under the RCU read-lock, which makes + * sure that the wqueue still exists. It can then take the lock, + * and check that the wqueue hasn't been destroyed, which in + * turn makes sure that the notification pipe still exists. + */ +static inline bool lock_wqueue(struct watch_queue *wqueue) +{ + spin_lock_bh(&wqueue->lock); + if (unlikely(wqueue->defunct)) { + spin_unlock_bh(&wqueue->lock); + return false; + } + return true; +} + +static inline void unlock_wqueue(struct watch_queue *wqueue) +{ + spin_unlock_bh(&wqueue->lock); +} + static void watch_queue_pipe_buf_release(struct pipe_inode_info *pipe, struct pipe_buffer *buf) { @@ -69,6 +90,10 @@ static const struct pipe_buf_operations watch_queue_pipe_buf_ops = { /* * Post a notification to a watch queue. + * + * Must be called with the RCU lock for reading, and the + * watch_queue lock held, which guarantees that the pipe + * hasn't been released. */ static bool post_one_notification(struct watch_queue *wqueue, struct watch_notification *n) @@ -85,9 +110,6 @@ static bool post_one_notification(struct watch_queue *wqueue, spin_lock_irq(&pipe->rd_wait.lock); - if (wqueue->defunct) - goto out; - mask = pipe->ring_size - 1; head = pipe->head; tail = pipe->tail; @@ -203,7 +225,10 @@ void __post_watch_notification(struct watch_list *wlist, if (security_post_notification(watch->cred, cred, n) < 0) continue; - post_one_notification(wqueue, n); + if (lock_wqueue(wqueue)) { + post_one_notification(wqueue, n); + unlock_wqueue(wqueue);; + } } rcu_read_unlock(); @@ -463,11 +488,12 @@ int add_watch_to_object(struct watch *watch, struct watch_list *wlist) return -EAGAIN; } - spin_lock_bh(&wqueue->lock); - kref_get(&wqueue->usage); - kref_get(&watch->usage); - hlist_add_head(&watch->queue_node, &wqueue->watches); - spin_unlock_bh(&wqueue->lock); + if (lock_wqueue(wqueue)) { + kref_get(&wqueue->usage); + kref_get(&watch->usage); + hlist_add_head(&watch->queue_node, &wqueue->watches); + unlock_wqueue(wqueue); + } hlist_add_head(&watch->list_node, &wlist->watchers); return 0; @@ -521,20 +547,15 @@ found: wqueue = rcu_dereference(watch->queue); - /* We don't need the watch list lock for the next bit as RCU is - * protecting *wqueue from deallocation. - */ - if (wqueue) { + if (lock_wqueue(wqueue)) { post_one_notification(wqueue, &n.watch); - spin_lock_bh(&wqueue->lock); - if (!hlist_unhashed(&watch->queue_node)) { hlist_del_init_rcu(&watch->queue_node); put_watch(watch); } - spin_unlock_bh(&wqueue->lock); + unlock_wqueue(wqueue); } if (wlist->release_watch) { diff --git a/kernel/workqueue.c b/kernel/workqueue.c index b7823624f9ed..058feadd469f 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -55,7 +55,6 @@ #include "workqueue_internal.h" -#include #include /* events/workqueue.h uses default TRACE_INCLUDE_PATH */ #undef TRACE_INCLUDE_PATH @@ -5855,7 +5854,6 @@ static void wq_watchdog_timer_fn(struct timer_list *unused) pr_cont_pool_info(pool); pr_cont(" stuck for %us!\n", jiffies_to_msecs(now - pool_ts) / 1000); - trace_android_vh_wq_lockup_pool(pool->cpu, pool_ts); } } diff --git a/net/core/net-traces.c b/net/core/net-traces.c index 465362a9b55d..42f242394135 100644 --- a/net/core/net-traces.c +++ b/net/core/net-traces.c @@ -54,6 +54,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(neigh_event_send_dead); EXPORT_TRACEPOINT_SYMBOL_GPL(neigh_cleanup_and_release); EXPORT_TRACEPOINT_SYMBOL_GPL(kfree_skb); +EXPORT_TRACEPOINT_SYMBOL_GPL(consume_skb); EXPORT_TRACEPOINT_SYMBOL_GPL(napi_poll); diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c index 78acc4e9ac93..b8939ebaa6d3 100644 --- a/net/nfc/netlink.c +++ b/net/nfc/netlink.c @@ -1244,7 +1244,7 @@ int nfc_genl_fw_download_done(struct nfc_dev *dev, const char *firmware_name, struct sk_buff *msg; void *hdr; - msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); + msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); if (!msg) return -ENOMEM; @@ -1260,7 +1260,7 @@ int nfc_genl_fw_download_done(struct nfc_dev *dev, const char *firmware_name, genlmsg_end(msg, hdr); - genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); + genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC); return 0; diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index ce854cfac2fe..b2402c962807 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -414,20 +414,31 @@ printf "%08x\n" $$dec_size | \ ) quiet_cmd_bzip2 = BZIP2 $@ - cmd_bzip2 = { cat $(real-prereqs) | $(KBZIP2) -9; $(size_append); } > $@ + cmd_bzip2 = cat $(real-prereqs) | $(KBZIP2) -9 > $@ + +quiet_cmd_bzip2_with_size = BZIP2 $@ + cmd_bzip2_with_size = { cat $(real-prereqs) | $(KBZIP2) -9; $(size_append); } > $@ # Lzma # --------------------------------------------------------------------------- quiet_cmd_lzma = LZMA $@ - cmd_lzma = { cat $(real-prereqs) | $(LZMA) -9; $(size_append); } > $@ + cmd_lzma = cat $(real-prereqs) | $(LZMA) -9 > $@ + +quiet_cmd_lzma_with_size = LZMA $@ + cmd_lzma_with_size = { cat $(real-prereqs) | $(LZMA) -9; $(size_append); } > $@ quiet_cmd_lzo = LZO $@ - cmd_lzo = { cat $(real-prereqs) | $(KLZOP) -9; $(size_append); } > $@ + cmd_lzo = cat $(real-prereqs) | $(KLZOP) -9 > $@ + +quiet_cmd_lzo_with_size = LZO $@ + cmd_lzo_with_size = { cat $(real-prereqs) | $(KLZOP) -9; $(size_append); } > $@ quiet_cmd_lz4 = LZ4 $@ - cmd_lz4 = { cat $(real-prereqs) | \ - $(LZ4) -l -12 --favor-decSpeed stdin stdout; \ + cmd_lz4 = cat $(real-prereqs) | $(LZ4) -l -12 --favor-decSpeed stdin stdout > $@ + +quiet_cmd_lz4_with_size = LZ4 $@ + cmd_lz4_with_size = { cat $(real-prereqs) | $(LZ4) -l -12 --favor-decSpeed stdin stdout; \ $(size_append); } > $@ quiet_cmd_lz4c = LZ4C $@ @@ -475,7 +486,10 @@ quiet_cmd_uimage = UIMAGE $@ # big dictionary would increase the memory usage too much in the multi-call # decompression mode. A BCJ filter isn't used either. quiet_cmd_xzkern = XZKERN $@ - cmd_xzkern = { cat $(real-prereqs) | sh $(srctree)/scripts/xz_wrap.sh; \ + cmd_xzkern = cat $(real-prereqs) | sh $(srctree)/scripts/xz_wrap.sh > $@ + +quiet_cmd_xzkern_with_size = XZKERN $@ + cmd_xzkern_with_size = { cat $(real-prereqs) | sh $(srctree)/scripts/xz_wrap.sh; \ $(size_append); } > $@ quiet_cmd_xzmisc = XZMISC $@ @@ -501,7 +515,10 @@ quiet_cmd_zstd = ZSTD $@ cmd_zstd = { cat $(real-prereqs) | $(ZSTD) -19; $(size_append); } > $@ quiet_cmd_zstd22 = ZSTD22 $@ - cmd_zstd22 = { cat $(real-prereqs) | $(ZSTD) -22 --ultra; $(size_append); } > $@ + cmd_zstd22 = cat $(real-prereqs) | $(ZSTD) -22 --ultra > $@ + +quiet_cmd_zstd22_with_size = ZSTD22 $@ + cmd_zstd22_with_size = { cat $(real-prereqs) | $(ZSTD) -22 --ultra; $(size_append); } > $@ # ASM offsets # --------------------------------------------------------------------------- diff --git a/tools/testing/selftests/filesystems/fuse/fuse_test.c b/tools/testing/selftests/filesystems/fuse/fuse_test.c index 58a0dd587fec..461b79656973 100644 --- a/tools/testing/selftests/filesystems/fuse/fuse_test.c +++ b/tools/testing/selftests/filesystems/fuse/fuse_test.c @@ -1911,7 +1911,117 @@ out: return result; } -static int parse_options(int argc, char *const *argv) +static int bpf_test_lookup_postfilter(const char *mount_dir) +{ + const char *file1_name = "file1"; + const char *file2_name = "file2"; + const char *file3_name = "file3"; + int result = TEST_FAILURE; + int bpf_fd = -1; + int src_fd = -1; + int fuse_dev = -1; + int file_fd = -1; + int pid = -1; + int status; + + TEST(file_fd = s_creat(s_path(s(ft_src), s(file1_name)), 0777), + file_fd != -1); + TESTSYSCALL(close(file_fd)); + TEST(file_fd = s_creat(s_path(s(ft_src), s(file2_name)), 0777), + file_fd != -1); + TESTSYSCALL(close(file_fd)); + file_fd = -1; + TESTEQUAL(install_elf_bpf("test_bpf.bpf", "test_lookup_postfilter", + &bpf_fd, NULL, NULL), 0); + TEST(src_fd = open(ft_src, O_DIRECTORY | O_RDONLY | O_CLOEXEC), + src_fd != -1); + TESTEQUAL(mount_fuse(mount_dir, bpf_fd, src_fd, &fuse_dev), 0); + FUSE_ACTION + int fd = -1; + + TESTEQUAL(s_open(s_path(s(mount_dir), s(file1_name)), O_RDONLY), + -1); + TESTEQUAL(errno, ENOENT); + TEST(fd = s_open(s_path(s(mount_dir), s(file2_name)), O_RDONLY), + fd != -1); + TESTSYSCALL(close(fd)); + TESTEQUAL(s_open(s_path(s(mount_dir), s(file3_name)), O_RDONLY), + -1); + FUSE_DAEMON + struct fuse_in_header *in_header = + (struct fuse_in_header *)bytes_in; + struct fuse_entry_out *feo; + struct fuse_entry_bpf_out *febo; + + TESTFUSELOOKUP(file1_name, FUSE_POSTFILTER); + TESTFUSEOUTERROR(-ENOENT); + + TESTFUSELOOKUP(file2_name, FUSE_POSTFILTER); + feo = (struct fuse_entry_out *) (bytes_in + + sizeof(struct fuse_in_header) + strlen(file2_name) + 1); + febo = (struct fuse_entry_bpf_out *) ((char *)feo + + sizeof(*feo)); + TESTFUSEOUT2(fuse_entry_out, *feo, fuse_entry_bpf_out, *febo); + + TESTFUSELOOKUP(file3_name, FUSE_POSTFILTER); + TESTEQUAL(in_header->error_in, -ENOENT); + TESTFUSEOUTERROR(-ENOENT); + FUSE_DONE + + result = TEST_SUCCESS; +out: + close(file_fd); + close(fuse_dev); + umount(mount_dir); + close(src_fd); + close(bpf_fd); + return result; +} + +static void parse_range(const char *ranges, bool *run_test, size_t tests) +{ + size_t i; + char *range; + + for (i = 0; i < tests; ++i) + run_test[i] = false; + + range = strtok(optarg, ","); + while (range) { + char *dash = strchr(range, '-'); + + if (dash) { + size_t start = 1, end = tests; + char *end_ptr; + + if (dash > range) { + start = strtol(range, &end_ptr, 10); + if (*end_ptr != '-' || start <= 0 || start > tests) + ksft_exit_fail_msg("Bad range\n"); + } + + if (dash[1]) { + end = strtol(dash + 1, &end_ptr, 10); + if (*end_ptr || end <= start || end > tests) + ksft_exit_fail_msg("Bad range\n"); + } + + for (i = start; i <= end; ++i) + run_test[i - 1] = true; + } else { + char *end; + long value = strtol(range, &end, 10); + + if (*end || value <= 0 || value > tests) + ksft_exit_fail_msg("Bad range\n"); + run_test[value - 1] = true; + } + range = strtok(NULL, ","); + } +} + +static int parse_options(int argc, char *const *argv, bool *run_test, + size_t tests) { signed char c; @@ -1922,7 +2032,7 @@ static int parse_options(int argc, char *const *argv) break; case 't': - test_options.test = strtol(optarg, NULL, 10); + parse_range(optarg, run_test, tests); break; case 'v': @@ -1941,7 +2051,8 @@ struct test_case { const char *name; }; -static void run_one_test(const char *mount_dir, struct test_case *test_case) +static void run_one_test(const char *mount_dir, + const struct test_case *test_case) { ksft_print_msg("Running %s\n", test_case->name); if (test_case->pfunc(mount_dir) == TEST_SUCCESS) @@ -1957,37 +2068,11 @@ int main(int argc, char *argv[]) int i; int fd, count; - if (parse_options(argc, argv)) - ksft_exit_fail_msg("Bad options\n"); - - // Seed randomness pool for testing on QEMU - // NOTE - this abuses the concept of randomness - do *not* ever do this - // on a machine for production use - the device will think it has good - // randomness when it does not. - fd = open("/dev/urandom", O_WRONLY | O_CLOEXEC); - count = 4096; - for (int i = 0; i < 128; ++i) - ioctl(fd, RNDADDTOENTCNT, &count); - close(fd); - - ksft_print_header(); - - if (geteuid() != 0) - ksft_print_msg("Not a root, might fail to mount.\n"); - - if (tracing_on() != TEST_SUCCESS) - ksft_exit_fail_msg("Can't turn on tracing\n"); - - src_dir = setup_mount_dir(ft_src); - mount_dir = setup_mount_dir(ft_dst); - if (src_dir == NULL || mount_dir == NULL) - ksft_exit_fail_msg("Can't create a mount dir\n"); - #define MAKE_TEST(test) \ { \ test, #test \ } - struct test_case cases[] = { + const struct test_case cases[] = { MAKE_TEST(basic_test), MAKE_TEST(bpf_test_real), MAKE_TEST(bpf_test_partial), @@ -2017,27 +2102,51 @@ int main(int argc, char *argv[]) MAKE_TEST(bpf_test_lseek), MAKE_TEST(bpf_test_readdirplus_not_overriding_backing), MAKE_TEST(bpf_test_no_readdirplus_without_nodeid), - MAKE_TEST(bpf_test_revalidate_handle_backing_fd) + MAKE_TEST(bpf_test_revalidate_handle_backing_fd), + MAKE_TEST(bpf_test_lookup_postfilter), }; #undef MAKE_TEST - if (test_options.test) { - if (test_options.test <= 0 || - test_options.test > ARRAY_SIZE(cases)) - ksft_exit_fail_msg("Invalid test\n"); + bool run_test[ARRAY_SIZE(cases)]; - ksft_set_plan(1); - delete_dir_tree(mount_dir, false); - delete_dir_tree(src_dir, false); - run_one_test(mount_dir, &cases[test_options.test - 1]); - } else { - ksft_set_plan(ARRAY_SIZE(cases)); - for (i = 0; i < ARRAY_SIZE(cases); ++i) { + for (int i = 0; i < ARRAY_SIZE(cases); ++i) + run_test[i] = true; + + if (parse_options(argc, argv, run_test, ARRAY_SIZE(cases))) + ksft_exit_fail_msg("Bad options\n"); + + // Seed randomness pool for testing on QEMU + // NOTE - this abuses the concept of randomness - do *not* ever do this + // on a machine for production use - the device will think it has good + // randomness when it does not. + fd = open("/dev/urandom", O_WRONLY | O_CLOEXEC); + count = 4096; + for (int i = 0; i < 128; ++i) + ioctl(fd, RNDADDTOENTCNT, &count); + close(fd); + + ksft_print_header(); + + if (geteuid() != 0) + ksft_print_msg("Not a root, might fail to mount.\n"); + + if (tracing_on() != TEST_SUCCESS) + ksft_exit_fail_msg("Can't turn on tracing\n"); + + src_dir = setup_mount_dir(ft_src); + mount_dir = setup_mount_dir(ft_dst); + if (src_dir == NULL || mount_dir == NULL) + ksft_exit_fail_msg("Can't create a mount dir\n"); + + ksft_set_plan(ARRAY_SIZE(run_test)); + + for (i = 0; i < ARRAY_SIZE(run_test); ++i) + if (run_test[i]) { delete_dir_tree(mount_dir, false); delete_dir_tree(src_dir, false); run_one_test(mount_dir, &cases[i]); - } - } + } else + ksft_cnt.ksft_xskip++; umount2(mount_dir, MNT_FORCE); delete_dir_tree(mount_dir, true); diff --git a/tools/testing/selftests/filesystems/fuse/test_bpf.c b/tools/testing/selftests/filesystems/fuse/test_bpf.c index 472a02aef5b5..b47445735ab6 100644 --- a/tools/testing/selftests/filesystems/fuse/test_bpf.c +++ b/tools/testing/selftests/filesystems/fuse/test_bpf.c @@ -524,3 +524,16 @@ int readdirplus_test(struct fuse_bpf_args *fa) } return FUSE_BPF_BACKING; } + +SEC("test_lookup_postfilter") +int lookuppostfilter_test(struct fuse_bpf_args *fa) +{ + switch(fa->opcode) { + case FUSE_LOOKUP | FUSE_PREFILTER: + return FUSE_BPF_BACKING | FUSE_BPF_POST_FILTER; + case FUSE_LOOKUP | FUSE_POSTFILTER: + return FUSE_BPF_USER_FILTER; + default: + return FUSE_BPF_BACKING; + } +} diff --git a/tools/testing/selftests/filesystems/fuse/test_framework.h b/tools/testing/selftests/filesystems/fuse/test_framework.h index 945f141e9a66..7e832e901d50 100644 --- a/tools/testing/selftests/filesystems/fuse/test_framework.h +++ b/tools/testing/selftests/filesystems/fuse/test_framework.h @@ -40,7 +40,6 @@ static int test_case_fail; struct _test_options { int file; - int test; bool verbose; }; diff --git a/usr/Makefile b/usr/Makefile index b1a81a40eab1..7b89c0175a3a 100644 --- a/usr/Makefile +++ b/usr/Makefile @@ -3,11 +3,6 @@ # kbuild file for usr/ - including initramfs image # -# cmd_bzip2, cmd_lzma, cmd_lzo, cmd_lz4 from scripts/Makefile.lib appends the -# size at the end of the compressed file, which unfortunately does not work -# with unpack_to_rootfs(). Make size_append no-op. -override size_append := : - compress-y := shipped compress-$(CONFIG_INITRAMFS_COMPRESSION_GZIP) := gzip compress-$(CONFIG_INITRAMFS_COMPRESSION_BZIP2) := bzip2