From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from NAM03-CO1-obe.outbound.protection.outlook.com (mail-co1nam03on0064.outbound.protection.outlook.com [104.47.40.64]) by dpdk.org (Postfix) with ESMTP id 7BF7F1094 for ; Tue, 4 Jul 2017 19:16:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=WzjyEMsOp/pqU4xu96Bxf8GRDJzCX8WqYP8KHnOw4Yo=; b=btd8KQ1nvtaNm/06I5rORVhe0Vnp2bfqd++gf+lURltgbo7qjRIUoL/lnv3mqEJnRdK2JwtpKmA69AeyP7JZvnHvh5kwr98V3A3vhUIgFIiZ4kN6bLj3jDWD2BThYYh32/R+Be+St9DLkcpM4FqTRic3lwN/5MjGov3fUk2Surw= Authentication-Results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=caviumnetworks.com; Received: from jerin (106.200.206.49) by CY1PR0701MB1725.namprd07.prod.outlook.com (10.163.21.14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1220.11; Tue, 4 Jul 2017 17:16:40 +0000 Date: Tue, 4 Jul 2017 22:46:26 +0530 From: Jerin Jacob To: Harry van Haaren Cc: dev@dpdk.org, thomas@monjalon.net, keith.wiles@intel.com, bruce.richardson@intel.com Message-ID: <20170704171624.GA2732@jerin> References: <1498735421-100164-1-git-send-email-harry.van.haaren@intel.com> <1499031314-7172-1-git-send-email-harry.van.haaren@intel.com> <1499031314-7172-2-git-send-email-harry.van.haaren@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1499031314-7172-2-git-send-email-harry.van.haaren@intel.com> User-Agent: Mutt/1.8.3 (2017-05-23) X-Originating-IP: [106.200.206.49] X-ClientProxiedBy: BM1PR01CA0078.INDPRD01.PROD.OUTLOOK.COM (10.174.208.146) To CY1PR0701MB1725.namprd07.prod.outlook.com (10.163.21.14) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 3310730a-64e2-4077-f256-08d4c300711a X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(300000500095)(300135000095)(300000501095)(300135300095)(22001)(300000502095)(300135100095)(300000503095)(300135400095)(201703131423075)(201703031133081)(300000504095)(300135200095)(300000505095)(300135600095)(300000506095)(300135500095); SRVR:CY1PR0701MB1725; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1725; 3:rUudC7Ji3wYAynfWS70Ah4LjP2k0Y/1u6Db1xzAoloZzpd1lUHsFsKwFbfUcbiThGSdyMSl29F/IEUe6fEJQQELI9Si/lSETByu/8UyoK5DuFwp8r1spWlPWfBjUx0MScMkrDwDWOM7hJwecg27fXEP1iSkPY6oQP5Lu+GmXl2K0M6oM4Eq9gi62QKIHbdHu7wRfCaQiOvOSCeq7IWpaUp7U/3VEfNascF8nKydKFgvU9y7EIikZqfhbbEyvugvDJAoPT10Lu5YSkIDNzMdHzsGu0WKk3vesKbtQKff3RjhvI9Yfg0tB3kg6Uo4D4Uu7fEzc1x7V5bVFDwO3aTJxyjV/iorB+wFfOyKxuiGy0g4OzN/kRKEMXP07fWH84xlrppx8Ho61o5EFp1luZS3s6/IbHeW6IEgSfklCSd6rJfX7mK3kK0VVwkL0qCRGbJHXwt4nYQhUvXtpzrfj+dcAK9UmCVCt+Lcwd1TRkWxejb3llyMAg/+WjHd3dff5xHjGYwSPJ6ziyw1CSxYYFJK9Cpu0w3bPQVtCGtV0tGvRg8sa3Re055GTCPa+OX3qEoiJbTGLnu3iKd088a+/kelacMOx4z1kI3wVDuU+4SmbhRSvuYmDhPTYhTvLfdPmeo9aOYKQZz1v7ZIvY9ugGvT+vlvjc0FiUfECoE356wvJ4J6V5F4P2UbBM/9iCO0rGzD5z1m8ymhnY5HeL0aJWLMSjtQYZ8EiG7qC/id807wv9Ma7/tVhHufVlz0JM+CD8Xzn X-MS-TrafficTypeDiagnostic: CY1PR0701MB1725: X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1725; 25:Z8EhKrTsPT8A2qfaT5f29BsoyaYwOno/BOQJ6gIPu6zXiT9oawRdN7dUx8uWPiCSOuHDov8oq8h0xdi8T9fZp45nSO6h835Rvy9x8LnDlW1K5bN4DKgdDCb6tSSCWP4Kcnu6+0MIKHpY5AMVlk6z+rEDrdOXMAdskTt0wqxvEFnWLJXgFQza1x7vu9kw0yfzpNMiIMYnXqKXq+VnReyNmn0Vxioz2BcvLZTHXrKFp5m+igIuLoXCIz0hBmfKRylaefkjlrz4N4xB9zv4byzmAu2tS0rq5puaL8FFqxn4/3068yQhCR718FiG9abjTb1iUmX8xMiaBZnjr7XU5YGxMtVmbIbx/97kx8sjo7ojgga1qiV4+Xxqt3gsCWvUPUuzpCrISoYRnWO+YiIZJ2uH5JbnSTOSUtjgiMAE6U7PjStzacEVN+vD3MnuSsViID5tPsXTuN6VEi8kZJAjoihR/fJl6O317wA+iXiE+BhHj4OPXHr3m9bx7W4rqo3YA5h1kmvIMNH13v3WePwim/PKPYsaDjZ83p2rWXLIwBu/Qs+vYSvryOU6Z9Io1rqXklZrAlhwPmGWqQQUQtSPsbccN1QW5D20rPYakaVUtCGzD5bA2TNs8Y/QoHnTGmHofMv+G5h51wYnsdi5zG1pFyNX6JlNbUZ7eJn35aqLrXdGg/Ijedj62R1eS7t18GToH9tHClkOHkd17MiF+WltGzxZ7xbvGl15UKoJq4G8M9RnLQpu75BnSMQZA2g00h+duN3CEeI6g1AtcLOdrpiRCKFPAtnNoauDc5qwClHNo2+ODRvixGdgKPNCaIsjOB/1+7FVKejlWioA6XuHas4aJkY3TvMqCy2ke4sa1yWVuQutV2LfvubHW9hgsRWnrY+25Rf/Xk8CUDl02zhq6HhwReLim4gSg52JAIso4RRHZD7uvMU= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1725; 31:ozwOnQOYLmeD1w519nD0YeUXvF5pSOMI8R+izXOFNWndGdtgXRrOmFeFV1aQ2XfXlK+0SI8wuF36gWh8BgV7SSf7lSWM2X7Nb685l4GTUlEBZyRCIVMC0swfrY2KC2bO++Ds08+09L0rIworPRXlLNhkMLr+yCKN1GyuNVSRbfF/tBm2n3fOxal537v0RQxWVJ8CTWSbCTxk2j0pUHR6680UI0PBIMkM3lmnUOsRjU0T6xHDQEjSv6lPX82J3BJHP7B3FCt6lUNLQ4Z8g6QLcXcawJbGrWz9ZfCogHgh5YzeYprUmd7pr7vWXEiw+acXogMv24MxwISo6mgDnb/WqkHGiHiD0+DNqcT7KFN9SRhUQIBACweRZf3bbLku5a2XY1z0rtXVuFVLp3mOZxyHUl3M5SkEQXHlVvs8cyB9hNVaUrPg5BaXSqrLLi0rchjsj6CCD26V7JiTFsm9lFULNTOUw/O4Cp6kYuvYhy3Is9JV26bOr8Ef1JJFPkaiL2gJDE9Gj0z0S0OPMh/vQJ87wipxHz+JLb/YJcsehUa2yJ0r9Fr4tzHyxxq+em0UL+0BdsGyFukdSfPNKBukTrq9cPsTqi64CsOofu2ujwqPyFmJSSQcsVI886uev8sSMv36ul+pfuzoVAie/aHIYZto/TIW41+Cifp+Ijk/BD4E/4g9XdVeeDjF3aBxB1jM0k1K X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1725; 20:LIMqNsGvKayrnNaeNw8Q99JWA5zg2BFznb8Se4MlKyYZyTfAYxUDlgzPvoSIl5bkByZCS4TXRWpZk7kk2hXKrNz7LbJwhs0s/M6/twqrFfGAy+gPETsffcSVll2lsCxHYYAk5TqW4dgimKkKtbxbtVyo5VNWcV2BgklfKTGJt01IM8RmmwEuYBOnbrJu2i8VdM8rKj7cbJmjMggM0IU95O5Na+NAuTuikw3iPyjrUi/abMquULr672iZyAL7iaOg86D9+C/SXtbqpI7JexQyprd0bCksmNfLb/QapKL0e4kjDD+8JTFtYytjjYOdi5vgvYQz7mJ3Y0bGqU+ueWx4f5Epc3/J0IiYcMV32rMAwlaztMbAKBCav0G477FMHqaXGZCU9a9G7g5jfLrFd7LkPZ8VnbGxkj7Ryq6fA7Lac1Le1nZ4aB1BVSIdMoVA5ZPD/Wt250P1qW65dFinY7/ves4InSGa+DhbWRnh/oFz4Pmn/z/Mw7dUCc9CojG4suUYzNxQvBcR4/TLbfbgzX9XRP9ZZAlTMYN8gRFNIkvGdAABkStwZzaq1SW8ET8nyCXpQdtTkGi1ln9F2sVokG9b73+yJGRje9AsPjMopugkNEI= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(236129657087228)(148574349560750)(167848164394848)(158140799945019)(228905959029699); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6040450)(601004)(2401047)(5005006)(8121501046)(2017060910033)(10201501046)(3002001)(93006095)(100000703101)(100105400095)(6041248)(20161123562025)(20161123564025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(20161123558100)(20161123555025)(6072148)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:CY1PR0701MB1725; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:CY1PR0701MB1725; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0701MB1725; 4:xV26Tx4LVqZ6ytZQ9ENDxTUKA0r9Wiw2Wy66dPE8?= =?us-ascii?Q?TmavoDGO8MPAH0OKxtRrJ8RbnC5VGc6+S2JxGDzxFVBkocdgDirdGBtFhNVR?= =?us-ascii?Q?pQrBBt+gDi/FGBJfjAO3pi2tIXOMIR6wv/B5CNwEi2cb2CifaL3xgEOndSgR?= =?us-ascii?Q?4fo5tYxxZbTM9ZeZwCkwFz2j8aQRYIeJhqR861PHDLeS9zC14Dqr/G3vTJ3J?= =?us-ascii?Q?eygeSy0fiLYNvHTsOfL/ZctScTmKGMp6zyiPwRCpJmhjK1bgKclY+ZGwiKal?= =?us-ascii?Q?aAg9o7SUxoBTURTKz47LpEcpDxnZzWChSQJUnKHDDPG1v9YZuM0Vo27PQNZY?= =?us-ascii?Q?eESyQM/qDFre02XVdrqLKl8EZBODX2V98eTJy57obLusslxX7BIoRkXZrNIS?= =?us-ascii?Q?ho+UMGSw/deyah/mfx/D/kpIpL1lxIDjHV48IZbHYVJ4OHlOwNvBc8eJpFBW?= =?us-ascii?Q?pES3azCwsw6ET9McY1RaQDFiE/Q4wJ2KSIZNDPA53ddn2aWWi2tey2nwJhU9?= =?us-ascii?Q?1CZFMylNkuB+OrFaEVbzuJsH7+8aDXs8Ci/DS1BGoZ0sn9LPnbE0XfoDYUfE?= =?us-ascii?Q?1oqT+xeWpZVb1yPIjesAUdtdgJAeqy6HghHi2r7Kj7KJjt4luZjfE2grTY56?= =?us-ascii?Q?6vCfyHhLyQ7I2WHArzgk/qLTewsorjPWRgnUWU5HOflCf5AW40ggsmrsMT5y?= =?us-ascii?Q?oIZ/ZNs9B7tK18Qu2rkFTRKOmHEje7uom6RZXEr2ElObOW8G+Vb09QK7L8d4?= =?us-ascii?Q?d6oxrWCTmGAeDQrLu3EfFHQLv7+BkXE7UJeKw00aniiMZuVSQFeOgOgPhPQb?= =?us-ascii?Q?sntI5PhcvTKNx/iXucmaF2WbPydV/Jcu6aU1n62t4hNc+TEIppVe0fV5gF67?= =?us-ascii?Q?o1Fw6Ey/vWbDvfVp0eYXets2V0qSt7owbDUhTH3s151/vrRChuv1/piQNfU1?= =?us-ascii?Q?5d8BwKgD4y+NQkFHc70SddET93h3KfQZv4fsrQBy70V2E9O/O4tAiRhBAPaS?= =?us-ascii?Q?Id3WdDecoDk6bxPXRC/7lpSNtzH22KS7wAEltz7tAD6Fsd8y50jmMPsEuOIl?= =?us-ascii?Q?yOSnb4gWDbF1irnQsIXl2lcFyMul/zEFy/ISUrNcXY463IMb3O9UlmFdK8ul?= =?us-ascii?Q?n9bbBMs8tiiQFl7omwGo0FydfuRF7q24inz0dUXIT9zZuEl/PW8BaYVkO8Qb?= =?us-ascii?Q?u+M1DqU2i19acfUqw7U4bVvzdXHiinr7eNL62QmPHSkBKm3ecJWxXrSTRKWu?= =?us-ascii?Q?4s5tEblQMAdYUmGIM7suW8DvG0hHkotYjUSkVC6recd9OXgVVrJkR3wzHKnU?= =?us-ascii?Q?wngSLHyOv8psUWgJul7g2Jk1+Ye4/DjeTZZsRx3tHswi?= X-Forefront-PRVS: 0358535363 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(4630300001)(6009001)(39450400003)(39410400002)(39850400002)(39400400002)(39840400002)(13464003)(83506001)(50466002)(4326008)(42186005)(33656002)(8676002)(25786009)(2906002)(229853002)(1076002)(4001350100001)(478600001)(6916009)(6666003)(50986999)(5660300001)(2950100002)(42882006)(54356999)(76176999)(72206003)(966005)(23726003)(47776003)(6116002)(3846002)(33716001)(305945005)(5009440100003)(7736002)(6306002)(6496005)(81166006)(189998001)(55016002)(53936002)(9686003)(6246003)(38730400002)(66066001)(53376002)(110136004)(18370500001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0701MB1725; H:jerin; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0701MB1725; 23:zxiUzfS64119p+BF+n7vLlUssGFWUWTPzTOZK9l?= =?us-ascii?Q?zxkPv1MHKL8o16BTNskUCxlWgMQ+AioX2YlIjXe+48khg1vzMaqt78b5PCvf?= =?us-ascii?Q?lEY3CP8FgTzT6112mocUgkkt7vbCNNLtPthxm/lgn5AWcbU+7iyg79JYEKaJ?= =?us-ascii?Q?ZCbkJFN+e7oQ7puD5+JGO4LYhg6+4bME/HVwhi1CnhOkEbPqka6JUipTyTjq?= =?us-ascii?Q?aftjcuhXCu8RFDXaajWlV6UErL/EIy+bjdTT3eUn0p+P8AqKuuQbQpn/shPF?= =?us-ascii?Q?Gud1dR0gWv2L2QAAX97iGjDxhC15H4qW0vFFcAhlYoqs/lxpIKowFqE6X7TP?= =?us-ascii?Q?7iIJM9BgYinePzYAhsU7BQsoZ72SYh+LEY5ruQGZ8NgfuPqbpkFwq5Gt9Cm4?= =?us-ascii?Q?n+3X498ECf3yeL9Jlp1rCke92u3CMt8SXIyA297InmLV8cBH4+KAvwzJE0v3?= =?us-ascii?Q?i/YlcjVQxmioaboFk9DbNFzyps2e1AvFC7k4aIrZ0fKVQAEEDyVqmTztvUqG?= =?us-ascii?Q?cQXHJpZtbZqe4OhslI0wz5gkigqXTwK4Z16IN6julnHNXQ+KB8lZhWL7O6tK?= =?us-ascii?Q?y34mQsR4+h4omN12JEivJaQkIO7FeiaE0HLgYfKj3rW7Hq4LZ435ag463Dfl?= =?us-ascii?Q?4DWH7lodLYIicYHqPfwzHlE66zV8ynVuAKnGOIx1Y+WlOHsWUjB5QohEqiru?= =?us-ascii?Q?MY4fi6u/Iuz1ClOhqalep9zjO+BO5/hCP/Vtp9IhKMKi8VCF70fhAv8w5+Fa?= =?us-ascii?Q?Bjcsev9nNEOZenQd/JiO36miHSMh+9vfJstI2YqrHrRg8ql7vt00Q3WOyPyQ?= =?us-ascii?Q?XAjtBkePLRLZcK4XWZTcKS7DAOWpvvUUZ4IXf5t1GECxwikvg7njaaG4nZ9f?= =?us-ascii?Q?P+XzB33/YsAUnRZw6HrmLWvpfg+UcQvGLiL8a4x0DdV9H+3pFxxMH8XFKL7h?= =?us-ascii?Q?b8hnWkch5c0yhrfc+V7pUeAr1Nqwu589iN071bHMUnFrVXX96HSskJMPBENo?= =?us-ascii?Q?fINHc1CcCcbJgD4ZCwDmkdn6Gz6VCC2yRyH2aLvKzA5iI+/xWTO6YmQYYpAx?= =?us-ascii?Q?VJAJaKXAkDOSgzGp7a3QdcrbPn1bIqEtnvbhw6IqQfl5hztSYH1yq01OKyDZ?= =?us-ascii?Q?mJTKTmvFo6VjMYs0fTsMQnEE68ZbvLfG0Kb/8MdyryIoC01N+ccMqzE+jjQ/?= =?us-ascii?Q?L3jejjK3pEQk4R4JzLSMzbM8l8psygtQNtaOoELXAojXUPBk6vQ6WAnwg3bt?= =?us-ascii?Q?4JQfyLzJd0/zLEnerRKDIMdsYArF7jfGrMmtSAzxC?= X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR0701MB1725; 6:0ZpQFujcvUfaxCZmySLllsY23CZZgHvtbHMUf8Gy?= =?us-ascii?Q?ML7uPKu5bhU3/U4v50dQ8Ei1Ox0PoDbCMMx5tC4rkG9qC0hGo9YhCvygr7OT?= =?us-ascii?Q?CuOykjyxpL0ou/dwykcvdx62/LAOCG7rrxmo+5CiNe8PGT4rXjEu+G2ITQby?= =?us-ascii?Q?AnY9C49OLYQP+Y+L13ddEhsfIK7CQm6Thu7wVGnhllz+g//2uH8JpGMTIhuY?= =?us-ascii?Q?OlEa/wLC89qvGfXbnMmcQTH9IHqUjiyg2oEp50Su0LU3zBwh+fgO8yZtxsOe?= =?us-ascii?Q?Ga/ojRlRqvljv/8gxtOwP7MuGWgttz0Ui0MXBQYrGsSSYmrpluLolXLL6Wi4?= =?us-ascii?Q?F1XHF8jYgsDBRmWHpTm5O8Rx9GDfDjRxyYikwtLdozMzu0Z3zt7WggWToaR2?= =?us-ascii?Q?IRL5QBpAe9j8AB8zSRvXpOZYekm4mMh+7Cv2otYKqrEbB/m+UVQI/eLbNtxF?= =?us-ascii?Q?WO6gKg3Y7iAsDgfXNdsgNqLWhchkcddHgQUSpraUsxRDREBVPq2MY3vYVzSe?= =?us-ascii?Q?YERyv4nGBODhzsaMjdpK3mxnyqf9pjJXQxie3B/iv0Q+mKULSN0rxzCAB+Cm?= =?us-ascii?Q?zx6DV5BNAIIiUqhHZP5kLhybUYI9Rudy1I3jXCa6kl/b/l/vkyC5nAOZFqTN?= =?us-ascii?Q?rsPKe+MGO6Y7fOahALoM53p1d/TN7fidfpAXKuCZ1Q9xqFWfbyu6eNRfNuay?= =?us-ascii?Q?3OdYK5AQyQb9GIi4xMlsh2NaibhvegetfwCLBsKaSx/fQWMJCzNhCmf/Ijx5?= =?us-ascii?Q?aBWzXN0S5q+zxgY1CaQQgpYjtO4yyQbPlMITf7B2C2LYA5r8kmiXsEZbn2Fe?= =?us-ascii?Q?YjsunJyC1krGNCSHB7zcp8YyTuB8RwziRlI6AUw8xVLpM+S4v9wphNq+RbZj?= =?us-ascii?Q?7KbsMW4VU3LN9vkX7E8w8/eqoFo2SW0LLarIAuZruOk+4aCYwbJ4GCytgpr6?= =?us-ascii?Q?HsFD1ESFGMe0H+6sNU+8wOKWoSx6Bw8YWZW0VnZownfqpVkRNnr8Su2KFbjY?= =?us-ascii?Q?y9o=3D?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1725; 5:FDU/p3TdD7pwAcCIJjh2F2osTjZ852uo8x1kC6tX3kuE5PtZdnHNY/VVAv2EBbU2BLOyOg8+CWQgXCT6FFCWdxpHL5RBK5IyFdmbyfpnPkPUvX/OFU1Dz8+9lAFx4bff4j3dYx1qO2FcuQVrUgvEfoUwEUw6L+u75+AQuQWxkTMQkFEfjCWi1bt6woABHxvf//MazPzR+ltxJ/1uzD74lBHHkWbs3Ve2g4jqMTe3wHj56pjDA3eZRZs2qdildD1+5VfAVFqBBk1GeXEK54sEClOfS/aMY6Dl8AUaEqh9ZB3n5q2ViwJZ3x3TLXUL81c5CAyobwrk4jh12kzHM2QkcCltMAfmOqO15uP0iLsIbSTX5ZbUh3tve40Il5hWDEJEV9M95nb9CVvT/SqV7nS5DB6wguPQ58/eZD9gTLet3dnGA7BxP92O6bOo+0llJSAvWWPL+LdgTuV60mj7ikBZ9m+3qhJVWrUymcopm1O5koeqs65dKJdn1njgIDeiYwmB; 24:LgvsIz+i/LOnVkbXsgKB3EDvwoWEWgUR27HL6Cg1K49G3LMKG1k9yjGzF+UEi1f2ImWwmNRbFTwYt+4JeB/W2OHNPXxmpaKzNohnDV46GOY= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR0701MB1725; 7:7c7L9/IcMOCr7G6FxEkA/Bc2d1Ki7JzoIQwL0WEPXSVFbNDgI+ElFEF1xr2VUPry/O0qnwhRF99RClV6myVxb/k3uwpxcpqTY5IYA6+D3icOZJtKvIcbvNLqVE3+S/X8KfEUoL2XmZvM3IJZ3kx5D7N+5crjvTNer/K04fXTacq65YYX7z4wZT/FjzFfgfCktCfpOIfbi0yWQ+d1A7ngv9t++HlwHClIyqb2SQFGfR9GixDvElf2gJG2h8hXnpWJLQlP97uaQUr8aMVQYIQ5cMgDgKXHAVqbN3q0lNI4v9AZmNISAJuXyDvKq8qWasdZLq12C8b9D4QLi8Lwte40L4TTjkkPE+JJ8s7fkAixz+wXudRVaZP1Ew3UsEiyDFDxvWY9Jziw8wUrEdThreSglKvFSpHoec7Nhlaku+BsdkZ9sRijtnPbbRYywAobDMpfScrvgTSgWdurcgIOjZmYo2Fakkf72TQffvK90kSwmBE8S3EmE71Azv4KOO9uJK/Pqp7staps4ColR3QGwttWy18HegrjSBVWw2M1y6NXgE7mv4jcXi0+iXmyR3dLoytpX3xanvr/pqKJ9TwwmWp+7F8JGptLkwxrcI6ZiKshY4r8oHJHcLqu+bX73oZhE1qicyXzk9liB1QhgWuGRLOwVIktT07tPJsVyYqXTaxPR96k+m5sjgU9j5whwvKJ2l0fYE0VcpeEU/yJQh0Iw/+rx9UWwZlmsIig9Q3MfLcOPaBJZfBW9LXBymQVGsgPpgIbjdmspTaX1WYhmy/Vvy87t97w3O1qTY+oQe3e2JSWxhs= X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Jul 2017 17:16:40.8992 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0701MB1725 Subject: Re: [dpdk-dev] [PATCH v3 1/7] service cores: header and implementation X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 04 Jul 2017 17:16:47 -0000 -----Original Message----- > Date: Sun, 2 Jul 2017 22:35:08 +0100 > From: Harry van Haaren > To: dev@dpdk.org > CC: jerin.jacob@caviumnetworks.com, thomas@monjalon.net, > keith.wiles@intel.com, bruce.richardson@intel.com, Harry van Haaren > > Subject: [PATCH v3 1/7] service cores: header and implementation > X-Mailer: git-send-email 2.7.4 > > Add header files, update .map files with new service > functions, and add the service header to the doxygen > for building. > > This service header API allows DPDK to use services as > a concept of something that requires CPU cycles. An example > is a PMD that runs in software to schedule events, where a > hardware version exists that does not require a CPU. > > The code presented here is based on an initial RFC: > http://dpdk.org/ml/archives/dev/2017-May/065207.html > This was then reworked, and RFC v2 with the changes posted: > http://dpdk.org/ml/archives/dev/2017-June/067194.html > > This is the fourth iteration of the service core concept, > with 2 RFCs and this being v2 of the implementation. > > Signed-off-by: Harry van Haaren > diff --git a/lib/librte_eal/common/Makefile b/lib/librte_eal/common/Makefile > index a5bd108..2a93397 100644 > --- a/lib/librte_eal/common/Makefile > +++ b/lib/librte_eal/common/Makefile > @@ -41,6 +41,7 @@ INC += rte_eal_memconfig.h rte_malloc_heap.h > INC += rte_hexdump.h rte_devargs.h rte_bus.h rte_dev.h rte_vdev.h > INC += rte_pci_dev_feature_defs.h rte_pci_dev_features.h > INC += rte_malloc.h rte_keepalive.h rte_time.h > +INC += rte_service.h rte_service_private.h This will install rte_service_private.h file $RTE_TARGET. Based on earlier email, You don't want to expose rte_service_private.h to application. Right? If so, I think, we remove rte_service_private.h from here and add CFLAGS to point this header in local makefile of the _component_ which interested in getting eal component specific functions. > > GENERIC_INC := rte_atomic.h rte_byteorder.h rte_cycles.h rte_prefetch.h > GENERIC_INC += rte_spinlock.h rte_memcpy.h rte_cpuflags.h rte_rwlock.h > diff --git a/lib/librte_eal/common/eal_common_lcore.c b/lib/librte_eal/common/eal_common_lcore.c > + * called on it. > + * @retval 0 Service successfully switched off > + */ > +int32_t rte_service_stop(struct rte_service_spec *service); > + > +/** Returns if *service* is currently running. > + * > + * This function retuns true if the service has been started using s/retuns/returns/ > +int32_t rte_service_lcore_reset_all(void); > + > +/** Enable or disable statistics collection. > + * > + * This function enables per core, per-service cycle count collection. > + * @param enabled Zero to turn off statistics collection, non-zero to enable. > + */ > +void rte_service_set_stats_enable(int enabled); Since it it is a "set" function, better argument is "int enable" > + > +/** Retrieve the list of currently enabled service cores. > + * > + * This function fills in an application supplied array, with each element > + * indicating the lcore_id of a service core. > + * > + * Adding and removing service cores can be performed using > + * *rte_service_lcore_add* and *rte_service_lcore_del*. > + * @param [out] array An array of at least N items. What is N here. It should be RTE_MAX_LCORE. Right? > + * @param [out] The size of *array*. > + * @retval >=0 Number of service cores that have been populated in the array > + * @retval -ENOMEM The provided array is not large enough to fill in the > + * service core list. No items have been populated, call this function > + * with a size of at least *rte_service_core_count* items. > + */ > +int32_t rte_service_lcore_list(uint32_t array[], uint32_t n); > + > + cores_state = rte_calloc("rte_service_core_states", RTE_MAX_LCORE, > + sizeof(struct core_state), RTE_CACHE_LINE_SIZE); > + if (!cores_state) { > + printf("error allocating core states array\n"); > + return -ENOMEM; > + } > + > + int i; > + int count = 0; > + struct rte_config *cfg = rte_eal_get_configuration(); > + for (i = 0; i < RTE_MAX_LCORE; i++) { > + if (lcore_config[i].core_role == ROLE_SERVICE) { > + if ((unsigned)i == cfg->master_lcore) > + continue; > + rte_service_lcore_add(i); > + count++; > + } > + } > + > + rte_service_library_initialized = 1; > + return 0; > +} > + > +void rte_service_set_stats_enable(int enabled) Since it it is a "set" function, better argument is "int enable" > +{ > + uint32_t i; > + for (i = 0; i < RTE_MAX_LCORE; i++) > + cores_state[i].collect_statistics = enabled; > +} > + > +/* returns 1 if service is registered and has not been unregistered > + * Returns 0 if service never registered, or has been unregistered > + */ > +static inline int > +service_valid(uint32_t id) { > + return !!(rte_services[id].internal_flags & > + (1 << SERVICE_F_REGISTERED)); > +} > + > +uint32_t > +rte_service_get_count(void) > +{ > + return rte_service_count; > +} > + > +struct rte_service_spec * > +rte_service_get_by_id(uint32_t id) > +{ > + struct rte_service_spec *service = NULL; > + if (id < rte_service_count) > + service = (struct rte_service_spec *)&rte_services[id]; > + > + return service; > +} > + > +struct rte_service_spec *rte_service_get_by_name(const char *name) > +{ > + struct rte_service_spec *service = NULL; > + int i; > + for (i = 0; i < RTE_SERVICE_NUM_MAX; i++) { > + if (service_valid(i) && > + strcmp(name, rte_services[i].spec.name) == 0) > + service = (struct rte_service_spec *)&rte_services[i]; > + break; "break" should be under "if" condition. ie { and } for the "if" condition is missing > + } > + > + return service; > +} > + > +int32_t > +rte_service_register(const struct rte_service_spec *spec) > +{ > + uint32_t i; > + int32_t free_slot = -1; > + > + if (spec->callback == NULL || strlen(spec->name) == 0) > + return -EINVAL; > + > + for (i = 0; i < RTE_SERVICE_NUM_MAX; i++) { > + if (!service_valid(i)) { > + free_slot = i; > + break; > + } > + } > + > + if ((free_slot < 0) || (i == RTE_SERVICE_NUM_MAX)) > + return -ENOSPC; > + > + struct rte_service_spec_impl *s = &rte_services[free_slot]; > + s->spec = *spec; > + s->internal_flags |= (1 << SERVICE_F_REGISTERED); > + > + rte_smp_wmb(); > + rte_service_count++; My earlier comments on rte_smp_wmb() was in assumption that rte_service_register() called be from worker cores. Can rte_service_register() called from worker threads. No. Right? if yes then we need an atomic variable to increment rte_service_count. > + > + return 0; > +} > + > +int32_t > +rte_service_start(struct rte_service_spec *service) > +{ > + struct rte_service_spec_impl *s = > + (struct rte_service_spec_impl *)service; > + s->runstate = RUNSTATE_RUNNING; > + rte_smp_wmb(); > + return 0; > +} > + > +int32_t > +rte_service_stop(struct rte_service_spec *service) > +{ > + struct rte_service_spec_impl *s = > + (struct rte_service_spec_impl *)service; > + s->runstate = RUNSTATE_STOPPED; > + rte_smp_wmb(); > + return 0; > +} > + > +static int32_t > +rte_service_runner_func(void *arg) > +{ > + RTE_SET_USED(arg); > + uint32_t i; > + const int lcore = rte_lcore_id(); > + struct core_state *cs = &cores_state[lcore]; Couple of comments in fastpath code. IMO, better to move "service_mask" and access to global variable(so that it allocated from local stack) outside the loop. global variable may share with other frequent write variables. const uint64_t service_mask = cs->service_mask; const uint32_t __rte_service_count = rte_service_count; > + > + while (cores_state[lcore].runstate == RUNSTATE_RUNNING) { > + for (i = 0; i < rte_service_count; i++) { > + struct rte_service_spec_impl *s = &rte_services[i]; > + if (s->runstate != RUNSTATE_RUNNING || > + !(service_mask & (1 << i))) > + continue; > + > + /* check if this is the only core mapped, else use > + * atomic to serialize cores mapped to this service > + */ > + uint32_t *lock = (uint32_t *)&s->execute_lock; > + if ((s->spec.capabilities & RTE_SERVICE_CAP_MT_SAFE) || > + (s->num_mapped_cores == 1 || > + rte_atomic32_cmpset(lock, 0, 1))) { > + void *userdata = s->spec.callback_userdata; > + > + if (cs->collect_statistics) { > + uint64_t start = rte_rdtsc(); > + s->spec.callback(userdata); > + uint64_t end = rte_rdtsc(); > + s->cycles_spent += end - start; > + cs->calls_per_service[i]++; > + s->calls++; > + } else { > + cs->calls_per_service[i]++; Should we need this in non stat configuration ? > + s->spec.callback(userdata); > + s->calls++; Should we need this in non stat configuration ? > + } > + > + rte_atomic32_clear(&s->execute_lock); Call this only when "rte_atomic32_cmpset" in action as it is costly for normal case. IMO, we need to have rte_smp_rmb() here to update the status of cores_state[lcore].runstate or s->runstate(as it can be updated from other lcores) > + } > + } > + } > + > + lcore_config[lcore].state = WAIT; > + > + return 0; > +} > +