Changeset f96ad61


Ignore:
Timestamp:
10/24/18 15:20:19 (2 years ago)
Author:
Shane Alcock <salcock@…>
Branches:
ringperformance
Children:
84dbd79
Parents:
928db3d
Message:

Attempt to improve ring per-packet performance in parallel libtrace

  • Try to read multiple packets on each pread call, instead of just one.
  • Inline most of the prepare packet workload to avoid function call overhead when reading packets.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • lib/format_linux_ring.c

    r928db3d rf96ad61  
    320320#ifdef HAVE_PACKET_FANOUT
    321321static int linuxring_pstart_input(libtrace_t *libtrace) {
    322         /* Only because our pread is hard-coded to only do one
    323          * packet at a time anyway */
    324         libtrace->config.burst_size = 1;
    325322        return linuxcommon_pstart_input(libtrace, linuxring_start_input_stream);
    326323}
     
    465462}
    466463
    467 static int linuxring_prepare_packet(libtrace_t *libtrace UNUSED,
     464static inline int _linuxring_prepare_packet(
    468465                                    libtrace_packet_t *packet, void *buffer,
    469466                                    libtrace_rt_types_t rt_type, uint32_t flags)
     
    491488}
    492489
     490static inline int linuxring_prepare_packet(libtrace_t *libtrace UNUSED,
     491                                    libtrace_packet_t *packet, void *buffer,
     492                                    libtrace_rt_types_t rt_type, uint32_t flags)
     493{
     494        return _linuxring_prepare_packet(packet, buffer, rt_type, flags);
     495}
    493496#ifdef HAVE_NETPACKET_PACKET_H
    494497#define LIBTRACE_MIN(a,b) ((a)<(b) ? (a) : (b))
     
    500503                                        libtrace_packet_t *packet,
    501504                                        struct linux_per_stream_t *stream,
    502                                         libtrace_message_queue_t *queue) {
     505                                        libtrace_message_queue_t *queue,
     506                                        int block) {
    503507
    504508        struct tpacket2_hdr *header;
     
    518522         * ready for consumption.
    519523         */
     524
    520525        while (!(header->tp_status & TP_STATUS_USER) ||
    521                header->tp_status == TP_STATUS_LIBTRACE) {
     526                        header->tp_status == TP_STATUS_LIBTRACE) {
     527                if (!block) {
     528                        return 0;
     529                }
     530
    522531                if ((ret=is_halted(libtrace)) != -1)
    523532                        return ret;
     
    594603        /* We just need to get prepare_packet to set all our packet pointers
    595604         * appropriately */
    596         if (linuxring_prepare_packet(libtrace, packet, packet->buffer,
     605        if (_linuxring_prepare_packet(packet, packet->buffer,
    597606                                packet->type, 0))
    598607                return -1;
     
    603612
    604613static int linuxring_read_packet(libtrace_t *libtrace, libtrace_packet_t *packet) {
    605         return linuxring_read_stream(libtrace, packet, FORMAT_DATA_FIRST, NULL);
     614        return linuxring_read_stream(libtrace, packet, FORMAT_DATA_FIRST,
     615                        NULL, 1);
    606616}
    607617
     
    610620                                   libtrace_thread_t *t,
    611621                                   libtrace_packet_t *packets[],
    612                                    UNUSED size_t nb_packets) {
    613         /* For now just read one packet */
    614         /* If we change this to actually read nb_packets, make sure
    615          * we remove the burst_size override in linuxring_pstart_input()
    616          */
    617         packets[0]->error = linuxring_read_stream(libtrace, packets[0],
    618                                                   t->format_data, &t->messages);
    619         if (packets[0]->error >= 1)
    620                 return 1;
    621         else
    622                 return packets[0]->error;
     622                                   size_t nb_packets) {
     623        size_t i;
     624
     625        for (i = 0; i < nb_packets; i++) {
     626                packets[i]->error = linuxring_read_stream(libtrace, packets[i],
     627                                t->format_data, &t->messages, i == 0 ? 1 : 0);
     628
     629                if (packets[i]->error < 0) {
     630                        return packets[i]->error;
     631                }
     632
     633                if (packets[i]->error == 0) {
     634                        return i;
     635                }
     636        }
     637
     638        return nb_packets;
    623639}
    624640#endif
Note: See TracChangeset for help on using the changeset viewer.