From ea71a0c4e950bd91c9abd2ec7619263afd93253d Mon Sep 17 00:00:00 2001 From: Petri Savolainen Date: Mon, 28 Sep 2015 17:52:58 +0300 Subject: linux-generic: pktio: enable classifier only when needed Packet input does not call packet_classifier function when there are no cos (pmr, default cos or l2/l3 table) set for the pktio interface. Signed-off-by: Petri Savolainen Reviewed-by: Balasubramanian Manoharan Signed-off-by: Maxim Uvarov --- platform/linux-generic/odp_packet_io.c | 97 ++++++++++++++++++++++------------ 1 file changed, 63 insertions(+), 34 deletions(-) (limited to 'platform/linux-generic/odp_packet_io.c') diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c index d724933..2e7b199 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -154,9 +154,7 @@ static void unlock_entry_classifier(pktio_entry_t *entry) static void init_pktio_entry(pktio_entry_t *entry) { set_taken(entry); - /* Currently classifier is enabled by default. It should be enabled - only when used. */ - entry->s.cls_enabled = 1; + pktio_cls_enabled_set(entry, 0); entry->s.inq_default = ODP_QUEUE_INVALID; pktio_classifier_init(entry); @@ -542,30 +540,42 @@ odp_buffer_hdr_t *pktin_dequeue(queue_entry_t *qentry) odp_buffer_hdr_t *buf_hdr; odp_buffer_t buf; odp_packet_t pkt_tbl[QUEUE_MULTI_MAX]; - odp_buffer_hdr_t *tmp_hdr_tbl[QUEUE_MULTI_MAX]; + odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX]; int pkts, i, j; + odp_pktio_t pktio; buf_hdr = queue_deq(qentry); if (buf_hdr != NULL) return buf_hdr; - pkts = odp_pktio_recv(qentry->s.pktin, pkt_tbl, QUEUE_MULTI_MAX); + pktio = qentry->s.pktin; + + pkts = odp_pktio_recv(pktio, pkt_tbl, QUEUE_MULTI_MAX); if (pkts <= 0) return NULL; - for (i = 0, j = 0; i < pkts; ++i) { - buf = _odp_packet_to_buffer(pkt_tbl[i]); - buf_hdr = odp_buf_to_hdr(buf); - if (0 > packet_classifier(qentry->s.pktin, pkt_tbl[i])) - tmp_hdr_tbl[j++] = buf_hdr; + if (pktio_cls_enabled(get_pktio_entry(pktio))) { + for (i = 0, j = 0; i < pkts; i++) { + if (0 > packet_classifier(pktio, pkt_tbl[i])) { + buf = _odp_packet_to_buffer(pkt_tbl[i]); + hdr_tbl[j++] = odp_buf_to_hdr(buf); + } + } + } else { + for (i = 0; i < pkts; i++) { + buf = _odp_packet_to_buffer(pkt_tbl[i]); + hdr_tbl[i] = odp_buf_to_hdr(buf); + } + + j = pkts; } if (0 == j) return NULL; if (j > 1) - queue_enq_multi(qentry, &tmp_hdr_tbl[1], j - 1, 0); - buf_hdr = tmp_hdr_tbl[0]; + queue_enq_multi(qentry, &hdr_tbl[1], j - 1, 0); + buf_hdr = hdr_tbl[0]; return buf_hdr; } @@ -581,10 +591,10 @@ int pktin_deq_multi(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr[], int num) { int nbr; odp_packet_t pkt_tbl[QUEUE_MULTI_MAX]; - odp_buffer_hdr_t *tmp_hdr_tbl[QUEUE_MULTI_MAX]; - odp_buffer_hdr_t *tmp_hdr; + odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX]; odp_buffer_t buf; int pkts, i, j; + odp_pktio_t pktio; nbr = queue_deq_multi(qentry, buf_hdr, num); if (odp_unlikely(nbr > num)) @@ -597,19 +607,30 @@ int pktin_deq_multi(queue_entry_t *qentry, odp_buffer_hdr_t *buf_hdr[], int num) if (nbr == num) return nbr; - pkts = odp_pktio_recv(qentry->s.pktin, pkt_tbl, QUEUE_MULTI_MAX); + pktio = qentry->s.pktin; + + pkts = odp_pktio_recv(pktio, pkt_tbl, QUEUE_MULTI_MAX); if (pkts <= 0) return nbr; - for (i = 0, j = 0; i < pkts; ++i) { - buf = _odp_packet_to_buffer(pkt_tbl[i]); - tmp_hdr = odp_buf_to_hdr(buf); - if (0 > packet_classifier(qentry->s.pktin, pkt_tbl[i])) - tmp_hdr_tbl[j++] = tmp_hdr; + if (pktio_cls_enabled(get_pktio_entry(pktio))) { + for (i = 0, j = 0; i < pkts; i++) { + if (0 > packet_classifier(pktio, pkt_tbl[i])) { + buf = _odp_packet_to_buffer(pkt_tbl[i]); + hdr_tbl[j++] = odp_buf_to_hdr(buf); + } + } + } else { + for (i = 0; i < pkts; i++) { + buf = _odp_packet_to_buffer(pkt_tbl[i]); + hdr_tbl[i] = odp_buf_to_hdr(buf); + } + + j = pkts; } if (j) - queue_enq_multi(qentry, tmp_hdr_tbl, j, 0); + queue_enq_multi(qentry, hdr_tbl, j, 0); return nbr; } @@ -618,6 +639,10 @@ int pktin_poll(pktio_entry_t *entry) odp_packet_t pkt_tbl[QUEUE_MULTI_MAX]; odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX]; int num, num_enq, i; + odp_buffer_t buf; + odp_pktio_t pktio; + + pktio = entry->s.handle; if (odp_unlikely(is_free(entry))) return -1; @@ -628,26 +653,30 @@ int pktin_poll(pktio_entry_t *entry) if (entry->s.state == STATE_STOP) return 0; - num = odp_pktio_recv(entry->s.handle, pkt_tbl, QUEUE_MULTI_MAX); + num = odp_pktio_recv(pktio, pkt_tbl, QUEUE_MULTI_MAX); + + if (num == 0) + return 0; if (num < 0) { ODP_ERR("Packet recv error\n"); return -1; } - for (i = 0, num_enq = 0; i < num; ++i) { - odp_buffer_t buf; - odp_buffer_hdr_t *hdr; - - buf = _odp_packet_to_buffer(pkt_tbl[i]); - hdr = odp_buf_to_hdr(buf); - - if (entry->s.cls_enabled) { - if (packet_classifier(entry->s.handle, pkt_tbl[i]) < 0) - hdr_tbl[num_enq++] = hdr; - } else { - hdr_tbl[num_enq++] = hdr; + if (pktio_cls_enabled(entry)) { + for (i = 0, num_enq = 0; i < num; i++) { + if (packet_classifier(pktio, pkt_tbl[i]) < 0) { + buf = _odp_packet_to_buffer(pkt_tbl[i]); + hdr_tbl[num_enq++] = odp_buf_to_hdr(buf); + } } + } else { + for (i = 0; i < num; i++) { + buf = _odp_packet_to_buffer(pkt_tbl[i]); + hdr_tbl[i] = odp_buf_to_hdr(buf); + } + + num_enq = num; } if (num_enq) { -- cgit v1.2.3