From f9da59d59c1455957383733b3d9452435568ea6b Mon Sep 17 00:00:00 2001 From: Qiuwen Lu Date: Thu, 24 Aug 2017 09:46:30 +0800 Subject: 调整send_burst_with_options中REHASH过程到报文头部构建后,避免计算HASH值时,报文还不完整。 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 原实现在__send_burst_packet_construct()前处理REHASH选项。此时,报文可能还不完整(例如,缺少以太网头部等),导致计算报文的Hash值失败。 - 现修正为__send_burst_packet_construct()后处理REHASH选项,计算Hash值。 --- app/src/rawio.c | 74 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/app/src/rawio.c b/app/src/rawio.c index b17fb01..51df2bd 100644 --- a/app/src/rawio.c +++ b/app/src/rawio.c @@ -16,7 +16,7 @@ static inline int __packet_total_len(struct rte_mbuf * mbufs[], unsigned int nr_ return total_len; } -int mrapp_packet_fast_send_burst(struct vdev_instance * vdi, queue_id_t qid, +int mrapp_packet_fast_send_burst(struct vdev_instance * vdi, queue_id_t qid, struct rte_mbuf * mbufs[], int nr_mbufs) { hash_t mbufs_hash[MR_BURST_MAX]; @@ -25,7 +25,7 @@ int mrapp_packet_fast_send_burst(struct vdev_instance * vdi, queue_id_t qid, mbufs_hash[i] = qid; __rte_mbuf_sanity_check(mbufs[i], 1); } - + /* 快速发送锁。可以在任何上下文下发送快速报文 快速发送锁实现在应用,应用崩溃不会对主进程产生影响。 快速发送的报文应该数量很小,引入这个锁不会引起性能问题。 @@ -42,7 +42,7 @@ int mrapp_packet_fast_send_burst(struct vdev_instance * vdi, queue_id_t qid, int marsio_recv_burst(struct mr_vdev * vdev, queue_id_t qid, marsio_buff_t * mbufs[], int nr_mbufs) { - assert(qid < vdev->nr_rxstream); + assert(qid < vdev->nr_rxstream); if (unlikely(qid >= vdev->nr_rxstream)) return -EINVAL; struct vdev_instance * vdi = vdev->vdi; @@ -67,23 +67,23 @@ int marsio_recv_burst(struct mr_vdev * vdev, queue_id_t qid, marsio_buff_t * mbu thread_info.instance->stat[tid].packet_recv_length = __packet_total_len(__mbufs, ret); } - /* BPF Dumper */ - if (unlikely(vdev->bpf_dumper != NULL)) - bpf_dumper_write(vdev->bpf_dumper, __mbufs, ret); + /* BPF Dumper */ + if (unlikely(vdev->bpf_dumper != NULL)) + bpf_dumper_write(vdev->bpf_dumper, __mbufs, ret); out: return ret; } -int marsio_recv_all_burst(struct mr_instance * instance, queue_id_t qid, +int marsio_recv_all_burst(struct mr_instance * instance, queue_id_t qid, marsio_buff_t * mbufs[], int nr_mbufs) { instance->recv_all_state[qid] = (instance->recv_all_state[qid] + 1) % instance->nr_vdevs; unsigned int state = instance->recv_all_state[qid]; struct mr_vdev * vdev = &instance->vdevs[state]; - if(unlikely(vdev->nr_rxstream == 0)) - return 0; + if (unlikely(vdev->nr_rxstream == 0)) + return 0; return marsio_recv_burst(vdev, qid, mbufs, nr_mbufs); } @@ -93,9 +93,9 @@ static int __send_burst_packet_construct(struct mr_sendpath * sendpath, queue_id { struct rte_mbuf ** __mbufs = (struct rte_mbuf **)mbufs; - if (sendpath->fn_prebuild_hook != NULL && sendpath->fn_prebuild_hook(sendpath, __mbufs, nr_mbufs, - sendpath->prebuild_hook_args) < 0) - goto err; + if (sendpath->fn_prebuild_hook != NULL && sendpath->fn_prebuild_hook(sendpath, __mbufs, nr_mbufs, + sendpath->prebuild_hook_args) < 0) + goto err; /* 查询这个SendPath是否可用 */ if (!sendpath->can_use && sendpath->fn_requery(sendpath) < 0) @@ -109,9 +109,9 @@ static int __send_burst_packet_construct(struct mr_sendpath * sendpath, queue_id if (sendpath->fn_l2_construct != NULL && sendpath->fn_l2_construct(sendpath, __mbufs, nr_mbufs) < 0) goto err; - if (sendpath->fn_postbuild_hook != NULL && sendpath->fn_postbuild_hook(sendpath, __mbufs, nr_mbufs, - sendpath->postbuild_hook_args) < 0) - goto err; + if (sendpath->fn_postbuild_hook != NULL && sendpath->fn_postbuild_hook(sendpath, __mbufs, nr_mbufs, + sendpath->postbuild_hook_args) < 0) + goto err; return RT_SUCCESS; @@ -126,14 +126,14 @@ int marsio_send_burst(struct mr_sendpath * sendpath, queue_id_t sid, marsio_buff if (__send_burst_packet_construct(sendpath, sid, mbufs, nr_mbufs) < 0) goto err; - + /* 从报文本身携带的Hash值计算分流用的Hash值 */ hash_t hash[MR_BURST_MAX]; for (int i = 0; i < nr_mbufs; i++) hash[i] = __mbufs[i]->hash.usr; - /* BPF Dumper */ - if (unlikely(sendpath->vdev->bpf_dumper != NULL)) - bpf_dumper_write(sendpath->vdev->bpf_dumper, __mbufs, nr_mbufs); + /* BPF Dumper */ + if (unlikely(sendpath->vdev->bpf_dumper != NULL)) + bpf_dumper_write(sendpath->vdev->bpf_dumper, __mbufs, nr_mbufs); vnode_mirror_enqueue_bulk(sendpath->target_vdi->vnode_tx_prod, sid, __mbufs, hash, nr_mbufs); @@ -160,52 +160,52 @@ err: return RT_ERR; } -int marsio_send_burst_with_options(struct mr_sendpath * sendpath, queue_id_t sid, +int marsio_send_burst_with_options(struct mr_sendpath * sendpath, queue_id_t sid, marsio_buff_t * mbufs[], int nr_mbufs, uint16_t options) { struct rte_mbuf ** __mbufs = (struct rte_mbuf **)mbufs; - assert(sid < sendpath->target_vdi->nr_txstream); - + assert(sid < sendpath->target_vdi->nr_txstream); + for (int i = 0; i < nr_mbufs; i++) { assert(__mbufs[i]->data_len != 0 && __mbufs[i]->pkt_len != 0); __rte_mbuf_sanity_check(mbufs[i], i); } - if (options & MARSIO_SEND_OPT_REHASH) - { - distributer_caculate(sendpath->instance->dist_object, __mbufs, nr_mbufs); - } + if (__send_burst_packet_construct(sendpath, sid, mbufs, nr_mbufs) < 0) + goto err; + + if (options & MARSIO_SEND_OPT_REHASH) + { + distributer_caculate(sendpath->instance->dist_object, __mbufs, nr_mbufs); + } if (options & MARSIO_SEND_OPT_NO_FREE) { for (int i = 0; i < nr_mbufs; i++) rte_pktmbuf_refcnt_update(__mbufs[i], 1); } - if (options & MARSIO_SEND_OPT_CTRL) - { - for (int i = 0; i < nr_mbufs; i++) __mbufs[i]->ol_flags |= CTRL_MBUF_FLAG; - } + if (options & MARSIO_SEND_OPT_CTRL) + { + for (int i = 0; i < nr_mbufs; i++) __mbufs[i]->ol_flags |= CTRL_MBUF_FLAG; + } hash_t hash[MR_BURST_MAX]; for (int i = 0; i < nr_mbufs; i++) hash[i] = __mbufs[i]->hash.usr; - if (__send_burst_packet_construct(sendpath, sid, mbufs, nr_mbufs) < 0) - goto err; - /* BPF Dumper */ if (unlikely(sendpath->vdev->bpf_dumper != NULL)) - bpf_dumper_write(sendpath->vdev->bpf_dumper, __mbufs, nr_mbufs); + bpf_dumper_write(sendpath->vdev->bpf_dumper, __mbufs, nr_mbufs); if (options & MARSIO_SEND_OPT_FAST) { - vnode_mirror_enqueue_bulk(sendpath->target_vdi->vnode_ftx_prod, sid, - __mbufs, hash, nr_mbufs); + vnode_mirror_enqueue_bulk(sendpath->target_vdi->vnode_ftx_prod, sid, + __mbufs, hash, nr_mbufs); } else { vnode_mirror_enqueue_bulk(sendpath->target_vdi->vnode_tx_prod, sid, - __mbufs, hash, nr_mbufs); + __mbufs, hash, nr_mbufs); } /* 线程运行情况统计 */ -- cgit v1.2.3