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 --- .../linux-generic/include/odp_packet_io_internal.h | 10 +++ platform/linux-generic/odp_classification.c | 5 ++ platform/linux-generic/odp_packet_io.c | 97 ++++++++++++++-------- 3 files changed, 78 insertions(+), 34 deletions(-) diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h index a21c683..6b03051 100644 --- a/platform/linux-generic/include/odp_packet_io_internal.h +++ b/platform/linux-generic/include/odp_packet_io_internal.h @@ -109,6 +109,16 @@ static inline pktio_entry_t *get_pktio_entry(odp_pktio_t pktio) return pktio_entry_ptr[pktio_to_id(pktio)]; } +static inline int pktio_cls_enabled(pktio_entry_t *entry) +{ + return entry->s.cls_enabled; +} + +static inline void pktio_cls_enabled_set(pktio_entry_t *entry, int ena) +{ + entry->s.cls_enabled = ena; +} + int pktin_poll(pktio_entry_t *entry); extern const pktio_if_ops_t sock_mmsg_pktio_ops; diff --git a/platform/linux-generic/odp_classification.c b/platform/linux-generic/odp_classification.c index 6c1aff4..fb1b019 100644 --- a/platform/linux-generic/odp_classification.c +++ b/platform/linux-generic/odp_classification.c @@ -307,6 +307,7 @@ int odp_pktio_default_cos_set(odp_pktio_t pktio_in, odp_cos_t default_cos) } entry->s.cls.default_cos = cos; + pktio_cls_enabled_set(entry, 1); return 0; } @@ -378,6 +379,7 @@ int odp_cos_with_l2_priority(odp_pktio_t pktio_in, l2_cos->cos[qos_table[i]] = cos; } } + pktio_cls_enabled_set(entry, 1); UNLOCK(&l2_cos->lock); return 0; } @@ -410,6 +412,7 @@ int odp_cos_with_l3_qos(odp_pktio_t pktio_in, l3_cos->cos[qos_table[i]] = cos; } } + pktio_cls_enabled_set(entry, 1); UNLOCK(&l3_cos->lock); return 0; } @@ -488,6 +491,7 @@ int odp_pktio_pmr_cos(odp_pmr_t pmr_id, pktio_entry->s.cls.pmr[num_pmr] = pmr; pktio_entry->s.cls.cos[num_pmr] = cos; pktio_entry->s.cls.num_pmr++; + pktio_cls_enabled_set(pktio_entry, 1); UNLOCK(&pktio_entry->s.cls.lock); return 0; @@ -625,6 +629,7 @@ int odp_pktio_pmr_match_set_cos(odp_pmr_set_t pmr_set_id, odp_pktio_t src_pktio, pktio_entry->s.cls.pmr[num_pmr] = pmr; pktio_entry->s.cls.cos[num_pmr] = cos; pktio_entry->s.cls.num_pmr++; + pktio_cls_enabled_set(pktio_entry, 1); UNLOCK(&pktio_entry->s.cls.lock); return 0; 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