Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-19 Thread Jason Wang



On 2017年02月19日 13:08, Michael S. Tsirkin wrote:

-   oxdp_qp = vi->xdp_queue_pairs;
-
/* Changing the headroom in buffers is a disruptive operation because
 * existing buffers must be flushed and reallocated. This will happen
 * when a xdp program is initially added or xdp is disabled by removing
 * the xdp program resulting in number of XDP queues changing.
 */
if (vi->xdp_queue_pairs != xdp_qp) {
-   vi->xdp_queue_pairs = xdp_qp;
err = virtnet_reset(vi);
-   if (err)
+   if (err) {
+   dev_warn(>dev, "XDP reset failure.\n");
goto virtio_reset_err;
+   }
+   vi->xdp_queue_pairs = xdp_qp;

But xdp_queue_pairs is being used to detect if we should allocate the XDP
headroom. If we move it here do we have a set of buffers in the ring without
the proper headroom when we assign the xdp program below?

Right, so how about passing xdp_queue_pairs as a parameter to
virtnet_reset(). Then virtnet_reset() can set it after _remove_vq_common()
but before virtnet_restore_up()?

Thanks

Jason, wouldn't you say it's cleaner to avoid resets?
Would you be interested in completing this work:

20170207053455-mutt-send-email-...@kernel.org




Yes, but this seems still need drop packets, is this acceptable?

Thanks



Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-19 Thread Jason Wang



On 2017年02月19日 13:08, Michael S. Tsirkin wrote:

-   oxdp_qp = vi->xdp_queue_pairs;
-
/* Changing the headroom in buffers is a disruptive operation because
 * existing buffers must be flushed and reallocated. This will happen
 * when a xdp program is initially added or xdp is disabled by removing
 * the xdp program resulting in number of XDP queues changing.
 */
if (vi->xdp_queue_pairs != xdp_qp) {
-   vi->xdp_queue_pairs = xdp_qp;
err = virtnet_reset(vi);
-   if (err)
+   if (err) {
+   dev_warn(>dev, "XDP reset failure.\n");
goto virtio_reset_err;
+   }
+   vi->xdp_queue_pairs = xdp_qp;

But xdp_queue_pairs is being used to detect if we should allocate the XDP
headroom. If we move it here do we have a set of buffers in the ring without
the proper headroom when we assign the xdp program below?

Right, so how about passing xdp_queue_pairs as a parameter to
virtnet_reset(). Then virtnet_reset() can set it after _remove_vq_common()
but before virtnet_restore_up()?

Thanks

Jason, wouldn't you say it's cleaner to avoid resets?
Would you be interested in completing this work:

20170207053455-mutt-send-email-...@kernel.org




Yes, but this seems still need drop packets, is this acceptable?

Thanks



Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-19 Thread Michael S. Tsirkin
On Fri, Feb 17, 2017 at 03:30:51PM -0800, John Fastabend wrote:
> On 17-02-16 09:10 PM, Jason Wang wrote:
> > 
> > 
> > On 2017年02月17日 12:53, John Fastabend wrote:
> >> On 17-02-15 01:08 AM, Jason Wang wrote:
> >>> We set queues before reset which will cause a crash[1]. This is
> >>> because is_xdp_raw_buffer_queue() depends on the old xdp queue pairs
> >>> number to do the correct detection. So fix this by:
> >>>
> >>> - set queues after reset, to keep the old vi->curr_queue_pairs. (in
> >>>fact setting queues before reset does not works since after feature
> >>>set, all queue pairs were enabled by default during reset).
> >>> - change xdp_queue_pairs only after virtnet_reset() is succeed.
> >>>
> >>> [1]
> >> I'm guessing this occurs when enabling XDP while receiving lots of traffic?
> > 
> > I hit this then disabling XDP while receiving lots of traffic.
> > 
> 
> [...]
> 
> >>> +vi->xdp_queue_pairs = xdp_qp;
> >> But xdp_queue_pairs is being used to detect if we should allocate the XDP
> >> headroom. If we move it here do we have a set of buffers in the ring 
> >> without
> >> the proper headroom when we assign the xdp program below?
> > 
> > Right, so how about passing xdp_queue_pairs as a parameter to 
> > virtnet_reset().
> > Then virtnet_reset() can set it after _remove_vq_common() but before
> > virtnet_restore_up()?
> > 
> > Thanks
> > 
> 
> Sounds like a reasonable fix to me.

I'm fine with that.

> >>
> >>> +}
> >>> +
> >>> +err = _virtnet_set_queues(vi, curr_qp + xdp_qp);
> >>> +if (err) {
> >>> +dev_warn(>dev, "XDP Device queue allocation failure.\n");
> >>> +goto virtio_queue_err;
> >>>   }
> >>> netif_set_real_num_rx_queues(dev, curr_qp + xdp_qp);
> >>> @@ -1844,17 +1844,18 @@ static int virtnet_xdp_set(struct net_device *dev,
> >>> struct bpf_prog *prog)
> >>> return 0;
> >> Thanks,
> >> John
> >>
> > 


Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-19 Thread Michael S. Tsirkin
On Fri, Feb 17, 2017 at 03:30:51PM -0800, John Fastabend wrote:
> On 17-02-16 09:10 PM, Jason Wang wrote:
> > 
> > 
> > On 2017年02月17日 12:53, John Fastabend wrote:
> >> On 17-02-15 01:08 AM, Jason Wang wrote:
> >>> We set queues before reset which will cause a crash[1]. This is
> >>> because is_xdp_raw_buffer_queue() depends on the old xdp queue pairs
> >>> number to do the correct detection. So fix this by:
> >>>
> >>> - set queues after reset, to keep the old vi->curr_queue_pairs. (in
> >>>fact setting queues before reset does not works since after feature
> >>>set, all queue pairs were enabled by default during reset).
> >>> - change xdp_queue_pairs only after virtnet_reset() is succeed.
> >>>
> >>> [1]
> >> I'm guessing this occurs when enabling XDP while receiving lots of traffic?
> > 
> > I hit this then disabling XDP while receiving lots of traffic.
> > 
> 
> [...]
> 
> >>> +vi->xdp_queue_pairs = xdp_qp;
> >> But xdp_queue_pairs is being used to detect if we should allocate the XDP
> >> headroom. If we move it here do we have a set of buffers in the ring 
> >> without
> >> the proper headroom when we assign the xdp program below?
> > 
> > Right, so how about passing xdp_queue_pairs as a parameter to 
> > virtnet_reset().
> > Then virtnet_reset() can set it after _remove_vq_common() but before
> > virtnet_restore_up()?
> > 
> > Thanks
> > 
> 
> Sounds like a reasonable fix to me.

I'm fine with that.

> >>
> >>> +}
> >>> +
> >>> +err = _virtnet_set_queues(vi, curr_qp + xdp_qp);
> >>> +if (err) {
> >>> +dev_warn(>dev, "XDP Device queue allocation failure.\n");
> >>> +goto virtio_queue_err;
> >>>   }
> >>> netif_set_real_num_rx_queues(dev, curr_qp + xdp_qp);
> >>> @@ -1844,17 +1844,18 @@ static int virtnet_xdp_set(struct net_device *dev,
> >>> struct bpf_prog *prog)
> >>> return 0;
> >> Thanks,
> >> John
> >>
> > 


Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-18 Thread Michael S. Tsirkin
On Fri, Feb 17, 2017 at 01:10:08PM +0800, Jason Wang wrote:
> 
> 
> On 2017年02月17日 12:53, John Fastabend wrote:
> > On 17-02-15 01:08 AM, Jason Wang wrote:
> > > We set queues before reset which will cause a crash[1]. This is
> > > because is_xdp_raw_buffer_queue() depends on the old xdp queue pairs
> > > number to do the correct detection. So fix this by:
> > > 
> > > - set queues after reset, to keep the old vi->curr_queue_pairs. (in
> > >fact setting queues before reset does not works since after feature
> > >set, all queue pairs were enabled by default during reset).
> > > - change xdp_queue_pairs only after virtnet_reset() is succeed.
> > > 
> > > [1]
> > I'm guessing this occurs when enabling XDP while receiving lots of traffic?
> 
> I hit this then disabling XDP while receiving lots of traffic.
> 
> > 
> > > [   74.328168] general protection fault:  [#1] SMP
> > > [   74.328625] Modules linked in: nfsd xfs libcrc32c virtio_net virtio_pci
> > > [   74.329117] CPU: 0 PID: 2849 Comm: xdp2 Not tainted 4.10.0-rc7+ #499
> > > [   74.329577] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), 
> > > BIOS rel-1.10.1-0-g8891697-prebuilt.qemu-project.org 04/01/2014
> > > [   74.330424] task: 88007a894000 task.stack: c90004388000
> > > [   74.330844] RIP: 0010:skb_release_head_state+0x28/0x80
> > > [   74.331298] RSP: 0018:c9000438b8d0 EFLAGS: 00010206
> > > [   74.331676] RAX:  RBX: 88007ad96300 RCX: 
> > > 
> > > [   74.332217] RDX: 88007fc137a8 RSI: 88007fc0db28 RDI: 
> > > 0001bf0001be
> > > [   74.332758] RBP: c9000438b8d8 R08: 0005008f R09: 
> > > 05f9
> > > [   74.333274] R10: 88007d001700 R11: 820a8a4d R12: 
> > > 88007ad96300
> > > [   74.333787] R13: 0002 R14: 880036604000 R15: 
> > > 77ff8000
> > > [   74.334308] FS:  7fc70d8a7b40() GS:88007fc0() 
> > > knlGS:
> > > [   74.334891] CS:  0010 DS:  ES:  CR0: 80050033
> > > [   74.335314] CR2: 7fff4144a710 CR3: 7ab56000 CR4: 
> > > 003406f0
> > > [   74.335830] DR0:  DR1:  DR2: 
> > > 
> > > [   74.336373] DR3:  DR6: fffe0ff0 DR7: 
> > > 0400
> > > [   74.336895] Call Trace:
> > > [   74.337086]  skb_release_all+0xd/0x30
> > > [   74.337356]  consume_skb+0x2c/0x90
> > > [   74.337607]  free_unused_bufs+0x1ff/0x270 [virtio_net]
> > > [   74.337988]  ? vp_synchronize_vectors+0x3b/0x60 [virtio_pci]
> > > [   74.338398]  virtnet_xdp+0x21e/0x440 [virtio_net]
> > > [   74.338741]  dev_change_xdp_fd+0x101/0x140
> > > [   74.339048]  do_setlink+0xcf4/0xd20
> > > [   74.339304]  ? symcmp+0xf/0x20
> > > [   74.339529]  ? mls_level_isvalid+0x52/0x60
> > > [   74.339828]  ? mls_range_isvalid+0x43/0x50
> > > [   74.340135]  ? nla_parse+0xa0/0x100
> > > [   74.340400]  rtnl_setlink+0xd4/0x120
> > > [   74.340664]  ? cpumask_next_and+0x30/0x50
> > > [   74.340966]  rtnetlink_rcv_msg+0x7f/0x1f0
> > > [   74.341259]  ? sock_has_perm+0x59/0x60
> > > [   74.341586]  ? napi_consume_skb+0xe2/0x100
> > > [   74.342010]  ? rtnl_newlink+0x890/0x890
> > > [   74.342435]  netlink_rcv_skb+0x92/0xb0
> > > [   74.342846]  rtnetlink_rcv+0x23/0x30
> > > [   74.343277]  netlink_unicast+0x162/0x210
> > > [   74.343677]  netlink_sendmsg+0x2db/0x390
> > > [   74.343968]  sock_sendmsg+0x33/0x40
> > > [   74.344233]  SYSC_sendto+0xee/0x160
> > > [   74.344482]  ? SYSC_bind+0xb0/0xe0
> > > [   74.344806]  ? sock_alloc_file+0x92/0x110
> > > [   74.345106]  ? fd_install+0x20/0x30
> > > [   74.345360]  ? sock_map_fd+0x3f/0x60
> > > [   74.345586]  SyS_sendto+0x9/0x10
> > > [   74.345790]  entry_SYSCALL_64_fastpath+0x1a/0xa9
> > > [   74.346086] RIP: 0033:0x7fc70d1b8f6d
> > > [   74.346312] RSP: 002b:7fff4144a708 EFLAGS: 0246 ORIG_RAX: 
> > > 002c
> > > [   74.346785] RAX: ffda RBX:  RCX: 
> > > 7fc70d1b8f6d
> > > [   74.347244] RDX: 002c RSI: 7fff4144a720 RDI: 
> > > 0003
> > > [   74.347683] RBP: 0003 R08:  R09: 
> > > 
> > > [   74.348544] R10:  R11: 0246 R12: 
> > > 7fff4144bd90
> > > [   74.349082] R13: 0002 R14: 0002 R15: 
> > > 7fff4144cda0
> > > [   74.349607] Code: 00 00 00 55 48 89 e5 53 48 89 fb 48 8b 7f 58 48 85 
> > > ff 74 0e 40 f6 c7 01 74 3d 48 c7 43 58 00 00 00 00 48 8b 7b 68 48 85 ff 
> > > 74 05  ff 0f 74 20 48 8b 43 60 48 85 c0 74 14 65 8b 15 f3 ab 8d 7e
> > > [   74.351008] RIP: skb_release_head_state+0x28/0x80 RSP: c9000438b8d0
> > > [   74.351625] ---[ end trace fe6e19fd11cfc80b ]---
> > > 
> > > Fixes: 2de2f7f40ef9 ("virtio_net: XDP support for adjust_head")
> > > Cc: John Fastabend 
> > > Signed-off-by: Jason Wang 
> > > ---
> > >   

Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-18 Thread Michael S. Tsirkin
On Fri, Feb 17, 2017 at 01:10:08PM +0800, Jason Wang wrote:
> 
> 
> On 2017年02月17日 12:53, John Fastabend wrote:
> > On 17-02-15 01:08 AM, Jason Wang wrote:
> > > We set queues before reset which will cause a crash[1]. This is
> > > because is_xdp_raw_buffer_queue() depends on the old xdp queue pairs
> > > number to do the correct detection. So fix this by:
> > > 
> > > - set queues after reset, to keep the old vi->curr_queue_pairs. (in
> > >fact setting queues before reset does not works since after feature
> > >set, all queue pairs were enabled by default during reset).
> > > - change xdp_queue_pairs only after virtnet_reset() is succeed.
> > > 
> > > [1]
> > I'm guessing this occurs when enabling XDP while receiving lots of traffic?
> 
> I hit this then disabling XDP while receiving lots of traffic.
> 
> > 
> > > [   74.328168] general protection fault:  [#1] SMP
> > > [   74.328625] Modules linked in: nfsd xfs libcrc32c virtio_net virtio_pci
> > > [   74.329117] CPU: 0 PID: 2849 Comm: xdp2 Not tainted 4.10.0-rc7+ #499
> > > [   74.329577] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), 
> > > BIOS rel-1.10.1-0-g8891697-prebuilt.qemu-project.org 04/01/2014
> > > [   74.330424] task: 88007a894000 task.stack: c90004388000
> > > [   74.330844] RIP: 0010:skb_release_head_state+0x28/0x80
> > > [   74.331298] RSP: 0018:c9000438b8d0 EFLAGS: 00010206
> > > [   74.331676] RAX:  RBX: 88007ad96300 RCX: 
> > > 
> > > [   74.332217] RDX: 88007fc137a8 RSI: 88007fc0db28 RDI: 
> > > 0001bf0001be
> > > [   74.332758] RBP: c9000438b8d8 R08: 0005008f R09: 
> > > 05f9
> > > [   74.333274] R10: 88007d001700 R11: 820a8a4d R12: 
> > > 88007ad96300
> > > [   74.333787] R13: 0002 R14: 880036604000 R15: 
> > > 77ff8000
> > > [   74.334308] FS:  7fc70d8a7b40() GS:88007fc0() 
> > > knlGS:
> > > [   74.334891] CS:  0010 DS:  ES:  CR0: 80050033
> > > [   74.335314] CR2: 7fff4144a710 CR3: 7ab56000 CR4: 
> > > 003406f0
> > > [   74.335830] DR0:  DR1:  DR2: 
> > > 
> > > [   74.336373] DR3:  DR6: fffe0ff0 DR7: 
> > > 0400
> > > [   74.336895] Call Trace:
> > > [   74.337086]  skb_release_all+0xd/0x30
> > > [   74.337356]  consume_skb+0x2c/0x90
> > > [   74.337607]  free_unused_bufs+0x1ff/0x270 [virtio_net]
> > > [   74.337988]  ? vp_synchronize_vectors+0x3b/0x60 [virtio_pci]
> > > [   74.338398]  virtnet_xdp+0x21e/0x440 [virtio_net]
> > > [   74.338741]  dev_change_xdp_fd+0x101/0x140
> > > [   74.339048]  do_setlink+0xcf4/0xd20
> > > [   74.339304]  ? symcmp+0xf/0x20
> > > [   74.339529]  ? mls_level_isvalid+0x52/0x60
> > > [   74.339828]  ? mls_range_isvalid+0x43/0x50
> > > [   74.340135]  ? nla_parse+0xa0/0x100
> > > [   74.340400]  rtnl_setlink+0xd4/0x120
> > > [   74.340664]  ? cpumask_next_and+0x30/0x50
> > > [   74.340966]  rtnetlink_rcv_msg+0x7f/0x1f0
> > > [   74.341259]  ? sock_has_perm+0x59/0x60
> > > [   74.341586]  ? napi_consume_skb+0xe2/0x100
> > > [   74.342010]  ? rtnl_newlink+0x890/0x890
> > > [   74.342435]  netlink_rcv_skb+0x92/0xb0
> > > [   74.342846]  rtnetlink_rcv+0x23/0x30
> > > [   74.343277]  netlink_unicast+0x162/0x210
> > > [   74.343677]  netlink_sendmsg+0x2db/0x390
> > > [   74.343968]  sock_sendmsg+0x33/0x40
> > > [   74.344233]  SYSC_sendto+0xee/0x160
> > > [   74.344482]  ? SYSC_bind+0xb0/0xe0
> > > [   74.344806]  ? sock_alloc_file+0x92/0x110
> > > [   74.345106]  ? fd_install+0x20/0x30
> > > [   74.345360]  ? sock_map_fd+0x3f/0x60
> > > [   74.345586]  SyS_sendto+0x9/0x10
> > > [   74.345790]  entry_SYSCALL_64_fastpath+0x1a/0xa9
> > > [   74.346086] RIP: 0033:0x7fc70d1b8f6d
> > > [   74.346312] RSP: 002b:7fff4144a708 EFLAGS: 0246 ORIG_RAX: 
> > > 002c
> > > [   74.346785] RAX: ffda RBX:  RCX: 
> > > 7fc70d1b8f6d
> > > [   74.347244] RDX: 002c RSI: 7fff4144a720 RDI: 
> > > 0003
> > > [   74.347683] RBP: 0003 R08:  R09: 
> > > 
> > > [   74.348544] R10:  R11: 0246 R12: 
> > > 7fff4144bd90
> > > [   74.349082] R13: 0002 R14: 0002 R15: 
> > > 7fff4144cda0
> > > [   74.349607] Code: 00 00 00 55 48 89 e5 53 48 89 fb 48 8b 7f 58 48 85 
> > > ff 74 0e 40 f6 c7 01 74 3d 48 c7 43 58 00 00 00 00 48 8b 7b 68 48 85 ff 
> > > 74 05  ff 0f 74 20 48 8b 43 60 48 85 c0 74 14 65 8b 15 f3 ab 8d 7e
> > > [   74.351008] RIP: skb_release_head_state+0x28/0x80 RSP: c9000438b8d0
> > > [   74.351625] ---[ end trace fe6e19fd11cfc80b ]---
> > > 
> > > Fixes: 2de2f7f40ef9 ("virtio_net: XDP support for adjust_head")
> > > Cc: John Fastabend 
> > > Signed-off-by: Jason Wang 
> > > ---
> > >   drivers/net/virtio_net.c | 35 

Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-17 Thread John Fastabend
On 17-02-16 09:10 PM, Jason Wang wrote:
> 
> 
> On 2017年02月17日 12:53, John Fastabend wrote:
>> On 17-02-15 01:08 AM, Jason Wang wrote:
>>> We set queues before reset which will cause a crash[1]. This is
>>> because is_xdp_raw_buffer_queue() depends on the old xdp queue pairs
>>> number to do the correct detection. So fix this by:
>>>
>>> - set queues after reset, to keep the old vi->curr_queue_pairs. (in
>>>fact setting queues before reset does not works since after feature
>>>set, all queue pairs were enabled by default during reset).
>>> - change xdp_queue_pairs only after virtnet_reset() is succeed.
>>>
>>> [1]
>> I'm guessing this occurs when enabling XDP while receiving lots of traffic?
> 
> I hit this then disabling XDP while receiving lots of traffic.
> 

[...]

>>> +vi->xdp_queue_pairs = xdp_qp;
>> But xdp_queue_pairs is being used to detect if we should allocate the XDP
>> headroom. If we move it here do we have a set of buffers in the ring without
>> the proper headroom when we assign the xdp program below?
> 
> Right, so how about passing xdp_queue_pairs as a parameter to virtnet_reset().
> Then virtnet_reset() can set it after _remove_vq_common() but before
> virtnet_restore_up()?
> 
> Thanks
> 

Sounds like a reasonable fix to me.

>>
>>> +}
>>> +
>>> +err = _virtnet_set_queues(vi, curr_qp + xdp_qp);
>>> +if (err) {
>>> +dev_warn(>dev, "XDP Device queue allocation failure.\n");
>>> +goto virtio_queue_err;
>>>   }
>>> netif_set_real_num_rx_queues(dev, curr_qp + xdp_qp);
>>> @@ -1844,17 +1844,18 @@ static int virtnet_xdp_set(struct net_device *dev,
>>> struct bpf_prog *prog)
>>> return 0;
>> Thanks,
>> John
>>
> 



Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-17 Thread John Fastabend
On 17-02-16 09:10 PM, Jason Wang wrote:
> 
> 
> On 2017年02月17日 12:53, John Fastabend wrote:
>> On 17-02-15 01:08 AM, Jason Wang wrote:
>>> We set queues before reset which will cause a crash[1]. This is
>>> because is_xdp_raw_buffer_queue() depends on the old xdp queue pairs
>>> number to do the correct detection. So fix this by:
>>>
>>> - set queues after reset, to keep the old vi->curr_queue_pairs. (in
>>>fact setting queues before reset does not works since after feature
>>>set, all queue pairs were enabled by default during reset).
>>> - change xdp_queue_pairs only after virtnet_reset() is succeed.
>>>
>>> [1]
>> I'm guessing this occurs when enabling XDP while receiving lots of traffic?
> 
> I hit this then disabling XDP while receiving lots of traffic.
> 

[...]

>>> +vi->xdp_queue_pairs = xdp_qp;
>> But xdp_queue_pairs is being used to detect if we should allocate the XDP
>> headroom. If we move it here do we have a set of buffers in the ring without
>> the proper headroom when we assign the xdp program below?
> 
> Right, so how about passing xdp_queue_pairs as a parameter to virtnet_reset().
> Then virtnet_reset() can set it after _remove_vq_common() but before
> virtnet_restore_up()?
> 
> Thanks
> 

Sounds like a reasonable fix to me.

>>
>>> +}
>>> +
>>> +err = _virtnet_set_queues(vi, curr_qp + xdp_qp);
>>> +if (err) {
>>> +dev_warn(>dev, "XDP Device queue allocation failure.\n");
>>> +goto virtio_queue_err;
>>>   }
>>> netif_set_real_num_rx_queues(dev, curr_qp + xdp_qp);
>>> @@ -1844,17 +1844,18 @@ static int virtnet_xdp_set(struct net_device *dev,
>>> struct bpf_prog *prog)
>>> return 0;
>> Thanks,
>> John
>>
> 



Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-16 Thread Jason Wang



On 2017年02月17日 12:53, John Fastabend wrote:

On 17-02-15 01:08 AM, Jason Wang wrote:

We set queues before reset which will cause a crash[1]. This is
because is_xdp_raw_buffer_queue() depends on the old xdp queue pairs
number to do the correct detection. So fix this by:

- set queues after reset, to keep the old vi->curr_queue_pairs. (in
   fact setting queues before reset does not works since after feature
   set, all queue pairs were enabled by default during reset).
- change xdp_queue_pairs only after virtnet_reset() is succeed.

[1]

I'm guessing this occurs when enabling XDP while receiving lots of traffic?


I hit this then disabling XDP while receiving lots of traffic.




[   74.328168] general protection fault:  [#1] SMP
[   74.328625] Modules linked in: nfsd xfs libcrc32c virtio_net virtio_pci
[   74.329117] CPU: 0 PID: 2849 Comm: xdp2 Not tainted 4.10.0-rc7+ #499
[   74.329577] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 
rel-1.10.1-0-g8891697-prebuilt.qemu-project.org 04/01/2014
[   74.330424] task: 88007a894000 task.stack: c90004388000
[   74.330844] RIP: 0010:skb_release_head_state+0x28/0x80
[   74.331298] RSP: 0018:c9000438b8d0 EFLAGS: 00010206
[   74.331676] RAX:  RBX: 88007ad96300 RCX: 
[   74.332217] RDX: 88007fc137a8 RSI: 88007fc0db28 RDI: 0001bf0001be
[   74.332758] RBP: c9000438b8d8 R08: 0005008f R09: 05f9
[   74.333274] R10: 88007d001700 R11: 820a8a4d R12: 88007ad96300
[   74.333787] R13: 0002 R14: 880036604000 R15: 77ff8000
[   74.334308] FS:  7fc70d8a7b40() GS:88007fc0() 
knlGS:
[   74.334891] CS:  0010 DS:  ES:  CR0: 80050033
[   74.335314] CR2: 7fff4144a710 CR3: 7ab56000 CR4: 003406f0
[   74.335830] DR0:  DR1:  DR2: 
[   74.336373] DR3:  DR6: fffe0ff0 DR7: 0400
[   74.336895] Call Trace:
[   74.337086]  skb_release_all+0xd/0x30
[   74.337356]  consume_skb+0x2c/0x90
[   74.337607]  free_unused_bufs+0x1ff/0x270 [virtio_net]
[   74.337988]  ? vp_synchronize_vectors+0x3b/0x60 [virtio_pci]
[   74.338398]  virtnet_xdp+0x21e/0x440 [virtio_net]
[   74.338741]  dev_change_xdp_fd+0x101/0x140
[   74.339048]  do_setlink+0xcf4/0xd20
[   74.339304]  ? symcmp+0xf/0x20
[   74.339529]  ? mls_level_isvalid+0x52/0x60
[   74.339828]  ? mls_range_isvalid+0x43/0x50
[   74.340135]  ? nla_parse+0xa0/0x100
[   74.340400]  rtnl_setlink+0xd4/0x120
[   74.340664]  ? cpumask_next_and+0x30/0x50
[   74.340966]  rtnetlink_rcv_msg+0x7f/0x1f0
[   74.341259]  ? sock_has_perm+0x59/0x60
[   74.341586]  ? napi_consume_skb+0xe2/0x100
[   74.342010]  ? rtnl_newlink+0x890/0x890
[   74.342435]  netlink_rcv_skb+0x92/0xb0
[   74.342846]  rtnetlink_rcv+0x23/0x30
[   74.343277]  netlink_unicast+0x162/0x210
[   74.343677]  netlink_sendmsg+0x2db/0x390
[   74.343968]  sock_sendmsg+0x33/0x40
[   74.344233]  SYSC_sendto+0xee/0x160
[   74.344482]  ? SYSC_bind+0xb0/0xe0
[   74.344806]  ? sock_alloc_file+0x92/0x110
[   74.345106]  ? fd_install+0x20/0x30
[   74.345360]  ? sock_map_fd+0x3f/0x60
[   74.345586]  SyS_sendto+0x9/0x10
[   74.345790]  entry_SYSCALL_64_fastpath+0x1a/0xa9
[   74.346086] RIP: 0033:0x7fc70d1b8f6d
[   74.346312] RSP: 002b:7fff4144a708 EFLAGS: 0246 ORIG_RAX: 
002c
[   74.346785] RAX: ffda RBX:  RCX: 7fc70d1b8f6d
[   74.347244] RDX: 002c RSI: 7fff4144a720 RDI: 0003
[   74.347683] RBP: 0003 R08:  R09: 
[   74.348544] R10:  R11: 0246 R12: 7fff4144bd90
[   74.349082] R13: 0002 R14: 0002 R15: 7fff4144cda0
[   74.349607] Code: 00 00 00 55 48 89 e5 53 48 89 fb 48 8b 7f 58 48 85 ff 74 0e 40 
f6 c7 01 74 3d 48 c7 43 58 00 00 00 00 48 8b 7b 68 48 85 ff 74 05  ff 0f 74 
20 48 8b 43 60 48 85 c0 74 14 65 8b 15 f3 ab 8d 7e
[   74.351008] RIP: skb_release_head_state+0x28/0x80 RSP: c9000438b8d0
[   74.351625] ---[ end trace fe6e19fd11cfc80b ]---

Fixes: 2de2f7f40ef9 ("virtio_net: XDP support for adjust_head")
Cc: John Fastabend 
Signed-off-by: Jason Wang 
---
  drivers/net/virtio_net.c | 35 ++-
  1 file changed, 18 insertions(+), 17 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 11e2853..9ff959c 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -1775,7 +1775,7 @@ static int virtnet_xdp_set(struct net_device *dev, struct 
bpf_prog *prog)
unsigned long int max_sz = PAGE_SIZE - sizeof(struct padded_vnet_hdr);
struct virtnet_info *vi = netdev_priv(dev);
struct bpf_prog *old_prog;
-   u16 oxdp_qp, xdp_qp = 0, curr_qp;
+   u16 xdp_qp = 0, curr_qp;
int i, err;
  
  	if 

Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-16 Thread Jason Wang



On 2017年02月17日 12:53, John Fastabend wrote:

On 17-02-15 01:08 AM, Jason Wang wrote:

We set queues before reset which will cause a crash[1]. This is
because is_xdp_raw_buffer_queue() depends on the old xdp queue pairs
number to do the correct detection. So fix this by:

- set queues after reset, to keep the old vi->curr_queue_pairs. (in
   fact setting queues before reset does not works since after feature
   set, all queue pairs were enabled by default during reset).
- change xdp_queue_pairs only after virtnet_reset() is succeed.

[1]

I'm guessing this occurs when enabling XDP while receiving lots of traffic?


I hit this then disabling XDP while receiving lots of traffic.




[   74.328168] general protection fault:  [#1] SMP
[   74.328625] Modules linked in: nfsd xfs libcrc32c virtio_net virtio_pci
[   74.329117] CPU: 0 PID: 2849 Comm: xdp2 Not tainted 4.10.0-rc7+ #499
[   74.329577] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 
rel-1.10.1-0-g8891697-prebuilt.qemu-project.org 04/01/2014
[   74.330424] task: 88007a894000 task.stack: c90004388000
[   74.330844] RIP: 0010:skb_release_head_state+0x28/0x80
[   74.331298] RSP: 0018:c9000438b8d0 EFLAGS: 00010206
[   74.331676] RAX:  RBX: 88007ad96300 RCX: 
[   74.332217] RDX: 88007fc137a8 RSI: 88007fc0db28 RDI: 0001bf0001be
[   74.332758] RBP: c9000438b8d8 R08: 0005008f R09: 05f9
[   74.333274] R10: 88007d001700 R11: 820a8a4d R12: 88007ad96300
[   74.333787] R13: 0002 R14: 880036604000 R15: 77ff8000
[   74.334308] FS:  7fc70d8a7b40() GS:88007fc0() 
knlGS:
[   74.334891] CS:  0010 DS:  ES:  CR0: 80050033
[   74.335314] CR2: 7fff4144a710 CR3: 7ab56000 CR4: 003406f0
[   74.335830] DR0:  DR1:  DR2: 
[   74.336373] DR3:  DR6: fffe0ff0 DR7: 0400
[   74.336895] Call Trace:
[   74.337086]  skb_release_all+0xd/0x30
[   74.337356]  consume_skb+0x2c/0x90
[   74.337607]  free_unused_bufs+0x1ff/0x270 [virtio_net]
[   74.337988]  ? vp_synchronize_vectors+0x3b/0x60 [virtio_pci]
[   74.338398]  virtnet_xdp+0x21e/0x440 [virtio_net]
[   74.338741]  dev_change_xdp_fd+0x101/0x140
[   74.339048]  do_setlink+0xcf4/0xd20
[   74.339304]  ? symcmp+0xf/0x20
[   74.339529]  ? mls_level_isvalid+0x52/0x60
[   74.339828]  ? mls_range_isvalid+0x43/0x50
[   74.340135]  ? nla_parse+0xa0/0x100
[   74.340400]  rtnl_setlink+0xd4/0x120
[   74.340664]  ? cpumask_next_and+0x30/0x50
[   74.340966]  rtnetlink_rcv_msg+0x7f/0x1f0
[   74.341259]  ? sock_has_perm+0x59/0x60
[   74.341586]  ? napi_consume_skb+0xe2/0x100
[   74.342010]  ? rtnl_newlink+0x890/0x890
[   74.342435]  netlink_rcv_skb+0x92/0xb0
[   74.342846]  rtnetlink_rcv+0x23/0x30
[   74.343277]  netlink_unicast+0x162/0x210
[   74.343677]  netlink_sendmsg+0x2db/0x390
[   74.343968]  sock_sendmsg+0x33/0x40
[   74.344233]  SYSC_sendto+0xee/0x160
[   74.344482]  ? SYSC_bind+0xb0/0xe0
[   74.344806]  ? sock_alloc_file+0x92/0x110
[   74.345106]  ? fd_install+0x20/0x30
[   74.345360]  ? sock_map_fd+0x3f/0x60
[   74.345586]  SyS_sendto+0x9/0x10
[   74.345790]  entry_SYSCALL_64_fastpath+0x1a/0xa9
[   74.346086] RIP: 0033:0x7fc70d1b8f6d
[   74.346312] RSP: 002b:7fff4144a708 EFLAGS: 0246 ORIG_RAX: 
002c
[   74.346785] RAX: ffda RBX:  RCX: 7fc70d1b8f6d
[   74.347244] RDX: 002c RSI: 7fff4144a720 RDI: 0003
[   74.347683] RBP: 0003 R08:  R09: 
[   74.348544] R10:  R11: 0246 R12: 7fff4144bd90
[   74.349082] R13: 0002 R14: 0002 R15: 7fff4144cda0
[   74.349607] Code: 00 00 00 55 48 89 e5 53 48 89 fb 48 8b 7f 58 48 85 ff 74 0e 40 
f6 c7 01 74 3d 48 c7 43 58 00 00 00 00 48 8b 7b 68 48 85 ff 74 05  ff 0f 74 
20 48 8b 43 60 48 85 c0 74 14 65 8b 15 f3 ab 8d 7e
[   74.351008] RIP: skb_release_head_state+0x28/0x80 RSP: c9000438b8d0
[   74.351625] ---[ end trace fe6e19fd11cfc80b ]---

Fixes: 2de2f7f40ef9 ("virtio_net: XDP support for adjust_head")
Cc: John Fastabend 
Signed-off-by: Jason Wang 
---
  drivers/net/virtio_net.c | 35 ++-
  1 file changed, 18 insertions(+), 17 deletions(-)

diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index 11e2853..9ff959c 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -1775,7 +1775,7 @@ static int virtnet_xdp_set(struct net_device *dev, struct 
bpf_prog *prog)
unsigned long int max_sz = PAGE_SIZE - sizeof(struct padded_vnet_hdr);
struct virtnet_info *vi = netdev_priv(dev);
struct bpf_prog *old_prog;
-   u16 oxdp_qp, xdp_qp = 0, curr_qp;
+   u16 xdp_qp = 0, curr_qp;
int i, err;
  
  	if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_GUEST_TSO4) 

Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-16 Thread John Fastabend
On 17-02-15 01:08 AM, Jason Wang wrote:
> We set queues before reset which will cause a crash[1]. This is
> because is_xdp_raw_buffer_queue() depends on the old xdp queue pairs
> number to do the correct detection. So fix this by:
> 
> - set queues after reset, to keep the old vi->curr_queue_pairs. (in
>   fact setting queues before reset does not works since after feature
>   set, all queue pairs were enabled by default during reset).
> - change xdp_queue_pairs only after virtnet_reset() is succeed.
> 
> [1]

I'm guessing this occurs when enabling XDP while receiving lots of traffic?

> 
> [   74.328168] general protection fault:  [#1] SMP
> [   74.328625] Modules linked in: nfsd xfs libcrc32c virtio_net virtio_pci
> [   74.329117] CPU: 0 PID: 2849 Comm: xdp2 Not tainted 4.10.0-rc7+ #499
> [   74.329577] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 
> rel-1.10.1-0-g8891697-prebuilt.qemu-project.org 04/01/2014
> [   74.330424] task: 88007a894000 task.stack: c90004388000
> [   74.330844] RIP: 0010:skb_release_head_state+0x28/0x80
> [   74.331298] RSP: 0018:c9000438b8d0 EFLAGS: 00010206
> [   74.331676] RAX:  RBX: 88007ad96300 RCX: 
> 
> [   74.332217] RDX: 88007fc137a8 RSI: 88007fc0db28 RDI: 
> 0001bf0001be
> [   74.332758] RBP: c9000438b8d8 R08: 0005008f R09: 
> 05f9
> [   74.333274] R10: 88007d001700 R11: 820a8a4d R12: 
> 88007ad96300
> [   74.333787] R13: 0002 R14: 880036604000 R15: 
> 77ff8000
> [   74.334308] FS:  7fc70d8a7b40() GS:88007fc0() 
> knlGS:
> [   74.334891] CS:  0010 DS:  ES:  CR0: 80050033
> [   74.335314] CR2: 7fff4144a710 CR3: 7ab56000 CR4: 
> 003406f0
> [   74.335830] DR0:  DR1:  DR2: 
> 
> [   74.336373] DR3:  DR6: fffe0ff0 DR7: 
> 0400
> [   74.336895] Call Trace:
> [   74.337086]  skb_release_all+0xd/0x30
> [   74.337356]  consume_skb+0x2c/0x90
> [   74.337607]  free_unused_bufs+0x1ff/0x270 [virtio_net]
> [   74.337988]  ? vp_synchronize_vectors+0x3b/0x60 [virtio_pci]
> [   74.338398]  virtnet_xdp+0x21e/0x440 [virtio_net]
> [   74.338741]  dev_change_xdp_fd+0x101/0x140
> [   74.339048]  do_setlink+0xcf4/0xd20
> [   74.339304]  ? symcmp+0xf/0x20
> [   74.339529]  ? mls_level_isvalid+0x52/0x60
> [   74.339828]  ? mls_range_isvalid+0x43/0x50
> [   74.340135]  ? nla_parse+0xa0/0x100
> [   74.340400]  rtnl_setlink+0xd4/0x120
> [   74.340664]  ? cpumask_next_and+0x30/0x50
> [   74.340966]  rtnetlink_rcv_msg+0x7f/0x1f0
> [   74.341259]  ? sock_has_perm+0x59/0x60
> [   74.341586]  ? napi_consume_skb+0xe2/0x100
> [   74.342010]  ? rtnl_newlink+0x890/0x890
> [   74.342435]  netlink_rcv_skb+0x92/0xb0
> [   74.342846]  rtnetlink_rcv+0x23/0x30
> [   74.343277]  netlink_unicast+0x162/0x210
> [   74.343677]  netlink_sendmsg+0x2db/0x390
> [   74.343968]  sock_sendmsg+0x33/0x40
> [   74.344233]  SYSC_sendto+0xee/0x160
> [   74.344482]  ? SYSC_bind+0xb0/0xe0
> [   74.344806]  ? sock_alloc_file+0x92/0x110
> [   74.345106]  ? fd_install+0x20/0x30
> [   74.345360]  ? sock_map_fd+0x3f/0x60
> [   74.345586]  SyS_sendto+0x9/0x10
> [   74.345790]  entry_SYSCALL_64_fastpath+0x1a/0xa9
> [   74.346086] RIP: 0033:0x7fc70d1b8f6d
> [   74.346312] RSP: 002b:7fff4144a708 EFLAGS: 0246 ORIG_RAX: 
> 002c
> [   74.346785] RAX: ffda RBX:  RCX: 
> 7fc70d1b8f6d
> [   74.347244] RDX: 002c RSI: 7fff4144a720 RDI: 
> 0003
> [   74.347683] RBP: 0003 R08:  R09: 
> 
> [   74.348544] R10:  R11: 0246 R12: 
> 7fff4144bd90
> [   74.349082] R13: 0002 R14: 0002 R15: 
> 7fff4144cda0
> [   74.349607] Code: 00 00 00 55 48 89 e5 53 48 89 fb 48 8b 7f 58 48 85 ff 74 
> 0e 40 f6 c7 01 74 3d 48 c7 43 58 00 00 00 00 48 8b 7b 68 48 85 ff 74 05  
> ff 0f 74 20 48 8b 43 60 48 85 c0 74 14 65 8b 15 f3 ab 8d 7e
> [   74.351008] RIP: skb_release_head_state+0x28/0x80 RSP: c9000438b8d0
> [   74.351625] ---[ end trace fe6e19fd11cfc80b ]---
> 
> Fixes: 2de2f7f40ef9 ("virtio_net: XDP support for adjust_head")
> Cc: John Fastabend 
> Signed-off-by: Jason Wang 
> ---
>  drivers/net/virtio_net.c | 35 ++-
>  1 file changed, 18 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 11e2853..9ff959c 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -1775,7 +1775,7 @@ static int virtnet_xdp_set(struct net_device *dev, 
> struct bpf_prog *prog)
>   unsigned long int max_sz = PAGE_SIZE - sizeof(struct padded_vnet_hdr);
>   struct virtnet_info *vi = netdev_priv(dev);
>   struct bpf_prog *old_prog;
> - u16 oxdp_qp, 

Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-16 Thread John Fastabend
On 17-02-15 01:08 AM, Jason Wang wrote:
> We set queues before reset which will cause a crash[1]. This is
> because is_xdp_raw_buffer_queue() depends on the old xdp queue pairs
> number to do the correct detection. So fix this by:
> 
> - set queues after reset, to keep the old vi->curr_queue_pairs. (in
>   fact setting queues before reset does not works since after feature
>   set, all queue pairs were enabled by default during reset).
> - change xdp_queue_pairs only after virtnet_reset() is succeed.
> 
> [1]

I'm guessing this occurs when enabling XDP while receiving lots of traffic?

> 
> [   74.328168] general protection fault:  [#1] SMP
> [   74.328625] Modules linked in: nfsd xfs libcrc32c virtio_net virtio_pci
> [   74.329117] CPU: 0 PID: 2849 Comm: xdp2 Not tainted 4.10.0-rc7+ #499
> [   74.329577] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 
> rel-1.10.1-0-g8891697-prebuilt.qemu-project.org 04/01/2014
> [   74.330424] task: 88007a894000 task.stack: c90004388000
> [   74.330844] RIP: 0010:skb_release_head_state+0x28/0x80
> [   74.331298] RSP: 0018:c9000438b8d0 EFLAGS: 00010206
> [   74.331676] RAX:  RBX: 88007ad96300 RCX: 
> 
> [   74.332217] RDX: 88007fc137a8 RSI: 88007fc0db28 RDI: 
> 0001bf0001be
> [   74.332758] RBP: c9000438b8d8 R08: 0005008f R09: 
> 05f9
> [   74.333274] R10: 88007d001700 R11: 820a8a4d R12: 
> 88007ad96300
> [   74.333787] R13: 0002 R14: 880036604000 R15: 
> 77ff8000
> [   74.334308] FS:  7fc70d8a7b40() GS:88007fc0() 
> knlGS:
> [   74.334891] CS:  0010 DS:  ES:  CR0: 80050033
> [   74.335314] CR2: 7fff4144a710 CR3: 7ab56000 CR4: 
> 003406f0
> [   74.335830] DR0:  DR1:  DR2: 
> 
> [   74.336373] DR3:  DR6: fffe0ff0 DR7: 
> 0400
> [   74.336895] Call Trace:
> [   74.337086]  skb_release_all+0xd/0x30
> [   74.337356]  consume_skb+0x2c/0x90
> [   74.337607]  free_unused_bufs+0x1ff/0x270 [virtio_net]
> [   74.337988]  ? vp_synchronize_vectors+0x3b/0x60 [virtio_pci]
> [   74.338398]  virtnet_xdp+0x21e/0x440 [virtio_net]
> [   74.338741]  dev_change_xdp_fd+0x101/0x140
> [   74.339048]  do_setlink+0xcf4/0xd20
> [   74.339304]  ? symcmp+0xf/0x20
> [   74.339529]  ? mls_level_isvalid+0x52/0x60
> [   74.339828]  ? mls_range_isvalid+0x43/0x50
> [   74.340135]  ? nla_parse+0xa0/0x100
> [   74.340400]  rtnl_setlink+0xd4/0x120
> [   74.340664]  ? cpumask_next_and+0x30/0x50
> [   74.340966]  rtnetlink_rcv_msg+0x7f/0x1f0
> [   74.341259]  ? sock_has_perm+0x59/0x60
> [   74.341586]  ? napi_consume_skb+0xe2/0x100
> [   74.342010]  ? rtnl_newlink+0x890/0x890
> [   74.342435]  netlink_rcv_skb+0x92/0xb0
> [   74.342846]  rtnetlink_rcv+0x23/0x30
> [   74.343277]  netlink_unicast+0x162/0x210
> [   74.343677]  netlink_sendmsg+0x2db/0x390
> [   74.343968]  sock_sendmsg+0x33/0x40
> [   74.344233]  SYSC_sendto+0xee/0x160
> [   74.344482]  ? SYSC_bind+0xb0/0xe0
> [   74.344806]  ? sock_alloc_file+0x92/0x110
> [   74.345106]  ? fd_install+0x20/0x30
> [   74.345360]  ? sock_map_fd+0x3f/0x60
> [   74.345586]  SyS_sendto+0x9/0x10
> [   74.345790]  entry_SYSCALL_64_fastpath+0x1a/0xa9
> [   74.346086] RIP: 0033:0x7fc70d1b8f6d
> [   74.346312] RSP: 002b:7fff4144a708 EFLAGS: 0246 ORIG_RAX: 
> 002c
> [   74.346785] RAX: ffda RBX:  RCX: 
> 7fc70d1b8f6d
> [   74.347244] RDX: 002c RSI: 7fff4144a720 RDI: 
> 0003
> [   74.347683] RBP: 0003 R08:  R09: 
> 
> [   74.348544] R10:  R11: 0246 R12: 
> 7fff4144bd90
> [   74.349082] R13: 0002 R14: 0002 R15: 
> 7fff4144cda0
> [   74.349607] Code: 00 00 00 55 48 89 e5 53 48 89 fb 48 8b 7f 58 48 85 ff 74 
> 0e 40 f6 c7 01 74 3d 48 c7 43 58 00 00 00 00 48 8b 7b 68 48 85 ff 74 05  
> ff 0f 74 20 48 8b 43 60 48 85 c0 74 14 65 8b 15 f3 ab 8d 7e
> [   74.351008] RIP: skb_release_head_state+0x28/0x80 RSP: c9000438b8d0
> [   74.351625] ---[ end trace fe6e19fd11cfc80b ]---
> 
> Fixes: 2de2f7f40ef9 ("virtio_net: XDP support for adjust_head")
> Cc: John Fastabend 
> Signed-off-by: Jason Wang 
> ---
>  drivers/net/virtio_net.c | 35 ++-
>  1 file changed, 18 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 11e2853..9ff959c 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -1775,7 +1775,7 @@ static int virtnet_xdp_set(struct net_device *dev, 
> struct bpf_prog *prog)
>   unsigned long int max_sz = PAGE_SIZE - sizeof(struct padded_vnet_hdr);
>   struct virtnet_info *vi = netdev_priv(dev);
>   struct bpf_prog *old_prog;
> - u16 oxdp_qp, xdp_qp = 0, curr_qp;
> + u16 xdp_qp = 0, 

Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-16 Thread Michael S. Tsirkin
On Wed, Feb 15, 2017 at 05:08:09PM +0800, Jason Wang wrote:
> We set queues before reset which will cause a crash[1]. This is
> because is_xdp_raw_buffer_queue() depends on the old xdp queue pairs
> number to do the correct detection. So fix this by:
> 
> - set queues after reset, to keep the old vi->curr_queue_pairs. (in
>   fact setting queues before reset does not works since after feature
>   set, all queue pairs were enabled by default during reset).
> - change xdp_queue_pairs only after virtnet_reset() is succeed.
> 
> [1]
> 
> [   74.328168] general protection fault:  [#1] SMP
> [   74.328625] Modules linked in: nfsd xfs libcrc32c virtio_net virtio_pci
> [   74.329117] CPU: 0 PID: 2849 Comm: xdp2 Not tainted 4.10.0-rc7+ #499
> [   74.329577] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 
> rel-1.10.1-0-g8891697-prebuilt.qemu-project.org 04/01/2014
> [   74.330424] task: 88007a894000 task.stack: c90004388000
> [   74.330844] RIP: 0010:skb_release_head_state+0x28/0x80
> [   74.331298] RSP: 0018:c9000438b8d0 EFLAGS: 00010206
> [   74.331676] RAX:  RBX: 88007ad96300 RCX: 
> 
> [   74.332217] RDX: 88007fc137a8 RSI: 88007fc0db28 RDI: 
> 0001bf0001be
> [   74.332758] RBP: c9000438b8d8 R08: 0005008f R09: 
> 05f9
> [   74.333274] R10: 88007d001700 R11: 820a8a4d R12: 
> 88007ad96300
> [   74.333787] R13: 0002 R14: 880036604000 R15: 
> 77ff8000
> [   74.334308] FS:  7fc70d8a7b40() GS:88007fc0() 
> knlGS:
> [   74.334891] CS:  0010 DS:  ES:  CR0: 80050033
> [   74.335314] CR2: 7fff4144a710 CR3: 7ab56000 CR4: 
> 003406f0
> [   74.335830] DR0:  DR1:  DR2: 
> 
> [   74.336373] DR3:  DR6: fffe0ff0 DR7: 
> 0400
> [   74.336895] Call Trace:
> [   74.337086]  skb_release_all+0xd/0x30
> [   74.337356]  consume_skb+0x2c/0x90
> [   74.337607]  free_unused_bufs+0x1ff/0x270 [virtio_net]
> [   74.337988]  ? vp_synchronize_vectors+0x3b/0x60 [virtio_pci]
> [   74.338398]  virtnet_xdp+0x21e/0x440 [virtio_net]
> [   74.338741]  dev_change_xdp_fd+0x101/0x140
> [   74.339048]  do_setlink+0xcf4/0xd20
> [   74.339304]  ? symcmp+0xf/0x20
> [   74.339529]  ? mls_level_isvalid+0x52/0x60
> [   74.339828]  ? mls_range_isvalid+0x43/0x50
> [   74.340135]  ? nla_parse+0xa0/0x100
> [   74.340400]  rtnl_setlink+0xd4/0x120
> [   74.340664]  ? cpumask_next_and+0x30/0x50
> [   74.340966]  rtnetlink_rcv_msg+0x7f/0x1f0
> [   74.341259]  ? sock_has_perm+0x59/0x60
> [   74.341586]  ? napi_consume_skb+0xe2/0x100
> [   74.342010]  ? rtnl_newlink+0x890/0x890
> [   74.342435]  netlink_rcv_skb+0x92/0xb0
> [   74.342846]  rtnetlink_rcv+0x23/0x30
> [   74.343277]  netlink_unicast+0x162/0x210
> [   74.343677]  netlink_sendmsg+0x2db/0x390
> [   74.343968]  sock_sendmsg+0x33/0x40
> [   74.344233]  SYSC_sendto+0xee/0x160
> [   74.344482]  ? SYSC_bind+0xb0/0xe0
> [   74.344806]  ? sock_alloc_file+0x92/0x110
> [   74.345106]  ? fd_install+0x20/0x30
> [   74.345360]  ? sock_map_fd+0x3f/0x60
> [   74.345586]  SyS_sendto+0x9/0x10
> [   74.345790]  entry_SYSCALL_64_fastpath+0x1a/0xa9
> [   74.346086] RIP: 0033:0x7fc70d1b8f6d
> [   74.346312] RSP: 002b:7fff4144a708 EFLAGS: 0246 ORIG_RAX: 
> 002c
> [   74.346785] RAX: ffda RBX:  RCX: 
> 7fc70d1b8f6d
> [   74.347244] RDX: 002c RSI: 7fff4144a720 RDI: 
> 0003
> [   74.347683] RBP: 0003 R08:  R09: 
> 
> [   74.348544] R10:  R11: 0246 R12: 
> 7fff4144bd90
> [   74.349082] R13: 0002 R14: 0002 R15: 
> 7fff4144cda0
> [   74.349607] Code: 00 00 00 55 48 89 e5 53 48 89 fb 48 8b 7f 58 48 85 ff 74 
> 0e 40 f6 c7 01 74 3d 48 c7 43 58 00 00 00 00 48 8b 7b 68 48 85 ff 74 05  
> ff 0f 74 20 48 8b 43 60 48 85 c0 74 14 65 8b 15 f3 ab 8d 7e
> [   74.351008] RIP: skb_release_head_state+0x28/0x80 RSP: c9000438b8d0
> [   74.351625] ---[ end trace fe6e19fd11cfc80b ]---
> 
> Fixes: 2de2f7f40ef9 ("virtio_net: XDP support for adjust_head")
> Cc: John Fastabend 
> Signed-off-by: Jason Wang 

Acked-by: Michael S. Tsirkin 

> ---
>  drivers/net/virtio_net.c | 35 ++-
>  1 file changed, 18 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 11e2853..9ff959c 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -1775,7 +1775,7 @@ static int virtnet_xdp_set(struct net_device *dev, 
> struct bpf_prog *prog)
>   unsigned long int max_sz = PAGE_SIZE - sizeof(struct padded_vnet_hdr);
>   struct virtnet_info *vi = netdev_priv(dev);
>   struct bpf_prog *old_prog;
> - u16 oxdp_qp, xdp_qp = 

Re: [PATCH net-next] virito-net: set queues after reset during xdp_set

2017-02-16 Thread Michael S. Tsirkin
On Wed, Feb 15, 2017 at 05:08:09PM +0800, Jason Wang wrote:
> We set queues before reset which will cause a crash[1]. This is
> because is_xdp_raw_buffer_queue() depends on the old xdp queue pairs
> number to do the correct detection. So fix this by:
> 
> - set queues after reset, to keep the old vi->curr_queue_pairs. (in
>   fact setting queues before reset does not works since after feature
>   set, all queue pairs were enabled by default during reset).
> - change xdp_queue_pairs only after virtnet_reset() is succeed.
> 
> [1]
> 
> [   74.328168] general protection fault:  [#1] SMP
> [   74.328625] Modules linked in: nfsd xfs libcrc32c virtio_net virtio_pci
> [   74.329117] CPU: 0 PID: 2849 Comm: xdp2 Not tainted 4.10.0-rc7+ #499
> [   74.329577] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 
> rel-1.10.1-0-g8891697-prebuilt.qemu-project.org 04/01/2014
> [   74.330424] task: 88007a894000 task.stack: c90004388000
> [   74.330844] RIP: 0010:skb_release_head_state+0x28/0x80
> [   74.331298] RSP: 0018:c9000438b8d0 EFLAGS: 00010206
> [   74.331676] RAX:  RBX: 88007ad96300 RCX: 
> 
> [   74.332217] RDX: 88007fc137a8 RSI: 88007fc0db28 RDI: 
> 0001bf0001be
> [   74.332758] RBP: c9000438b8d8 R08: 0005008f R09: 
> 05f9
> [   74.333274] R10: 88007d001700 R11: 820a8a4d R12: 
> 88007ad96300
> [   74.333787] R13: 0002 R14: 880036604000 R15: 
> 77ff8000
> [   74.334308] FS:  7fc70d8a7b40() GS:88007fc0() 
> knlGS:
> [   74.334891] CS:  0010 DS:  ES:  CR0: 80050033
> [   74.335314] CR2: 7fff4144a710 CR3: 7ab56000 CR4: 
> 003406f0
> [   74.335830] DR0:  DR1:  DR2: 
> 
> [   74.336373] DR3:  DR6: fffe0ff0 DR7: 
> 0400
> [   74.336895] Call Trace:
> [   74.337086]  skb_release_all+0xd/0x30
> [   74.337356]  consume_skb+0x2c/0x90
> [   74.337607]  free_unused_bufs+0x1ff/0x270 [virtio_net]
> [   74.337988]  ? vp_synchronize_vectors+0x3b/0x60 [virtio_pci]
> [   74.338398]  virtnet_xdp+0x21e/0x440 [virtio_net]
> [   74.338741]  dev_change_xdp_fd+0x101/0x140
> [   74.339048]  do_setlink+0xcf4/0xd20
> [   74.339304]  ? symcmp+0xf/0x20
> [   74.339529]  ? mls_level_isvalid+0x52/0x60
> [   74.339828]  ? mls_range_isvalid+0x43/0x50
> [   74.340135]  ? nla_parse+0xa0/0x100
> [   74.340400]  rtnl_setlink+0xd4/0x120
> [   74.340664]  ? cpumask_next_and+0x30/0x50
> [   74.340966]  rtnetlink_rcv_msg+0x7f/0x1f0
> [   74.341259]  ? sock_has_perm+0x59/0x60
> [   74.341586]  ? napi_consume_skb+0xe2/0x100
> [   74.342010]  ? rtnl_newlink+0x890/0x890
> [   74.342435]  netlink_rcv_skb+0x92/0xb0
> [   74.342846]  rtnetlink_rcv+0x23/0x30
> [   74.343277]  netlink_unicast+0x162/0x210
> [   74.343677]  netlink_sendmsg+0x2db/0x390
> [   74.343968]  sock_sendmsg+0x33/0x40
> [   74.344233]  SYSC_sendto+0xee/0x160
> [   74.344482]  ? SYSC_bind+0xb0/0xe0
> [   74.344806]  ? sock_alloc_file+0x92/0x110
> [   74.345106]  ? fd_install+0x20/0x30
> [   74.345360]  ? sock_map_fd+0x3f/0x60
> [   74.345586]  SyS_sendto+0x9/0x10
> [   74.345790]  entry_SYSCALL_64_fastpath+0x1a/0xa9
> [   74.346086] RIP: 0033:0x7fc70d1b8f6d
> [   74.346312] RSP: 002b:7fff4144a708 EFLAGS: 0246 ORIG_RAX: 
> 002c
> [   74.346785] RAX: ffda RBX:  RCX: 
> 7fc70d1b8f6d
> [   74.347244] RDX: 002c RSI: 7fff4144a720 RDI: 
> 0003
> [   74.347683] RBP: 0003 R08:  R09: 
> 
> [   74.348544] R10:  R11: 0246 R12: 
> 7fff4144bd90
> [   74.349082] R13: 0002 R14: 0002 R15: 
> 7fff4144cda0
> [   74.349607] Code: 00 00 00 55 48 89 e5 53 48 89 fb 48 8b 7f 58 48 85 ff 74 
> 0e 40 f6 c7 01 74 3d 48 c7 43 58 00 00 00 00 48 8b 7b 68 48 85 ff 74 05  
> ff 0f 74 20 48 8b 43 60 48 85 c0 74 14 65 8b 15 f3 ab 8d 7e
> [   74.351008] RIP: skb_release_head_state+0x28/0x80 RSP: c9000438b8d0
> [   74.351625] ---[ end trace fe6e19fd11cfc80b ]---
> 
> Fixes: 2de2f7f40ef9 ("virtio_net: XDP support for adjust_head")
> Cc: John Fastabend 
> Signed-off-by: Jason Wang 

Acked-by: Michael S. Tsirkin 

> ---
>  drivers/net/virtio_net.c | 35 ++-
>  1 file changed, 18 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 11e2853..9ff959c 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -1775,7 +1775,7 @@ static int virtnet_xdp_set(struct net_device *dev, 
> struct bpf_prog *prog)
>   unsigned long int max_sz = PAGE_SIZE - sizeof(struct padded_vnet_hdr);
>   struct virtnet_info *vi = netdev_priv(dev);
>   struct bpf_prog *old_prog;
> - u16 oxdp_qp, xdp_qp = 0, curr_qp;
> + u16 xdp_qp = 0, curr_qp;
>   int i,