On Mon, Sep 1, 2014 at 11:56 AM, Alex Wang <al...@nicira.com> wrote: >> > static struct dp_netdev_port *dp_netdev_lookup_port(const struct >> > dp_netdev *dp, >> > @@ -281,6 +281,15 @@ struct dp_netdev_actions >> > *dp_netdev_flow_get_actions( >> > const struct dp_netdev_flow *); >> > static void dp_netdev_actions_free(struct dp_netdev_actions *); >> > >> > +/* Represents the PMD configuration on a cpu socket. */ >> > +struct pmd_socket { >> > + struct dp_netdev *dp; >> > + struct latch exit_latch; >> > + struct pmd_thread *pmd_threads; >> > + int socket_id; >> > + int n_pmd_threads; >> > +}; >> > + >> We should keep socket to core mapping in numa module rather than in >> dpif-netdev. > > > > In my future patches (for per pmd cls/flowtable), i removed the pmd_socket. > I'll just move the change forward... > > > >> >> I am not sure why exit latch needs to be per socket, it is global >> today, it should be ok for now, no? >> > > > I'll make the 'exit latch' per pmd thread, because, for this optimization: > - when dpdk port is deleted, if it is the last dpdk port on the socket, > all pmd threads on the socket will be removed, > - using global exit latch will cause all pmd threads removed, > > pmd thread addition should be rare operation, so lets keep exit_latch per netdev, we can optimize it later if required.
> >> >> > static void * >> > pmd_thread_main(void *f_) >> > { >> > struct pmd_thread *f = f_; >> > - struct dp_netdev *dp = f->dp; >> > + struct dp_netdev *dp = f->socket->dp; >> > unsigned int lc = 0; >> > struct rxq_poll *poll_list; >> > + struct non_local_pmd_dev *dev_list; >> > unsigned int port_seq; >> > - int poll_cnt; >> > + int poll_cnt, dev_cnt; >> > int i; >> > >> > poll_cnt = 0; >> > + dev_cnt = 0; >> > poll_list = NULL; >> > + dev_list = NULL; >> > >> > - pmd_thread_setaffinity_cpu(f->id); >> > + pmd_thread_setaffinity_cpu(f->core_id); >> > reload: >> > poll_cnt = pmd_load_queues(f, &poll_list, poll_cnt); >> > + dev_cnt = pmd_get_non_local_pmd_dev(f, &dev_list, dev_cnt); >> > atomic_read(&f->change_seq, &port_seq); >> > >> > for (;;) { >> > @@ -1682,6 +1777,10 @@ reload: >> > dp_netdev_process_rxq_port(dp, poll_list[i].port, >> > poll_list[i].rx); >> > } >> > >> > + for (i = 0; i < dev_cnt; i++) { >> > + netdev_dpdk_flush_non_local(dev_list[i].dev, f->core_id); >> > + } >> > + >> >> In transmit function we can flush if this is remote queue. To optimize >> remote queue check on every xmit, we can add remote flag to >> dpdk-netdev queue. > > > > may i know more about the reason you want to flush for every remote tx pkt? > > - is it for packet order concern? > I wanted to avoid extra call for dpdk. > i'm not sure how expensive it is to call the tx function? but still think > we > should batch the remote tx here, > I am not proposing extra call, dpdk-send can flush queue if it is remote queue. _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev