aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPetri Savolainen <petri.savolainen@nokia.com>2015-09-28 17:52:58 +0300
committerMaxim Uvarov <maxim.uvarov@linaro.org>2015-09-30 10:56:15 +0300
commitea71a0c4e950bd91c9abd2ec7619263afd93253d (patch)
treec5c8c5d943de8f11aff112b817e1e0138562bcc2
parent3d409fdaef3b26ce2a87602db2994f1a1d8a163b (diff)
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 <petri.savolainen@nokia.com> Reviewed-by: Balasubramanian Manoharan <bala.manoharan@linaro.org> Signed-off-by: Maxim Uvarov <maxim.uvarov@linaro.org>
-rw-r--r--platform/linux-generic/include/odp_packet_io_internal.h10
-rw-r--r--platform/linux-generic/odp_classification.c5
-rw-r--r--platform/linux-generic/odp_packet_io.c97
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) {