Hi Bala,

For each pktio, I'm trying to create one odp_tm_t and also one tm thread.

The TM thread is bound to an odp_tm_group_t , that means I will create
odp_tm_group_t for each pktio.

Currently, the group creation only available for big system with more than
24 cores. So I also reduce this number.

As for the traffic_mgmt example, associate the company profile for each
pktio, like it is a pktio profile.

The whole picture is each pktio will be associated with one tm thread, and
this tm thread will have an odp_tm_t tree to handle.


Thanks,
Forrest

On 6 December 2016 at 20:17, Bala Manoharan <bala.manoha...@linaro.org>
wrote:

> Can you please elaborate on the use-case for this change?
>
> Regards,
> Bala
>
>
> On 2 December 2016 at 13:41,  <forrest....@linaro.org> wrote:
> > From: Xuelin Shi <forrest....@linaro.org>
> >
> > since tm thread is handling tm group, move the thread based
> > barrier to tm group. otherwise, packet cannot get into the
> > second tm system in the same group.
> >
> > Signed-off-by: Xuelin Shi <forrest....@linaro.org>
> > ---
> >  platform/linux-generic/include/odp_traffic_mngr_internal.h |  3 ++-
> >  platform/linux-generic/odp_traffic_mngr.c                  | 12
> +++++++-----
> >  2 files changed, 9 insertions(+), 6 deletions(-)
> >
> > diff --git a/platform/linux-generic/include/odp_traffic_mngr_internal.h
> b/platform/linux-generic/include/odp_traffic_mngr_internal.h
> > index 858183b..9f821fe 100644
> > --- a/platform/linux-generic/include/odp_traffic_mngr_internal.h
> > +++ b/platform/linux-generic/include/odp_traffic_mngr_internal.h
> > @@ -367,7 +367,6 @@ struct tm_system_s {
> >         _odp_tm_group_t odp_tm_group;
> >
> >         odp_ticketlock_t tm_system_lock;
> > -       odp_barrier_t    tm_system_barrier;
> >         odp_barrier_t    tm_system_destroy_barrier;
> >         odp_atomic_u64_t destroying;
> >         _odp_int_name_t  name_tbl_id;
> > @@ -416,8 +415,10 @@ struct tm_system_group_s {
> >         tm_system_group_t *prev;
> >         tm_system_group_t *next;
> >
> > +       odp_barrier_t  tm_group_barrier;
> >         tm_system_t   *first_tm_system;
> >         uint32_t       num_tm_systems;
> > +       uint32_t       first_enq;
> >         pthread_t      thread;
> >         pthread_attr_t attr;
> >  };
> > diff --git a/platform/linux-generic/odp_traffic_mngr.c
> b/platform/linux-generic/odp_traffic_mngr.c
> > index a1f990f..62e5c63 100644
> > --- a/platform/linux-generic/odp_traffic_mngr.c
> > +++ b/platform/linux-generic/odp_traffic_mngr.c
> > @@ -1854,6 +1854,7 @@ static int tm_enqueue(tm_system_t *tm_system,
> >                       tm_queue_obj_t *tm_queue_obj,
> >                       odp_packet_t pkt)
> >  {
> > +       tm_system_group_t *tm_group;
> >         input_work_item_t work_item;
> >         odp_packet_color_t pkt_color;
> >         tm_wred_node_t *initial_tm_wred_node;
> > @@ -1868,9 +1869,10 @@ static int tm_enqueue(tm_system_t *tm_system,
> >         if (queue_tm_reorder(&tm_queue_obj->tm_qentry,
> &pkt_hdr->buf_hdr))
> >                 return 0;
> >
> > -       if (tm_system->first_enq == 0) {
> > -               odp_barrier_wait(&tm_system->tm_system_barrier);
> > -               tm_system->first_enq = 1;
> > +       tm_group = GET_TM_GROUP(tm_system->odp_tm_group);
> > +       if (tm_group->first_enq == 0) {
> > +               odp_barrier_wait(&tm_group->tm_group_barrier);
> > +               tm_group->first_enq = 1;
> >         }
> >
> >         pkt_color = odp_packet_color(pkt);
> > @@ -2327,7 +2329,7 @@ static void *tm_system_thread(void *arg)
> >         input_work_queue = tm_system->input_work_queue;
> >
> >         /* Wait here until we have seen the first enqueue operation. */
> > -       odp_barrier_wait(&tm_system->tm_system_barrier);
> > +       odp_barrier_wait(&tm_group->tm_group_barrier);
> >         main_loop_running = true;
> >
> >         destroying = odp_atomic_load_u64(&tm_system->destroying);
> > @@ -2625,6 +2627,7 @@ static _odp_tm_group_t _odp_tm_group_create(const
> char *name ODP_UNUSED)
> >
> >         tm_group = malloc(sizeof(tm_system_group_t));
> >         memset(tm_group, 0, sizeof(tm_system_group_t));
> > +       odp_barrier_init(&tm_group->tm_group_barrier, 2);
> >
> >         /* Add this group to the tm_group_list linked list. */
> >         if (tm_group_list == NULL) {
> > @@ -2868,7 +2871,6 @@ odp_tm_t odp_tm_create(const char            *name,
> >         tm_system->_odp_int_timer_wheel = _ODP_INT_TIMER_WHEEL_INVALID;
> >
> >         odp_ticketlock_init(&tm_system->tm_system_lock);
> > -       odp_barrier_init(&tm_system->tm_system_barrier, 2);
> >         odp_atomic_init_u64(&tm_system->destroying, 0);
> >
> >         tm_system->_odp_int_sorted_pool = _odp_sorted_pool_create(
> > --
> > 1.8.3.1
> >
>

Reply via email to