Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4798248e authored by David S. Miller's avatar David S. Miller
Browse files

net: Add ops->ndo_xmit_flush()

parent 4c83acbc
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -193,7 +193,7 @@ static netdev_tx_t dlci_transmit(struct sk_buff *skb, struct net_device *dev)
	struct dlci_local *dlp = netdev_priv(dev);

	if (skb)
		dlp->slave->netdev_ops->ndo_start_xmit(skb, dlp->slave);
		netdev_start_xmit(skb, dlp->slave);
	return NETDEV_TX_OK;
}

+1 −1
Original line number Diff line number Diff line
@@ -1101,7 +1101,7 @@ static void ncm_tx_tasklet(unsigned long data)
	/* Only send if data is available. */
	if (ncm->skb_tx_data) {
		ncm->timer_force_tx = true;
		ncm->netdev->netdev_ops->ndo_start_xmit(NULL, ncm->netdev);
		netdev_start_xmit(NULL, ncm->netdev);
		ncm->timer_force_tx = false;
	}
}
+35 −0
Original line number Diff line number Diff line
@@ -782,6 +782,19 @@ typedef u16 (*select_queue_fallback_t)(struct net_device *dev,
 *        (can also return NETDEV_TX_LOCKED iff NETIF_F_LLTX)
 *	Required can not be NULL.
 *
 * void (*ndo_xmit_flush)(struct net_device *dev, u16 queue);
 *	A driver implements this function when it wishes to support
 *	deferred TX queue flushing.  The idea is that the expensive
 *	operation to trigger TX queue processing can be done after
 *	N calls to ndo_start_xmit rather than being done every single
 *	time.  In this regime ndo_start_xmit will be called one or more
 *	times, and then a final ndo_xmit_flush call will be made to
 *	have the driver tell the device about the new pending TX queue
 *	entries.  The kernel keeps track of which queues need flushing
 *	by monitoring skb->queue_mapping of the packets it submits to
 *	ndo_start_xmit.  This is the queue value that will be passed
 *	to ndo_xmit_flush.
 *
 * u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb,
 *                         void *accel_priv, select_queue_fallback_t fallback);
 *	Called to decide which queue to when device supports multiple
@@ -1005,6 +1018,7 @@ struct net_device_ops {
	int			(*ndo_stop)(struct net_device *dev);
	netdev_tx_t		(*ndo_start_xmit) (struct sk_buff *skb,
						   struct net_device *dev);
	void			(*ndo_xmit_flush)(struct net_device *dev, u16 queue);
	u16			(*ndo_select_queue)(struct net_device *dev,
						    struct sk_buff *skb,
						    void *accel_priv,
@@ -3430,6 +3444,27 @@ int __init dev_proc_init(void);
#define dev_proc_init() 0
#endif

static inline netdev_tx_t __netdev_start_xmit(const struct net_device_ops *ops,
					      struct sk_buff *skb, struct net_device *dev)
{
	netdev_tx_t ret;
	u16 q;

	q = skb->queue_mapping;
	ret = ops->ndo_start_xmit(skb, dev);
	if (dev_xmit_complete(ret) && ops->ndo_xmit_flush)
		ops->ndo_xmit_flush(dev, q);

	return ret;
}

static inline netdev_tx_t netdev_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
	const struct net_device_ops *ops = dev->netdev_ops;

	return __netdev_start_xmit(ops, skb, dev);
}

int netdev_class_create_file_ns(struct class_attribute *class_attr,
				const void *ns);
void netdev_class_remove_file_ns(struct class_attribute *class_attr,
+1 −1
Original line number Diff line number Diff line
@@ -599,7 +599,7 @@ static netdev_tx_t mpc_send_packet(struct sk_buff *skb,
	}

non_ip:
	return mpc->old_ops->ndo_start_xmit(skb, dev);
	return __netdev_start_xmit(mpc->old_ops, skb, dev);
}

static int atm_mpoa_vcc_attach(struct atm_vcc *vcc, void __user *arg)
+2 −3
Original line number Diff line number Diff line
@@ -2602,7 +2602,6 @@ EXPORT_SYMBOL(netif_skb_features);
int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,
			struct netdev_queue *txq)
{
	const struct net_device_ops *ops = dev->netdev_ops;
	int rc = NETDEV_TX_OK;
	unsigned int skb_len;

@@ -2667,7 +2666,7 @@ int dev_hard_start_xmit(struct sk_buff *skb, struct net_device *dev,

		skb_len = skb->len;
		trace_net_dev_start_xmit(skb, dev);
		rc = ops->ndo_start_xmit(skb, dev);
		rc = netdev_start_xmit(skb, dev);
		trace_net_dev_xmit(skb, rc, dev, skb_len);
		if (rc == NETDEV_TX_OK)
			txq_trans_update(txq);
@@ -2686,7 +2685,7 @@ gso:

		skb_len = nskb->len;
		trace_net_dev_start_xmit(nskb, dev);
		rc = ops->ndo_start_xmit(nskb, dev);
		rc = netdev_start_xmit(nskb, dev);
		trace_net_dev_xmit(nskb, rc, dev, skb_len);
		if (unlikely(rc != NETDEV_TX_OK)) {
			if (rc & ~NETDEV_TX_MASK)
Loading