On Fri, Apr 10, 2020 at 01:04:00AM +0200, Andrzej Ostruszka wrote:
> On 4/5/20 10:56 AM, jer...@marvell.com wrote:
> > From: Nithin Dabilpuram <ndabilpu...@marvell.com>
> > 
> > Add graph creation, configuration logic and graph main loop.
> > This graph main loop is run on every slave lcore and calls
> > rte_graph_walk() to walk over lcore specific rte_graph.
> > Master core accumulates and prints graph walk stats of all the
> > lcore's graph's.
> > 
> > Signed-off-by: Nithin Dabilpuram <ndabilpu...@marvell.com>
> > ---
> [...]
> > @@ -826,11 +936,26 @@ main(int argc, char **argv)
> >                                      "port=%d\n",
> >                                      ret, portid);
> >  
> > +                   /* Add this queue node to its graph */
> > +                   snprintf(qconf->rx_queue_list[queue].node_name,
> > +                            RTE_NODE_NAMESIZE, "ethdev_rx-%u-%u", portid,
> > +                            queueid);
> > +           }
> > +
> > +           /* Alloc a graph to this lcore only if source exists  */
> > +           if (qconf->n_rx_queue) {
> > +                   qconf->graph_id = nb_graphs;
> 
> See below for a comment related to that.
> 
> > +                   nb_graphs++;
> >             }
> >     }
> >  
> >     printf("\n");
> >  
> > +   /* Ethdev node config, skip rx queue mapping */
> > +   ret = rte_node_eth_config(ethdev_conf, nb_conf, nb_graphs);
> > +   if (ret)
> > +           rte_exit(EXIT_FAILURE, "rte_node_eth_config: err=%d\n", ret);
> > +
> >     /* Start ports */
> >     RTE_ETH_FOREACH_DEV(portid)
> >     {
> > @@ -858,6 +983,119 @@ main(int argc, char **argv)
> >  
> >     check_all_ports_link_status(enabled_port_mask);
> >  
> > +   /* Graph Initialization */
> > +   memset(&graph_conf, 0, sizeof(graph_conf));
> > +   graph_conf.node_patterns = node_patterns;
> > +   nb_patterns = RTE_DIM(node_patterns);
> > +
> > +   for (lcore_id = 0; lcore_id < RTE_MAX_LCORE; lcore_id++) {
> > +           rte_graph_t graph_id;
> > +           rte_edge_t i;
> > +
> > +           if (rte_lcore_is_enabled(lcore_id) == 0)
> > +                   continue;
> > +
> > +           qconf = &lcore_conf[lcore_id];
> > +
> > +           /* Skip graph creation if no source exists */
> > +           if (!qconf->n_rx_queue)
> > +                   continue;
> > +
> > +           /* Add rx node patterns of this lcore */
> > +           for (i = 0; i < qconf->n_rx_queue; i++) {
> > +                   graph_conf.node_patterns[nb_patterns + i] =
> > +                           qconf->rx_queue_list[i].node_name;
> > +           }
> > +
> > +           graph_conf.nb_node_patterns = nb_patterns + i;
> > +           graph_conf.socket_id = rte_lcore_to_socket_id(lcore_id);
> > +
> > +           snprintf(qconf->name, sizeof(qconf->name), "worker_%u",
> > +                    lcore_id);
> > +
> > +           graph_id = rte_graph_create(qconf->name, &graph_conf);
> > +           if (graph_id != qconf->graph_id)
> > +                   rte_exit(EXIT_FAILURE,
> > +                            "rte_graph_create(): graph_id=%d not "
> > +                            " as expected for lcore %u(%u\n",
> > +                            graph_id, lcore_id, qconf->graph_id);
> 
> Should application be checking graph implementation?  Maybe just check
> that it is not "invalid" and here store it to qconf->graph_id?

Ack, will fix it in V5.
> 
> > +
> > +           qconf->graph = rte_graph_lookup(qconf->name);
> > +           if (!qconf->graph)
> > +                   rte_exit(EXIT_FAILURE,
> > +                            "rte_graph_lookup(): graph %s not found\n",
> > +                            qconf->name);
> > +   }
> > +
> > +   memset(&rewrite_data, 0, sizeof(rewrite_data));
> > +   rewrite_len = sizeof(rewrite_data);
> > +
> > +   /* Add route to ip4 graph infra */
> > +   for (i = 0; i < IPV4_L3FWD_LPM_NUM_ROUTES; i++) {
> > +           char route_str[INET6_ADDRSTRLEN * 4];
> > +           char abuf[INET6_ADDRSTRLEN];
> > +           struct in_addr in;
> > +           uint32_t dst_port;
> > +           uint16_t next_hop;
> > +
> > +           /* Skip unused ports */
> > +           if ((1 << ipv4_l3fwd_lpm_route_array[i].if_out &
> > +                enabled_port_mask) == 0)
> > +                   continue;
> > +
> > +           dst_port = ipv4_l3fwd_lpm_route_array[i].if_out;
> > +           next_hop = i;
> 
> What is the difference between next_hop and i?  It looks to me like they
> both have the same type and value.  So maybe instead of another object
> just add comment to route_add() below?  No strong feeling here so you
> can ignore this comment.

Here there is no difference, but just wanted to say that next_hop is a
user choosen identifier to add rewrite data and use the same id to link
a route added to that next hop. There could be multiple routes pointing
to same next hop(gateway) in reality.
I'll change that to 'i' and add comment describing it in V5.
> 
> > +
> > +           in.s_addr = htonl(ipv4_l3fwd_lpm_route_array[i].ip);
> > +           snprintf(route_str, sizeof(route_str), "%s / %d (%d)",
> > +                    inet_ntop(AF_INET, &in, abuf, sizeof(abuf)),
> > +                    ipv4_l3fwd_lpm_route_array[i].depth,
> > +                    ipv4_l3fwd_lpm_route_array[i].if_out);
> > +
> > +           ret = rte_node_ip4_route_add(
> > +                   ipv4_l3fwd_lpm_route_array[i].ip,
> > +                   ipv4_l3fwd_lpm_route_array[i].depth, next_hop,
> > +                   RTE_NODE_IP4_LOOKUP_NEXT_REWRITE);
> > +
> 
> With regards
> Andrzej Ostruszka

Reply via email to