From patchwork Thu Oct 9 20:33:43 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stuart Haslam X-Patchwork-Id: 38531 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-wg0-f71.google.com (mail-wg0-f71.google.com [74.125.82.71]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 5D178202DB for ; Thu, 9 Oct 2014 20:34:15 +0000 (UTC) Received: by mail-wg0-f71.google.com with SMTP id y10sf1323388wgg.2 for ; Thu, 09 Oct 2014 13:34:14 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:delivered-to:from:to:date:message-id:subject :precedence:list-id:list-unsubscribe:list-archive:list-post :list-help:list-subscribe:mime-version:errors-to:sender :x-original-sender:x-original-authentication-results:mailing-list :content-type:content-transfer-encoding; bh=t2HL+Q60Z6lZJ6UjL5tXuUr/0RWLCmp0dZFpfAw2fsk=; b=Y8U6EEV8Pu/bmc0RasvcTEuXV/mmuT+xv11r1qlK6Bsn03gzSEwYBX4OereaXk9GJz WIjBjodzDNTxdcndoNgZ58wy5E68n92vxNdWBwHLojT7KyhjNA6OxHZ/p+zE9qTE++k8 cIpuWlz0EMm0OEsMiuTPZDqxgkVZDZllkKo+guqULScyVUe3FAVJbN/OHDBwOSc56SB6 pTRawrnUyJPHkeuV/sgmR5WusGjsL5AJq477TEwWsTADEbctF181Pq/Gkhb7R0H5XpVE HuKoiCipm/GGjBrReJAnmGYmm0hxl8bLWRX7Ev/24w25dXXwZgpMQzwOAqVK51TlLZlj FDiQ== X-Gm-Message-State: ALoCoQmO8cvQvllqsIWLbq2wY+n1vD4h61Rc4PH9j4Y6aw8LG02ZKscpLVJeJoDv05Ot2Lh2SZZP X-Received: by 10.152.43.66 with SMTP id u2mr34897lal.1.1412886854522; Thu, 09 Oct 2014 13:34:14 -0700 (PDT) X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.37.194 with SMTP id a2ls214127lak.41.gmail; Thu, 09 Oct 2014 13:34:14 -0700 (PDT) X-Received: by 10.112.189.103 with SMTP id gh7mr10884lbc.18.1412886854366; Thu, 09 Oct 2014 13:34:14 -0700 (PDT) Received: from mail-lb0-f173.google.com (mail-lb0-f173.google.com [209.85.217.173]) by mx.google.com with ESMTPS id dt6si6163046lbc.17.2014.10.09.13.34.14 for (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 09 Oct 2014 13:34:14 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.173 as permitted sender) client-ip=209.85.217.173; Received: by mail-lb0-f173.google.com with SMTP id 10so1891534lbg.32 for ; Thu, 09 Oct 2014 13:34:14 -0700 (PDT) X-Received: by 10.112.164.71 with SMTP id yo7mr20219173lbb.73.1412886853923; Thu, 09 Oct 2014 13:34:13 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.84.229 with SMTP id c5csp313932lbz; Thu, 9 Oct 2014 13:34:10 -0700 (PDT) X-Received: by 10.229.120.197 with SMTP id e5mr248051qcr.9.1412886850263; Thu, 09 Oct 2014 13:34:10 -0700 (PDT) Received: from ip-10-35-177-41.ec2.internal (lists.linaro.org. [54.225.227.206]) by mx.google.com with ESMTPS id q21si7460270qgq.67.2014.10.09.13.34.09 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Thu, 09 Oct 2014 13:34:10 -0700 (PDT) Received-SPF: none (google.com: lng-odp-bounces@lists.linaro.org does not designate permitted sender hosts) client-ip=54.225.227.206; Received: from localhost ([127.0.0.1] helo=ip-10-35-177-41.ec2.internal) by ip-10-35-177-41.ec2.internal with esmtp (Exim 4.76) (envelope-from ) id 1XcKPX-0005VS-Pq; Thu, 09 Oct 2014 20:34:07 +0000 Received: from service87.mimecast.com ([91.220.42.44]) by ip-10-35-177-41.ec2.internal with esmtp (Exim 4.76) (envelope-from ) id 1XcKPR-0005VN-3m for lng-odp@lists.linaro.org; Thu, 09 Oct 2014 20:34:01 +0000 Received: from cam-owa2.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.21]) by service87.mimecast.com; Thu, 09 Oct 2014 21:34:00 +0100 Received: from e106441.cambridge.arm.com ([10.1.255.212]) by cam-owa2.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Thu, 9 Oct 2014 21:33:57 +0100 From: Stuart Haslam To: lng-odp@lists.linaro.org Date: Thu, 9 Oct 2014 21:33:43 +0100 Message-Id: <1412886823-18347-1-git-send-email-stuart.haslam@arm.com> X-Mailer: git-send-email 1.9.1 X-OriginalArrivalTime: 09 Oct 2014 20:33:57.0818 (UTC) FILETIME=[5A00F9A0:01CFE400] X-MC-Unique: 114100921340000201 X-Topics: patch Subject: [lng-odp] [RFC PATCH] Remove queue types ODP_QUEUE_TYPE_PKTIN and PKTOUT X-BeenThere: lng-odp@lists.linaro.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: , List-Help: , List-Subscribe: , MIME-Version: 1.0 Errors-To: lng-odp-bounces@lists.linaro.org Sender: lng-odp-bounces@lists.linaro.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: stuart.haslam@arm.com X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.217.173 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 The PKTIN and PKTOUT queue types are currently used to identify queues as being attached to a pktio interface, but this is an implementation detail that has leaked into the API. Instead of using the queue type to modify the behaviour of a queue endpoint to send/recv packets over a pktio interface, add hooks to change this behaviour when a queue is set as a pktio input or output queue. Signed-off-by: Stuart Haslam --- Sending as an RFC for now as I've only done limited testing so far. Also, I'm not sure if other platforms depend on these queue types, I expect they don't but please shout if this is not the case. Tested only with SCHED queues with odp_pktio on linux-generic. example/generator/odp_generator.c | 2 +- example/ipsec/odp_ipsec.c | 4 +- example/l2fwd/odp_l2fwd.c | 2 +- example/packet/odp_pktio.c | 2 +- platform/linux-generic/include/api/odp_queue.h | 2 - .../linux-generic/include/odp_queue_internal.h | 3 ++ platform/linux-generic/odp_packet_io.c | 10 ++-- platform/linux-generic/odp_queue.c | 61 ++++++++++++---------- platform/linux-generic/odp_schedule.c | 4 +- 9 files changed, 45 insertions(+), 45 deletions(-) diff --git a/example/generator/odp_generator.c b/example/generator/odp_generator.c index 6055324..d566a19 100644 --- a/example/generator/odp_generator.c +++ b/example/generator/odp_generator.c @@ -473,7 +473,7 @@ static void *gen_recv_thread(void *arg) qparam.sched.group = ODP_SCHED_GROUP_DEFAULT; snprintf(inq_name, sizeof(inq_name), "%i-pktio_inq_def", (int)pktio); inq_name[ODP_QUEUE_NAME_LEN - 1] = '\0'; - inq_def = odp_queue_create(inq_name, ODP_QUEUE_TYPE_PKTIN, &qparam); + inq_def = odp_queue_create(inq_name, ODP_QUEUE_TYPE_SCHED, &qparam); if (inq_def == ODP_QUEUE_INVALID) { ODP_ERR(" [%02i] Error: pktio queue creation failed\n", thr); return NULL; diff --git a/example/ipsec/odp_ipsec.c b/example/ipsec/odp_ipsec.c index ec6c87a..ba90242 100644 --- a/example/ipsec/odp_ipsec.c +++ b/example/ipsec/odp_ipsec.c @@ -291,7 +291,7 @@ odp_queue_t polled_odp_queue_create(const char *name, my_queue = odp_queue_create(name, my_type, param); - if ((ODP_QUEUE_TYPE_SCHED == type) || (ODP_QUEUE_TYPE_PKTIN == type)) { + if (ODP_QUEUE_TYPE_SCHED == type) { poll_queues[num_polled_queues++] = my_queue; printf("%s: adding %d\n", __func__, my_queue); } @@ -572,7 +572,7 @@ void initialize_intf(char *intf) snprintf(inq_name, sizeof(inq_name), "%i-pktio_inq_def", (int)pktio); inq_name[ODP_QUEUE_NAME_LEN - 1] = '\0'; - inq_def = QUEUE_CREATE(inq_name, ODP_QUEUE_TYPE_PKTIN, &qparam); + inq_def = QUEUE_CREATE(inq_name, ODP_QUEUE_TYPE_SCHED, &qparam); if (ODP_QUEUE_INVALID == inq_def) { ODP_ERR("Error: pktio queue creation failed for %s\n", intf); exit(EXIT_FAILURE); diff --git a/example/l2fwd/odp_l2fwd.c b/example/l2fwd/odp_l2fwd.c index 8aa0ba0..4f08dd2 100644 --- a/example/l2fwd/odp_l2fwd.c +++ b/example/l2fwd/odp_l2fwd.c @@ -165,7 +165,7 @@ static odp_pktio_t queue_mode_init_params(void *arg, odp_buffer_pool_t pool) snprintf(inq_name, sizeof(inq_name), "%i-pktio_inq_def", (int)pktio); inq_name[ODP_QUEUE_NAME_LEN - 1] = '\0'; - inq_def = odp_queue_create(inq_name, ODP_QUEUE_TYPE_PKTIN, &qparam); + inq_def = odp_queue_create(inq_name, ODP_QUEUE_TYPE_SCHED, &qparam); if (inq_def == ODP_QUEUE_INVALID) { ODP_ERR(" Error: pktio queue creation failed"); return ODP_PKTIO_INVALID; diff --git a/example/packet/odp_pktio.c b/example/packet/odp_pktio.c index 145ae47..afb2cd2 100644 --- a/example/packet/odp_pktio.c +++ b/example/packet/odp_pktio.c @@ -151,7 +151,7 @@ static void *pktio_queue_thread(void *arg) snprintf(inq_name, sizeof(inq_name), "%i-pktio_inq_def", (int)pktio); inq_name[ODP_QUEUE_NAME_LEN - 1] = '\0'; - inq_def = odp_queue_create(inq_name, ODP_QUEUE_TYPE_PKTIN, &qparam); + inq_def = odp_queue_create(inq_name, ODP_QUEUE_TYPE_SCHED, &qparam); if (inq_def == ODP_QUEUE_INVALID) { ODP_ERR(" [%02i] Error: pktio queue creation failed\n", thr); return NULL; diff --git a/platform/linux-generic/include/api/odp_queue.h b/platform/linux-generic/include/api/odp_queue.h index 5e083f1..38ff272 100644 --- a/platform/linux-generic/include/api/odp_queue.h +++ b/platform/linux-generic/include/api/odp_queue.h @@ -42,8 +42,6 @@ typedef int odp_queue_type_t; #define ODP_QUEUE_TYPE_SCHED 0 /**< Scheduled queue */ #define ODP_QUEUE_TYPE_POLL 1 /**< Not scheduled queue */ -#define ODP_QUEUE_TYPE_PKTIN 2 /**< Packet input queue */ -#define ODP_QUEUE_TYPE_PKTOUT 3 /**< Packet output queue */ /** * ODP schedule priority diff --git a/platform/linux-generic/include/odp_queue_internal.h b/platform/linux-generic/include/odp_queue_internal.h index 8b6c517..5329d4f 100644 --- a/platform/linux-generic/include/odp_queue_internal.h +++ b/platform/linux-generic/include/odp_queue_internal.h @@ -95,6 +95,9 @@ void queue_unlock(queue_entry_t *queue); odp_buffer_t queue_sched_buf(odp_queue_t queue); int queue_sched_atomic(odp_queue_t handle); +void queue_set_pktin(queue_entry_t *queue, odp_pktio_t id); +void queue_set_pktout(queue_entry_t *queue, odp_pktio_t id); + static inline uint32_t queue_to_id(odp_queue_t handle) { return handle - 1; diff --git a/platform/linux-generic/odp_packet_io.c b/platform/linux-generic/odp_packet_io.c index 0c30f0f..fbf23ff 100644 --- a/platform/linux-generic/odp_packet_io.c +++ b/platform/linux-generic/odp_packet_io.c @@ -65,13 +65,13 @@ int odp_pktio_init_global(void) snprintf(name, sizeof(name), "%i-pktio_outq_default", (int)id); name[ODP_QUEUE_NAME_LEN-1] = '\0'; - qid = odp_queue_create(name, ODP_QUEUE_TYPE_PKTOUT, NULL); + qid = odp_queue_create(name, ODP_QUEUE_TYPE_SCHED, NULL); if (qid == ODP_QUEUE_INVALID) return -1; pktio_entry->s.outq_default = qid; queue_entry = queue_to_qentry(qid); - queue_entry->s.pktout = id; + queue_set_pktout(queue_entry, id); } return 0; @@ -325,16 +325,12 @@ int odp_pktio_inq_setdef(odp_pktio_t id, odp_queue_t queue) if (pktio_entry == NULL || qentry == NULL) return -1; - if (qentry->s.type != ODP_QUEUE_TYPE_PKTIN) - return -1; - lock_entry(pktio_entry); pktio_entry->s.inq_default = queue; unlock_entry(pktio_entry); queue_lock(qentry); - qentry->s.pktin = id; - qentry->s.status = QUEUE_STATUS_SCHED; + queue_set_pktin(qentry, id); queue_unlock(qentry); odp_schedule_queue(queue, qentry->s.param.sched.prio); diff --git a/platform/linux-generic/odp_queue.c b/platform/linux-generic/odp_queue.c index 1318bcd..1f0e33a 100644 --- a/platform/linux-generic/odp_queue.c +++ b/platform/linux-generic/odp_queue.c @@ -53,6 +53,8 @@ static void queue_init(queue_entry_t *queue, const char *name, { strncpy(queue->s.name, name, ODP_QUEUE_NAME_LEN - 1); queue->s.type = type; + queue->s.pktin = ODP_PKTIO_INVALID; + queue->s.pktout = ODP_PKTIO_INVALID; if (param) { memcpy(&queue->s.param, param, sizeof(odp_queue_param_t)); @@ -64,27 +66,10 @@ static void queue_init(queue_entry_t *queue, const char *name, queue->s.param.sched.group = ODP_SCHED_GROUP_DEFAULT; } - switch (type) { - case ODP_QUEUE_TYPE_PKTIN: - queue->s.enqueue = pktin_enqueue; - queue->s.dequeue = pktin_dequeue; - queue->s.enqueue_multi = pktin_enq_multi; - queue->s.dequeue_multi = pktin_deq_multi; - break; - case ODP_QUEUE_TYPE_PKTOUT: - queue->s.enqueue = pktout_enqueue; - queue->s.dequeue = pktout_dequeue; - queue->s.enqueue_multi = pktout_enq_multi; - queue->s.dequeue_multi = pktout_deq_multi; - break; - default: - queue->s.enqueue = queue_enq; - queue->s.dequeue = queue_deq; - queue->s.enqueue_multi = queue_enq_multi; - queue->s.dequeue_multi = queue_deq_multi; - break; - } - + queue->s.enqueue = queue_enq; + queue->s.dequeue = queue_deq; + queue->s.enqueue_multi = queue_enq_multi; + queue->s.dequeue_multi = queue_deq_multi; queue->s.head = NULL; queue->s.tail = NULL; queue->s.sched_buf = ODP_BUFFER_INVALID; @@ -162,8 +147,7 @@ odp_queue_t odp_queue_create(const char *name, odp_queue_type_t type, if (queue->s.status == QUEUE_STATUS_FREE) { queue_init(queue, name, type, param); - if (type == ODP_QUEUE_TYPE_SCHED || - type == ODP_QUEUE_TYPE_PKTIN) + if (type == ODP_QUEUE_TYPE_SCHED) queue->s.status = QUEUE_STATUS_NOTSCHED; else queue->s.status = QUEUE_STATUS_READY; @@ -175,8 +159,7 @@ odp_queue_t odp_queue_create(const char *name, odp_queue_type_t type, UNLOCK(&queue->s.lock); } - if (handle != ODP_QUEUE_INVALID && - (type == ODP_QUEUE_TYPE_SCHED || type == ODP_QUEUE_TYPE_PKTIN)) { + if (handle != ODP_QUEUE_INVALID && type == ODP_QUEUE_TYPE_SCHED) { odp_buffer_t buf; buf = odp_schedule_buffer_alloc(handle); @@ -353,8 +337,7 @@ odp_buffer_hdr_t *queue_deq(queue_entry_t *queue) if (queue->s.head == NULL) { /* Already empty queue */ - if (queue->s.status == QUEUE_STATUS_SCHED && - queue->s.type != ODP_QUEUE_TYPE_PKTIN) + if (queue->s.status == QUEUE_STATUS_SCHED) queue->s.status = QUEUE_STATUS_NOTSCHED; } else { buf_hdr = queue->s.head; @@ -381,8 +364,7 @@ int queue_deq_multi(queue_entry_t *queue, odp_buffer_hdr_t *buf_hdr[], int num) if (queue->s.head == NULL) { /* Already empty queue */ - if (queue->s.status == QUEUE_STATUS_SCHED && - queue->s.type != ODP_QUEUE_TYPE_PKTIN) + if (queue->s.status == QUEUE_STATUS_SCHED) queue->s.status = QUEUE_STATUS_NOTSCHED; } else { odp_buffer_hdr_t *hdr = queue->s.head; @@ -453,3 +435,24 @@ void queue_unlock(queue_entry_t *queue) { UNLOCK(&queue->s.lock); } + +void queue_set_pktin(queue_entry_t *queue, odp_pktio_t pktio_id) +{ + queue->s.pktin = pktio_id; + queue->s.enqueue = pktin_enqueue; + queue->s.dequeue = pktin_dequeue; + queue->s.enqueue_multi = pktin_enq_multi; + queue->s.dequeue_multi = pktin_deq_multi; + if (queue->s.type == ODP_QUEUE_TYPE_SCHED) + queue->s.status = QUEUE_STATUS_SCHED; +} + +void queue_set_pktout(queue_entry_t *queue, odp_pktio_t pktio_id) +{ + queue->s.pktout = pktio_id; + queue->s.enqueue = pktout_enqueue; + queue->s.dequeue = pktout_dequeue; + queue->s.enqueue_multi = pktout_enq_multi; + queue->s.dequeue_multi = pktout_deq_multi; +} + diff --git a/platform/linux-generic/odp_schedule.c b/platform/linux-generic/odp_schedule.c index 1bf819b..5742196 100644 --- a/platform/linux-generic/odp_schedule.c +++ b/platform/linux-generic/odp_schedule.c @@ -301,8 +301,8 @@ static int schedule(odp_queue_t *out_queue, odp_buffer_t out_buf[], /* Remove empty queue from scheduling, * except packet input queues */ - if (odp_queue_type(queue) == - ODP_QUEUE_TYPE_PKTIN) + queue_entry_t *qentry = queue_to_qentry(queue); + if (qentry->s.pktin != ODP_PKTIO_INVALID) odp_queue_enq(pri_q, desc_buf); continue;