summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQiuwen Lu <[email protected]>2017-08-24 09:46:30 +0800
committerQiuwen Lu <[email protected]>2017-08-24 09:46:30 +0800
commitf9da59d59c1455957383733b3d9452435568ea6b (patch)
treedfe2941f6e43b2803894b430538146d8ee83c9cc
parentacecbd318e44068f7788e42eb15257d79fe0e58a (diff)
调整send_burst_with_options中REHASH过程到报文头部构建后,避免计算HASH值时,报文还不完整。v4.2.15-20170824
- 原实现在__send_burst_packet_construct()前处理REHASH选项。此时,报文可能还不完整(例如,缺少以太网头部等),导致计算报文的Hash值失败。 - 现修正为__send_burst_packet_construct()后处理REHASH选项,计算Hash值。
-rw-r--r--app/src/rawio.c74
1 files 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);
}
/* 线程运行情况统计 */