[Intel-wired-lan] [net-next PATCH v3 1/3] ixgbe: add XDP support for pass and drop actions
Alexander Duyck
alexander.duyck at gmail.com
Thu Mar 9 21:35:23 UTC 2017
On Thu, Mar 9, 2017 at 8:33 AM, John Fastabend <john.fastabend at gmail.com> wrote:
> On 17-03-03 12:55 PM, Alexander Duyck wrote:
>> On Fri, Mar 3, 2017 at 9:57 AM, John Fastabend <john.fastabend at gmail.com> wrote:
>>> Basic XDP drop support for ixgbe. Uses READ_ONCE/xchg semantics on XDP
>>> programs instead of rcu primitives as suggested by Daniel Borkmann and
>>> Alex Duyck.
>>>
>>> Signed-off-by: John Fastabend <john.r.fastabend at intel.com>
>>> ---
>>> drivers/net/ethernet/intel/ixgbe/ixgbe.h | 4 +
>>> drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 4 -
>>> drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 123 +++++++++++++++++++++-
>>> 3 files changed, 120 insertions(+), 11 deletions(-)
>>>
>>> diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h
>>> index b812913..6eaf506 100644
>
> [...]
>
> I'll fix style comments in next version.
>
>>> if (!skb) {
>>> @@ -6061,7 +6120,8 @@ static int ixgbe_setup_all_tx_resources(struct ixgbe_adapter *adapter)
>>> *
>>> * Returns 0 on success, negative on failure
>>> **/
>>> -int ixgbe_setup_rx_resources(struct ixgbe_ring *rx_ring)
>>> +int ixgbe_setup_rx_resources(struct ixgbe_adapter *adapter,
>>> + struct ixgbe_ring *rx_ring)
>>> {
>>> struct device *dev = rx_ring->dev;
>>> int orig_node = dev_to_node(dev);
>>> @@ -6098,6 +6158,8 @@ int ixgbe_setup_rx_resources(struct ixgbe_ring *rx_ring)
>>> rx_ring->next_to_clean = 0;
>>> rx_ring->next_to_use = 0;
>>>
>>> + xchg(&rx_ring->xdp_prog, adapter->xdp_prog);
>>> +
>>> return 0;
>>> err:
>>> vfree(rx_ring->rx_buffer_info);
>>
>> It occurs to me that I am not sure we even need the xchg here. This
>> should be protected by an the rtnl lock anyway. So I don't think we
>> need the xchg unless XDP can update things outside the rtnl lock which
>> if it can we have other issues since adapter->xdp_prog could then be
>> updated while this is going on.
>>
>>> @@ -6121,10 +6183,11 @@ static int ixgbe_setup_all_rx_resources(struct ixgbe_adapter *adapter)
>>> int i, err = 0;
>>>
>>> for (i = 0; i < adapter->num_rx_queues; i++) {
>>> - err = ixgbe_setup_rx_resources(adapter->rx_ring[i]);
>>> + struct ixgbe_ring *rx_ring = adapter->rx_ring[i];
>>> +
>>> + err = ixgbe_setup_rx_resources(adapter, rx_ring);
>>> if (!err)
>>> continue;
>>> -
>>
>> There is a bunch of noise here. Don't bother modifying white space,
>> just add the adapter reference to the function call. It will still
>> be below 80 characters anyway.
>>
>>> e_err(probe, "Allocation for Rx Queue %u failed\n", i);
>>> goto err_setup_rx;
>>> }
>>> @@ -6189,6 +6252,7 @@ void ixgbe_free_rx_resources(struct ixgbe_ring *rx_ring)
>>> {
>>> ixgbe_clean_rx_ring(rx_ring);
>>>
>>> + xchg(&rx_ring->xdp_prog, NULL);
>>> vfree(rx_ring->rx_buffer_info);
>>> rx_ring->rx_buffer_info = NULL;
>>>
>>
>> Same question that I had for the other xchg. Do we even need it? The
>> NAPI polling routine should already be unregistered since we are
>> freeing rings at this point. Odds are we can probably just assign
>> NULL as a value and skip the xchg assuming all callers of this
>> function are holding the rtnl.
>>
>
> As long as we can guarantee the ring is down and no traffic is being received
> then the xchg is not needed. In both of the above cases.
Even if we were passing traffic I don't think the xchg is needed. It
is only really needed if we want to pull the value out. If you look
through the RCU code we do a lot of the initialization stuff by just
assigning a NULL pointer since assignment of a pointer is usually an
atomic operation anyway.
- Alex
More information about the Intel-wired-lan
mailing list