|
@@ -634,6 +634,26 @@ void kfree_skb(struct sk_buff *skb)
|
|
|
}
|
|
|
EXPORT_SYMBOL(kfree_skb);
|
|
|
|
|
|
+/**
|
|
|
+ * skb_tx_error - report an sk_buff xmit error
|
|
|
+ * @skb: buffer that triggered an error
|
|
|
+ *
|
|
|
+ * Report xmit error if a device callback is tracking this skb.
|
|
|
+ * skb must be freed afterwards.
|
|
|
+ */
|
|
|
+void skb_tx_error(struct sk_buff *skb)
|
|
|
+{
|
|
|
+ if (skb_shinfo(skb)->tx_flags & SKBTX_DEV_ZEROCOPY) {
|
|
|
+ struct ubuf_info *uarg;
|
|
|
+
|
|
|
+ uarg = skb_shinfo(skb)->destructor_arg;
|
|
|
+ if (uarg->callback)
|
|
|
+ uarg->callback(uarg, false);
|
|
|
+ skb_shinfo(skb)->tx_flags &= ~SKBTX_DEV_ZEROCOPY;
|
|
|
+ }
|
|
|
+}
|
|
|
+EXPORT_SYMBOL(skb_tx_error);
|
|
|
+
|
|
|
/**
|
|
|
* consume_skb - free an skbuff
|
|
|
* @skb: buffer to free
|