Merge tag 'efi-next-for-v6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi
[linux-block.git] / include / linux / netdevice.h
index c35f04f636f15a2a034baedd0b60b0857b96f0e0..08fbd4622ccf731daaee34ad99773d6dc2e82fa6 100644 (file)
@@ -52,6 +52,7 @@
 #include <linux/rbtree.h>
 #include <net/net_trackers.h>
 #include <net/net_debug.h>
+#include <net/dropreason-core.h>
 
 struct netpoll_info;
 struct device;
@@ -359,18 +360,22 @@ struct napi_struct {
        unsigned long           gro_bitmask;
        int                     (*poll)(struct napi_struct *, int);
 #ifdef CONFIG_NETPOLL
+       /* CPU actively polling if netpoll is configured */
        int                     poll_owner;
 #endif
+       /* CPU on which NAPI has been scheduled for processing */
+       int                     list_owner;
        struct net_device       *dev;
        struct gro_list         gro_hash[GRO_HASH_BUCKETS];
        struct sk_buff          *skb;
        struct list_head        rx_list; /* Pending GRO_NORMAL skbs */
        int                     rx_count; /* length of rx_list */
+       unsigned int            napi_id;
        struct hrtimer          timer;
+       struct task_struct      *thread;
+       /* control-path-only fields follow */
        struct list_head        dev_list;
        struct hlist_node       napi_hash_node;
-       unsigned int            napi_id;
-       struct task_struct      *thread;
 };
 
 enum {
@@ -508,15 +513,18 @@ static inline bool napi_reschedule(struct napi_struct *napi)
        return false;
 }
 
-bool napi_complete_done(struct napi_struct *n, int work_done);
 /**
- *     napi_complete - NAPI processing complete
- *     @n: NAPI context
+ * napi_complete_done - NAPI processing complete
+ * @n: NAPI context
+ * @work_done: number of packets processed
  *
- * Mark NAPI processing as complete.
- * Consider using napi_complete_done() instead.
+ * Mark NAPI processing as complete. Should only be called if poll budget
+ * has not been completely consumed.
+ * Prefer over napi_complete().
  * Return false if device should avoid rearming interrupts.
  */
+bool napi_complete_done(struct napi_struct *n, int work_done);
+
 static inline bool napi_complete(struct napi_struct *n)
 {
        return napi_complete_done(n, 0);
@@ -1308,6 +1316,17 @@ struct netdev_net_notifier {
  *     Used to add FDB entries to dump requests. Implementers should add
  *     entries to skb and update idx with the number of entries.
  *
+ * int (*ndo_mdb_add)(struct net_device *dev, struct nlattr *tb[],
+ *                   u16 nlmsg_flags, struct netlink_ext_ack *extack);
+ *     Adds an MDB entry to dev.
+ * int (*ndo_mdb_del)(struct net_device *dev, struct nlattr *tb[],
+ *                   struct netlink_ext_ack *extack);
+ *     Deletes the MDB entry from dev.
+ * int (*ndo_mdb_dump)(struct net_device *dev, struct sk_buff *skb,
+ *                    struct netlink_callback *cb);
+ *     Dumps MDB entries from dev. The first argument (marker) in the netlink
+ *     callback is used by core rtnetlink code.
+ *
  * int (*ndo_bridge_setlink)(struct net_device *dev, struct nlmsghdr *nlh,
  *                          u16 flags, struct netlink_ext_ack *extack)
  * int (*ndo_bridge_getlink)(struct sk_buff *skb, u32 pid, u32 seq,
@@ -1570,6 +1589,16 @@ struct net_device_ops {
                                               const unsigned char *addr,
                                               u16 vid, u32 portid, u32 seq,
                                               struct netlink_ext_ack *extack);
+       int                     (*ndo_mdb_add)(struct net_device *dev,
+                                              struct nlattr *tb[],
+                                              u16 nlmsg_flags,
+                                              struct netlink_ext_ack *extack);
+       int                     (*ndo_mdb_del)(struct net_device *dev,
+                                              struct nlattr *tb[],
+                                              struct netlink_ext_ack *extack);
+       int                     (*ndo_mdb_dump)(struct net_device *dev,
+                                               struct sk_buff *skb,
+                                               struct netlink_callback *cb);
        int                     (*ndo_bridge_setlink)(struct net_device *dev,
                                                      struct nlmsghdr *nlh,
                                                      u16 flags,
@@ -2463,6 +2492,7 @@ static inline
 struct netdev_queue *netdev_get_tx_queue(const struct net_device *dev,
                                         unsigned int index)
 {
+       DEBUG_NET_WARN_ON_ONCE(index >= dev->num_tx_queues);
        return &dev->_tx[index];
 }
 
@@ -2958,7 +2988,8 @@ netdev_notifier_info_to_extack(const struct netdev_notifier_info *info)
 }
 
 int call_netdevice_notifiers(unsigned long val, struct net_device *dev);
-
+int call_netdevice_notifiers_info(unsigned long val,
+                                 struct netdev_notifier_info *info);
 
 extern rwlock_t                                dev_base_lock;          /* Device list lock */
 
@@ -3163,6 +3194,10 @@ struct softnet_data {
 #ifdef CONFIG_RPS
        struct softnet_data     *rps_ipi_list;
 #endif
+
+       bool                    in_net_rx_action;
+       bool                    in_napi_threaded_poll;
+
 #ifdef CONFIG_NET_FLOW_LIMIT
        struct sd_flow_limit __rcu *flow_limit;
 #endif
@@ -3307,6 +3342,7 @@ static inline void netif_tx_wake_all_queues(struct net_device *dev)
 
 static __always_inline void netif_tx_stop_queue(struct netdev_queue *dev_queue)
 {
+       /* Must be an atomic op see netif_txq_try_stop() */
        set_bit(__QUEUE_STATE_DRV_XOFF, &dev_queue->state);
 }
 
@@ -3503,7 +3539,7 @@ static inline void netdev_tx_completed_queue(struct netdev_queue *dev_queue,
         * netdev_tx_sent_queue will miss the update and cause the queue to
         * be stopped forever
         */
-       smp_mb();
+       smp_mb(); /* NOTE: netdev_txq_completed_mb() assumes this exists */
 
        if (unlikely(dql_avail(&dev_queue->dql) < 0))
                return;
@@ -3807,13 +3843,8 @@ static inline unsigned int get_netdev_rx_queue_index(
 
 int netif_get_num_default_rss_queues(void);
 
-enum skb_free_reason {
-       SKB_REASON_CONSUMED,
-       SKB_REASON_DROPPED,
-};
-
-void __dev_kfree_skb_irq(struct sk_buff *skb, enum skb_free_reason reason);
-void __dev_kfree_skb_any(struct sk_buff *skb, enum skb_free_reason reason);
+void dev_kfree_skb_irq_reason(struct sk_buff *skb, enum skb_drop_reason reason);
+void dev_kfree_skb_any_reason(struct sk_buff *skb, enum skb_drop_reason reason);
 
 /*
  * It is not allowed to call kfree_skb() or consume_skb() from hardware
@@ -3836,22 +3867,22 @@ void __dev_kfree_skb_any(struct sk_buff *skb, enum skb_free_reason reason);
  */
 static inline void dev_kfree_skb_irq(struct sk_buff *skb)
 {
-       __dev_kfree_skb_irq(skb, SKB_REASON_DROPPED);
+       dev_kfree_skb_irq_reason(skb, SKB_DROP_REASON_NOT_SPECIFIED);
 }
 
 static inline void dev_consume_skb_irq(struct sk_buff *skb)
 {
-       __dev_kfree_skb_irq(skb, SKB_REASON_CONSUMED);
+       dev_kfree_skb_irq_reason(skb, SKB_CONSUMED);
 }
 
 static inline void dev_kfree_skb_any(struct sk_buff *skb)
 {
-       __dev_kfree_skb_any(skb, SKB_REASON_DROPPED);
+       dev_kfree_skb_any_reason(skb, SKB_DROP_REASON_NOT_SPECIFIED);
 }
 
 static inline void dev_consume_skb_any(struct sk_buff *skb)
 {
-       __dev_kfree_skb_any(skb, SKB_REASON_CONSUMED);
+       dev_kfree_skb_any_reason(skb, SKB_CONSUMED);
 }
 
 u32 bpf_prog_run_generic_xdp(struct sk_buff *skb, struct xdp_buff *xdp,