From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <Jerin.JacobKollanukkaran@cavium.com>
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 <dev@dpdk.org>; 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 <jerin.jacob@caviumnetworks.com>
To: Harry van Haaren <harry.van.haaren@intel.com>
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: <CY1PR0701MB1725E6B2456F39CFD7F4DE14E3D70@CY1PR0701MB1725.namprd07.prod.outlook.com>
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 <dev.dpdk.org>
List-Unsubscribe: <http://dpdk.org/ml/options/dev>,
 <mailto:dev-request@dpdk.org?subject=unsubscribe>
List-Archive: <http://dpdk.org/ml/archives/dev/>
List-Post: <mailto:dev@dpdk.org>
List-Help: <mailto:dev-request@dpdk.org?subject=help>
List-Subscribe: <http://dpdk.org/ml/listinfo/dev>,
 <mailto:dev-request@dpdk.org?subject=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 <harry.van.haaren@intel.com>
> To: dev@dpdk.org
> CC: jerin.jacob@caviumnetworks.com, thomas@monjalon.net,
>  keith.wiles@intel.com, bruce.richardson@intel.com, Harry van Haaren
>  <harry.van.haaren@intel.com>
> 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 <harry.van.haaren@intel.com>
> 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;
> +}
> +