This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "".
The branch, api-next has been updated discards 8511e88c69f5bf7cd251875610370aa334878788 (commit) discards 898d834f8c7164e4ee1a99fbe9115b3c7ca5bd67 (commit) discards 42fd89a1ee51a2535192650a8cffc05c32b0da12 (commit) discards c3a6bf82fa3b2cb742eb33ff66096f6f79be2c32 (commit) discards a9402619bd06f1e1ac9ada694484a104fcfff7d5 (commit) discards 6f9209f69f69ba8cfe51ff440f978b7d82d13245 (commit) discards d24149493d8733fc898fabbd718492717ad0e498 (commit) discards 5de83b54f16d8078b306f4e89e299154eb5972a2 (commit) discards 7d46bfe20a88358546859078cb7d09a1ff49fb6f (commit) discards 4a8039c26c7cc5aaa9b4485315879fba8fadacf7 (commit) discards 51254145370423631b3ac778865e06be2e418141 (commit) discards fa2fb9f553142adaa7526069ce3070814f915c32 (commit) discards 64991d2a01c36513e8c1a9518da9a56cb9f32594 (commit) discards efb3dc0e6524b32442dc50f5ced9ce1f1d6fd948 (commit) discards 02b60f6739a3980cab9cd1afca5dcc1fedd84a1e (commit) discards 406dc695c3fc756bac6ecef3c7d67348699e7a25 (commit) discards 1bb388931c9101f38703142fda4f6b9e0bff52c4 (commit) discards 6fd24dd1f81b2ca5442d19bd66ffd902de651934 (commit) discards 833470a13c2068890bfacdbf99bacce55bed2db2 (commit) discards 374301a2aa5ba6dfa81aa4c70fd24ed59141c012 (commit) discards f913948f5daa4cb1f71467d872b5380974b04f2d (commit) discards f703d49c196a6c6c9d29d3c7b04c02d727795a2c (commit) discards 5eb5837adf64b14e795483a6cdf4e83124c56be8 (commit) discards 4964f08fa748eb61949fff147e930be72555d233 (commit) discards 263a5bb884c3e274174b1d1e4e0ae497143b1f81 (commit) discards 3e007fea33316e1d7d66cd7ea19541a1653b501c (commit) discards f8eda649cd915654175c9723aca75adaae88c3d3 (commit) discards 96a177a6322a9d8fad99d43271d1b98ecd5d12a5 (commit) discards 3529f3b8713021e45c7dbdd81f839d8b9049efcc (commit) discards af055783f975e2b8b9e443565b3abdc9f7946ade (commit) discards 8d9936c45c4a9f8db9142057d8acee41d54e0b51 (commit) discards 2a6485f25dc9b0612cccf40a2360dc6d40becb78 (commit) discards 91fee166b0dbf4949f1a1786e167a6948b1e8f52 (commit) discards 01e4772d22537772001714318d5f501f082b6c5e (commit) discards f8bbdfc98be5d86dea67cc34ee97a4b69c052d61 (commit) discards 295bf070e27323060ba607805dd95ce0353a9461 (commit) discards ae66a05708d04f332d85fb258196d9045ebc303c (commit) discards eb3a816cb0fa6c5e76b25398a0ac280c769dcb49 (commit) discards 1ee7da08721452033dd7b0537e62ec1191291120 (commit) discards eb9f47e9ce077e089575183abbfe00f2fce2fd41 (commit) discards 37bb9253fe0951f6dba10349e4ff472890615006 (commit) discards 70cf3e1941797acc0c3f1e2990f4490c249ee1a8 (commit) discards 7d457a070d8fd304262f28da9f86712b136ab0c0 (commit) discards 5c1c8bca96169bb3ce312b0d5cca39f7d9bc4372 (commit) discards 9bdb18d5ee876212bdac3098266a522f7bd25efb (commit) discards 044b9ed53fa1845d99f0aee3f402a5dcfed3c16e (commit) discards d901665b489d0470af24e757208488011515e0ad (commit) discards f36139ea56706df2534a269039b3effca7169234 (commit) discards 27b0ca668ec90730f6329185e23a026caf0b9064 (commit) discards c290e20364469774d6091426144645e53c257867 (commit) discards 96adbf43bcd91c63dd8c4c248b439ff3150bd1cc (commit) discards 7563bcf7716cdedf82a9a4f2a8121c45f669a45c (commit) discards 55daa2b0c3b024bfe9b17966fe3d7f10aaa27363 (commit) discards bab62d6ee6e1072bedbb49bcf747fecfb99b24df (commit) discards 6cede326ec2f9d9d5965419c1963a7cd541a7802 (commit) discards e93e8c3ea659c9a64aef3f53ae8932b31dfcef95 (commit) discards 5d1f07269026cdc371973a5edb2373113698e3c8 (commit) discards 3bf94540be3400cb741903b9b44ddc62b14cf397 (commit) discards b6e973744e52db038d9e0886fcaef014eff05cb5 (commit) discards f30d79bf8689dda7554b5c3d1025fb9030135ab7 (commit) discards 39502aa8b1a01732b012a424ca6587030d2e0a09 (commit) discards da5d27b57a0a3c8389c0a0f8c5747308419a094a (commit) discards 207efebdb9ca6d329cc89b272865559f5eeff182 (commit) discards 12b368d14e19761b7aabc4cac04918582253052b (commit) discards c73aaee1959377064cecccb6158b225de3f13db5 (commit) discards 7263734ca83fc439d7b491149cf07fa3f569b539 (commit) discards e9e6dcaa53b16b4a081bc87ad971accd45180d8d (commit) discards 33e0abebe03ed2095ff44780241e8b63166e36d9 (commit) discards 9eb433d73e9efae2c7075d4ac51716de5f4c2ac1 (commit) discards 64990e412ef6007ef6257f8b1640245ac630a676 (commit) discards f9c09aa73f0903e969fbbbacbf90fb9b7244edca (commit) discards 4a8115e12dad1f2a522143ded2fabe3f5e5c631c (commit) discards d429c89da5375b6b01b310ee92eeb1d4f07b10b9 (commit) discards cc92704bedc6ee2c940bb858110bbbdac6d7cb30 (commit) discards 8ec09bb45b2f4ea21b56e2d5dc4b804755be8d6e (commit) discards eddcf556d49b1d44e018624b9da8ba9d42fdacb5 (commit) discards 386b4d88d7b6320d60da438c20e92d1e41f5fd82 (commit) discards 01af3741a5cf6909347254cf0a42bccf185dc561 (commit) discards 6459109ccb46369a8d45d531c76e54c4267b30d6 (commit) discards 4dc8160d4897a041a14de578c3fc777fa27e78f5 (commit) discards 13b3e7ee716c9f5a296817b5143542d736ae3595 (commit) discards b68aa21885ec3bdfa914c66d811662efbf380127 (commit) discards f2be51f38a5115b5f5e2d6ee59df645f624adb7a (commit) discards 898d8b479149308de40331bf3a646bca1c99449e (commit) discards 794e94ae421c9587df1a11ff3027e6076974ec23 (commit) discards 93774c205c20951e51b0ed8d9c03bd21f95857bc (commit) discards a83e3c5ce2caa4ba4ba92f6e383c2a28d9aa3956 (commit) discards 97eb06b4cd2f57e9033f5d09a5e2b7a7b9d641b9 (commit) discards 6c0ffbf9689e36cc94d303d5ac30575fef041cbe (commit) discards 7d2f7dbf7d97cea348bb0499b684103fd8ad750f (commit) discards d184c87a690969571734fcd0c135da4f0da8ab55 (commit) discards ae53f9f80ee5fb06c2a3c8512a14bc1e773a58e4 (commit) discards bfb4e078a70e5510c1e3eb9deab5baeadb1c7fc3 (commit) discards 29cf3cb9e63df80849f1b1c59b2174086e7dfe47 (commit) discards 0817968af5f7ceebe96c4ca4661da2734304a329 (commit) discards ec1be8784c85b263f52e763b7890f097b2366212 (commit) discards 45bca0d051dd1f946e2d1ca188c481c1d179ad07 (commit) discards bb2e2a4b2a538cb437f5b3331c95a7b7dc573cb3 (commit) discards 7c8a226008d9f6fc9cd04f87539ab2715fef522a (commit) discards 594a4a0171ab82512b05a06eb34ff7acb73730ab (commit) discards 0b5dfae55a5a16e8c6b820f2458e48210cf9d762 (commit) discards e236795c0941fd7fc01b162a899b5dc42ba1d05e (commit) discards 9f39ccb68e57fa56a6d5e0b968292a2af0abc812 (commit) discards 415e197affb7eb3db5d806911d3e4b8e6ff05779 (commit) discards 3a817119eae94a2eb0c12d3a7e82eda35133b42c (commit) discards 01d1a8db345fed332416b3a6066ae7be1f28f0ad (commit) discards 168d7168447b99097f3bbe397ca76b6cb87d34da (commit) discards ebff1c15f1a0ccad57d26720ba7357a6b194d7fe (commit) discards 07b1c56979139118d47d15ff969365c08814dfd5 (commit) discards fa9fd355c5404b46c3cfaf375666796cc5333aca (commit) discards 173ef79e5306807d994869c7fb62c66ee82e4beb (commit) discards 055da43cde1c7a9acc674a2db3d9d2a7a3d1ff8f (commit) discards 0b880228e5e19bf2446f31f50e6df41c64e9502b (commit) discards fb41b3eb2075505cf2f77fad48a8b6b5ed5da302 (commit) discards d3d950ab1af5d1823a44950ea5a78e41dbe44dde (commit) discards c97618bb548f6b7c5f27f4de497f72f705e184f6 (commit) discards eee3800f367d61ccdb9051d484e133f618aad9e4 (commit) discards d32bca1d3bd13efdef8b01a459fa1ce13042975b (commit) discards 3cd53f15344c8ccf05dcf7812b4e2ff6a0b20961 (commit) discards e40699a6950fedea5ebce172299a9a6aa2dec424 (commit) discards ac4ac579bba217043604c3f4ad21ed0446214572 (commit) discards a0857f0d63bccdc8a16eab5068b63029ea84f005 (commit) discards cb97c894c05ef5a43dce262cf178ce5f54b1c806 (commit) discards 81b8a6b38d3f71102527675529edbe5293bcd30b (commit) discards f11e8bfd0599a717c457f2afd17e1a89febd5f8d (commit) discards aab53b9cd951dc5b4f76e4acee8aa602ddd9ad99 (commit) discards e1656a13f7a4a69dd743fd80c37a461bbdbf7d3f (commit) discards 42146102091d6201399a39eadbb4a897768c27ab (commit) discards 84f5ac969eb50e83cfa87a529e5a59a94196bcba (commit) discards 9c15202e04ce97601d9910ce013da22fc5a3a2b0 (commit) discards 177fc4cce6485a2bb80b99309eb7947e634d37fc (commit) discards 386f6f8932a7897fdf8adc60aed8de7ee0174ad4 (commit) discards 79f23e85b2c7e8f977efc2d10bb06639f08edbaf (commit) discards 602e207726055100b068eff1442c28fba95b8fac (commit) discards fad375346ab5cab78b44e7de8417527ca77e7ca6 (commit) discards 59debc98d1d5ced95da8c95cdbc714184128f1e6 (commit) discards e4f37812327c8bef175ea8425e37bf634dab0528 (commit) discards dad667fca2a4cd1ced4f394c07768f1930a50e40 (commit) discards 94113a141f65678e03017d0e6b78cefead095be4 (commit) discards 267dfa6f866f4864b57e6a60ad7cc5cfcc41aa53 (commit) discards 28b535dfe81390967d55d542e7eabceb082a1851 (commit) discards b2c33de3a7fb8d32b5d21f49889a22e0c91eb78a (commit) discards 855af1eded37fccc2dc5f9f5dc5126fed54bd8fe (commit) discards f77c88791ba1635e05f40d90fe7edcf2f582ab69 (commit) discards b8383f5f99cbd7a9293ccf2fe28dc07e31ef82e3 (commit) discards fbd352708cc471a7dfa5f8f895b26a54bec2524b (commit) discards 7a7b06ec55b16c2ed6a1d42f53bd6aaf66a11102 (commit) discards 49cded97529c9e0d3628ec063e9d6156a132a34d (commit) discards b403d6328379311697ba9b2387b7ed981ee85ce9 (commit) discards 5683fb61ec3e35286b107051db12bd27a4179c8d (commit) discards c536b8e033d4faadf2357c0a0607d835aec8967b (commit) discards 060d1603a92dc4c769dbb2f27994726592e5518a (commit) discards 02621a7c1f16f0ecbe07505e18fbbd0a5064a1af (commit) discards fa1cb86a929cc036865c6638c46fcc6104b65da8 (commit) discards 577dfd844c9a011d54c19ca0bc43b262f43dab01 (commit) discards 317a306c0aa88eea352fdc42c41bf7798ef71504 (commit) discards 63a6d2f1eca6e20537497b20fc8a678a28b1a1fe (commit) discards c660b185883ab00ea0848238d920be1cecb4e8e0 (commit) discards 4eb7a65fcf2c3c3bcbe90ab5906a8fca7d877109 (commit) discards 20cd60d08ac698dd0734d687636f719fad7c9b63 (commit) discards 8a1ec9972f1fffdc72a9ba24c78acd33d42a8874 (commit) discards 56a1a6e4dd4d64ee8461d34ef91d56516ab0211e (commit) discards e7a507396da07e91d561711b89dbe5580899c048 (commit) discards 9e8b303b9ced369cfa6a9a5852a4aed4a35ff7a8 (commit) discards f4f5362b8408c53ac9545fef5544ed47001c4001 (commit) discards d6cb425ff5c3bbc885d2a908107cf1069d508815 (commit) discards 8b012a3a326415bd2137a8de0ceddc9c5ac97e4a (commit) discards a500461abe492173f7e3c5945f5790ab88eff49f (commit) discards b8a7ac79946e1dd3194ca20a01b5b694c5948a66 (commit) discards 09a074866e5d658c22ce189a2997238f22f8707e (commit) discards e88d1474f86da1f2dd41e55589fc45eadced9a9b (commit) discards b7b1cfabcbe0c04ea9305eda0554a3da4caa0b32 (commit) discards 71fc103d575f89bb07f296caf3b4d7c907fbfd60 (commit) discards b691ada8bd0a874614e9f62022a8b4e058dab658 (commit) discards 097142094e58a827fb6667ca98676afd04d390da (commit) discards be1e7e58dcf768530c912321c30e3133ae34d793 (commit) discards 73d947f8bbea36f17875b914245403c712e52c22 (commit) discards 7c37f698f50d77373a8a4d1bfa90b7c5d5784ba8 (commit) discards 9d36a4b14382ce881189d108bd2ff394f326e62d (commit) discards be8708c4939130a34340570c7d4b461980dfef5a (commit) discards a883d385247659b14c69152950a80beb74e47d70 (commit) discards 515313ee8b41bc427381f608bb165269e0a800af (commit) discards a180f2bd8de9a99af5d8f0d1b263f860a6230018 (commit) discards 0e685e208d264343b60c3a7f7928daafa3fd5a3f (commit) discards 3d53088bd7dd81fa00167fa2eaa56ef66d6cc8ac (commit) discards 6e9e1d0c25817853bcc6cdce5914a2ffd75cf9cb (commit) discards ad1a75be390acf2c16f0eb31eb1b98cd73345334 (commit) discards f87c806e2572accd02eb0a85402c3b54dbfab678 (commit) discards c77af280c83828c7f8aead842866cc70d4f45fd1 (commit) discards 3934fb4cc9c8ab4ff0b8e91052f5852ca71f1081 (commit) discards 98cc54322a5fdea0eb4d4ff7974202c94231874f (commit) discards f567073ea8fe810a6e20c0ab66124a55408458c6 (commit) discards 7ab311290c0232508f8c9791a5276a3cfedbc67d (commit) discards 0ee0d5d6a144ece0e614d88495d78f52d869a4c6 (commit) discards b9332dd5a6c7b86a3a8917937506d91061c33e74 (commit) discards 921690d4f9fad7361ac79093fac79c1db9ea66b4 (commit) discards 106079a61b5f6bc891d3b6aebfd96bf633976c5f (commit) discards 0b1672ff74596c9693f4b740cdc3db87106c3c5f (commit) discards 212910cf3c9688ec2306be96db451ea2af1ccc5a (commit) discards e210e8fd270fc07eed3e0aa38baa5a5c5f26c58d (commit) discards 4eb47ad97f91379ee0344a17facac012c34de61d (commit) discards c031e09c293bb5d656d5c4627fc42ca5db8c1a4c (commit) discards 1ac659578d525585078065221fe59bf5f259e0a5 (commit) discards 32c6a55645b59e067d7ca29e748ab359c7adb42d (commit) discards be84c9f694dbfef2c734b2b3cce5dbf0d090d116 (commit) discards 57ea8af13974b6237dc24c7169bc40983a250e76 (commit) discards e92c191b697b13c2e798e9200136c6374a1e6ec9 (commit) discards 2c80790a1cf2ce97c8917eec67583be7af32e328 (commit) discards 3f9e6cfaa3e0c773fca85c4bfadef48ef136dfcc (commit) discards fe3aa0c729c315f5b10e995629f7f6c4991c937a (commit) discards f40fbc735e6e17b05cba3b4dc68528be6e2dbab6 (commit) discards fb883a3f40f7d44cb93785ffee3f80e46a54afa2 (commit) discards ff6e5ec230a706df85f61ee6c93888cf32c0ee35 (commit) discards 2b496a7c7fdfa47fba1f36ee2598b942970c4e00 (commit) discards a422ada1e0724b6924456e0e1d60406f2adb747a (commit) discards 4b4ef72aec3afa47915313c152bfbadf3a1e5898 (commit) discards 738674405168d951ed9d699e917ff3cdc45fcf26 (commit) discards 8642d6726ea6eeffcd383e83b5d59caa63955115 (commit) discards a537e329055f5b3d716f72b0db73a94e0ce7eaa1 (commit) discards 55c88a4277369c07217340277e53cd38164ffe33 (commit) discards f167ad83edbb6b8dfe63160c4fe3c7260b9069ef (commit) discards e7d39ee6096d48f6f860d354caa48cdcf3671c5e (commit) discards 810a3e705e0211dfdbf04d0214f60c85c4de1c12 (commit) discards 10d39299bef01f013f7afcbcfe31ecf790f52fe5 (commit) discards 5bdaa62f65cdca54c9ff0cb0f16255ca968f803e (commit) discards 824a4c4b6424d1614527a3ca7f9eea8383f80a24 (commit) discards 49d227eb8c2e0e1506a0e34da46cc76fca1f9363 (commit) discards 370f6ca2bd8169bbece2cb97acccf7291dfe49d3 (commit) discards a651f4a0db4c57a37d8f190108297926938c6551 (commit) discards 8927aa2638a998a264ae5b74ddff7db8e0d10a59 (commit) discards 991058be9ac114da2060f2e41dc28f86d93751ac (commit) discards fab63578337cf8e1d92c53f09a546536993e603f (commit) discards 174b7a9f86f817432206cdc97e1c75670ae38b83 (commit) discards e48d04b3200c3fdb387442ade824778e8cc69f2e (commit) discards 8073ff7d71dd23f575d91e7b4969d6c0c8570dcd (commit) discards 48f79d39e33ab50d96fba57037d9dd869913745c (commit) discards cb33b0cfae1d20174f4c0b37dad44fa91f9b050d (commit) discards 0b98ee418d7a8867666143744bf803f17f4c7f99 (commit) discards 7ee813622ba89b22518cd8888b782d0262b23d00 (commit) discards 22cdc9521fcb1a0831287bc54c08cb29f419e224 (commit) discards 82b6cf4245ee9a5f33c1c44d79b2f71916b58bdb (commit) discards cceac2df4cf8523a7f448fa1fb0205a0b776dc42 (commit) discards b96e8e0836e1be10aeaf01e83e74ab7df3d4fa8a (commit) discards b967bb5d650bfdaf013521c4adef07b6a1a26d36 (commit) discards 697192b019f998cd1bc7e10b9e9ed6d05c41d2c0 (commit) discards 9ca2e7f68b93464b66ca569dcdbb96aba2a2165b (commit) discards 8419f829bb6a68ca2604cc49a5989ec553a5dd89 (commit) discards b5b88fe7f8e462784721210cc436b14aca3ab670 (commit) discards 41feb446202a20baa4ff3a698af42f1526937809 (commit) discards 23fb460f98bc97eda12fd144d2aaabf6f56ea7af (commit) discards c25686b776de00a7fab5e448dc7962ae685c7480 (commit) discards 6c3ebdc1890fefaaebef113b1dfa1b417f554162 (commit) discards 35bca2da28c076e0746f9d23ffe47f7c99773404 (commit) discards ef7d102f162399e1e14af82c53b6e15bc45e171b (commit) discards 99679775f90f33282bccf7446277ff90fd3bd7d4 (commit) discards 183cee58314f7cf73209244677132f95306a4bc1 (commit) discards 8c1d551158f7e36fa90a0e1df6f7b519bb5d83ff (commit) discards 632f6919c1ce10879e26c572bddbf9f0d75d0bf1 (commit) discards fbda0b1e65c17f2dd82485954041b26d7c1b0bfe (commit) discards 51a915d262a907f7801f793d4a65a3169d60d4e6 (commit) discards fd4e2949e85743730ca7e97d5d132f0217451699 (commit) discards d37d970a5e43263ed689d14ed90f4cf7e5ad9b86 (commit) discards 934fa84965b3eab01b24674f3fe98538739e9f67 (commit) discards 606aad5869c0e74ba9351838a0e8104c9dde9b2f (commit) discards b38895761bc288a7274f6e93df73da455ecda0c2 (commit) discards 64ede2a3e37db9d644f635ad3c0a45d9c6b0d996 (commit) discards a74371e1613d34af34a4af66c1de662bf35cb4c6 (commit) discards 09a00db97834e1f113d241505cef4634543bcda3 (commit) discards 2faee819a96a07d20a4474e74cc55ab20905e3bb (commit) discards dd541f661da61b43b8d7b18e40826d791a035811 (commit) discards b884067f460b9ef4d0f5800850456aad1625bf34 (commit) discards c52905b19e8d9035c81ea8847e532cfa4d45c6f6 (commit) discards 564375702111d0d07fad2b9d8e12ac000fb157bd (commit) discards ff1e59c72f0f6b72772b1e4a93b29e2cfca9e6e8 (commit) discards fd88c7f06b4c7f6b14b25bf2eab5aa80db6d4ed4 (commit) discards f21ec861693109aa2352a0cfac5c7583889cf6e6 (commit) discards b5a7da42c8808f54b1de45d9d2afc22888ffe072 (commit) discards 182b7a46636d4a9c72fa1d57e4ba54c68dfb5dce (commit) discards b9fd2c2714a0e9edafd986522174c505b0465d82 (commit) discards 77b648004d222d8ea06f657678b8ca34ecc6b6f1 (commit) discards 9b0a51c159abb43215a71ab0c107af0a6161e037 (commit) discards 71cd2fba2d739c40bf617e7833612549acee3405 (commit) discards 89269fd0ef5f1620c5b0c85c3af5f11d69d8cc43 (commit) discards eac7ec700ab0a75716881c5a390e890f2950f2e4 (commit) discards faa873cd4780729982f6d7f9d78cc1500f28ab3a (commit) discards d42ef2c5a01d29a9877e0b487694f66e40c43624 (commit) discards a71de69dd1f1defbdc5dc42edb1c8947d82e60fc (commit) discards ad59776ed683d4c019aa0db34b901fcb74a8eaa8 (commit) discards 5d779635ac4cf2c2d3128809cef3409a56716a0e (commit) discards d13f253075bbc08ad5402f61ad0dcecec28f3614 (commit) discards 5b97541db91dbb5beffdfe0d64272206a1507e0b (commit) discards 2722279b31b075586551801eb2860687ff966ea8 (commit) discards 837258c13bfbdd378d0d4fff6a2173a187d6e365 (commit) discards 8d99a23c4f3adaee2df33985b9257c311708218a (commit) discards a90a776079d1027bc360dff0e748a641ede0126e (commit) discards 3320ef784ef768e579689767bb226011c12a4a1e (commit) discards 233e95e4b50767765370aa552f159a9920c0151c (commit) discards 9b2b5a9695ad66977c964c83691cd2fef4c45b85 (commit) discards 067a7054ba44a2c754f1382daf6469c495085639 (commit) discards f5b1a18c53cec7203b4f94541af4b112c459ab74 (commit) discards 09da8929a55e31b5005a3bb1c2c1184c435612cf (commit) discards 7c629241f07aa7509d996c0560a20c5b0c7b371d (commit) via 3ede6754a3dc65e6d386e92d8611543538501972 (commit) via 0b1d2c57308cd3442054a8fd822a0c42fd1c585a (commit) via 66fed4c6a0188beec9ae3b557cd0fdb17d33648b (commit) via ff70ec3c233012d2d248ae0a3aafe1b777172ff2 (commit) via dc6ce4e3e80b4d16c7f35ef5d3d483879610d56e (commit) via ec17d091acb7b37961ce5c928ff6e920635b4df1 (commit) via 0286eab2015966d318fdd9622ec0dae81ffa7268 (commit) via 113b55e0d899b86c0577b6a428c2381e6210f4e9 (commit) via 7e3b878677705c36b165764e6b6c0a4b7ecc4530 (commit) via 2f82a59ca8510165364a588b217def6f77f7f684 (commit) via e6c3654c18ba0054841c3eb89cedc240537c43fa (commit) via 46df93db8213c979751b6183451cc2b5852b0ea9 (commit) via 7bdd0e5fd7173a1b8f11ed06a49e8dcb87252f00 (commit) via 5d32b43317b92a88032b29f8d5158f49d8648c7e (commit) via 5344c8641d2c4e37d9c83ed22a19e56aeee074f5 (commit) via 7d8426f78f9f8b6855906fa46793d0549b9d6560 (commit) via ba5346d8c91a29d229a103d2a937d5739f13ce51 (commit) via fcac2a0dfedfabafae53b698b4e021d8202ef965 (commit) via da730188aa6fb9f58145a697ad002ecfd102f898 (commit) via 6576ed1f000f326a44c636a3e5d832a7a2cfd4f7 (commit) via 5f95fc513d87d46753cf81a5da20b5ff4852eeff (commit) via 4fd6b609766aa741617e3fa443dd5d9c0bb9eb71 (commit) via e9bdfb477cc3c329e443cb8d2ffe5ce6ead7de8b (commit) via 21bdc8b9d58ba5bf0dd3cb569587f4c53edd7ee3 (commit) via 0748e9fc9fcc121ceb4e914870145461cc0a87eb (commit) via 0b511f3fdd3cbea300fa3108c17b1f8fcfe75da4 (commit) via dbaed696a6409093dc9d387c8ea946362b6ce212 (commit) via a4d92554bdb13f7aa3a1ab2ef212f080d5b5abcd (commit) via 1ecf1ddef06e0bb00641f2eb6605c34640c603ff (commit) via c80718ccd7b16d959a08292bc527f9bd66d5d1a2 (commit) via 1065c7735a98611308f7430839a62e8a1fab40da (commit) via 5d002e728f60be318f235cc610b4f1dd631a34ba (commit) via 48f8e6319df988f70bf9efde1cfab76ca4fa4549 (commit) via 47d3ace1c522e193cefb9730d046350817d31ecd (commit) via 0c0a0fc7fba874f14821e096c62b7fbeecd9b25a (commit) via b277ad28d344aa9bb98c26cc84bc071d57559a41 (commit) via b2be0e3688db91640882eb9df24a3a9f43cb3d88 (commit) via ed4270a59273b13619bda3a903fe83bb47ea6087 (commit) via cc7bc42309d5d1bf844af376f13a981cf57cb76b (commit) via 20a76096f5bbc87f545f16be72f766d26d5865c5 (commit) via 8ea3be29a66bd7bfe2776f5117f3c8bac78668ea (commit) via ec16951089de3ed475570d253f1f0b0746304cc9 (commit) via 7b23d26816a334804277a87e5ea93f2958e5a6ec (commit) via 9e1d151f2f308c16ed542a7fa1ab0f0cf1e7a0fc (commit) via d867eedd6987daba2f03f3b036601708969528f1 (commit) via 411a07b61019cece7545fb325cc77a328a657f83 (commit) via 3d1711bc27a819876552e1104a3f2fdfb0760a4e (commit) via 9504a42688ff7242317b0aa4669dff2bf7aa9d93 (commit) via e5f7c8fd4249b11a86715cd31394c73145cc674e (commit) via 3bd31be9ea2f5e96e96a638a081d8223d1734e6c (commit) via 9cd5b915b1b65e4e5fc83dedf9afa7029f1d3274 (commit) via 6afbe90158988dc36e25b1954fe1fe9124ae7df1 (commit) via 48e3615af2cf18136a32b5a0afa0d05303bd4d36 (commit) via 9b11cef7a44294ec094e508f8090d77c2284728e (commit) via 0485bc704a497ca482fe47228d6295fac661d947 (commit) via 7b9a1713a148fffff7095215b661f37ffc2a681b (commit) via ca71292dbadc5959ebcfaeda0c071ed558359b8b (commit) via a89e63bb67bfc163ac67aed49a3e3b733aca8384 (commit) via f9bb28e43836da8183276199f888fb8ee612defa (commit) via 2411cd30bfc38651860fcc0e9f1331c3a37ccfbe (commit) via e49af8a47be1f267a9d0a50066f9b7ba2f8bd774 (commit) via e06d1f6cfb34e13b6a3bc81220f07c1207c04248 (commit) via 97bb0f3801f2f1692a12e24d9aa4fadf0b8ce477 (commit) via 62782960967bd58553139d6b20f91a5849a2c288 (commit) via e6a9fa3c8d910fcc0f31cf5f3334addf3246d482 (commit) via bfc48dbed3d58f7f3325cd0a05445f2ab537c38e (commit) via 59a26fc8cc0be0be0e30144389cfee2e55a88ab2 (commit) via cb5ed2680f28412e72aa59f5769581bdb19d4ebd (commit) via 686811c2f3961f3fb26c862059fb690443567e73 (commit) via d63f90cf86c4f531007122fff497537dab81c088 (commit) via 6c2c1bbf83a2a69b99d28baecfc8bd3421b651d6 (commit) via 35525f70aa68e55dca6b05cf59a515c50e7dcba2 (commit) via 56f0435d26ad16fdb4c8b6ea874cf88b15a5ddf9 (commit) via 12c4ca508b07b8d2366b0c37bee5f866019e94c2 (commit) via 9ddeaaf7a3226ab03e57cc49775fd234b8d44a2b (commit) via 0dcbdecc871783b5669dc9cb8cf68b7f4d7ffb76 (commit) via d89f772686dba6b331515be41aeefe345a207575 (commit) via 132dff6387e441c7019a8366c681941ee6173452 (commit) via fd383ebb6ea70350c28227d0b133c4e9c7075997 (commit) via a78ae2b646fa194a3e148c8577e5c4d4857002da (commit) via c3e8fb83ed8b5d9017c4fc72ac8ad03bea04b753 (commit) via 1c1118ee10c209bac716f9368bbbbd47a74b62ef (commit) via 7c7194c3da746e435044829fcd1f38b8011e386d (commit) via b181d885962969f439d9cd6f828fb66007ddedcb (commit) via bc9a1f01b55da44053a233acd4110def04f208fe (commit) via 41eff89ad670eb3bc889ba3b1d9b16d45cb4fdb3 (commit) via 93f315dfdd3fa77bca5ceef2d487aec0dc55c92e (commit) via 458120cb0507fd143db4f122a9adb3651468712d (commit) via 661140b119ea0dfc516025869ffce5d215537745 (commit) via 68578a2b61e2afdf4655b61ed8f5d023b16b4846 (commit) via 0ce0f29c5cc10320eb7f0741788f551cdf2c6903 (commit) via 1ec853bed11476eac8b8bde9f3f1d1e480049816 (commit) via 635d7206969ac9167383c6e8e27fa45ec4d3f137 (commit) via 901de0794779a6f419f5229de045bf610ec2adc2 (commit) via 33c034c005f686cda95bc21ca4ed1aaf6d7eb539 (commit) via bfcb5801d210e1535e19e556698dd90337a3d4ac (commit) via e373d2a880ba8ab18fa47422920c34d48090714b (commit) via 2f1c802e45b2e860e641d84c15368cca6cc3454d (commit) via 5d6ad599eb9f6b05d3890f2b0aae3746b8a2b73e (commit) via 4f309eceba9fbf1254eb39120d184ca3f6543168 (commit) via abfea01c9d5afe4d318db623b24ee00231057316 (commit) via e468e7041ba526fd8e2814b1158bde2e4917a987 (commit) via c13d8ba9b4a7c0b4adddd637e942bf8d83675a95 (commit) via 48018032f54e6e50f509d073c8735f7a5c0bbcb1 (commit) via 380fa4598b4c58101a2f07ff179ae67fdcba70ab (commit) via 297cd7e9f93e31dd5a640b707895d702d17b30ae (commit) via d945bf9517ab5abfc59447ab30456d1ca9716a5a (commit) via 67d6f7120962594e6b9e3343fd7cf13eda956b15 (commit) via 45cd0923809b2b4b972c9e9843ca7323183380c7 (commit) via 8de012860878e3cb70aab7b6151223b201a8d9a1 (commit) via 52d54fae53f5e65f232cb21b116e51ea36b4eb0b (commit) via eab91f7101cdf47c59b14b5a511a82c701e66ff4 (commit) via cc91c95216ca80d17c638c07659873ecf24f25e6 (commit) via 4aa40267ae25e6ee021c8ce067bae649db2d0d8d (commit) via 83e9a6c3896d2d8a949a7bece565bae7dfd1d967 (commit) via 8dc48817b06a5a303cf2b778eda68cc3627dd625 (commit) via f21e5e8137becb8bda722ac8b9dd27d476af77f8 (commit) via f46ecd688b8c0de5f273ad92478f473eea167112 (commit) via 0e53dabacd38643eb17834b15b5ae8e459700a4f (commit) via bf5c002a2d9549fa0120d03588684096145f9fcc (commit) via 3f3997ff3af3f85c4ce150f41c9d95b7fd9e9f57 (commit) via 8f9f3784b900297f555f3a17d5ce47584846c77c (commit) via c5ee737dca5375e2f9fab38ffc768223b2d9eb64 (commit) via 1aca253a08ee916a66486bb6eca05cfc4567e38f (commit) via 4443213d11e3d9feeecb6d2f5b3bad80d8d73c4b (commit) via b6f8955f3f70a5e09bdd86c408373c0b8caeb3eb (commit) via 3cae562cf7e11f87d00c19f96b7b29f98a8dddc3 (commit) via 8c72eb46fb1ee47340ffc7af322215fb78894b37 (commit) via 044cae351a1e60e4381cdbae37e2a759772c2258 (commit) via 95cbee5ac9cdcb696d48e6f820593c813f535f8a (commit) via 0c8a2c0027e35184cbc6eeadc3a8aa8bd2e8605b (commit) via 2c41f8f678bbb96a63dedb4e4d948c5dd779f65d (commit) via 7e188187a77fa9bab56f1407eb660c324736cd34 (commit) via 031802ec0c5e3e44d70aee7b19e0cd1055c9fe0b (commit) via 690bacc61c55e4f8f3195faaac068da83790ebf4 (commit) via 0287f1432eda1cf3e7fb8323e0fda838cf744816 (commit) via f8a9b873ffd6b1a512eb87ebc3ab183bc71157b0 (commit) via df04f4ccb940fea8cf3d7b5d41e31a381bb0ec08 (commit) via 570758a22fd0d6e2b2a73eb8ed0a8360a5b0ef32 (commit) via 4a877ef354b51189acc631c9b0ef669cf16045cc (commit) via dc6c26b9ef60ac0f10dca34b9f84ad440cf2c39e (commit) via caad132591f4ede71f08b727f302c8d41b8e96d9 (commit) via d1936686de3035d2664fa4745bd8681a6411d0d6 (commit) via 712565ad0e1dfdb1d80ca0b3a82c994eced863b6 (commit) via 7cefeec60b27d96cc6a62f2579dddc56d80846ed (commit) via a8cc1677b95448509bbc0258734c4a0c6465a2ae (commit) via 0f6ebf74b3f77bf7e02558778e32d317cb983393 (commit) via 31f9a83aec500e45576202cc42219bf0673a9790 (commit) via 08620451ad0d82b092ac7516673644ab20ebc9bc (commit) via 83478c2c04ee939b69e09867f97be88ae5c9e684 (commit) via c5025dfd7c43740aae55d8e69104a251ef1c32ab (commit) via bbe8e532130900bbd6896e7ec5e6828f7e19fa4b (commit) via cd760151e86ac1276906edc83856650b7694162e (commit) via 99a96552ddc57fa93af1eb041b71c55e0927fa75 (commit) via 664cbd820806256b9f9d44dd879b5fa85c70d40c (commit) via 01a3bd80c5e56bdfa1868cfb1f030ca3a834d742 (commit) via 09affd4785c5817f14eb528940420d3831ab81de (commit) via 35265db49b1f5329deed85734cb94cac2cc44178 (commit) via ad7a654b1355f346e33834dd220535b07a4eef0e (commit) via 577a58dddef4824f709f00b602543bde3f440ac7 (commit) via 0c6352e2d0f755c310692f5cf627801abf8ccb63 (commit) via 71b674a18a4655ab17bb9ab851492f8c51a9b950 (commit) via 3b11463dc8f9ce6bdb95490eeda933e6b6be3534 (commit) via 23e4a06ea025492e33a9a0f759386133e9eef6ad (commit) via 917a2bf7e8a41538f811889099738eb3979efc3a (commit) via f60d82e96b995e10217ab40b6ad9f9cba3a6cadb (commit) via 65f2959da164c4fed23b713c99842213c7ab04e1 (commit) via 1d5c2ffab0051390641628a458f657c49ea54d41 (commit) via 406054d9c9ce31990d59640aa5d3dfd49e2d1e9d (commit) via b7da3cd005ab576b55e066ffa854697f41bb6f82 (commit) via a7f23e35b596dada847205235821336e9e8d7166 (commit) via 0db006b5ea8fb6c760a4e48a5dd953b65d1895fc (commit) via d966e0e452517e1e0a29ca59b892f6685d560c78 (commit) via 2dd51f19e1d9c84fd09962ad2d134c376b46c45f (commit) via d46c341e321cb5085d5577dd5fb8ca0b3f7ba554 (commit) via 21f383e9fa9f0f0c127dbb251e08ae91da56d817 (commit) via f6b06ba4ef87d2c62fe47fe8ffe4e240b37c8fc1 (commit) via 66d4b2811d1742dde1a8b84afdf6ab5914bfd1c6 (commit) via 5a9f779843e0140dce38f0d24640f995a6fcc25a (commit) via 6e3954910345b19f596fa35a3427c432ffaa0ecf (commit) via e86f2adb4c33cf047f6521149d67a340288dc8ca (commit) via 32eba5cfc30b0708ffe6819b87fcff50d8c8102b (commit) via 8343da812a20c3e1431e75656d97ff74c82bff41 (commit) via 9cbb27956fffac255bde543e6d52ebb3cc6d589d (commit) via 6b4331e9e3251d54db409a45cac7e5848d30029c (commit) via da173cd050d227730307850830b1d02a76db6d2a (commit) via d2ae9854243a72b7f7bc8c86a7226035c53c37be (commit) via 84507e04c0d1e1cedaa0b83737c0baa8cdf8d265 (commit) via c12678f1712dd291c7ce951243b52287f3028883 (commit) via 07fb2ebf0a16f9ef54b2bdd15c99e2c46eda3afc (commit) via 8002e2b5ce58a532615f9c630e14c793037f8ef7 (commit) via 984ffe3caae07b8d5cd9dab14b7b93ca7d87a87d (commit) via 194f82dac1ff10500ea10d2f25f9c010d67c6e5a (commit) via bfc46064595db98814a70a048ad9d4de70d12e56 (commit) via bb3a47d7eb62cfe50b111b357435f8bd554f374f (commit) via 22dcddaa3dcc82f88b4e9b97a6aa6deb632269f6 (commit) via 9a4f8305e9c90f0ca0e7e4c240eb88d81b864ae0 (commit) via a08beb4afc6b7da7786cd7c827643689c1ee86d0 (commit) via f14b2bb379065f70174cc46a3cb2f7577eaecf2c (commit) via bb09ee5afa739db4c6775e4d1481ecf7b2c6ee4d (commit) via 094e84c5635894f076e416c9d667fff7ae6d8acc (commit) via 29483528be6b0878a73c5b0d34e91dd34ade3f43 (commit) via 50f15e48f30ddafcbeac77fa5dcfbd8eb6f55353 (commit) via f8e019e23d8348506c1121c73d63ee4e1b584e6e (commit) via 8acc1daf215ee62beba7c333dc0818d9a9c52010 (commit) via cca78664b864d7fb3d99412147275d1b6ef582be (commit) via b7b947ed8562822aa88db1a67233e40ec4dfa812 (commit) via 9a8b2903c4761b00e1223cdf64f2bf3a79060bd5 (commit) via 945cc3e6aabaf39e619accba61277301520684f9 (commit) via d6a88b032af4ad2720da360190153fc020d5d3f4 (commit) via f0611da0be1f4002c5f49933204451eafe4f0219 (commit) via e887f50f0fcbc18080b418d533487e47bdd9a9a3 (commit) via b44cbbbfc148261843b041fbb5b4ea8f8879f44e (commit) via 461a16705242b1fd7e64b50fcaae57fce7cd7f79 (commit) via 94a4993ad85539f138178ba738b87d45ba09a1f9 (commit) via c5789c8633254aca7e1d978d1e1f0ad7077e7e2c (commit) via c46f54d8c708d6335b0288ff4a5aad3a3b93e41c (commit) via 0b9a1a2e8334581126d4ece3fb4f9e019d88da0d (commit) via 3c935f73096826f1ad837ef42ed377bbdffbdb4c (commit) via 90016dee6e905f2089266495fd29ec00d217c582 (commit) via 379e29833c3ade07ffc5f41cf11aeee8bc15ae52 (commit) via beece6ec441455598b405c96672dad803bdeb04f (commit) via 8e93d650453505cf6a80154b83060e68dacc5fc9 (commit) via 4b58f73b6f95501d7a6ad2c0b6cbdcb467644971 (commit) via e4a2c3e72e1c6fb6e6c6554971e4e01376b70034 (commit) via 42a46399f064212fc7a16f088779bee744d1241c (commit) via 8ae6e015e8d73092b5c6b728fa39ff8190b88015 (commit) via 47c4ecd4bfdeeca0fd507dbb4f9182b36e5829f9 (commit) via 2ba3fc5be07c77feaaffdaf7eb1bdd9f7c0f37c2 (commit) via 3331e3b51dfcbfe8be5bc8c118cb8a2561294d60 (commit) via db8c7882c2fc8c849cebef08e505343ae1396b79 (commit) via 1adfa2e17b27032ff31bd8f361e05970ce186148 (commit) via 33fbc04b6373960ec3f84de4e7e7b34c49d71508 (commit) via 0c20689a6a78818b5cdb97cfa6c23fa7d866a761 (commit) via 4646069f0417fc180977100af2bc1f527b2d4f28 (commit) via 6d48d7f7f684b8aa87f7eb4f922d45be345ed771 (commit) via 926c22f695ea702e598063919303f890ec52b71b (commit) via 6d50738dd0880aff32b58b15f550150a4766f13e (commit) via e8cb778f75282d08ad398e9145e8b14b05c7cf05 (commit) via e357f694d31de49a7bf03d088cab02fb9a1a055f (commit) via 4aff065f37799847e46d1d10644c6113332783d1 (commit) via 0a5d67beda902557056d5b5146d8cbe86e5001b0 (commit) via ef122c4484ee63f64f0a1b5cab74b018b19e6361 (commit) via 97fc51b1e5b3fcea9db99ba63c10bda47f79341a (commit) via d1248e7d74a8a9c9aecfd8acf5b9c6cb06591aae (commit) via b420bd3386b5b28283de0a308c51108bed07e7e0 (commit) via 0ff72a3e3c9e7cbfde3d2b7d088a49e248fc779a (commit) via 39e3b88db39174279c1902a0153c6efeed894c5b (commit) via 886cd2e905fbae644204ae67c87cd5f54b47e49a (commit) via 6c70ce349467434bf3b0941d11ee1d27b161acf6 (commit) via 96e6c6409bfe8e5f276f136c4e10454f112cd662 (commit) via 6ce60cac1fea6d65803740f5f9b6627abf6814b3 (commit) via f2fd33bd4a83f92f080826accc064df94e263210 (commit) via cb93abaef977a8014e81b296e8656c9faa43eaf2 (commit) via 3330513ba71f43869538ce6e97962c59f331a5ad (commit) via 6adce4648bf228b60fc65312964a21c84771f58d (commit) via 1a1e19cfd78018ba00fb75951dc6e6ce4d55ae1f (commit) via 7f7821256a53c6b9e810ac3bb07ae87dc79a9616 (commit) via 989df5d2f97ab4711328b11282dcc743f5740e00 (commit) via 1c36bf726387b291d73bee1448cf163527cf5fb0 (commit) via fb2159c2bfa65e9777e120fd7e364561861ede29 (commit) via d1a1ed78d5d1255a68399a47ab42f7cccd9efe8f (commit) via cd7c7b287229375bb6cf848def60d6ac866c4445 (commit) via 4c797e8478dfffd914b8af4e4299a8ab03e0f59c (commit) via 7926eb572b3e945fd4443a32a06939136929aab8 (commit) via 4c5a303d05406afe4f821f732254c83d387c259b (commit) via 3e8d0eeb61b49034d0c13c2e675b8cd8eb77a4b4 (commit) via 663dcce721a2f4502644adc7140dc945c7e7f333 (commit) via ffae3fb4a25d5d226656cefe99d4219e1461b633 (commit) via 18a022887fab2af810ae20c9dd2c5b4516188208 (commit) via 4785b1020c6df98556f22d854daaae907303e684 (commit) via f8a3e7255186d34f69da81f0274f5ff647429047 (commit) via f6c423a7d29e2c7d6d890cbc098a398d0d7e1288 (commit) via f850092201668db7a73258a58324be10b7fb1909 (commit) via 912e026c108d7a496ac7467e953dea77dadaaa57 (commit) via 53e883be583d6108aa2afb935f5115c038d732b0 (commit) via cbf59d43c2eabfc92252faf6f92496b570b87c69 (commit) via 0cf079bb8c66b317b0c1c841264087c65866d5d5 (commit) via c9f834ad2462498c6c875642aef1523a3eec8dde (commit) via 6205659639b7efac4c84cea6abfaac62e2745eb1 (commit) via 8e315e2fc863d4636667c34feee56815a3b46c93 (commit) via 048f089a6b5fec94c09d9c3ba60105fe89b43c90 (commit) via bb4c8fb4e9311401acf31756d746b91fbd949699 (commit) via 8de2b39a6498fb52d838fd6eaefc1af9e044d718 (commit) via dc28824415ea510e3ef62e47f7640bf4a8420fde (commit) via bcb7aa8cb4e0fc0974cea7c92a488e0a6ba84c95 (commit) via 0b87221f657b4c88cba3011f350503ece92cfd1c (commit) via 008a34ae01a1980c4bfae5baf0c6df2bcd5820db (commit) via 9ffd1b9e2a3c10d7ba0e17689e5e1b823ecec393 (commit) via bbd5e76447bc586495cf79262314ec29ffe31540 (commit) via 54afd62e94e98fa8099c58c7d4deb54f563c52e7 (commit) via 5803effe1db1078189fc14d192943cd65b6a0d62 (commit) via 4bd301ee6b110282cf04ac581775ba9fd093d2d1 (commit) via 7c87b66edc84e8c713fefc68d46464660adaf71e (commit) via 6886a2ca3d3dd1157302ddee424c36f632903bd0 (commit) via d3191c08080c2e73d931697626d39c174f1c663f (commit) via d7c097e4a1168efa7393f8028179a2ff2f96505d (commit) via 6d91fe717d2e62e048fb8837a67cc1118a3113d1 (commit) via 9b7d0f9116a6e040f151c994ed10e958b9399295 (commit) via b3a8f10e0d4c1d323e682025b1189018d5d01cbf (commit) via 2b6cccd3541f053140b1765913a9ca5af67d374d (commit) via 24201040f2a8e66f11359f29b283831db8550c84 (commit) via 55b8ccb80bee2eaf7932a5bbb7963544d8fc906b (commit) via 6add70a4ff916acb331b961bc230cf946fbe835a (commit)
This update added new revisions after undoing existing revisions. That is to say, the old revision is not a strict subset of the new revision. This situation occurs when you --force push a change and generate a repository containing something like this:
* -- * -- B -- O -- O -- O (8511e88c69f5bf7cd251875610370aa334878788) \ N -- N -- N (3ede6754a3dc65e6d386e92d8611543538501972)
When this happens we assume that you've already had alert emails for all of the O revisions, and so we here report only the revisions in the N branch from the common base, B.
Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below.
- Log ----------------------------------------------------------------- commit 3ede6754a3dc65e6d386e92d8611543538501972 Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Thu Nov 15 20:34:27 2018 +0300
validation: scheduler use schedule_config instead of capabilities
Since ODP test suite will use default configuration for scheduler, all comparisons should be done against it rather than maximum possible values returned by capabilities.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/test/validation/api/scheduler/scheduler.c b/test/validation/api/scheduler/scheduler.c index 4fdfc243..27377580 100644 --- a/test/validation/api/scheduler/scheduler.c +++ b/test/validation/api/scheduler/scheduler.c @@ -418,7 +418,7 @@ static void scheduler_test_wait(void) static void scheduler_test_queue_size(void) { odp_queue_capability_t queue_capa; - odp_scheduler_config_t default_config; + odp_schedule_config_t default_config; odp_pool_t pool; odp_pool_param_t pool_param; odp_queue_param_t queue_param; @@ -432,8 +432,8 @@ static void scheduler_test_queue_size(void) ODP_SCHED_SYNC_ORDERED};
CU_ASSERT_FATAL(odp_queue_capability(&queue_capa) == 0); - odp_scheduler_config_init(&default_config); queue_size = TEST_QUEUE_SIZE_NUM_EV; + odp_schedule_config_init(&default_config); if (default_config.queue_size && queue_size > default_config.queue_size) queue_size = default_config.queue_size; @@ -1662,6 +1662,7 @@ static int create_queues(test_globals_t *globals) int i, j, prios, rc; odp_queue_capability_t capa; odp_schedule_capability_t sched_capa; + odp_schedule_config_t default_config; odp_pool_t queue_ctx_pool; odp_pool_param_t params; odp_buffer_t queue_ctx_buf; @@ -1691,10 +1692,11 @@ static int create_queues(test_globals_t *globals) }
globals->max_sched_queue_size = BUFS_PER_QUEUE_EXCL; - if (sched_capa.max_queue_size && sched_capa.max_queue_size < - BUFS_PER_QUEUE_EXCL) { - printf("Max sched queue size %u\n", sched_capa.max_queue_size); - globals->max_sched_queue_size = sched_capa.max_queue_size; + odp_schedule_config_init(&default_config); + if (default_config.queue_size && + globals->max_sched_queue_size > default_config.queue_size) { + printf("Max sched queue size %u\n", default_config.queue_size); + globals->max_sched_queue_size = default_config.queue_size; }
prios = odp_schedule_num_prio(); @@ -1704,7 +1706,7 @@ static int create_queues(test_globals_t *globals) queues_per_prio = QUEUES_PER_PRIO; num_sched = (prios * queues_per_prio * sched_types) + CHAOS_NUM_QUEUES; num_plain = (prios * queues_per_prio); - while ((num_sched > sched_capa.max_queues || + while ((num_sched > default_config.num_queues || num_plain > capa.plain.max_num || num_sched + num_plain > capa.max_queues) && queues_per_prio) { queues_per_prio--;
commit 0b1d2c57308cd3442054a8fd822a0c42fd1c585a Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Fri Nov 9 13:01:14 2018 +0300
travis: install graphviz in doxygen test
Install graphviz to stop doxygen from emitting 'missing dot' errors.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/.travis.yml b/.travis.yml index f2b87b7b..85ab9ae4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -196,6 +196,7 @@ jobs: - libconfig-dev - libssl-dev - cmake + - graphviz install: # Updated Doxygen - |
commit 66fed4c6a0188beec9ae3b557cd0fdb17d33648b Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Wed Nov 7 17:41:04 2018 +0300
examples: add calls to odp_schedule_config()
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/example/classifier/odp_classifier.c b/example/classifier/odp_classifier.c index 43d40c53..274ffaf4 100644 --- a/example/classifier/odp_classifier.c +++ b/example/classifier/odp_classifier.c @@ -556,6 +556,9 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); }
+ /* Configure scheduler */ + odp_schedule_config(NULL); + /* odp_pool_print(pool); */ odp_atomic_init_u64(&args->total_packets, 0);
diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c index 1093454c..bd6af795 100644 --- a/example/generator/odp_generator.c +++ b/example/generator/odp_generator.c @@ -1199,6 +1199,9 @@ int main(int argc, char *argv[]) args->rx_burst_size = args->appl.rx_burst; }
+ /* Configure scheduler */ + odp_schedule_config(NULL); + /* Create packet pool */ odp_pool_param_init(¶ms); params.pkt.seg_len = POOL_PKT_LEN; diff --git a/example/ipsec/odp_ipsec.c b/example/ipsec/odp_ipsec.c index 52ccce22..1bbf7a00 100644 --- a/example/ipsec/odp_ipsec.c +++ b/example/ipsec/odp_ipsec.c @@ -1297,6 +1297,9 @@ main(int argc, char *argv[]) exit(EXIT_FAILURE); }
+ /* Configure scheduler */ + odp_schedule_config(NULL); + /* Populate our IPsec cache */ printf("Using %s mode for crypto API\n\n", (CRYPTO_API_SYNC == global->appl.mode) ? "SYNC" : diff --git a/example/ipsec_api/odp_ipsec.c b/example/ipsec_api/odp_ipsec.c index fb0d9049..ab0fa3c5 100644 --- a/example/ipsec_api/odp_ipsec.c +++ b/example/ipsec_api/odp_ipsec.c @@ -996,6 +996,9 @@ main(int argc, char *argv[]) exit(EXIT_FAILURE); }
+ /* Configure scheduler */ + odp_schedule_config(NULL); + /* Populate our IPsec cache */ printf("Using %s mode for IPsec API\n\n", (ODP_IPSEC_OP_MODE_SYNC == global->appl.mode) ? "SYNC" : diff --git a/example/ipsec_offload/odp_ipsec_offload.c b/example/ipsec_offload/odp_ipsec_offload.c index 90b3f640..4d95b2e5 100644 --- a/example/ipsec_offload/odp_ipsec_offload.c +++ b/example/ipsec_offload/odp_ipsec_offload.c @@ -606,6 +606,9 @@ main(int argc, char *argv[])
ipsec_init_post();
+ /* Configure scheduler */ + odp_schedule_config(NULL); + /* Initialize interfaces (which resolves FWD DB entries */ for (i = 0; i < global->appl.if_count; i++) initialize_intf(global->appl.if_names[i], diff --git a/example/packet/odp_packet_dump.c b/example/packet/odp_packet_dump.c index 5dcb7893..4e3aec8f 100644 --- a/example/packet/odp_packet_dump.c +++ b/example/packet/odp_packet_dump.c @@ -640,6 +640,8 @@ int main(int argc, char *argv[])
global->pool = ODP_POOL_INVALID;
+ odp_schedule_config(NULL); + odp_sys_info_print();
if (open_pktios(global)) { diff --git a/example/packet/odp_pktio.c b/example/packet/odp_pktio.c index e73e903c..b1c4a79c 100644 --- a/example/packet/odp_pktio.c +++ b/example/packet/odp_pktio.c @@ -424,6 +424,9 @@ int main(int argc, char *argv[]) } odp_pool_print(pool);
+ /* Config and start scheduler */ + odp_schedule_config(NULL); + /* Create a pktio instance for each interface */ for (i = 0; i < args->appl.if_count; ++i) create_pktio(args->appl.if_names[i], pool, args->appl.mode); diff --git a/example/timer/odp_timer_accuracy.c b/example/timer/odp_timer_accuracy.c index 3b0d7e38..9409e340 100644 --- a/example/timer/odp_timer_accuracy.c +++ b/example/timer/odp_timer_accuracy.c @@ -426,6 +426,9 @@ int main(int argc, char *argv[])
odp_sys_info_print();
+ /* Configure scheduler */ + odp_schedule_config(NULL); + num = test_global.opt.num;
test_global.timer = calloc(num, sizeof(odp_timer_t)); diff --git a/example/timer/odp_timer_simple.c b/example/timer/odp_timer_simple.c index 116f8ba6..ddefb0d2 100644 --- a/example/timer/odp_timer_simple.c +++ b/example/timer/odp_timer_simple.c @@ -81,6 +81,9 @@ int main(int argc ODP_UNUSED, char *argv[] ODP_UNUSED) goto err; }
+ /* Configure scheduler */ + odp_schedule_config(NULL); + /* * Create a queue for timer test */ diff --git a/example/timer/odp_timer_test.c b/example/timer/odp_timer_test.c index 192a61d3..ca3e8ddf 100644 --- a/example/timer/odp_timer_test.c +++ b/example/timer/odp_timer_test.c @@ -418,6 +418,9 @@ int main(int argc, char *argv[]) printf("period: %i usec\n", gbls->args.period_us); printf("timeouts: %i\n", gbls->args.tmo_count);
+ /* Configure scheduler */ + odp_schedule_config(NULL); + /* * Create pool for timeouts */
commit ff70ec3c233012d2d248ae0a3aafe1b777172ff2 Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Wed Nov 7 17:41:04 2018 +0300
performance: add calls to odp_schedule_config()
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/test/performance/odp_cpu_bench.c b/test/performance/odp_cpu_bench.c index b41bc43f..852ed308 100644 --- a/test/performance/odp_cpu_bench.c +++ b/test/performance/odp_cpu_bench.c @@ -526,7 +526,7 @@ int main(int argc, char *argv[]) odp_cpumask_t cpumask; odp_pool_capability_t pool_capa; odp_pool_t pool; - odp_schedule_capability_t schedule_capa; + odp_schedule_config_t schedule_config; odp_shm_t shm; odp_shm_t lookup_tbl_shm; odp_pool_param_t params; @@ -614,26 +614,24 @@ int main(int argc, char *argv[]) printf("first CPU: %i\n", odp_cpumask_first(&cpumask)); printf("cpu mask: %s\n", cpumaskstr);
- if (odp_schedule_capability(&schedule_capa)) { - printf("Error: Schedule capa failed.\n"); - return -1; - } + odp_schedule_config_init(&schedule_config); + odp_schedule_config(&schedule_config);
/* Make sure a single queue can store all the packets in a group */ pkts_per_group = QUEUES_PER_GROUP * PKTS_PER_QUEUE; - if (schedule_capa.max_queue_size && - schedule_capa.max_queue_size < pkts_per_group) - pkts_per_group = schedule_capa.max_queue_size; + if (schedule_config.queue_size && + schedule_config.queue_size < pkts_per_group) + pkts_per_group = schedule_config.queue_size;
/* Divide queues evenly into groups */ - if (schedule_capa.max_queues < QUEUES_PER_GROUP) { + if (schedule_config.num_queues < QUEUES_PER_GROUP) { LOG_ERR("Error: min %d queues required\n", QUEUES_PER_GROUP); return -1; } - num_queues = num_workers > schedule_capa.max_queues ? - schedule_capa.max_queues : num_workers; + num_queues = num_workers > schedule_config.num_queues ? + schedule_config.num_queues : num_workers; num_groups = (num_queues + QUEUES_PER_GROUP - 1) / QUEUES_PER_GROUP; - if (num_groups * QUEUES_PER_GROUP > schedule_capa.max_queues) + if (num_groups * QUEUES_PER_GROUP > schedule_config.num_queues) num_groups--; num_queues = num_groups * QUEUES_PER_GROUP;
diff --git a/test/performance/odp_crypto.c b/test/performance/odp_crypto.c index d175bb7e..665268be 100644 --- a/test/performance/odp_crypto.c +++ b/test/performance/odp_crypto.c @@ -1101,6 +1101,7 @@ int main(int argc, char *argv[])
odp_queue_param_init(&qparam); if (cargs.schedule) { + odp_schedule_config(NULL); qparam.type = ODP_QUEUE_TYPE_SCHED; qparam.sched.prio = ODP_SCHED_PRIO_DEFAULT; qparam.sched.sync = ODP_SCHED_SYNC_PARALLEL; diff --git a/test/performance/odp_ipsec.c b/test/performance/odp_ipsec.c index 5a5824e8..e388916c 100644 --- a/test/performance/odp_ipsec.c +++ b/test/performance/odp_ipsec.c @@ -1088,6 +1088,7 @@ int main(int argc, char *argv[])
odp_queue_param_init(&qparam); if (cargs.schedule) { + odp_schedule_config(NULL); qparam.type = ODP_QUEUE_TYPE_SCHED; qparam.sched.prio = ODP_SCHED_PRIO_DEFAULT; qparam.sched.sync = ODP_SCHED_SYNC_PARALLEL; diff --git a/test/performance/odp_l2fwd.c b/test/performance/odp_l2fwd.c index c9243184..78e3920f 100644 --- a/test/performance/odp_l2fwd.c +++ b/test/performance/odp_l2fwd.c @@ -1568,6 +1568,8 @@ int main(int argc, char *argv[])
bind_workers();
+ odp_schedule_config(NULL); + /* Default */ if (num_groups == 0) { group[0] = ODP_SCHED_GROUP_ALL; diff --git a/test/performance/odp_pktio_ordered.c b/test/performance/odp_pktio_ordered.c index da37407a..15229aeb 100644 --- a/test/performance/odp_pktio_ordered.c +++ b/test/performance/odp_pktio_ordered.c @@ -1062,6 +1062,7 @@ int main(int argc, char *argv[]) odp_pool_param_t params; odp_shm_t shm; odp_schedule_capability_t schedule_capa; + odp_schedule_config_t schedule_config; odp_pool_capability_t pool_capa; odph_ethaddr_t new_addr; odph_helper_options_t helper_options; @@ -1129,6 +1130,8 @@ int main(int argc, char *argv[]) /* Parse and store the application arguments */ parse_args(argc, argv, &gbl_args->appl);
+ odp_schedule_config(NULL); + if (gbl_args->appl.in_mode == SCHED_ORDERED) { /* At least one ordered lock required */ if (schedule_capa.max_ordered_locks < 1) { @@ -1158,9 +1161,9 @@ int main(int argc, char *argv[]) pool_size = pool_capa.pkt.max_num;
queue_size = MAX_NUM_PKT; - if (schedule_capa.max_queue_size && - schedule_capa.max_queue_size < MAX_NUM_PKT) - queue_size = schedule_capa.max_queue_size; + if (schedule_config.queue_size && + schedule_config.queue_size < MAX_NUM_PKT) + queue_size = schedule_config.queue_size;
/* Pool should not be larger than queue, otherwise queue enqueues at * packet input may fail. */ diff --git a/test/performance/odp_pktio_perf.c b/test/performance/odp_pktio_perf.c index b86d437e..2ed2c352 100644 --- a/test/performance/odp_pktio_perf.c +++ b/test/performance/odp_pktio_perf.c @@ -759,6 +759,9 @@ static int test_init(void) iface = gbl_args->args.ifaces[0]; schedule = gbl_args->args.schedule;
+ if (schedule) + odp_schedule_config(NULL); + /* create pktios and associate input/output queues */ gbl_args->pktio_tx = create_pktio(iface, schedule); if (gbl_args->args.num_ifaces > 1) { diff --git a/test/performance/odp_sched_latency.c b/test/performance/odp_sched_latency.c index b6299141..b5be1a16 100644 --- a/test/performance/odp_sched_latency.c +++ b/test/performance/odp_sched_latency.c @@ -714,6 +714,8 @@ int main(int argc, char *argv[]) memset(globals, 0, sizeof(test_globals_t)); memcpy(&globals->args, &args, sizeof(test_args_t));
+ odp_schedule_config(NULL); + /* * Create event pool */ diff --git a/test/performance/odp_sched_perf.c b/test/performance/odp_sched_perf.c index b25c3e19..c301263e 100644 --- a/test/performance/odp_sched_perf.c +++ b/test/performance/odp_sched_perf.c @@ -43,6 +43,7 @@ typedef struct test_stat_t { typedef struct test_global_t { test_options_t test_options;
+ odp_schedule_config_t schedule_config; odp_barrier_t barrier; odp_pool_t pool; odp_cpumask_t cpumask; @@ -251,7 +252,6 @@ static int create_pool(test_global_t *global)
static int create_queues(test_global_t *global) { - odp_schedule_capability_t schedule_capa; odp_queue_param_t queue_param; odp_queue_t queue; odp_buffer_t buf; @@ -279,20 +279,16 @@ static int create_queues(test_global_t *global)
printf(" queue type %s\n\n", type_str);
- if (odp_schedule_capability(&schedule_capa)) { - printf("Error: Schedule capa failed.\n"); - return -1; - } - - if (tot_queue > schedule_capa.max_queues) { + if (tot_queue > global->schedule_config.num_queues) { printf("Max queues supported %u\n", - schedule_capa.max_queues); + global->schedule_config.num_queues); return -1; }
- if (schedule_capa.max_queue_size && - queue_size > schedule_capa.max_queue_size) { - printf("Max queue size %u\n", schedule_capa.max_queue_size); + if (global->schedule_config.queue_size && + queue_size > global->schedule_config.queue_size) { + printf("Max queue size %u\n", + global->schedule_config.queue_size); return -1; }
@@ -603,6 +599,9 @@ int main(int argc, char **argv) return -1; }
+ odp_schedule_config_init(&global->schedule_config); + odp_schedule_config(&global->schedule_config); + if (set_num_cpu(global)) return -1;
diff --git a/test/performance/odp_sched_pktio.c b/test/performance/odp_sched_pktio.c index 1faa9b1d..393ea352 100644 --- a/test/performance/odp_sched_pktio.c +++ b/test/performance/odp_sched_pktio.c @@ -127,6 +127,8 @@ typedef struct { uint64_t rx_pkt_sum; uint64_t tx_pkt_sum;
+ odp_schedule_config_t schedule_config; + } test_global_t;
static test_global_t *test_global; @@ -723,6 +725,9 @@ static int config_setup(test_global_t *test_global) cpu = odp_cpumask_next(cpumask, cpu); }
+ odp_schedule_config_init(&test_global->schedule_config); + odp_schedule_config(&test_global->schedule_config); + if (odp_pool_capability(&pool_capa)) { printf("Error: Pool capability failed.\n"); return -1; @@ -1109,15 +1114,9 @@ static int create_pipeline_queues(test_global_t *test_global) int i, j, k, num_pktio, stages, queues, ctx_size; pipe_queue_context_t *ctx; odp_queue_param_t queue_param; - odp_schedule_capability_t schedule_capa; odp_schedule_sync_t sched_sync; int ret = 0;
- if (odp_schedule_capability(&schedule_capa)) { - printf("Error: Schedule capa failed.\n"); - return -1; - } - num_pktio = test_global->opt.num_pktio; stages = test_global->opt.pipe_stages; queues = test_global->opt.pipe_queues; @@ -1130,10 +1129,10 @@ static int create_pipeline_queues(test_global_t *test_global) queue_param.sched.group = ODP_SCHED_GROUP_ALL;
queue_param.size = test_global->opt.pipe_queue_size; - if (schedule_capa.max_queue_size && - queue_param.size > schedule_capa.max_queue_size) { + if (test_global->schedule_config.queue_size && + queue_param.size > test_global->schedule_config.queue_size) { printf("Error: Pipeline queue max size is %u\n", - schedule_capa.max_queue_size); + test_global->schedule_config.queue_size); return -1; }
diff --git a/test/performance/odp_scheduling.c b/test/performance/odp_scheduling.c index 655a619e..afe5b73b 100644 --- a/test/performance/odp_scheduling.c +++ b/test/performance/odp_scheduling.c @@ -813,7 +813,7 @@ int main(int argc, char *argv[]) odph_odpthread_params_t thr_params; odp_queue_capability_t capa; odp_pool_capability_t pool_capa; - odp_schedule_capability_t schedule_capa; + odp_schedule_config_t schedule_config; uint32_t num_queues, num_buf;
printf("\nODP example starts\n\n"); @@ -909,15 +909,14 @@ int main(int argc, char *argv[]) return -1; }
- if (odp_schedule_capability(&schedule_capa)) { - printf("Error: Schedule capa failed.\n"); - return -1; - } + odp_schedule_config_init(&schedule_config); + odp_schedule_config(&schedule_config);
globals->queues_per_prio = QUEUES_PER_PRIO; num_queues = globals->queues_per_prio * NUM_PRIOS; - if (num_queues > schedule_capa.max_queues) - globals->queues_per_prio = schedule_capa.max_queues / + if (schedule_config.num_queues && + num_queues > schedule_config.num_queues) + globals->queues_per_prio = schedule_config.num_queues / NUM_PRIOS;
/* One plain queue is also used */
commit dc6ce4e3e80b4d16c7f35ef5d3d483879610d56e Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Wed Nov 7 17:41:04 2018 +0300
validation: add calls to odp_schedule_config()
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/test/common/odp_cunit_common.c b/test/common/odp_cunit_common.c index 4db6c32d..7f345fba 100644 --- a/test/common/odp_cunit_common.c +++ b/test/common/odp_cunit_common.c @@ -98,6 +98,10 @@ static int tests_global_init(odp_instance_t *inst) fprintf(stderr, "error: odp_init_local() failed.\n"); return -1; } + if (0 != odp_schedule_config(NULL)) { + fprintf(stderr, "error: odp_schedule_config(NULL) failed.\n"); + return -1; + }
return 0; } diff --git a/test/validation/api/timer/timer.c b/test/validation/api/timer/timer.c index 72294c5c..aaffd92d 100644 --- a/test/validation/api/timer/timer.c +++ b/test/validation/api/timer/timer.c @@ -92,6 +92,9 @@ static int timer_global_init(odp_instance_t *inst) global_mem = odp_shm_addr(global_shm); memset(global_mem, 0, sizeof(global_shared_mem_t));
+ /* Configure scheduler */ + odp_schedule_config(NULL); + return 0; }
commit ec17d091acb7b37961ce5c928ff6e920635b4df1 Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Wed Nov 7 17:39:48 2018 +0300
linux-gen: implement odp_schedule_config() API call
Add odp_schedule_config() stub, which does nothing at this point. Use it to actually check (in debug mode) that application call it in proper place.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/include/odp_schedule_if.h b/platform/linux-generic/include/odp_schedule_if.h index abc64d0d..15c91590 100644 --- a/platform/linux-generic/include/odp_schedule_if.h +++ b/platform/linux-generic/include/odp_schedule_if.h @@ -87,10 +87,17 @@ int sched_cb_pktin_poll(int pktio_index, int pktin_index, int sched_cb_pktin_poll_one(int pktio_index, int rx_queue, odp_event_t evts[]); void sched_cb_pktio_stop_finalize(int pktio_index);
+/* For debugging */ +#ifdef ODP_DEBUG +extern int _odp_schedule_configured; +#endif + /* API functions */ typedef struct { uint64_t (*schedule_wait_time)(uint64_t ns); int (*schedule_capability)(odp_schedule_capability_t *capa); + void (*schedule_config_init)(odp_schedule_config_t *config); + int (*schedule_config)(const odp_schedule_config_t *config); odp_event_t (*schedule)(odp_queue_t *from, uint64_t wait); int (*schedule_multi)(odp_queue_t *from, uint64_t wait, odp_event_t events[], int num); diff --git a/platform/linux-generic/odp_schedule_basic.c b/platform/linux-generic/odp_schedule_basic.c index f057f468..48f232e6 100644 --- a/platform/linux-generic/odp_schedule_basic.c +++ b/platform/linux-generic/odp_schedule_basic.c @@ -597,6 +597,8 @@ static int schedule_init_queue(uint32_t queue_index, int i; int prio = prio_level_from_api(sched_param->prio);
+ ODP_ASSERT(_odp_schedule_configured); + pri_set_queue(queue_index, prio); sched->queue[queue_index].grp = sched_param->group; sched->queue[queue_index].prio = prio; @@ -797,6 +799,19 @@ static int schedule_term_local(void) return 0; }
+static void schedule_config_init(odp_schedule_config_t *config) +{ + config->num_queues = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; + config->queue_size = queue_glb->config.max_queue_size; +} + +static int schedule_config(const odp_schedule_config_t *config) +{ + (void)config; + + return 0; +} + static inline int copy_from_stash(odp_event_t out_ev[], unsigned int max) { int i = 0; @@ -1589,6 +1604,8 @@ const schedule_fn_t schedule_basic_fn = { const schedule_api_t schedule_basic_api = { .schedule_wait_time = schedule_wait_time, .schedule_capability = schedule_capability, + .schedule_config_init = schedule_config_init, + .schedule_config = schedule_config, .schedule = schedule, .schedule_multi = schedule_multi, .schedule_multi_wait = schedule_multi_wait, diff --git a/platform/linux-generic/odp_schedule_if.c b/platform/linux-generic/odp_schedule_if.c index 92e0a62f..cb52f155 100644 --- a/platform/linux-generic/odp_schedule_if.c +++ b/platform/linux-generic/odp_schedule_if.c @@ -25,6 +25,10 @@ extern const schedule_api_t schedule_scalable_api; const schedule_fn_t *sched_fn; const schedule_api_t *sched_api;
+#ifdef ODP_DEBUG +int _odp_schedule_configured; +#endif + uint64_t odp_schedule_wait_time(uint64_t ns) { return sched_api->schedule_wait_time(ns); @@ -35,14 +39,46 @@ int odp_schedule_capability(odp_schedule_capability_t *capa) return sched_api->schedule_capability(capa); }
+void odp_schedule_config_init(odp_schedule_config_t *config) +{ + memset(config, 0, sizeof(*config)); + + sched_api->schedule_config_init(config); +} + +int odp_schedule_config(const odp_schedule_config_t *config) +{ + int ret; + odp_schedule_config_t defconfig; + + ODP_ASSERT(!_odp_schedule_configured); + + if (!config) { + odp_schedule_config_init(&defconfig); + config = &defconfig; + } + + ret = sched_api->schedule_config(config); +#ifdef ODP_DEBUG + if (ret >= 0) + _odp_schedule_configured = 1; +#endif + + return ret; +} + odp_event_t odp_schedule(odp_queue_t *from, uint64_t wait) { + ODP_ASSERT(_odp_schedule_configured); + return sched_api->schedule(from, wait); }
int odp_schedule_multi(odp_queue_t *from, uint64_t wait, odp_event_t events[], int num) { + ODP_ASSERT(_odp_schedule_configured); + return sched_api->schedule_multi(from, wait, events, num); }
diff --git a/platform/linux-generic/odp_schedule_scalable.c b/platform/linux-generic/odp_schedule_scalable.c index 091e5ff9..4e9dd771 100644 --- a/platform/linux-generic/odp_schedule_scalable.c +++ b/platform/linux-generic/odp_schedule_scalable.c @@ -1994,6 +1994,19 @@ static int schedule_term_local(void) return rc; }
+static void schedule_config_init(odp_schedule_config_t *config) +{ + config->num_queues = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; + config->queue_size = 0; /* FIXME ? */ +} + +static int schedule_config(const odp_schedule_config_t *config) +{ + (void)config; + + return 0; +} + static int num_grps(void) { return MAX_SCHED_GROUP; @@ -2141,6 +2154,8 @@ const schedule_fn_t schedule_scalable_fn = { const schedule_api_t schedule_scalable_api = { .schedule_wait_time = schedule_wait_time, .schedule_capability = schedule_capability, + .schedule_config_init = schedule_config_init, + .schedule_config = schedule_config, .schedule = schedule, .schedule_multi = schedule_multi, .schedule_multi_wait = schedule_multi_wait, diff --git a/platform/linux-generic/odp_schedule_sp.c b/platform/linux-generic/odp_schedule_sp.c index 6cc8f376..eec88a60 100644 --- a/platform/linux-generic/odp_schedule_sp.c +++ b/platform/linux-generic/odp_schedule_sp.c @@ -257,6 +257,19 @@ static int term_local(void) return 0; }
+static void schedule_config_init(odp_schedule_config_t *config) +{ + config->num_queues = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; + config->queue_size = queue_glb->config.max_queue_size; +} + +static int schedule_config(const odp_schedule_config_t *config) +{ + (void)config; + + return 0; +} + static uint32_t max_ordered_locks(void) { return NUM_ORDERED_LOCKS; @@ -362,6 +375,11 @@ static int init_queue(uint32_t qi, const odp_schedule_param_t *sched_param) odp_schedule_group_t group = sched_param->group; int prio = 0;
+#ifdef ODP_DEBUG + if (!_odp_schedule_configured) + ODP_ABORT("Scheduler not configured!\n"); +#endif + if (group < 0 || group >= NUM_GROUP) return -1;
@@ -961,6 +979,8 @@ const schedule_fn_t schedule_sp_fn = { const schedule_api_t schedule_sp_api = { .schedule_wait_time = schedule_wait_time, .schedule_capability = schedule_capability, + .schedule_config_init = schedule_config_init, + .schedule_config = schedule_config, .schedule = schedule, .schedule_multi = schedule_multi, .schedule_multi_wait = schedule_multi_wait,
commit 0286eab2015966d318fdd9622ec0dae81ffa7268 Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Wed Nov 7 16:46:50 2018 +0300
linux-gen: schedule: rename config to get_config
Rename config function to get_config to avoid collisions.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/include/odp_schedule_if.h b/platform/linux-generic/include/odp_schedule_if.h index 88961269..abc64d0d 100644 --- a/platform/linux-generic/include/odp_schedule_if.h +++ b/platform/linux-generic/include/odp_schedule_if.h @@ -53,7 +53,7 @@ typedef void (*schedule_order_unlock_lock_fn_t)(void); typedef void (*schedule_order_lock_start_fn_t)(void); typedef void (*schedule_order_lock_wait_fn_t)(void); typedef uint32_t (*schedule_max_ordered_locks_fn_t)(void); -typedef void (*schedule_config_fn_t)(schedule_config_t *config); +typedef void (*schedule_get_config_fn_t)(schedule_config_t *config);
typedef struct schedule_fn_t { schedule_pktio_start_fn_t pktio_start; @@ -74,7 +74,7 @@ typedef struct schedule_fn_t { schedule_order_lock_wait_fn_t wait_order_lock; schedule_order_unlock_lock_fn_t order_unlock_lock; schedule_max_ordered_locks_fn_t max_ordered_locks; - schedule_config_fn_t config; + schedule_get_config_fn_t get_config;
} schedule_fn_t;
diff --git a/platform/linux-generic/odp_schedule_basic.c b/platform/linux-generic/odp_schedule_basic.c index b93e5c41..f057f468 100644 --- a/platform/linux-generic/odp_schedule_basic.c +++ b/platform/linux-generic/odp_schedule_basic.c @@ -1547,7 +1547,7 @@ static int schedule_num_grps(void) return NUM_SCHED_GRPS; }
-static void schedule_config(schedule_config_t *config) +static void schedule_get_config(schedule_config_t *config) { *config = *(&sched->config_if); }; @@ -1582,7 +1582,7 @@ const schedule_fn_t schedule_basic_fn = { .order_lock = order_lock, .order_unlock = order_unlock, .max_ordered_locks = schedule_max_ordered_locks, - .config = schedule_config + .get_config = schedule_get_config };
/* Fill in scheduler API calls */ diff --git a/platform/linux-generic/odp_thread.c b/platform/linux-generic/odp_thread.c index 7728929b..b30174dd 100644 --- a/platform/linux-generic/odp_thread.c +++ b/platform/linux-generic/odp_thread.c @@ -142,10 +142,10 @@ int odp_thread_init_local(odp_thread_type_t type) group_worker = 1; group_control = 1;
- if (sched_fn->config) { + if (sched_fn->get_config) { schedule_config_t schedule_config;
- sched_fn->config(&schedule_config); + sched_fn->get_config(&schedule_config); group_all = schedule_config.group_enable.all; group_worker = schedule_config.group_enable.worker; group_control = schedule_config.group_enable.control; @@ -196,10 +196,10 @@ int odp_thread_term_local(void) group_worker = 1; group_control = 1;
- if (sched_fn->config) { + if (sched_fn->get_config) { schedule_config_t schedule_config;
- sched_fn->config(&schedule_config); + sched_fn->get_config(&schedule_config); group_all = schedule_config.group_enable.all; group_worker = schedule_config.group_enable.worker; group_control = schedule_config.group_enable.control;
commit 113b55e0d899b86c0577b6a428c2381e6210f4e9 Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Wed Oct 31 13:45:09 2018 +0300
api: schedule: add scheduler flow aware mode
ODP scheduler configuration to support flow aware mode
Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/include/odp/api/spec/event.h b/include/odp/api/spec/event.h index d9f7ab73..affdc7b0 100644 --- a/include/odp/api/spec/event.h +++ b/include/odp/api/spec/event.h @@ -209,6 +209,44 @@ void odp_event_free_multi(const odp_event_t event[], int num); */ void odp_event_free_sp(const odp_event_t event[], int num);
+/** + * Event flow id value + * + * Returns the flow id value set in the event. + * Usage of flow id enables scheduler to maintain multiple synchronization + * contexts per single queue. For example, when multiple flows are assigned to + * an atomic queue, events of a single flow (events from the same queue with + * the same flow id value) are guaranteed to be processed by only single thread + * at a time. For packets received through packet input initial + * event flow id will be same as flow hash generated for packets. The hash + * algorithm and therefore the resulting flow id value is implementation + * specific. Use pktio API configuration options to select the fields used for + * initial flow id calculation. For all other events initial flow id is zero + * An application can change event flow id using odp_event_flow_id_set(). + * + * @param event Event handle + * + * @return Flow id of the event + * + */ +uint32_t odp_event_flow_id(odp_event_t event); + +/** + * Set event flow id value + * + * Store the event flow id for the event and sets the flow id flag. + * When scheduler is configured as flow aware, scheduled queue synchronization + * will be based on this id within each queue. + * When scheduler is configured as flow unaware, event flow id is ignored by + * the implementation. + * The value of flow id must be less than the number of flows configured in the + * scheduler. + * + * @param event Event handle + * @param flow_id Flow event id to be set. + */ +void odp_event_flow_id_set(odp_event_t event, uint32_t flow_id); + /** * @} */ diff --git a/include/odp/api/spec/schedule_types.h b/include/odp/api/spec/schedule_types.h index 0b75d17d..3648c64e 100644 --- a/include/odp/api/spec/schedule_types.h +++ b/include/odp/api/spec/schedule_types.h @@ -78,6 +78,9 @@ extern "C" { * requests another event from the scheduler, which implicitly releases the * context. User may allow the scheduler to release the context earlier than * that by calling odp_schedule_release_atomic(). + * When scheduler is enabled as flow-aware, the event flow id value affects + * scheduling of the event and synchronization is maintained per flow within + * each queue. */
/** @@ -104,6 +107,9 @@ extern "C" { * (e.g. freed or stored) within the context are considered missing from * reordering and are skipped at this time (but can be ordered again within * another context). + * When scheduler is enabled as flow-aware, the event flow id value affects + * scheduling of the event and synchronization is maintained per flow within + * each queue. */
/** @@ -190,6 +196,13 @@ typedef struct odp_schedule_capability_t { * events. */ uint32_t max_queue_size;
+ /** Maximum supported flows per queue. + * Specifies the maximum number of flows per queue supported by the + * implementation. A value of 0 indicates flow aware mode is not + * supported. + */ + uint32_t max_flows; + /** Lock-free (ODP_NONBLOCKING_LF) queues support. * The specification is the same as for the blocking implementation. */ odp_support_t lockfree_queues; @@ -217,6 +230,22 @@ typedef struct odp_schedule_config_t { */ uint32_t queue_size;
+ /** Number of flows per queue to be supported. Scheduler enables flow + * aware mode when flow count is configured greater than 1 (up to + * 'max_flows' capability). + * + * Flows are lightweight entities and events can be assigned to + * specific flows by the application using odp_event_flow_id_set() + * before enqueuing the event into the scheduler. This value is ignored + * unless scheduler supports flow aware mode. + * + * This number should be less than maximum flow supported by the + * implementation. The default value is zero. + * + * @see odp_schedule_capability_t + */ + uint32_t num_flows; + } odp_schedule_config_t;
/**
commit 7e3b878677705c36b165764e6b6c0a4b7ecc4530 Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Wed Oct 24 17:55:18 2018 +0300
api: schedule: add scheduler config and start API
Add API calls to configure and start scheduler subsystem.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/include/odp/api/spec/schedule.h b/include/odp/api/spec/schedule.h index 6538c509..43292124 100644 --- a/include/odp/api/spec/schedule.h +++ b/include/odp/api/spec/schedule.h @@ -257,6 +257,44 @@ int odp_schedule_default_prio(void); */ int odp_schedule_num_prio(void);
+/** + * Initialize schedule configuration options + * + * Initialize an odp_schedule_config_t to its default values. + * + * @param[out] config Pointer to schedule configuration structure + */ +void odp_schedule_config_init(odp_schedule_config_t *config); + +/** + * Global schedule configuration + * + * Initialize and configure scheduler with global configuration options + * to schedule events across different scheduled queues. + * This function must be called before scheduler is used (any other scheduler + * function is called except odp_schedule_capability() and + * odp_schedule_config_init()) or any queues are created (by application itself + * or by other ODP modules). + * An application can pass NULL value to use default configuration. It will + * have the same result as filling the structure with + * odp_schedule_config_init() and then passing it to odp_schedule_config(). + * + * The initialization sequeunce should be, + * odp_schedule_capability() + * odp_schedule_config_init() + * odp_schedule_config() + * odp_schedule() + * + * @param config Pointer to scheduler configuration structure or NULL for the + * default configuration + * + * @retval 0 on success + * @retval <0 on failure + * + * @see odp_schedule_capability(), odp_schedule_config_init() + */ +int odp_schedule_config(const odp_schedule_config_t *config); + /** * Query scheduler capabilities * diff --git a/include/odp/api/spec/schedule_types.h b/include/odp/api/spec/schedule_types.h index e7cc0479..0b75d17d 100644 --- a/include/odp/api/spec/schedule_types.h +++ b/include/odp/api/spec/schedule_types.h @@ -200,6 +200,25 @@ typedef struct odp_schedule_capability_t {
} odp_schedule_capability_t;
+/** + * Schedule configuration + */ +typedef struct odp_schedule_config_t { + /** Maximum number of scheduled queues to be supported. + * + * @see odp_schedule_capability_t + */ + uint32_t num_queues; + + /** Maximum number of events required to be stored simultaneously in + * scheduled queue. This number must not exceed 'max_queue_size' + * capability. A value of 0 configures default queue size supported by + * the implementation. + */ + uint32_t queue_size; + +} odp_schedule_config_t; + /** * @} */
commit 2f82a59ca8510165364a588b217def6f77f7f684 Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Wed Oct 31 13:47:52 2018 +0300
example, tests: move scheduled queue capabilities to sched
Move scheduled queue capabilities to odp_schedule_capability_t structure, as they logically belong to ODP scheduler module, rather than queue module.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/example/sysinfo/odp_sysinfo.c b/example/sysinfo/odp_sysinfo.c index cd0c6bfd..709f25d9 100644 --- a/example/sysinfo/odp_sysinfo.c +++ b/example/sysinfo/odp_sysinfo.c @@ -401,19 +401,15 @@ int main(void) printf(" max ordered locks: %" PRIu32 "\n", schedule_capa.max_ordered_locks); printf(" max groups: %u\n", schedule_capa.max_groups); - printf(" priorities: %u\n", schedule_capa.prios); - printf(" sched.max_num: %" PRIu32 "\n", - queue_capa.sched.max_num); - printf(" sched.max_size: %" PRIu32 "\n", - queue_capa.sched.max_size); - printf(" sched.lf.max_num: %" PRIu32 "\n", - queue_capa.sched.lockfree.max_num); - printf(" sched.lf.max_size: %" PRIu32 "\n", - queue_capa.sched.lockfree.max_size); - printf(" sched.wf.max_num: %" PRIu32 "\n", - queue_capa.sched.waitfree.max_num); - printf(" sched.wf.max_size: %" PRIu32 "\n", - queue_capa.sched.waitfree.max_size); + printf(" priorities: %u\n", schedule_capa.max_prios); + printf(" sched.max_queues: %" PRIu32 "\n", + schedule_capa.max_queues); + printf(" sched.max_queue_size: %" PRIu32 "\n", + schedule_capa.max_queue_size); + printf(" sched.lf_queues: %ssupported\n", + schedule_capa.lockfree_queues ? "" : "not "); + printf(" sched.wf_queues: %ssupported\n", + schedule_capa.waitfree_queues ? "" : "not ");
printf("\n"); printf(" TIMER\n"); diff --git a/test/performance/odp_cpu_bench.c b/test/performance/odp_cpu_bench.c index 402ab4a1..b41bc43f 100644 --- a/test/performance/odp_cpu_bench.c +++ b/test/performance/odp_cpu_bench.c @@ -526,7 +526,7 @@ int main(int argc, char *argv[]) odp_cpumask_t cpumask; odp_pool_capability_t pool_capa; odp_pool_t pool; - odp_queue_capability_t queue_capa; + odp_schedule_capability_t schedule_capa; odp_shm_t shm; odp_shm_t lookup_tbl_shm; odp_pool_param_t params; @@ -614,27 +614,26 @@ int main(int argc, char *argv[]) printf("first CPU: %i\n", odp_cpumask_first(&cpumask)); printf("cpu mask: %s\n", cpumaskstr);
- /* Create application queues */ - if (odp_queue_capability(&queue_capa)) { - LOG_ERR("Error: odp_queue_capability() failed\n"); - exit(EXIT_FAILURE); + if (odp_schedule_capability(&schedule_capa)) { + printf("Error: Schedule capa failed.\n"); + return -1; }
/* Make sure a single queue can store all the packets in a group */ pkts_per_group = QUEUES_PER_GROUP * PKTS_PER_QUEUE; - if (queue_capa.sched.max_size && - queue_capa.sched.max_size < pkts_per_group) - pkts_per_group = queue_capa.sched.max_size; + if (schedule_capa.max_queue_size && + schedule_capa.max_queue_size < pkts_per_group) + pkts_per_group = schedule_capa.max_queue_size;
/* Divide queues evenly into groups */ - if (queue_capa.sched.max_num < QUEUES_PER_GROUP) { + if (schedule_capa.max_queues < QUEUES_PER_GROUP) { LOG_ERR("Error: min %d queues required\n", QUEUES_PER_GROUP); return -1; } - num_queues = num_workers > queue_capa.sched.max_num ? - queue_capa.sched.max_num : num_workers; + num_queues = num_workers > schedule_capa.max_queues ? + schedule_capa.max_queues : num_workers; num_groups = (num_queues + QUEUES_PER_GROUP - 1) / QUEUES_PER_GROUP; - if (num_groups * QUEUES_PER_GROUP > queue_capa.sched.max_num) + if (num_groups * QUEUES_PER_GROUP > schedule_capa.max_queues) num_groups--; num_queues = num_groups * QUEUES_PER_GROUP;
diff --git a/test/performance/odp_pktio_ordered.c b/test/performance/odp_pktio_ordered.c index 1b4b756a..da37407a 100644 --- a/test/performance/odp_pktio_ordered.c +++ b/test/performance/odp_pktio_ordered.c @@ -1061,7 +1061,6 @@ int main(int argc, char *argv[]) odp_pool_t pool; odp_pool_param_t params; odp_shm_t shm; - odp_queue_capability_t queue_capa; odp_schedule_capability_t schedule_capa; odp_pool_capability_t pool_capa; odph_ethaddr_t new_addr; @@ -1099,11 +1098,6 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); }
- if (odp_queue_capability(&queue_capa)) { - LOG_ERR("Error: Queue capa failed\n"); - exit(EXIT_FAILURE); - } - if (odp_schedule_capability(&schedule_capa)) { printf("Error: Schedule capa failed.\n"); return -1; @@ -1164,9 +1158,9 @@ int main(int argc, char *argv[]) pool_size = pool_capa.pkt.max_num;
queue_size = MAX_NUM_PKT; - if (queue_capa.sched.max_size && - queue_capa.sched.max_size < MAX_NUM_PKT) - queue_size = queue_capa.sched.max_size; + if (schedule_capa.max_queue_size && + schedule_capa.max_queue_size < MAX_NUM_PKT) + queue_size = schedule_capa.max_queue_size;
/* Pool should not be larger than queue, otherwise queue enqueues at * packet input may fail. */ diff --git a/test/performance/odp_sched_perf.c b/test/performance/odp_sched_perf.c index bbd76c86..b25c3e19 100644 --- a/test/performance/odp_sched_perf.c +++ b/test/performance/odp_sched_perf.c @@ -251,7 +251,7 @@ static int create_pool(test_global_t *global)
static int create_queues(test_global_t *global) { - odp_queue_capability_t queue_capa; + odp_schedule_capability_t schedule_capa; odp_queue_param_t queue_param; odp_queue_t queue; odp_buffer_t buf; @@ -279,19 +279,20 @@ static int create_queues(test_global_t *global)
printf(" queue type %s\n\n", type_str);
- if (odp_queue_capability(&queue_capa)) { - printf("Error: Queue capa failed.\n"); + if (odp_schedule_capability(&schedule_capa)) { + printf("Error: Schedule capa failed.\n"); return -1; }
- if (tot_queue > queue_capa.sched.max_num) { - printf("Max queues supported %u\n", queue_capa.sched.max_num); + if (tot_queue > schedule_capa.max_queues) { + printf("Max queues supported %u\n", + schedule_capa.max_queues); return -1; }
- if (queue_capa.sched.max_size && - queue_size > queue_capa.sched.max_size) { - printf("Max queue size %u\n", queue_capa.sched.max_size); + if (schedule_capa.max_queue_size && + queue_size > schedule_capa.max_queue_size) { + printf("Max queue size %u\n", schedule_capa.max_queue_size); return -1; }
diff --git a/test/performance/odp_sched_pktio.c b/test/performance/odp_sched_pktio.c index 878dcad0..1faa9b1d 100644 --- a/test/performance/odp_sched_pktio.c +++ b/test/performance/odp_sched_pktio.c @@ -1109,12 +1109,12 @@ static int create_pipeline_queues(test_global_t *test_global) int i, j, k, num_pktio, stages, queues, ctx_size; pipe_queue_context_t *ctx; odp_queue_param_t queue_param; - odp_queue_capability_t queue_capa; + odp_schedule_capability_t schedule_capa; odp_schedule_sync_t sched_sync; int ret = 0;
- if (odp_queue_capability(&queue_capa)) { - printf("Error: Queue capability failed\n"); + if (odp_schedule_capability(&schedule_capa)) { + printf("Error: Schedule capa failed.\n"); return -1; }
@@ -1130,10 +1130,10 @@ static int create_pipeline_queues(test_global_t *test_global) queue_param.sched.group = ODP_SCHED_GROUP_ALL;
queue_param.size = test_global->opt.pipe_queue_size; - if (queue_capa.sched.max_size && - queue_param.size > queue_capa.sched.max_size) { + if (schedule_capa.max_queue_size && + queue_param.size > schedule_capa.max_queue_size) { printf("Error: Pipeline queue max size is %u\n", - queue_capa.sched.max_size); + schedule_capa.max_queue_size); return -1; }
diff --git a/test/performance/odp_scheduling.c b/test/performance/odp_scheduling.c index acc401e0..655a619e 100644 --- a/test/performance/odp_scheduling.c +++ b/test/performance/odp_scheduling.c @@ -813,6 +813,7 @@ int main(int argc, char *argv[]) odph_odpthread_params_t thr_params; odp_queue_capability_t capa; odp_pool_capability_t pool_capa; + odp_schedule_capability_t schedule_capa; uint32_t num_queues, num_buf;
printf("\nODP example starts\n\n"); @@ -908,10 +909,16 @@ int main(int argc, char *argv[]) return -1; }
+ if (odp_schedule_capability(&schedule_capa)) { + printf("Error: Schedule capa failed.\n"); + return -1; + } + globals->queues_per_prio = QUEUES_PER_PRIO; num_queues = globals->queues_per_prio * NUM_PRIOS; - if (num_queues > capa.sched.max_num) - globals->queues_per_prio = capa.sched.max_num / NUM_PRIOS; + if (num_queues > schedule_capa.max_queues) + globals->queues_per_prio = schedule_capa.max_queues / + NUM_PRIOS;
/* One plain queue is also used */ num_queues = (globals->queues_per_prio * NUM_PRIOS) + 1; diff --git a/test/validation/api/queue/queue.c b/test/validation/api/queue/queue.c index 99acc4bf..aab95bab 100644 --- a/test/validation/api/queue/queue.c +++ b/test/validation/api/queue/queue.c @@ -127,18 +127,15 @@ static void queue_test_capa(void) odp_queue_param_t qparams; char name[ODP_QUEUE_NAME_LEN]; odp_queue_t queue[MAX_QUEUES]; - uint32_t num_queues, min, i, j; + uint32_t num_queues, min, i;
memset(&capa, 0, sizeof(odp_queue_capability_t)); CU_ASSERT(odp_queue_capability(&capa) == 0);
CU_ASSERT(capa.max_queues != 0); CU_ASSERT(capa.plain.max_num != 0); - CU_ASSERT(capa.sched.max_num != 0);
min = capa.plain.max_num; - if (min > capa.sched.max_num) - min = capa.sched.max_num;
CU_ASSERT(capa.max_queues >= min);
@@ -150,33 +147,26 @@ static void queue_test_capa(void) odp_queue_param_init(&qparams); CU_ASSERT(qparams.nonblocking == ODP_BLOCKING);
- for (j = 0; j < 2; j++) { - if (j == 0) { - num_queues = capa.plain.max_num; - } else { - num_queues = capa.sched.max_num; - qparams.type = ODP_QUEUE_TYPE_SCHED; - } + num_queues = capa.plain.max_num;
- if (num_queues > MAX_QUEUES) - num_queues = MAX_QUEUES; + if (num_queues > MAX_QUEUES) + num_queues = MAX_QUEUES;
- for (i = 0; i < num_queues; i++) { - generate_name(name, i); - queue[i] = odp_queue_create(name, &qparams); + for (i = 0; i < num_queues; i++) { + generate_name(name, i); + queue[i] = odp_queue_create(name, &qparams);
- if (queue[i] == ODP_QUEUE_INVALID) { - CU_FAIL("Queue create failed"); - num_queues = i; - break; - } - - CU_ASSERT(odp_queue_lookup(name) != ODP_QUEUE_INVALID); + if (queue[i] == ODP_QUEUE_INVALID) { + CU_FAIL("Queue create failed"); + num_queues = i; + break; }
- for (i = 0; i < num_queues; i++) - CU_ASSERT(odp_queue_destroy(queue[i]) == 0); + CU_ASSERT(odp_queue_lookup(name) != ODP_QUEUE_INVALID); } + + for (i = 0; i < num_queues; i++) + CU_ASSERT(odp_queue_destroy(queue[i]) == 0); }
static void queue_test_mode(void) diff --git a/test/validation/api/scheduler/scheduler.c b/test/validation/api/scheduler/scheduler.c index 35c38751..4fdfc243 100644 --- a/test/validation/api/scheduler/scheduler.c +++ b/test/validation/api/scheduler/scheduler.c @@ -20,6 +20,7 @@ #define NUM_BUFS_PAUSE 1000 #define NUM_BUFS_BEFORE_PAUSE 10 #define NUM_GROUPS 2 +#define MAX_QUEUES (64 * 1024)
#define TEST_QUEUE_SIZE_NUM_EV 50
@@ -144,12 +145,16 @@ static void release_context(odp_schedule_sync_t sync) static void scheduler_test_capa(void) { odp_schedule_capability_t capa; + odp_queue_capability_t queue_capa;
memset(&capa, 0, sizeof(odp_schedule_capability_t)); CU_ASSERT_FATAL(odp_schedule_capability(&capa) == 0); + CU_ASSERT_FATAL(odp_queue_capability(&queue_capa) == 0);
CU_ASSERT(capa.max_groups != 0); CU_ASSERT(capa.max_prios != 0); + CU_ASSERT(capa.max_queues != 0); + CU_ASSERT(queue_capa.max_queues >= capa.max_queues); }
static void scheduler_test_wait_time(void) @@ -413,6 +418,7 @@ static void scheduler_test_wait(void) static void scheduler_test_queue_size(void) { odp_queue_capability_t queue_capa; + odp_scheduler_config_t default_config; odp_pool_t pool; odp_pool_param_t pool_param; odp_queue_param_t queue_param; @@ -426,10 +432,11 @@ static void scheduler_test_queue_size(void) ODP_SCHED_SYNC_ORDERED};
CU_ASSERT_FATAL(odp_queue_capability(&queue_capa) == 0); + odp_scheduler_config_init(&default_config); queue_size = TEST_QUEUE_SIZE_NUM_EV; - if (queue_capa.sched.max_size && - queue_size > queue_capa.sched.max_size) - queue_size = queue_capa.sched.max_size; + if (default_config.queue_size && + queue_size > default_config.queue_size) + queue_size = default_config.queue_size;
odp_pool_param_init(&pool_param); pool_param.buf.size = 100; @@ -1684,9 +1691,10 @@ static int create_queues(test_globals_t *globals) }
globals->max_sched_queue_size = BUFS_PER_QUEUE_EXCL; - if (capa.sched.max_size && capa.sched.max_size < BUFS_PER_QUEUE_EXCL) { - printf("Max sched queue size %u\n", capa.sched.max_size); - globals->max_sched_queue_size = capa.sched.max_size; + if (sched_capa.max_queue_size && sched_capa.max_queue_size < + BUFS_PER_QUEUE_EXCL) { + printf("Max sched queue size %u\n", sched_capa.max_queue_size); + globals->max_sched_queue_size = sched_capa.max_queue_size; }
prios = odp_schedule_num_prio(); @@ -1696,7 +1704,7 @@ static int create_queues(test_globals_t *globals) queues_per_prio = QUEUES_PER_PRIO; num_sched = (prios * queues_per_prio * sched_types) + CHAOS_NUM_QUEUES; num_plain = (prios * queues_per_prio); - while ((num_sched > capa.sched.max_num || + while ((num_sched > sched_capa.max_queues || num_plain > capa.plain.max_num || num_sched + num_plain > capa.max_queues) && queues_per_prio) { queues_per_prio--;
commit e6c3654c18ba0054841c3eb89cedc240537c43fa Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Wed Oct 31 13:47:52 2018 +0300
linux-gen: queue, schedule: move scheduled queue capabilities to sched
Move scheduled queue capabilities to odp_schedule_capability_t structure, as they logically belong to ODP scheduler module, rather than queue module.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/odp_queue_basic.c b/platform/linux-generic/odp_queue_basic.c index 1d66ccc7..37a2fad1 100644 --- a/platform/linux-generic/odp_queue_basic.c +++ b/platform/linux-generic/odp_queue_basic.c @@ -57,10 +57,10 @@ static int queue_capa(odp_queue_capability_t *capa, int sched ODP_UNUSED) capa->plain.max_size = queue_glb->config.max_queue_size; capa->plain.lockfree.max_num = queue_glb->queue_lf_num; capa->plain.lockfree.max_size = queue_glb->queue_lf_size; +#if ODP_DEPRECATED_API capa->sched.max_num = capa->max_queues; capa->sched.max_size = queue_glb->config.max_queue_size;
-#if ODP_DEPRECATED_API if (sched) { capa->max_ordered_locks = sched_fn->max_ordered_locks(); capa->max_sched_groups = sched_fn->num_grps(); diff --git a/platform/linux-generic/odp_queue_scalable.c b/platform/linux-generic/odp_queue_scalable.c index 4d5598a8..88abe8c7 100644 --- a/platform/linux-generic/odp_queue_scalable.c +++ b/platform/linux-generic/odp_queue_scalable.c @@ -317,11 +317,11 @@ static int queue_capability(odp_queue_capability_t *capa) capa->max_ordered_locks = sched_fn->max_ordered_locks(); capa->max_sched_groups = sched_fn->num_grps(); capa->sched_prios = odp_schedule_num_prio(); + capa->sched.max_num = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; + capa->sched.max_size = 0; #endif capa->plain.max_num = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; capa->plain.max_size = 0; - capa->sched.max_num = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; - capa->sched.max_size = 0;
return 0; } diff --git a/platform/linux-generic/odp_schedule_basic.c b/platform/linux-generic/odp_schedule_basic.c index 85b4142c..b93e5c41 100644 --- a/platform/linux-generic/odp_schedule_basic.c +++ b/platform/linux-generic/odp_schedule_basic.c @@ -1559,6 +1559,8 @@ static int schedule_capability(odp_schedule_capability_t *capa) capa->max_ordered_locks = schedule_max_ordered_locks(); capa->max_groups = schedule_num_grps(); capa->max_prios = schedule_num_prio(); + capa->max_queues = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; + capa->max_queue_size = queue_glb->config.max_queue_size;
return 0; } diff --git a/platform/linux-generic/odp_schedule_scalable.c b/platform/linux-generic/odp_schedule_scalable.c index 2c681647..091e5ff9 100644 --- a/platform/linux-generic/odp_schedule_scalable.c +++ b/platform/linux-generic/odp_schedule_scalable.c @@ -2114,6 +2114,8 @@ static int schedule_capability(odp_schedule_capability_t *capa) capa->max_ordered_locks = schedule_max_ordered_locks(); capa->max_groups = num_grps(); capa->max_prios = schedule_num_prio(); + capa->max_queues = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; + capa->max_queue_size = 0;
return 0; } diff --git a/platform/linux-generic/odp_schedule_sp.c b/platform/linux-generic/odp_schedule_sp.c index 9c477d71..6cc8f376 100644 --- a/platform/linux-generic/odp_schedule_sp.c +++ b/platform/linux-generic/odp_schedule_sp.c @@ -932,6 +932,8 @@ static int schedule_capability(odp_schedule_capability_t *capa) capa->max_ordered_locks = max_ordered_locks(); capa->max_groups = num_grps(); capa->max_prios = schedule_num_prio(); + capa->max_queues = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; + capa->max_queue_size = queue_glb->config.max_queue_size;
return 0; }
commit 46df93db8213c979751b6183451cc2b5852b0ea9 Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Wed Oct 24 17:50:54 2018 +0300
api: queue, schedule: move scheduled queue capabilities to sched
Move scheduled queue capabilities to odp_schedule_capability_t structure, as they logically belong to ODP scheduler module, rather than queue module.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/include/odp/api/spec/queue_types.h b/include/odp/api/spec/queue_types.h index 9c7c7de9..c8f31046 100644 --- a/include/odp/api/spec/queue_types.h +++ b/include/odp/api/spec/queue_types.h @@ -139,7 +139,8 @@ typedef struct odp_queue_capability_t { * instead */ unsigned int ODP_DEPRECATE(max_sched_groups);
- /** @deprecated Use prios field of odp_schedule_capability_t instead */ + /** @deprecated Use max_prios field of odp_schedule_capability_t + * instead */ unsigned int ODP_DEPRECATE(sched_prios);
/** Plain queue capabilities */ @@ -182,7 +183,8 @@ typedef struct odp_queue_capability_t {
} plain;
- /** Scheduled queue capabilities */ + /** @deprecated Use queue capabilities in odp_schedule_capability_t + * instead */ struct { /** Maximum number of scheduled (ODP_BLOCKING) queues of the * default size. */ @@ -220,7 +222,7 @@ typedef struct odp_queue_capability_t {
} waitfree;
- } sched; + } ODP_DEPRECATE(sched);
} odp_queue_capability_t;
diff --git a/include/odp/api/spec/schedule_types.h b/include/odp/api/spec/schedule_types.h index f55e53f3..e7cc0479 100644 --- a/include/odp/api/spec/schedule_types.h +++ b/include/odp/api/spec/schedule_types.h @@ -14,6 +14,8 @@ #define ODP_API_SPEC_SCHEDULE_TYPES_H_ #include <odp/visibility_begin.h>
+#include <odp/api/support.h> + #ifdef __cplusplus extern "C" { #endif @@ -178,6 +180,24 @@ typedef struct odp_schedule_capability_t { /** Number of scheduling priorities */ uint32_t max_prios;
+ /** Maximum number of scheduled (ODP_BLOCKING) queues of the default + * size. */ + uint32_t max_queues; + + /** Maximum number of events a scheduled (ODP_BLOCKING) queue can store + * simultaneously. The value of zero means that scheduled queues do not + * have a size limit, but a single queue can store all available + * events. */ + uint32_t max_queue_size; + + /** Lock-free (ODP_NONBLOCKING_LF) queues support. + * The specification is the same as for the blocking implementation. */ + odp_support_t lockfree_queues; + + /** Wait-free (ODP_NONBLOCKING_WF) queues support. + * The specification is the same as for the blocking implementation. */ + odp_support_t waitfree_queues; + } odp_schedule_capability_t;
/**
commit 7bdd0e5fd7173a1b8f11ed06a49e8dcb87252f00 Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Wed Oct 24 17:49:29 2018 +0300
example, tests: move scheduler capabilities to scheduler
Add odp_schedule_capability() call to query scheduler capabilities. Move basic scheduler capabilities to new odp_schedule_capability_t structure.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/example/sysinfo/odp_sysinfo.c b/example/sysinfo/odp_sysinfo.c index ff79d893..cd0c6bfd 100644 --- a/example/sysinfo/odp_sysinfo.c +++ b/example/sysinfo/odp_sysinfo.c @@ -238,6 +238,7 @@ int main(void) odp_queue_capability_t queue_capa; odp_timer_capability_t timer_capa; odp_crypto_capability_t crypto_capa; + odp_schedule_capability_t schedule_capa; uint64_t huge_page[MAX_HUGE_PAGES]; char ava_mask_str[ODP_CPUMASK_STR_SIZE]; char work_mask_str[ODP_CPUMASK_STR_SIZE]; @@ -293,6 +294,11 @@ int main(void) return -1; }
+ if (odp_schedule_capability(&schedule_capa)) { + printf("schedule capability failed\n"); + return -1; + } + if (odp_timer_capability(ODP_CLOCK_CPU, &timer_capa)) { printf("timer capability failed\n"); return -1; @@ -393,9 +399,9 @@ int main(void) printf("\n"); printf(" SCHEDULER\n"); printf(" max ordered locks: %" PRIu32 "\n", - queue_capa.max_ordered_locks); - printf(" max groups: %u\n", queue_capa.max_sched_groups); - printf(" priorities: %u\n", queue_capa.sched_prios); + schedule_capa.max_ordered_locks); + printf(" max groups: %u\n", schedule_capa.max_groups); + printf(" priorities: %u\n", schedule_capa.prios); printf(" sched.max_num: %" PRIu32 "\n", queue_capa.sched.max_num); printf(" sched.max_size: %" PRIu32 "\n", diff --git a/test/performance/odp_pktio_ordered.c b/test/performance/odp_pktio_ordered.c index 2e0ff578..1b4b756a 100644 --- a/test/performance/odp_pktio_ordered.c +++ b/test/performance/odp_pktio_ordered.c @@ -1062,6 +1062,7 @@ int main(int argc, char *argv[]) odp_pool_param_t params; odp_shm_t shm; odp_queue_capability_t queue_capa; + odp_schedule_capability_t schedule_capa; odp_pool_capability_t pool_capa; odph_ethaddr_t new_addr; odph_helper_options_t helper_options; @@ -1103,6 +1104,11 @@ int main(int argc, char *argv[]) exit(EXIT_FAILURE); }
+ if (odp_schedule_capability(&schedule_capa)) { + printf("Error: Schedule capa failed.\n"); + return -1; + } + if (odp_pool_capability(&pool_capa)) { LOG_ERR("Error: Pool capa failed\n"); exit(EXIT_FAILURE); @@ -1131,7 +1137,7 @@ int main(int argc, char *argv[])
if (gbl_args->appl.in_mode == SCHED_ORDERED) { /* At least one ordered lock required */ - if (queue_capa.max_ordered_locks < 1) { + if (schedule_capa.max_ordered_locks < 1) { LOG_ERR("Error: Ordered locks not available.\n"); exit(EXIT_FAILURE); } diff --git a/test/validation/api/classification/odp_classification_tests.c b/test/validation/api/classification/odp_classification_tests.c index 41201d4a..4f722140 100644 --- a/test/validation/api/classification/odp_classification_tests.c +++ b/test/validation/api/classification/odp_classification_tests.c @@ -152,16 +152,16 @@ void configure_cls_pmr_chain(void) uint32_t addr; uint32_t mask; odp_pmr_param_t pmr_param; - odp_queue_capability_t queue_capa; + odp_schedule_capability_t schedule_capa;
- CU_ASSERT_FATAL(odp_queue_capability(&queue_capa) == 0); + CU_ASSERT_FATAL(odp_schedule_capability(&schedule_capa) == 0);
odp_queue_param_init(&qparam); qparam.type = ODP_QUEUE_TYPE_SCHED; qparam.sched.prio = odp_schedule_default_prio(); qparam.sched.sync = ODP_SCHED_SYNC_PARALLEL; qparam.sched.group = ODP_SCHED_GROUP_ALL; - qparam.sched.lock_count = queue_capa.max_ordered_locks; + qparam.sched.lock_count = schedule_capa.max_ordered_locks; sprintf(queuename, "%s", "SrcQueue");
queue_list[CLS_PMR_CHAIN_SRC] = odp_queue_create(queuename, &qparam); diff --git a/test/validation/api/queue/queue.c b/test/validation/api/queue/queue.c index cf081a99..99acc4bf 100644 --- a/test/validation/api/queue/queue.c +++ b/test/validation/api/queue/queue.c @@ -133,8 +133,6 @@ static void queue_test_capa(void) CU_ASSERT(odp_queue_capability(&capa) == 0);
CU_ASSERT(capa.max_queues != 0); - CU_ASSERT(capa.max_sched_groups != 0); - CU_ASSERT(capa.sched_prios != 0); CU_ASSERT(capa.plain.max_num != 0); CU_ASSERT(capa.sched.max_num != 0);
@@ -715,6 +713,7 @@ static void queue_test_info(void) odp_queue_info_t info; odp_queue_param_t param; odp_queue_capability_t capability; + odp_schedule_capability_t sched_capa; char q_plain_ctx[] = "test_q_plain context data"; char q_order_ctx[] = "test_q_order context data"; uint32_t lock_count; @@ -729,13 +728,14 @@ static void queue_test_info(void)
memset(&capability, 0, sizeof(odp_queue_capability_t)); CU_ASSERT(odp_queue_capability(&capability) == 0); + CU_ASSERT(odp_schedule_capability(&sched_capa) == 0); /* Create a scheduled ordered queue with explicitly set params */ odp_queue_param_init(¶m); param.type = ODP_QUEUE_TYPE_SCHED; param.sched.prio = odp_schedule_default_prio(); param.sched.sync = ODP_SCHED_SYNC_ORDERED; param.sched.group = ODP_SCHED_GROUP_ALL; - param.sched.lock_count = capability.max_ordered_locks; + param.sched.lock_count = sched_capa.max_ordered_locks; if (param.sched.lock_count == 0) printf("\n Ordered locks NOT supported\n"); param.context = q_order_ctx; diff --git a/test/validation/api/scheduler/scheduler.c b/test/validation/api/scheduler/scheduler.c index 2f66f526..35c38751 100644 --- a/test/validation/api/scheduler/scheduler.c +++ b/test/validation/api/scheduler/scheduler.c @@ -141,6 +141,17 @@ static void release_context(odp_schedule_sync_t sync) odp_schedule_release_ordered(); }
+static void scheduler_test_capa(void) +{ + odp_schedule_capability_t capa; + + memset(&capa, 0, sizeof(odp_schedule_capability_t)); + CU_ASSERT_FATAL(odp_schedule_capability(&capa) == 0); + + CU_ASSERT(capa.max_groups != 0); + CU_ASSERT(capa.max_prios != 0); +} + static void scheduler_test_wait_time(void) { int i; @@ -1643,6 +1654,7 @@ static int create_queues(test_globals_t *globals) { int i, j, prios, rc; odp_queue_capability_t capa; + odp_schedule_capability_t sched_capa; odp_pool_t queue_ctx_pool; odp_pool_param_t params; odp_buffer_t queue_ctx_buf; @@ -1659,11 +1671,16 @@ static int create_queues(test_globals_t *globals) return -1; }
+ if (odp_schedule_capability(&sched_capa) < 0) { + printf("Queue capability query failed\n"); + return -1; + } + /* Limit to test maximum */ - if (capa.max_ordered_locks > MAX_ORDERED_LOCKS) { - capa.max_ordered_locks = MAX_ORDERED_LOCKS; + if (sched_capa.max_ordered_locks > MAX_ORDERED_LOCKS) { + sched_capa.max_ordered_locks = MAX_ORDERED_LOCKS; printf("Testing only %u ordered locks\n", - capa.max_ordered_locks); + sched_capa.max_ordered_locks); }
globals->max_sched_queue_size = BUFS_PER_QUEUE_EXCL; @@ -1764,7 +1781,7 @@ static int create_queues(test_globals_t *globals)
snprintf(name, sizeof(name), "sched_%d_%d_o", i, j); p.sched.sync = ODP_SCHED_SYNC_ORDERED; - p.sched.lock_count = capa.max_ordered_locks; + p.sched.lock_count = sched_capa.max_ordered_locks; p.size = 0; q = odp_queue_create(name, &p);
@@ -1773,12 +1790,12 @@ static int create_queues(test_globals_t *globals) return -1; } if (odp_queue_lock_count(q) != - capa.max_ordered_locks) { + sched_capa.max_ordered_locks) { printf("Queue %" PRIu64 " created with " "%d locks instead of expected %d\n", odp_queue_to_u64(q), odp_queue_lock_count(q), - capa.max_ordered_locks); + sched_capa.max_ordered_locks); return -1; }
@@ -1795,7 +1812,7 @@ static int create_queues(test_globals_t *globals) qctx->sequence = 0;
for (ndx = 0; - ndx < capa.max_ordered_locks; + ndx < sched_capa.max_ordered_locks; ndx++) { qctx->lock_sequence[ndx] = 0; } @@ -1949,6 +1966,7 @@ static int scheduler_suite_term(void) }
odp_testinfo_t scheduler_suite[] = { + ODP_TEST_INFO(scheduler_test_capa), ODP_TEST_INFO(scheduler_test_wait_time), ODP_TEST_INFO(scheduler_test_num_prio), ODP_TEST_INFO(scheduler_test_queue_destroy),
commit 5d32b43317b92a88032b29f8d5158f49d8648c7e Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Fri Oct 26 03:00:43 2018 +0300
linux-gen: queue, schedule: move scheduler capabilities to scheduler
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/include/odp_schedule_if.h b/platform/linux-generic/include/odp_schedule_if.h index 5f7f2c4d..88961269 100644 --- a/platform/linux-generic/include/odp_schedule_if.h +++ b/platform/linux-generic/include/odp_schedule_if.h @@ -90,6 +90,7 @@ void sched_cb_pktio_stop_finalize(int pktio_index); /* API functions */ typedef struct { uint64_t (*schedule_wait_time)(uint64_t ns); + int (*schedule_capability)(odp_schedule_capability_t *capa); odp_event_t (*schedule)(odp_queue_t *from, uint64_t wait); int (*schedule_multi)(odp_queue_t *from, uint64_t wait, odp_event_t events[], int num); diff --git a/platform/linux-generic/odp_queue_basic.c b/platform/linux-generic/odp_queue_basic.c index b1f9bd0e..1d66ccc7 100644 --- a/platform/linux-generic/odp_queue_basic.c +++ b/platform/linux-generic/odp_queue_basic.c @@ -47,7 +47,7 @@ static int queue_init(queue_entry_t *queue, const char *name, queue_global_t *queue_glb; extern _odp_queue_inline_offset_t _odp_queue_inline_offset;
-static int queue_capa(odp_queue_capability_t *capa, int sched) +static int queue_capa(odp_queue_capability_t *capa, int sched ODP_UNUSED) { memset(capa, 0, sizeof(odp_queue_capability_t));
@@ -60,11 +60,13 @@ static int queue_capa(odp_queue_capability_t *capa, int sched) capa->sched.max_num = capa->max_queues; capa->sched.max_size = queue_glb->config.max_queue_size;
+#if ODP_DEPRECATED_API if (sched) { capa->max_ordered_locks = sched_fn->max_ordered_locks(); capa->max_sched_groups = sched_fn->num_grps(); capa->sched_prios = odp_schedule_num_prio(); } +#endif
return 0; } diff --git a/platform/linux-generic/odp_queue_scalable.c b/platform/linux-generic/odp_queue_scalable.c index ac85d10a..4d5598a8 100644 --- a/platform/linux-generic/odp_queue_scalable.c +++ b/platform/linux-generic/odp_queue_scalable.c @@ -313,9 +313,11 @@ static int queue_capability(odp_queue_capability_t *capa)
/* Reserve some queues for internal use */ capa->max_queues = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; +#if ODP_DEPRECATED_API capa->max_ordered_locks = sched_fn->max_ordered_locks(); capa->max_sched_groups = sched_fn->num_grps(); capa->sched_prios = odp_schedule_num_prio(); +#endif capa->plain.max_num = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; capa->plain.max_size = 0; capa->sched.max_num = ODP_CONFIG_QUEUES - NUM_INTERNAL_QUEUES; diff --git a/platform/linux-generic/odp_schedule_basic.c b/platform/linux-generic/odp_schedule_basic.c index 0b226e4f..85b4142c 100644 --- a/platform/linux-generic/odp_schedule_basic.c +++ b/platform/linux-generic/odp_schedule_basic.c @@ -1550,6 +1550,17 @@ static int schedule_num_grps(void) static void schedule_config(schedule_config_t *config) { *config = *(&sched->config_if); +}; + +static int schedule_capability(odp_schedule_capability_t *capa) +{ + memset(capa, 0, sizeof(odp_schedule_capability_t)); + + capa->max_ordered_locks = schedule_max_ordered_locks(); + capa->max_groups = schedule_num_grps(); + capa->max_prios = schedule_num_prio(); + + return 0; }
/* Fill in scheduler interface */ @@ -1575,6 +1586,7 @@ const schedule_fn_t schedule_basic_fn = { /* Fill in scheduler API calls */ const schedule_api_t schedule_basic_api = { .schedule_wait_time = schedule_wait_time, + .schedule_capability = schedule_capability, .schedule = schedule, .schedule_multi = schedule_multi, .schedule_multi_wait = schedule_multi_wait, diff --git a/platform/linux-generic/odp_schedule_if.c b/platform/linux-generic/odp_schedule_if.c index 4d50a13f..92e0a62f 100644 --- a/platform/linux-generic/odp_schedule_if.c +++ b/platform/linux-generic/odp_schedule_if.c @@ -30,6 +30,11 @@ uint64_t odp_schedule_wait_time(uint64_t ns) return sched_api->schedule_wait_time(ns); }
+int odp_schedule_capability(odp_schedule_capability_t *capa) +{ + return sched_api->schedule_capability(capa); +} + odp_event_t odp_schedule(odp_queue_t *from, uint64_t wait) { return sched_api->schedule(from, wait); diff --git a/platform/linux-generic/odp_schedule_scalable.c b/platform/linux-generic/odp_schedule_scalable.c index 957398ca..2c681647 100644 --- a/platform/linux-generic/odp_schedule_scalable.c +++ b/platform/linux-generic/odp_schedule_scalable.c @@ -2107,6 +2107,17 @@ static uint32_t schedule_max_ordered_locks(void) return CONFIG_QUEUE_MAX_ORD_LOCKS; }
+static int schedule_capability(odp_schedule_capability_t *capa) +{ + memset(capa, 0, sizeof(odp_schedule_capability_t)); + + capa->max_ordered_locks = schedule_max_ordered_locks(); + capa->max_groups = num_grps(); + capa->max_prios = schedule_num_prio(); + + return 0; +} + const schedule_fn_t schedule_scalable_fn = { .pktio_start = pktio_start, .thr_add = thr_add, @@ -2127,6 +2138,7 @@ const schedule_fn_t schedule_scalable_fn = {
const schedule_api_t schedule_scalable_api = { .schedule_wait_time = schedule_wait_time, + .schedule_capability = schedule_capability, .schedule = schedule, .schedule_multi = schedule_multi, .schedule_multi_wait = schedule_multi_wait, diff --git a/platform/linux-generic/odp_schedule_sp.c b/platform/linux-generic/odp_schedule_sp.c index f55e2151..9c477d71 100644 --- a/platform/linux-generic/odp_schedule_sp.c +++ b/platform/linux-generic/odp_schedule_sp.c @@ -925,6 +925,17 @@ static void order_unlock(void) { }
+static int schedule_capability(odp_schedule_capability_t *capa) +{ + memset(capa, 0, sizeof(odp_schedule_capability_t)); + + capa->max_ordered_locks = max_ordered_locks(); + capa->max_groups = num_grps(); + capa->max_prios = schedule_num_prio(); + + return 0; +} + /* Fill in scheduler interface */ const schedule_fn_t schedule_sp_fn = { .pktio_start = pktio_start, @@ -947,6 +958,7 @@ const schedule_fn_t schedule_sp_fn = { /* Fill in scheduler API calls */ const schedule_api_t schedule_sp_api = { .schedule_wait_time = schedule_wait_time, + .schedule_capability = schedule_capability, .schedule = schedule, .schedule_multi = schedule_multi, .schedule_multi_wait = schedule_multi_wait,
commit 5344c8641d2c4e37d9c83ed22a19e56aeee074f5 Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Fri Oct 26 02:50:26 2018 +0300
linux-gen: move NUM_INTERNAL_QUEUES to config
It is really a config value, that allows one to select amount of queues to be reserved for platform internal use, so move it to config header.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/include/odp_config_internal.h b/platform/linux-generic/include/odp_config_internal.h index 642de685..b6c4329a 100644 --- a/platform/linux-generic/include/odp_config_internal.h +++ b/platform/linux-generic/include/odp_config_internal.h @@ -26,6 +26,11 @@ extern "C" { */ #define ODP_CONFIG_QUEUES 1024
+/* + * Queues reserved for ODP internal use + */ +#define NUM_INTERNAL_QUEUES 64 + /* * Maximum number of ordered locks per queue */ diff --git a/platform/linux-generic/odp_queue_basic.c b/platform/linux-generic/odp_queue_basic.c index f02a9a32..b1f9bd0e 100644 --- a/platform/linux-generic/odp_queue_basic.c +++ b/platform/linux-generic/odp_queue_basic.c @@ -30,8 +30,6 @@ #include <odp/api/plat/queue_inline_types.h> #include <odp_global_data.h>
-#define NUM_INTERNAL_QUEUES 64 - #include <odp/api/plat/ticketlock_inlines.h> #define LOCK(queue_ptr) odp_ticketlock_lock(&((queue_ptr)->s.lock)) #define UNLOCK(queue_ptr) odp_ticketlock_unlock(&((queue_ptr)->s.lock)) diff --git a/platform/linux-generic/odp_queue_scalable.c b/platform/linux-generic/odp_queue_scalable.c index 5bff1354..ac85d10a 100644 --- a/platform/linux-generic/odp_queue_scalable.c +++ b/platform/linux-generic/odp_queue_scalable.c @@ -33,8 +33,6 @@ #include <string.h> #include <inttypes.h>
-#define NUM_INTERNAL_QUEUES 64 - #define MIN(a, b) \ ({ \ __typeof__(a) tmp_a = (a); \
commit 7d8426f78f9f8b6855906fa46793d0549b9d6560 Author: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Date: Wed Oct 24 17:49:29 2018 +0300
api: queue, schedule: move scheduler capabilities to scheduler
Add odp_schedule_capability() call to query scheduler capabilities. Move basic scheduler capabilities to new odp_schedule_capability_t structure.
Signed-off-by: Dmitry Eremin-Solenikov dmitry.ereminsolenikov@linaro.org Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Reviewed-by: Bill Fischofer bill.fischofer@linaro.org Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/include/odp/api/spec/queue_types.h b/include/odp/api/spec/queue_types.h index be7e79a8..9c7c7de9 100644 --- a/include/odp/api/spec/queue_types.h +++ b/include/odp/api/spec/queue_types.h @@ -19,6 +19,7 @@ extern "C" { #endif
#include <odp/api/schedule_types.h> +#include <odp/api/deprecated.h>
/** @addtogroup odp_queue * @{ @@ -130,14 +131,16 @@ typedef struct odp_queue_capability_t { * types are used simultaneously. */ uint32_t max_queues;
- /** Maximum number of ordered locks per queue */ - uint32_t max_ordered_locks; + /** @deprecated Use max_ordered_locks field of + * odp_schedule_capability_t instead */ + uint32_t ODP_DEPRECATE(max_ordered_locks);
- /** Maximum number of scheduling groups */ - unsigned max_sched_groups; + /** @deprecated Use max_groups field of odp_schedule_capability_t + * instead */ + unsigned int ODP_DEPRECATE(max_sched_groups);
- /** Number of scheduling priorities */ - unsigned sched_prios; + /** @deprecated Use prios field of odp_schedule_capability_t instead */ + unsigned int ODP_DEPRECATE(sched_prios);
/** Plain queue capabilities */ struct { diff --git a/include/odp/api/spec/schedule.h b/include/odp/api/spec/schedule.h index d9b868e3..6538c509 100644 --- a/include/odp/api/spec/schedule.h +++ b/include/odp/api/spec/schedule.h @@ -257,6 +257,18 @@ int odp_schedule_default_prio(void); */ int odp_schedule_num_prio(void);
+/** + * Query scheduler capabilities + * + * Outputs schedule capabilities on success. + * + * @param[out] capa Pointer to capability structure for output + * + * @retval 0 on success + * @retval <0 on failure + */ +int odp_schedule_capability(odp_schedule_capability_t *capa); + /** * Schedule group create * diff --git a/include/odp/api/spec/schedule_types.h b/include/odp/api/spec/schedule_types.h index 76afc6dd..f55e53f3 100644 --- a/include/odp/api/spec/schedule_types.h +++ b/include/odp/api/spec/schedule_types.h @@ -165,6 +165,21 @@ typedef struct odp_schedule_param_t { uint32_t lock_count; } odp_schedule_param_t;
+/** + * Scheduler capabilities + */ +typedef struct odp_schedule_capability_t { + /** Maximum number of ordered locks per queue */ + uint32_t max_ordered_locks; + + /** Maximum number of scheduling groups */ + uint32_t max_groups; + + /** Number of scheduling priorities */ + uint32_t max_prios; + +} odp_schedule_capability_t; + /** * @} */
commit ba5346d8c91a29d229a103d2a937d5739f13ce51 Author: Matias Elo matias.elo@nokia.com Date: Wed Sep 26 13:25:06 2018 +0300
helper: threads: add ODPH_PROC_MODE environment variable
ODPH_PROC_MODE environment variable can be used to enable process mode. Setting environment variable is simpler in CI compared to using command line arguments.
Signed-off-by: Matias Elo matias.elo@nokia.com Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/helper/threads.c b/helper/threads.c index 01bc33ea..d35e603b 100644 --- a/helper/threads.c +++ b/helper/threads.c @@ -337,6 +337,13 @@ int odph_parse_options(int argc, char *argv[]) if (env && atoi(env)) helper_options.mem_model = ODP_MEM_MODEL_PROCESS;
+ /* Enable process mode using environment variable. Setting environment + * variable is easier for CI testing compared to command line + * argument. */ + env = getenv("ODPH_PROC_MODE"); + if (env && atoi(env)) + helper_options.proc = 1; + /* Find and remove option */ for (i = 0; i < argc;) { if (strcmp(argv[i], "--odph_proc") == 0) {
commit fcac2a0dfedfabafae53b698b4e021d8202ef965 Author: Josep Puigdemont josep.puigdemont@linaro.org Date: Thu Sep 6 13:06:09 2018 +0200
linux-gen: ishm: make huge page cache size dynamic
Signed-off-by: Josep Puigdemont josep.puigdemont@linaro.org Reviewed-and-tested-by: Matias Elo matias.elo@nokia.com Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/platform/linux-generic/odp_ishm.c b/platform/linux-generic/odp_ishm.c index 875f9f9d..8be916c4 100644 --- a/platform/linux-generic/odp_ishm.c +++ b/platform/linux-generic/odp_ishm.c @@ -346,6 +346,21 @@ static void hp_init(void) hpc->idx = -1; hpc->len = odp_sys_huge_page_size();
+ addr = mmap(NULL, + sizeof(struct huge_page_cache) + sizeof(int) * count, + PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); + if (addr == MAP_FAILED) { + ODP_ERR("Unable to mmap memory for huge page cache\n."); + return; + } + + hpc = addr; + + hpc->max_fds = count; + hpc->total = 0; + hpc->idx = -1; + hpc->len = odp_sys_huge_page_size(); + for (int i = 0; i < count; ++i) { int fd;
commit da730188aa6fb9f58145a697ad002ecfd102f898 Author: Balasubramanian Manoharan bala.manoharan@linaro.org Date: Tue Apr 24 20:09:37 2018 +0530
api: comp: compression specification
ODP Compression specification
Signed-off-by: Balasubramanian Manoharan bala.manoharan@linaro.org Signed-off-by: Shally Verma shally.verma@cavium.com Signed-off-by: Mahipal Challa mahipal.challa@cavium.com Reviewed-by: Petri Savolainen petri.savolainen@linaro.org Reviewed-by: Bogdan Pricope bogdan.pricope@linaro.org Signed-off-by: Maxim Uvarov maxim.uvarov@linaro.org
diff --git a/include/odp/api/abi-default/comp.h b/include/odp/api/abi-default/comp.h new file mode 100644 index 00000000..8a1145af --- /dev/null +++ b/include/odp/api/abi-default/comp.h @@ -0,0 +1,35 @@ +/* Copyright (c) 2018, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef ODP_ABI_COMP_H_ +#define ODP_ABI_COMP_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include <stdint.h> + +/** @internal Dummy type for strong typing */ +typedef struct { char dummy; /**< @internal Dummy */ } _odp_abi_comp_session_t; + +/** @ingroup odp_compression + * @{ + */ + +typedef _odp_abi_comp_session_t *odp_comp_session_t; + +#define ODP_COMP_SESSION_INVALID ((odp_comp_session_t)0) + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/odp/api/spec/comp.h b/include/odp/api/spec/comp.h new file mode 100644 index 00000000..a5eb5a23 --- /dev/null +++ b/include/odp/api/spec/comp.h @@ -0,0 +1,613 @@ +/* Copyright (c) 2018, Linaro Limited + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +/** + * @file + * + * ODP Compression + */ + +#ifndef ODP_API_COMP_H_ +#define ODP_API_COMP_H_ + +#include <odp/visibility_begin.h> +#include <odp/api/support.h> +#include <odp/api/packet.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** @defgroup odp_compression ODP COMP + * Operations for Compression and Decompression API. + * Hash calculation may be combined with de-/compression operations + * + * @{ + */ + +/** + * @def ODP_COMP_SESSION_INVALID + * Invalid session handle + */ + +/** + * @typedef odp_comp_session_t + * Compression/Decompression session handle + */ + +/** + * Compression operation mode + */ +typedef enum { + /** Synchronous Compression operation + * + * Application uses synchronous operation, + * which outputs all results on function return. + * */ + ODP_COMP_OP_MODE_SYNC, + + /** Asynchronous Compression operation + * + * Application uses asynchronous operation, + * which return results via events. + * */ + ODP_COMP_OP_MODE_ASYNC +} odp_comp_op_mode_t; + +/** + * Compression operation type. + */ +typedef enum { + /** Operation type - Compress */ + ODP_COMP_OP_COMPRESS, + + /** Operation type - Decompress */ + ODP_COMP_OP_DECOMPRESS +} odp_comp_op_t; + +/** + * Compression hash algorithms + */ +typedef enum { + /** No hash algorithm selected. */ + ODP_COMP_HASH_ALG_NONE, + + /** SHA-1 hash algorithm. */ + ODP_COMP_HASH_ALG_SHA1, + + /** SHA-2 hash algorithm 256-bit digest length. */ + ODP_COMP_HASH_ALG_SHA256 +} odp_comp_hash_alg_t; + +/** + * Compression algorithms + * + */ +typedef enum { + /** No algorithm specified. Added for testing purpose. */ + ODP_COMP_ALG_NULL, + + /** DEFLATE - RFC1951 */ + ODP_COMP_ALG_DEFLATE, + + /** ZLIB - RFC1950 */ + ODP_COMP_ALG_ZLIB, + + /** LZS */ + ODP_COMP_ALG_LZS +} odp_comp_alg_t; + +/** + * Compression operation status codes + */ +typedef enum { + /** Operation completed successfully*/ + ODP_COMP_STATUS_SUCCESS, + + /** Operation terminated due to insufficient output buffer */ + ODP_COMP_STATUS_OUT_OF_SPACE_TERM, + + /** Operation failure */ + ODP_COMP_STATUS_FAILURE, +} odp_comp_status_t; + +/** + * Hash algorithms in a bit field structure + */ +typedef union odp_comp_hash_algos_t { + /** hash algorithms */ + struct { + /** ODP_COMP_HASH_ALG_NONE */ + uint32_t none : 1, + + /** ODP_COMP_HASH_ALG_SHA1 */ + uint32_t sha1 : 1; + + /** ODP_COMP_HASH_ALG_SHA256 */ + uint32_t sha256 : 1; + + } bit; + + /** All bits of the bit field structure + * + * This field can be used to set/clear all flags, or bitwise + * operations over the entire structure. + */ + uint32_t all_bits; +} odp_comp_hash_algos_t; + +/** + * Compression algorithms in a bit field structure + */ +typedef union odp_comp_algos_t { + /** Compression algorithms */ + struct { + /** ODP_COMP_ALG_NULL */ + uint32_t null : 1; + + /** ODP_COMP_ALG_DEFLATE */ + uint32_t deflate : 1; + + /** ODP_COMP_ALG_ZLIB */ + uint32_t zlib : 1; + + /** ODP_COMP_ALG_LZS */ + uint32_t lzs : 1; + } bit; + + /** All bits of the bit field structure + * This field can be used to set/clear all flags, or bitwise + * operations over the entire structure. + */ + uint32_t all_bits; +} odp_comp_algos_t; + +/** + * Compression Interface Capabilities + */ +typedef struct odp_comp_capability_t { + /** Maximum number of sessions */ + uint32_t max_sessions; + + /** Supported compression algorithms */ + odp_comp_algos_t comp_algos; + + /** Supported hash algorithms */ + odp_comp_hash_algos_t hash_algos; + + /** Synchronous compression mode support (ODP_COMP_OP_MODE_SYNC) */ + odp_support_t sync; + + /** Aynchronous compression mode support (ODP_COMP_OP_MODE_SSYNC) */ + odp_support_t async; +} odp_comp_capability_t; + +/** + * Hash algorithm capabilities + */ +typedef struct odp_comp_hash_alg_capability_t { + /** Digest length in bytes */ + uint32_t digest_len; +} odp_comp_hash_alg_capability_t; + +/** + * Compression algorithm capabilities + */ +typedef struct odp_comp_alg_capability_t { + + /** Maximum compression level supported by implementation of this + * algorithm. Indicates number of compression levels supported by + * implementation. Valid range from (1 ... max_level) + */ + uint32_t max_level; + + /** Supported hash algorithms */ + odp_comp_hash_algos_t hash_algo; + + /** Compression ratio + * Optimal compression operation ratio for this algorithm. + * This is an estimate of maximum compression operation output for this + * algorithm. It is expressed as a percentage of maximum expected + * output data size with respect to input data size. + * i.e a value of 200% denotes the output data is 2x times the input + * data size. This is an optimal/most case estimate and it is possible + * that the percentage of output data produced might be greater + * than this value. + * + * @see odp__percent_t + */ + odp_percent_t compression_ratio; +} odp_comp_alg_capability_t; + +/** + * Compression Huffman type. Used by DEFLATE algorithm + */ +typedef enum odp_comp_huffman_code { + /** Fixed Huffman code */ + ODP_COMP_HUFFMAN_FIXED, + + /** Dynamic Huffman code */ + ODP_COMP_HUFFMAN_DYNAMIC, + + /** Default huffman code selected by implementation */ + ODP_COMP_HUFFMAN_DEFAULT, +} odp_comp_huffman_code_t; + +/** + * Compression DEFLATEe algorithm parameters. + * Also initialized by other deflate based algorithms , ex. ZLIB + */ +typedef struct odp_comp_deflate_param { + /** + * Compression level + * + * Valid range is integer between (0 ... max_level) + * level supported by the implementation. + * + * where, + * 0 - implemention default + * + * 1 - fastest compression i.e. output produced at + * best possible speed at the expense of compression quality + * + * max_level - High quality compression + * + * @see 'max_level' in odp_comp_alg_capability_t + */ + uint32_t comp_level; + + /** huffman code to use */ + odp_comp_huffman_code_t huffman_code; +} odp_comp_deflate_param_t; + +/** + * Compression algorithm specific parameters + */ +typedef union odp_comp_alg_param_t { + /** deflate parameter */ + odp_comp_deflate_param_t deflate; + + /** Struct for defining zlib algorithm parameters */ + struct { + /** deflate algo params */ + odp_comp_deflate_param_t deflate; + } zlib; +} odp_comp_alg_param_t; + + /** + * Compression session creation parameters + */ +typedef struct odp_comp_session_param_t { + /** Compression operation type Compress vs Decompress */ + odp_comp_op_t op; + + /** Compression operation mode + * + * Operation mode Synchronous vs Asynchronous + * + * @see odp_comp_op(), odp_comp_op_enq() + */ + odp_comp_op_mode_t mode; + + /** Compression algorithm + * + * @see odp_comp_capability() + */ + odp_comp_alg_t comp_algo; + + /** Hash algorithm + * + * @see odp_comp_alg_capability() + */ + odp_comp_hash_alg_t hash_algo; + + /** parameters specific to compression */ + odp_comp_alg_param_t alg_param; + + /** Session packet enqueue ordering + * Boolean to indicate if packet enqueue ordering is required per + * session. Valid only for Asynchronous operation mode + * (ODP_COMP_OP_MODE_ASYNC). Packet order is always maintained for + * synchronous operation mode (ODP_COMP_OP_MODE_SYNC) + * + * true: packet session enqueue order maintained + * + * false: packet session enqueue order is not maintained + * + * @note: By disabling packet order requirement, performance oriented + * application can leverage HW offered parallelism to increase operation + * performance. + */ + odp_bool_t packet_order; + + /** Destination queue for compression operations result. + * Results are enqueued as ODP_EVENT_PACKET with subtype + * ODP_EVENT_PACKET_COMP + */ + odp_queue_t compl_queue; +} odp_comp_session_param_t; + +/** + * Compression packet operation result + */ +typedef struct odp_comp_packet_result_t { + /** Operation status code */ + odp_comp_status_t status; + + /** Input packet handle */ + odp_packet_t pkt_in; + + /** Output packet data range + * Specifies offset and length of data resulting from compression + * operation. When hashing is configured output_data_range.len equals + * length of output data + 'digest+len' + */ + odp_packet_data_range_t output_data_range; +} odp_comp_packet_result_t; + +/** + * Compression per packet operation parameters + */ +typedef struct odp_comp_packet_op_param_t { + /** Session handle */ + odp_comp_session_t session; + + /** Input data range to process. where, + * + * offset - starting offset + * length - length of data for compression operation + * */ + odp_packet_data_range_t in_data_range; + + /** Output packet data range. + * Indicates where processed packet will be written. where, + * + * offset - starting offset + * length - length of buffer available for output + * + * Output packet data is not modified outside of this provided data + * range. If output data length is not sufficient for compression + * operation ODP_COMP_STATUS_OUT_OF_SPACE_TERM error will occur + */ + odp_packet_data_range_t out_data_range; +} odp_comp_packet_op_param_t; + +/** + * Query compression capabilities + * + * Output compression capabilities on success. + * + * @param[out] capa Pointer to capability structure for output + * + * @retval 0 on success + * @retval <0 on failure + */ +int odp_comp_capability(odp_comp_capability_t *capa); + +/** + * Query supported compression algorithm capabilities + * + * Output algorithm capabilities. + * + * @param comp Compression algorithm + * @param[out] capa Compression algorithm capability + * + * @retval 0 on success + * @retval <0 on failure + */ +int odp_comp_alg_capability(odp_comp_alg_t comp, + odp_comp_alg_capability_t *capa); + +/** + * Query supported hash algorithm capabilities + * + * Outputs all supported configuration options for the algorithm. + * + * @param hash Hash algorithm + * @param capa Hash algorithm capability + * + * @retval 0 on success + * @retval <0 on failure + */ +int odp_comp_hash_alg_capability(odp_comp_hash_alg_t hash, + odp_comp_hash_alg_capability_t *capa); + +/** + * Initialize compression session parameters + * + * Initialize an odp_comp_session_param_t to its default values for + * all fields. + * + * @param param Pointer to odp_comp_session_param_t to be initialized + */ +void odp_comp_session_param_init(odp_comp_session_param_t *param); + +/** + * Compression session creation + * + * Create a comp session according to the session parameters. Use + * odp_comp_session_param_init() to initialize parameters into their + * default values. + * + * @param param Session parameters + * + * @retval Comp session handle + * @retval ODP_COMP_SESSION_INVALID on failure + */ +odp_comp_session_t +odp_comp_session_create(const odp_comp_session_param_t *param); + +/** + * Compression session destroy + * + * Destroy an unused session. Result is undefined if session is being used + * (i.e. asynchronous operation is in progress). + * + * @param session Session handle + * + * @retval 0 on success + * @retval <0 on failure + */ +int odp_comp_session_destroy(odp_comp_session_t session); + +/** + * Synchronous packet compression operation + * + * This operation does packet compression in synchronous mode. A successful operation + * returns the number of successfully processed input packets and updates the + * results in the corresponding output packets. Outputted packets contain + * compression results metadata (odp_comp_packet_result_t), which should be + * checked for operation status. Length of outputted data can be got from + * output_data_range.len. + * + * When hashing is configured along with compression operation the + * result is appended at the end of the output data, output_data_range.len + * equals length of output data + 'digest_len'. Processed data length + * can be computed by subtracting 'digest_len' from output_data_range.len where + * 'digest_len' can be queried from odp_comp_hash_alg_capability(). + * Hash is always performed on plain text. Hash validation in decompression is + * performed by the application. + * For every input packet entry in 'pkt_in' array, application should pass + * corresponding valid output packet handle. If any error occurs during + * processing of packets, the API returns with number of entries successfully + * processed. + * Output packet metadatas like length or data pointer will not be updated. + * + * @param pkt_in Packets to be processed + * @param pkt_out Packet handle array for resulting packets + * @param num_pkt Number of packets to be processed + * @param param Operation parameters + * + * @return Number of input packets consumed (0 ... num_pkt) + * @retval <0 on failure + * + * @note The 'pkt_in','pkt_out'and 'param' arrays should be of same length, + * Results are undefined if otherwise. + + * @note Same packet handle cannot be used as input and output parameter. + * In-place compression operation is not supported + */ +int odp_comp_op(const odp_packet_t pkt_in[], odp_packet_t pkt_out[], + int num_pkt, const odp_comp_packet_op_param_t param[]); + +/** + * Asynchronous packet compression operation + * + * This operation does packet compression in asynchronous mode. It processes + * packets otherwise identical to odp_comp_op(), but the resulting packets are + * enqueued to 'compl_queue' configured during session (odp_comp_session_t) + * creation. For every input packet entry in in_pkt array, user should pass + * corresponding valid output packet handle. On return, API returns with + * number of entries successfully submitted for operation. + * + * When hashing is configured along with compression operation the + * result is appended at the end of the output data, output_data_range.len + * equals length of output data + 'digest_len'. Processed data length + * can be computed by subtracting 'digest_len' from output_data_range.len where + * 'digest_len' can be queried from odp_comp_hash_alg_capability(). + * Hash is always performed on plain text. Hash validation in decompression is + * performed by the application. + * + * In case of partially accepted array i.e. + * when number of packets returned < num_pkt, application may attempt to + * resubmit subsequent entries via calling any of the operation API. + * + * All the packets successfully enqueued will be submitted to 'compl_queue' + * after compression operation, Application should check 'status' of the + * operation in odp_comp_packet_result_t. + * Output packet metadatas like length or data pointer will not be updated. + * + * Please note it is always recommended that application using async mode, + * provide sufficiently large buffer size to avoid + * ODP_COMP_STATUS_OUT_OF_SPACE_TERM. + * + * @param pkt_in Packets to be processed + * @param pkt_out Packet handle array for resulting packets + * @param num_pkt Number of packets to be processed + * @param param Operation parameters + * + * @return Number of input packets enqueued (0 ... num_pkt) + * @retval <0 on failure + * + * @note The 'pkt_in','pkt_out'and 'param' arrays should be of same length, + * Results are undefined if otherwise. + + * @note Same packet handle cannot be used as input and output parameter. + * In-place compression operation is not supported + + * @see odp_comp_op(), odp_comp_packet_result() + */ +int odp_comp_op_enq(const odp_packet_t pkt_in[], odp_packet_t pkt_out[], + int num_pkt, const odp_comp_packet_op_param_t param[]); + +/** + * Get compression operation results from processed packet. + * + * Successful compression operations of all modes (ODP_COMP_OP_MODE_SYNC and + * ODP_COMP_OP_MODE_ASYNC) produce packets which contain compression result + * metadata. This function copies operation results from compression processed + * packet. Event subtype of this packet is ODP_EVENT_PACKET_COMP. Results are + * undefined if non-compression processed packet is passed as input. + * + * @param[out] result pointer to operation result for output + * @param packet compression processed packet (ODP_EVENT_PACKET_COMP) + * + * @retval 0 On success + * @retval <0 On failure + */ +int odp_comp_result(odp_comp_packet_result_t *result, odp_packet_t packet); + + /** + * Convert compression processed packet event to packet handle + * + * Get packet handle corresponding to processed packet event. Event subtype + * must be ODP_EVENT_PACKET_COMP. Compression operation results can be + * examined with odp_comp_result(). + * + * @param event Event handle + * + * @return Valid Packet handle on success, + * @retval ODP_PACKET_INVALID on failure + * + * @see odp_event_subtype(), odp_comp_result() + * + */ +odp_packet_t odp_comp_packet_from_event(odp_event_t event); + + /** + * Convert processed packet handle to event + * + * The packet handle must be an output of a compression operation + * + * @param pkt Packet handle from compression operation + * @return Event handle + */ +odp_event_t odp_comp_packet_to_event(odp_packet_t pkt); + +/** + * Get printable value for an odp_comp_session_t + * + * @param hdl odp_comp_session_t handle to be printed + * @return uint64_t value that can be used to print/display this + * handle + * + * @note This routine is intended to be used for diagnostic purposes + * to enable applications to generate a printable value that represents + * an odp_comp_session_t handle. + */ +uint64_t odp_comp_session_to_u64(odp_comp_session_t hdl); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#include <odp/visibility_end.h> +#endif +
-----------------------------------------------------------------------
Summary of changes: config/odp-linux-generic.conf | 2 +- configure.ac | 1 - helper/threads.c | 7 +++++++ .../include-abi/odp/api/abi/classification.h | 2 +- platform/linux-generic/odp_classification.c | 3 ++- platform/linux-generic/odp_ishm.c | 15 +++++++++++++++ platform/linux-generic/pktio/loop.c | 1 - platform/linux-generic/test/inline-timer.conf | 2 +- platform/linux-generic/test/process-mode.conf | 2 +- test/validation/api/timer/timer.c | 2 +- 10 files changed, 29 insertions(+), 8 deletions(-)
hooks/post-receive