On 22 October 2015 at 18:06, Nikita Kalyazin <n.kalya...@samsung.com> wrote:
> Hi, > > > [Alex] ODP queues are neither software nor hardware by definition, each > > implementation is free to implement them as they see fit. Also PacketI/O > > abstraction is not an abstraction for a NIC device. The ODP way to use > multiple > > queues for ingress is through the classifier. There was a former > proposal of > > enabling RSS at pktio level but it was not accepted. I also noticed that > this > > patch tries to introduce multiple default queues which is kind of > confusing - > > default traffic is all traffic which does not satisfy classifier > criteria. For > > output, multiple queues are used by the means of TM api. > As I understand, ODP implies three options of ingress processing: > - "recv" (poll pktio with raw recv() method); > - "poll" (poll poll pktio via default input queue associated with the > pktio); > - "sched" (call schedule() which makes use of classifier and queue > priorities). > Looks like each ODP implementation should support all the three options. > > For "sched" option, classification may be implemented in hardware, and ODP > queues, in their turn, can also be implemented in hardware. The hardware > would > distribute packets to its hardware queues according to PMRs or L2/L3 QoS. > > For "recv" option, the only way possible to access NIC's hardware queues > (if any), is to call recv() on a specified queue explicitly. So there > should be > an API for it. In my patch I proposed such APIs (odp_pktio_recv_queue()). > I admit, this might be not the best API name possible. However I don't > see any > other way to access NIC's hardware queues at "recv" level. We can add > hw_queue_id parameter to existing odp_pktio_recv() alternatively (same way > as > DPDK does with rte_eth_rx_burst()). In case of using such an explicit > hardware > queue polling, RSS should be configured somehow to distribute packets > across them. > > For "poll" option, it's not completely clear to me how it should relate to > NIC's > hardware queues. It looks like classification is not involved here, and > this > option isn't really different from "recv". If this is correct, presence of > multiple default input queues is reasonable, since they're directly mapped > to > NIC's hardware queues, and odp_queue_deq() simply extracts a packet from > the > appropriate HW queue. > [Alex] > Hi Nikita, I understand your reasoning but ODP Packet I/O (pktio) is _not_ (yet?) a NIC abstraction. The fact is that in current ODP design ingress queues are "connected" to the pktio device by the configuration of classifier or as default/error CoS queues. Classifier can be changed dynamically, e.g, adding or removing CoSes or queues without stopping/re-configuring the pktio device. I don't see in DPDK such features in PMD, all queues are configured and setup at initialization time and they don't change thereafter. > -- > > Best regards, > > Nikita Kalyazin, > n.kalya...@samsung.com > > Software Engineer > Virtualization Group > Samsung R&D Institute Russia > Tel: +7 (495) 797-25-00 #3816 > Tel: +7 (495) 797-25-03 > Office #1501, 12-1, Dvintsev str., > Moscow, 127018, Russia > > On Mon, Oct 19, 2015 at 08:17:17PM +0300, Alexandru Badicioiu wrote: > > > > > > On 19 October 2015 at 19:16, Nikita Kalyazin <[1]n.kalya...@samsung.com> > wrote: > > > > Hi Stuart, > > > > > > Thanks for your feedback. > > > > > One thing that is missing here is a method for the application to > > > configure how packets are distributed, i.e. which fields in the > packet > > > are used when calculating the flow hash (not necessarily the hash > > > algorithm itself, that can be implementation defined). > > > > > > For example with the netmap implementation here, if you have a > > > compatible interface, I assume the user can control distribution > to RX > > > queues using something like; > > > > > > ethtool --config-ntuple rx-flow-hash esp4 > > > > > > But it would be better if this were configurable via the ODP API. > Petri > > > had a suggestion a while back related to this to add a structure > to the > > > odp_pktio_params_t; > > > > > > enum odp_pktio_input_hash { > > > /** No specific fields defined */ > > > ODP_PKTIN_HASH_NONE = 0, > > > /** IPv4/v6 addresses */ > > > ODP_PKTIN_HASH_IP, > > > /** UDP ports and IPv4/v6 addresses */ > > > ODP_PKTIN_HASH_UDP_IP, > > > /** TCP ports and IPv4/v6 addresses */ > > > ODP_PKTIN_HASH_TCP_IP > > > }; > > Thanks, I plan to think about it. > > Btw, NICs provide wide variety of settings regarding distribution of > > packets across the queues. Is it supposed to extend the proposed > > structure to support more flexible configuration? > > > > > How about: > > > > > > int odp_pktio_inq_create(odp_pktio_t pktio, const char *name, > > > const odp_queue_param_t *param, > > > odp_queue_t queues[], int num); > > > > > > Which would return the number of queues created, and ensure that > all > > > queues had the same parameters. Or, maybe it's time to start using > > > odp_queue_group_t, which we have always intended to be a group of > queues > > > that all have the same properties. > > Good point. I'll consider the cleaner approach. > > > > > I'm not keen on the odp_pktio_recv/send_queue() APIs as the queues > > > referred to there are not ODP queues so it makes things a bit less > clear, > > > and in general we should be moving away from using the direct > _send/_recv > > > APIs. If we're explicitly using queues then we should use the > queue and/ > > or > > > scheduler APIs. > > Right, these API names look a bit confusing, because same word is > used to > > refer to both hardware NIC queues and ODP (software) queues. > > > > [Alex] ODP queues are neither software nor hardware by definition, each > > implementation is free to implement them as they see fit. Also PacketI/O > > abstraction is not an abstraction for a NIC device. The ODP way to use > multiple > > queues for ingress is through the classifier. There was a former > proposal of > > enabling RSS at pktio level but it was not accepted. I also noticed that > this > > patch tries to introduce multiple default queues which is kind of > confusing - > > default traffic is all traffic which does not satisfy classifier > criteria. For > > output, multiple queues are used by the means of TM api. > > > > However, I think it would be useful to preserve explicit send/recv > APIs, > > since in many cases they might appear more efficient (odp-ovs is an > example > > of such applications), and rename those to make them more obvious. > > > > > Are you able to join the meeting on Tuesday to discuss? > > > > > > [2]http://www.opendataplane.org/meetings/ > > Thanks, I'm going to join the meeting. > > > > -- > > > > Best regards, > > > > Nikita Kalyazin, > > [3]n.kalya...@samsung.com > > > > Software Engineer > > Virtualization Group > > Samsung R&D Institute Russia > > Tel: [4]+7 (495) 797-25-00 #3816 > > Tel: [5]+7 (495) 797-25-03 > > Office #1501, 12-1, Dvintsev str., > > Moscow, 127018, Russia > > > > On Fri, Oct 16, 2015 at 07:15:43PM +0100, Stuart Haslam wrote: > > > On Wed, Oct 14, 2015 at 02:32:37PM +0300, Nikita Kalyazin wrote: > > > > This series is a proposal of multiqueue API for ODP. > > > > Modern network adapters (both physical and virtual) support > multiple > > > > hardware queues. Assigning separate CPU core for processing of > each > > > > queue allows to scale throughput (in best case - linearly). > > > > > > > > > > Thanks for the contribution, we do need something like this, in > > > particular hash based distribution has been on the todo list for a > > > little while. I've not reviewed the implementation in detail but > have > > > focused on the API changes specifically and have a few initial > thoughts > > > below. > > > > > > One thing that is missing here is a method for the application to > > > configure how packets are distributed, i.e. which fields in the > packet > > > are used when calculating the flow hash (not necessarily the hash > > > algorithm itself, that can be implementation defined). > > > > > > For example with the netmap implementation here, if you have a > > > compatible interface, I assume the user can control distribution > to RX > > > queues using something like; > > > > > > ethtool --config-ntuple rx-flow-hash esp4 > > > > > > But it would be better if this were configurable via the ODP API. > Petri > > > had a suggestion a while back related to this to add a structure > to the > > > odp_pktio_params_t; > > > > > > enum odp_pktio_input_hash { > > > /** No specific fields defined */ > > > ODP_PKTIN_HASH_NONE = 0, > > > /** IPv4/v6 addresses */ > > > ODP_PKTIN_HASH_IP, > > > /** UDP ports and IPv4/v6 addresses */ > > > ODP_PKTIN_HASH_UDP_IP, > > > /** TCP ports and IPv4/v6 addresses */ > > > ODP_PKTIN_HASH_TCP_IP > > > }; > > > > > > As for RX queue creation, rather than proposed sequence that looks > like > > > this: > > > > > > odp_pktio_max_num_queues() > > > odp_pktio_configure() > > > foreach inq > > > odp_queue_create() > > > > > > How about: > > > > > > int odp_pktio_inq_create(odp_pktio_t pktio, const char *name, > > > const odp_queue_param_t *param, > > > odp_queue_t queues[], int num); > > > > > > Which would return the number of queues created, and ensure that > all > > > queues had the same parameters. Or, maybe it's time to start using > > > odp_queue_group_t, which we have always intended to be a group of > queues > > > that all have the same properties. > > > > > > I'm not keen on the odp_pktio_recv/send_queue() APIs as the queues > > > referred to there are not ODP queues so it makes things a bit less > clear, > > > and in general we should be moving away from using the direct > _send/_recv > > > APIs. If we're explicitly using queues then we should use the > queue and/ > > or > > > scheduler APIs. > > > > > > Are you able to join the meeting on Tuesday to discuss? > > > > > > [6]http://www.opendataplane.org/meetings/ > > > > > > > This series should be considered a prototype. > > > > This implementation of multiqueue API is not complete (not all > the > > > > code has been migrated to multiqueue API). Existing packet IO > API has > > > > been left untouched and reimplemented using mutliqueue API > (queue 0 is > > > > always used in such cases). The existing API is supposed to be > > > > removed in the future, as soon as all the remaining code > migrates to > > > > the multiqueue API. > > > > Since single lock for all the queues makes all pktio Rx and Tx > calls > > > > sequential, per queue locks have been added. > > > > For the purpose of evaluation, multiqueue support has been added > to > > > > netmap pktio. > > > > > > > > Patch 1 adds multiqueue prototypes of pktio API functions. > > > > Patches 2-4 contain common implementation of the multiqueue API. > > > > Patch 5 adds multiqueue support in netmap pktio. > > > > Patch 6 moves odp_generator to multiqueue API. > > > > > > > > In our tests (odp_generator sends packets, odp_generator receives > > > > packets), the following results have been obtained: > > > > +----------+------------------------+-------+ > > > > | # queues | kpps (64-byte packets) | boost | > > > > +----------+------------------------+-------+ > > > > | 1 | 853 | 1.00x | > > > > | 2 | 1404 | 1.64x | > > > > | 4 | 2374 | 2.78x | > > > > | 8 | 4345 | 5.09x | > > > > +----------+------------------------+-------+ > > > > > > > > Nikita Kalyazin (6): > > > > api: pktio: add multiqueue API > > > > linux-generic: pktio: add per queue pktio locks > > > > linux-generic: pktio: implement multiqueue API (part I) > > > > linux-generic: pktio: imlement multiqueue API (part II) > > > > linux-generic: pktio: multiqueue support in netmap > > > > example: generator: use multiqueue API > > > > > > > > example/generator/odp_generator.c | 63 +++- > > > > include/odp/api/config.h | 7 +- > > > > include/odp/api/packet_io.h | 118 ++++++ > > > > .../linux-generic/include/odp_packet_io_internal.h | 19 +- > > > > platform/linux-generic/include/odp_packet_netmap.h | 6 +- > > > > .../linux-generic/include/odp_queue_internal.h | 2 + > > > > .../linux-generic/include/odp_schedule_internal.h | 1 + > > > > platform/linux-generic/odp_packet_io.c | 405 > > +++++++++++++++++---- > > > > platform/linux-generic/odp_schedule.c | 26 +- > > > > platform/linux-generic/pktio/netmap.c | 218 > +++++++++-- > > > > 10 files changed, 725 insertions(+), 140 deletions(-) > > > > > > > > -- > > > > 2.5.3 > > > > > > _______________________________________________ > > lng-odp mailing list > > [7]lng-odp@lists.linaro.org > > [8]https://lists.linaro.org/mailman/listinfo/lng-odp > > > > > > > > References: > > > > [1] mailto:n.kalya...@samsung.com > > [2] http://www.opendataplane.org/meetings/ > > [3] mailto:n.kalya...@samsung.com > > [4] tel:%2B7%20%28495%29%20797-25-00%20%233816 > > [5] tel:%2B7%20%28495%29%20797-25-03 > > [6] http://www.opendataplane.org/meetings/ > > [7] mailto:lng-odp@lists.linaro.org > > [8] https://lists.linaro.org/mailman/listinfo/lng-odp >
_______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp