On Fri, Dec 11, 2015 at 12:42:33PM -0800, Rich Lane wrote:
> On Wed, Dec 2, 2015 at 10:06 PM, Yuanhan Liu <yuanhan.liu at linux.intel.com>
> wrote:
> 
>     +static inline int __attribute__((always_inline))
>     +copy_mbuf_to_desc(struct virtio_net *dev, struct vhost_virtqueue *vq,
>     +? ? ? ? ? ? ? ? ?struct rte_mbuf *m, uint16_t desc_idx, uint32_t *copied)
>     +{
>     ...
>     +? ? ? ?while (1) {
>     +? ? ? ? ? ? ? ?/* done with current mbuf, fetch next */
>     +? ? ? ? ? ? ? ?if (mbuf_avail == 0) {
>     +? ? ? ? ? ? ? ? ? ? ? ?m = m->next;
>     +? ? ? ? ? ? ? ? ? ? ? ?if (m == NULL)
>     +? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?break;
>     +
>     +? ? ? ? ? ? ? ? ? ? ? ?mbuf_offset = 0;
>     +? ? ? ? ? ? ? ? ? ? ? ?mbuf_avail? = rte_pktmbuf_data_len(m);
>     +? ? ? ? ? ? ? ?}
>     +
>     +? ? ? ? ? ? ? ?/* done with current desc buf, fetch next */
>     +? ? ? ? ? ? ? ?if (desc_avail == 0) {
>     +? ? ? ? ? ? ? ? ? ? ? ?if ((desc->flags & VRING_DESC_F_NEXT) == 0) {
>     +? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?/* Room in vring buffer is not enough */
>     +? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?return -1;
>     +? ? ? ? ? ? ? ? ? ? ? ?}
>     +
>     +? ? ? ? ? ? ? ? ? ? ? ?desc = &vq->desc[desc->next];
>     +? ? ? ? ? ? ? ? ? ? ? ?desc_addr? ?= gpa_to_vva(dev, desc->addr);
>     +? ? ? ? ? ? ? ? ? ? ? ?desc_offset = 0;
>     +? ? ? ? ? ? ? ? ? ? ? ?desc_avail? = desc->len;
>     +? ? ? ? ? ? ? ?}
>     +
>     +? ? ? ? ? ? ? ?COPY(desc_addr + desc_offset,
>     +? ? ? ? ? ? ? ? ? ? ? ?rte_pktmbuf_mtod_offset(m, uint64_t, 
> mbuf_offset));
>     +? ? ? ? ? ? ? ?PRINT_PACKET(dev, (uintptr_t)(desc_addr + desc_offset),
>     +? ? ? ? ? ? ? ? ? ? ? ? ? ? cpy_len, 0);
>     +? ? ? ?}
>     +? ? ? ?*copied = rte_pktmbuf_pkt_len(m);
> 
> 
> AFAICT m will always be NULL at this point so the call to rte_pktmbuf_len will
> segfault.

Right, I should move it in the beginning of this function.

        --yliu

Reply via email to