On Tue, Jan 6, 2015 at 12:27 PM, Zoltan Kiss <[email protected]> wrote:
> > > On 05/01/15 20:26, Bill Fischofer wrote: > >> >> >> On Mon, Jan 5, 2015 at 1:19 PM, Zoltan Kiss <[email protected] >> <mailto:[email protected]>> wrote: >> >> This is only compile tested, and there are a few questions in the >> patch. >> >> Signed-off-by: Zoltan Kiss <[email protected] >> <mailto:[email protected]>> >> --- >> diff --git a/lib/netdev-odp.c b/lib/netdev-odp.c >> index 96126a1..571b66e 100644 >> --- a/lib/netdev-odp.c >> +++ b/lib/netdev-odp.c >> > > @@ -129,26 +129,26 @@ odp_init(int argc, char *argv[]) >> static int >> odp_class_init(void) >> { >> - void *pool_base; >> odp_shm_t shm; >> + odp_buffer_pool_param_t params; >> int result = 0; >> >> /* create packet pool */ >> shm = odp_shm_reserve("shm_packet_pool", SHM_PKT_POOL_SIZE, >> ODP_CACHE_LINE_SIZE, 0); >> - pool_base = odp_shm_addr(shm); >> >> - if (odp_unlikely(pool_base == NULL)) { >> + if (odp_unlikely(shm == ODP_SHM_INVALID)) { >> VLOG_ERR("Error: ODP packet pool mem alloc failed\n"); >> out_of_memory(); >> return -1; >> } >> >> - pool = odp_buffer_pool_create("packet_pool", pool_base, >> - SHM_PKT_POOL_SIZE, >> - SHM_PKT_POOL_BUF_SIZE, >> - ODP_CACHE_LINE_SIZE, >> - ODP_BUFFER_TYPE_PACKET); >> + params.buf_size = SHM_PKT_POOL_BUF_SIZE; >> + params.buf_align = ODP_CACHE_LINE_SIZE; >> + params.num_bufs = SHM_PKT_POOL_SIZE / SHM_PKT_POOL_BUF_SIZE; >> + params.buf_type = ODP_BUFFER_TYPE_PACKET; >> + >> + pool = odp_buffer_pool_create("packet_pool", shm, ¶ms); >> >> You really shouldn't be attempting to allocate your own SHM here. >> Instead, delete the odp_shm_reserve() calls and pass ODP_SHM_NULL as the >> second parameter to odp_buffer_pool_create() and ODP will allocate the >> memory for you. There is no architected way to determine how large a >> SHM you need to allocate to successfully do it the other way, so this >> provision of the API is of somewhat questionable utility. >> > > Ok, I'll use it that way. > > >> >> if (struct_pool == ODP_BUFFER_POOL_INVALID) { >> VLOG_ERR("Error: packet pool create failed.\n"); >> @@ -247,15 +244,15 @@ netdev_odp_construct(struct netdev *netdev_) >> } >> >> netdev->pkt_pool = pool; >> - pkt = odph_packet_alloc(netdev->pkt_pool); >> - if (!odph_packet_is_valid(pkt)) { >> + pkt = odp_packet_alloc(netdev->pkt_pool, 0); >> + if (!odp_packet_is_valid(pkt)) { >> out_of_memory(); >> goto out_err; >> } >> >> >> It's more efficient to say if (pkt == ODP_PACKET_INVALID) here for this >> test. >> >> >> - netdev->max_frame_len = odph_packet_buf_size(pkt); >> + netdev->max_frame_len = odp_buffer_size(odp_packet_to_ >> buffer(pkt)); >> >> >> Need more context as to what you're trying to determine here. If you >> want to know what's the largest size packet you can receive that's >> ODP_CONFIG_PACKET_BUF_LEN_MAX >> > > This was written by Ciprian, but as far as I saw the only reason to > allocate this packet is to determine the maximum packet size for this > particular pool, not absolute maximum. > odp_buffer_pool_info is better for this goal. > > Yes, odp_buffer_pool_info() will return the buf_size associated with the pool, which will tell you that. Note to Petri: Please note that applications need to know the packet size associated with a buffer pool, not the packet segment size. If you want to separately specify packet segment size on the odp_buffer_pool_param_t, we still need the packet size as well. > > > @@ -334,19 +331,21 @@ clone_pkts(struct netdev_odp *dev, struct >> dpif_packet **pkts, >> dropped++; >> continue; >> } >> - pkt = odph_packet_alloc(dev->pkt_pool); >> + pkt = odp_packet_alloc(dev->pkt_pool, size); >> >> - if (OVS_UNLIKELY(!odph_packet_is_valid(pkt))) { >> + if (OVS_UNLIKELY(pkt == ODP_PACKET_INVALID)) { >> VLOG_WARN_RL(&rl, "Could not allocate packet"); >> dropped += cnt -i; >> break; >> } >> >> - odp_packet_init(pkt); >> - odp_packet_set_l2_offset(pkt, 0); >> + odp_packet_reset(pkt, 0); >> + odp_packet_l2_offset_set(pkt, 0); >> >> - memcpy(odp_packet_l2(pkt), ofpbuf_data(&pkts[i]->ofpbuf), >> size); >> - odp_packet_parse(pkt, size, 0); >> + memcpy(odp_packet_l2_ptr(pkt, NULL), >> ofpbuf_data(&pkts[i]->ofpbuf), >> + size); >> + /* TODO: is this OK? */ >> >> >> You shouldn't use memcpy on packets. Instead, to set the length and >> copy the packet this should be: >> > > > >> odp_packet_push_tail(pkt, size); >> odp_packet_copydata_in(pkt, 0, size, >> ofpbuf_data(&pkts[i]->ofpbuf)); >> >> + _odp_packet_parse(pkt); >> >> >> This is an internal API and should not be called by an ODP app. It >> should be an ODP API but Petri hasn't approved it as such, hence it >> can't be used. >> > If this came in on an ODP interface, then we don't need to parse it as > Ciprian wrote in an another mail, because it was parsed during reception. > But if it came from another kind of port (I'm not sure that's possible at > the moment, but I think we will need that), we need to parse here. OK. > > > > >> @@ -649,10 +648,12 @@ netdev_odp_rxq_recv(struct netdev_rxq *rxq_, >> struct dpif_packet **packets, >> out_of_memory(); >> } >> packets[i] = (struct dpif_packet*) odp_buffer_addr(buf); >> - ofpbuf_init_odp(&packets[i]->ofpbuf, >> odph_packet_buf_size(pkt_tbl[i])); >> + ofpbuf_init_odp(&packets[i]->ofpbuf, >> + >> odp_buffer_size(odp_packet_to_buffer(pkt_tbl[i]))); >> + /* ^^^ >> Is this OK?*/ >> >> >> I'm not sure what you're trying to do here to say what these calls >> should be. Can you clarify? >> > I need to determine the allocated buffer size from a odp_packet_t. I don't > know if there is a helper for that, I haven't found it, but maybe I missed > it. > odp_packet_buf_len(pkt) tells you that info. > > Zoli >
_______________________________________________ lng-odp mailing list [email protected] http://lists.linaro.org/mailman/listinfo/lng-odp
