-LINUX_VERSION-6.6 = .69
-LINUX_KERNEL_HASH-6.6.69 = 9c6305567b75d99514cde6eb9de39973f3d5c857a75bd9dcdfca57041f8d4f34
+LINUX_VERSION-6.6 = .70
+LINUX_KERNEL_HASH-6.6.70 = 84d23ee07fb26febbcb6d1295ba15efdc67ac382b4137b2c8853146c10fd2f97
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
-@@ -839,7 +839,7 @@ config I2C_MT65XX
+@@ -841,7 +841,7 @@ config I2C_MT65XX
config I2C_MT7621
tristate "MT7621/MT7628 I2C Controller"
--- a/include/linux/spinlock.h
+++ b/include/linux/spinlock.h
-@@ -515,6 +515,10 @@ DEFINE_LOCK_GUARD_1(raw_spinlock_irq, ra
- raw_spin_lock_irq(_T->lock),
- raw_spin_unlock_irq(_T->lock))
+@@ -519,6 +519,10 @@ DEFINE_LOCK_GUARD_1(raw_spinlock_irq, ra
+
+ DEFINE_LOCK_GUARD_1_COND(raw_spinlock_irq, _try, raw_spin_trylock_irq(_T->lock))
+DEFINE_LOCK_GUARD_1(raw_spinlock_bh, raw_spinlock_t,
+ raw_spin_lock_bh(_T->lock),
DEFINE_LOCK_GUARD_1(raw_spinlock_irqsave, raw_spinlock_t,
raw_spin_lock_irqsave(_T->lock, _T->flags),
raw_spin_unlock_irqrestore(_T->lock, _T->flags),
-@@ -528,6 +532,10 @@ DEFINE_LOCK_GUARD_1(spinlock_irq, spinlo
- spin_lock_irq(_T->lock),
- spin_unlock_irq(_T->lock))
+@@ -540,6 +544,10 @@ DEFINE_LOCK_GUARD_1(spinlock_irq, spinlo
+ DEFINE_LOCK_GUARD_1_COND(spinlock_irq, _try,
+ spin_trylock_irq(_T->lock))
+DEFINE_LOCK_GUARD_1(spinlock_bh, spinlock_t,
+ spin_lock_bh(_T->lock),
pdev->device == PCI_DEVICE_ID_ASMEDIA_1042_XHCI) {
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
-@@ -633,8 +633,11 @@ static int xhci_move_dequeue_past_td(str
+@@ -634,8 +634,11 @@ static int xhci_move_dequeue_past_td(str
struct xhci_ring *ep_ring;
struct xhci_command *cmd;
struct xhci_segment *new_seg;
dma_addr_t addr;
u64 hw_dequeue;
bool cycle_found = false;
-@@ -672,7 +675,27 @@ static int xhci_move_dequeue_past_td(str
+@@ -673,7 +676,27 @@ static int xhci_move_dequeue_past_td(str
hw_dequeue = xhci_get_hw_deq(xhci, dev, ep_index, stream_id);
new_seg = ep_ring->deq_seg;
new_deq = ep_ring->dequeue;
* For devices with more than one control interface, we assume the
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
-@@ -2247,6 +2247,8 @@ static const struct usb_audio_quirk_flag
+@@ -2249,6 +2249,8 @@ static const struct usb_audio_quirk_flag
QUIRK_FLAG_ALIGN_TRANSFER),
DEVICE_FLG(0x534d, 0x2109, /* MacroSilicon MS2109 */
QUIRK_FLAG_ALIGN_TRANSFER),
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
-@@ -1497,6 +1497,109 @@ command_cleanup:
+@@ -1498,6 +1498,109 @@ command_cleanup:
}
/*
* non-error returns are a promise to giveback() the urb later
* we drop ownership so next owner (or urb unlink) can get it
*/
-@@ -5347,6 +5450,7 @@ static const struct hc_driver xhci_hc_dr
+@@ -5360,6 +5463,7 @@ static const struct hc_driver xhci_hc_dr
.endpoint_reset = xhci_endpoint_reset,
.check_bandwidth = xhci_check_bandwidth,
.reset_bandwidth = xhci_reset_bandwidth,
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
-@@ -738,9 +738,9 @@ deq_found:
+@@ -739,9 +739,9 @@ deq_found:
}
if ((ep->ep_state & SET_DEQ_PENDING)) {
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
-@@ -1586,7 +1586,7 @@ static void xhci_fixup_endpoint(struct u
+@@ -1587,7 +1587,7 @@ static void xhci_fixup_endpoint(struct u
return;
}
ctrl_ctx->add_flags = xhci_get_endpoint_flag_from_index(ep_index);
erst_base = xhci_read_64(xhci, &ir->ir_set->erst_base);
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
-@@ -1425,8 +1425,9 @@ struct urb_priv {
+@@ -1426,8 +1426,9 @@ struct urb_priv {
* Each segment table entry is 4*32bits long. 1K seems like an ok size:
* (1K bytes * 8bytes/bit) / (4*32 bits) = 64 segment entries in the table,
* meaning 64 ring segments.
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
-@@ -728,6 +728,15 @@ static int xhci_move_dequeue_past_td(str
+@@ -729,6 +729,15 @@ static int xhci_move_dequeue_past_td(str
} while (!cycle_found || !td_last_trb_found);
deq_found:
addr = xhci_trb_virt_to_dma(new_seg, new_deq);
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
-@@ -1663,6 +1663,9 @@ struct xhci_hcd {
+@@ -1664,6 +1664,9 @@ struct xhci_hcd {
#define XHCI_CDNS_SCTX_QUIRK BIT_ULL(48)
#define XHCI_ETRON_HOST BIT_ULL(49)
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
-@@ -1665,6 +1665,7 @@ struct xhci_hcd {
+@@ -1666,6 +1666,7 @@ struct xhci_hcd {
/* Downstream VLI fixes */
#define XHCI_AVOID_DQ_ON_LINK BIT_ULL(56)
if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
-@@ -3674,6 +3674,48 @@ static int xhci_align_td(struct xhci_hcd
+@@ -3714,6 +3714,48 @@ static int xhci_align_td(struct xhci_hcd
return 1;
}
/* This is very similar to what ehci-q.c qtd_fill() does */
int xhci_queue_bulk_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
struct urb *urb, int slot_id, unsigned int ep_index)
-@@ -3830,6 +3872,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
+@@ -3870,6 +3912,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
}
check_trb_math(urb, enqd_len);
giveback_first_trb(xhci, slot_id, ep_index, urb->stream_id,
start_cycle, start_trb);
return 0;
-@@ -3979,6 +4023,8 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *
+@@ -4019,6 +4063,8 @@ int xhci_queue_ctrl_tx(struct xhci_hcd *
/* Event on completion */
field | TRB_IOC | TRB_TYPE(TRB_STATUS) | ep_ring->cycle_state);
return 0;
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
-@@ -1666,6 +1666,7 @@ struct xhci_hcd {
+@@ -1667,6 +1667,7 @@ struct xhci_hcd {
/* Downstream VLI fixes */
#define XHCI_AVOID_DQ_ON_LINK BIT_ULL(56)
#define XHCI_VLI_SS_BULK_OUT_BUG BIT_ULL(57)
/* Global Debug LSP MUX Select */
#define DWC3_GDBGLSPMUX_ENDBC BIT(15) /* Host only */
#define DWC3_GDBGLSPMUX_HOSTSELECT(n) ((n) & 0x3fff)
-@@ -1062,6 +1065,7 @@ struct dwc3_scratchpad_array {
+@@ -1066,6 +1069,7 @@ struct dwc3_scratchpad_array {
* @tx_max_burst_prd: max periodic ESS transmit burst size
* @tx_fifo_resize_max_num: max number of fifos allocated during txfifo resize
* @clear_stall_protocol: endpoint number that requires a delayed status phase
* @hsphy_interface: "utmi" or "ulpi"
* @connected: true when we're connected to a host, false otherwise
* @softconnect: true when gadget connect is called, false when disconnect runs
-@@ -1299,6 +1303,7 @@ struct dwc3 {
+@@ -1303,6 +1307,7 @@ struct dwc3 {
u8 tx_max_burst_prd;
u8 tx_fifo_resize_max_num;
u8 clear_stall_protocol;
#define DWC3_GUCTL1_RESUME_OPMODE_HS_HOST BIT(10)
/* Global Status Register */
-@@ -1117,10 +1118,12 @@ struct dwc3_scratchpad_array {
+@@ -1121,10 +1122,12 @@ struct dwc3_scratchpad_array {
* generation after resume from suspend.
* @ulpi_ext_vbus_drv: Set to confiure the upli chip to drives CPEN pin
* VBUS with an external supply.
* @tx_de_emphasis_quirk: set if we enable Tx de-emphasis quirk
* @tx_de_emphasis: Tx de-emphasis value
* 0 - -6dB de-emphasis
-@@ -1347,6 +1350,7 @@ struct dwc3 {
+@@ -1351,6 +1354,7 @@ struct dwc3 {
unsigned ulpi_ext_vbus_drv:1;
unsigned parkmode_disable_ss_quirk:1;
unsigned parkmode_disable_hs_quirk:1;
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
-@@ -4716,7 +4716,7 @@ void lru_gen_look_around(struct page_vma
+@@ -4723,7 +4723,7 @@ void lru_gen_look_around(struct page_vma
if (!folio)
continue;
#define DWC3_GUCTL1_PARKMODE_DISABLE_SS BIT(17)
#define DWC3_GUCTL1_PARKMODE_DISABLE_HS BIT(16)
#define DWC3_GUCTL1_PARKMODE_DISABLE_FSLS BIT(15)
-@@ -1118,6 +1120,8 @@ struct dwc3_scratchpad_array {
+@@ -1122,6 +1124,8 @@ struct dwc3_scratchpad_array {
* generation after resume from suspend.
* @ulpi_ext_vbus_drv: Set to confiure the upli chip to drives CPEN pin
* VBUS with an external supply.
* @parkmode_disable_ss_quirk: If set, disable park mode feature for all
* Superspeed instances.
* @parkmode_disable_hs_quirk: If set, disable park mode feature for all
-@@ -1348,6 +1352,8 @@ struct dwc3 {
+@@ -1352,6 +1356,8 @@ struct dwc3 {
unsigned dis_tx_ipgap_linecheck_quirk:1;
unsigned resume_hs_terminations:1;
unsigned ulpi_ext_vbus_drv:1;
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
-@@ -505,6 +505,19 @@ void xhci_ring_ep_doorbell(struct xhci_h
+@@ -506,6 +506,19 @@ void xhci_ring_ep_doorbell(struct xhci_h
trace_xhci_ring_ep_doorbell(slot_id, DB_VALUE(ep_index, stream_id));
/* called during probe() after chip reset completes */
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
-@@ -161,6 +161,49 @@ int xhci_start(struct xhci_hcd *xhci)
+@@ -162,6 +162,49 @@ int xhci_start(struct xhci_hcd *xhci)
return ret;
}
/*
* Reset a halted HC.
*
-@@ -480,6 +523,15 @@ static int xhci_run_finished(struct xhci
+@@ -481,6 +524,15 @@ static int xhci_run_finished(struct xhci
return -ENODEV;
}
if (xhci->quirks & XHCI_NEC_HOST)
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
-@@ -1661,6 +1661,7 @@ struct xhci_hcd {
+@@ -1662,6 +1662,7 @@ struct xhci_hcd {
#define XHCI_WRITE_64_HI_LO BIT_ULL(47)
#define XHCI_CDNS_SCTX_QUIRK BIT_ULL(48)
#define XHCI_ETRON_HOST BIT_ULL(49)
--- a/net/core/dev.c
+++ b/net/core/dev.c
-@@ -4481,13 +4481,7 @@ static inline void ____napi_schedule(str
+@@ -4483,13 +4483,7 @@ static inline void ____napi_schedule(str
*/
thread = READ_ONCE(napi->thread);
if (thread) {
wake_up_process(thread);
return;
}
-@@ -6643,8 +6637,6 @@ static int napi_poll(struct napi_struct
+@@ -6645,8 +6639,6 @@ static int napi_poll(struct napi_struct
static int napi_thread_wait(struct napi_struct *napi)
{
set_current_state(TASK_INTERRUPTIBLE);
while (!kthread_should_stop()) {
-@@ -6653,15 +6645,13 @@ static int napi_thread_wait(struct napi_
+@@ -6655,15 +6647,13 @@ static int napi_thread_wait(struct napi_
* Testing SCHED bit is not enough because SCHED bit might be
* set by some other busy poll thread or by napi_disable().
*/
static inline void rps_lock_irqsave(struct softnet_data *sd,
unsigned long *flags)
{
-@@ -4449,6 +4475,7 @@ EXPORT_SYMBOL(__dev_direct_xmit);
+@@ -4451,6 +4477,7 @@ EXPORT_SYMBOL(__dev_direct_xmit);
/*************************************************************************
* Receiver routines
*************************************************************************/
int netdev_max_backlog __read_mostly = 1000;
EXPORT_SYMBOL(netdev_max_backlog);
-@@ -4481,12 +4508,16 @@ static inline void ____napi_schedule(str
+@@ -4483,12 +4510,16 @@ static inline void ____napi_schedule(str
*/
thread = READ_ONCE(napi->thread);
if (thread) {
list_add_tail(&napi->poll_list, &sd->poll_list);
WRITE_ONCE(napi->list_owner, smp_processor_id());
/* If not called from net_rx_action()
-@@ -4732,6 +4763,11 @@ static void napi_schedule_rps(struct sof
+@@ -4734,6 +4765,11 @@ static void napi_schedule_rps(struct sof
#ifdef CONFIG_RPS
if (sd != mysd) {
sd->rps_ipi_next = mysd->rps_ipi_list;
mysd->rps_ipi_list = sd;
-@@ -5955,7 +5991,7 @@ static void net_rps_action_and_irq_enabl
+@@ -5957,7 +5993,7 @@ static void net_rps_action_and_irq_enabl
#ifdef CONFIG_RPS
struct softnet_data *remsd = sd->rps_ipi_list;
sd->rps_ipi_list = NULL;
local_irq_enable();
-@@ -5970,7 +6006,7 @@ static void net_rps_action_and_irq_enabl
+@@ -5972,7 +6008,7 @@ static void net_rps_action_and_irq_enabl
static bool sd_has_rps_ipi_waiting(struct softnet_data *sd)
{
#ifdef CONFIG_RPS
#else
return false;
#endif
-@@ -6014,7 +6050,7 @@ static int process_backlog(struct napi_s
+@@ -6016,7 +6052,7 @@ static int process_backlog(struct napi_s
* We can use a plain write instead of clear_bit(),
* and we dont need an smp_mb() memory barrier.
*/
again = false;
} else {
skb_queue_splice_tail_init(&sd->input_pkt_queue,
-@@ -6680,43 +6716,48 @@ static void skb_defer_free_flush(struct
+@@ -6682,43 +6718,48 @@ static void skb_defer_free_flush(struct
}
}
return 0;
}
-@@ -11297,7 +11338,7 @@ static int dev_cpu_dead(unsigned int old
+@@ -11299,7 +11340,7 @@ static int dev_cpu_dead(unsigned int old
list_del_init(&napi->poll_list);
if (napi->poll == process_backlog)
else
____napi_schedule(sd, napi);
}
-@@ -11305,12 +11346,14 @@ static int dev_cpu_dead(unsigned int old
+@@ -11307,12 +11348,14 @@ static int dev_cpu_dead(unsigned int old
raise_softirq_irqoff(NET_TX_SOFTIRQ);
local_irq_enable();
/* Process offline CPU's input_pkt_queue */
while ((skb = __skb_dequeue(&oldsd->process_queue))) {
-@@ -11573,6 +11616,38 @@ static struct pernet_operations __net_in
+@@ -11575,6 +11618,38 @@ static struct pernet_operations __net_in
*
*/
/*
* This is called single threaded during boot, so no need
* to take the rtnl semaphore.
-@@ -11623,7 +11698,10 @@ static int __init net_dev_init(void)
+@@ -11625,7 +11700,10 @@ static int __init net_dev_init(void)
init_gro_hash(&sd->backlog);
sd->backlog.poll = process_backlog;
sd->backlog.weight = weight_p;
spin_unlock_irq(&sd->input_pkt_queue.lock);
else if (!IS_ENABLED(CONFIG_PREEMPT_RT))
local_irq_enable();
-@@ -4782,6 +4782,23 @@ static void napi_schedule_rps(struct sof
+@@ -4784,6 +4784,23 @@ static void napi_schedule_rps(struct sof
__napi_schedule_irqoff(&mysd->backlog);
}
{
if (IS_ENABLED(CONFIG_RPS) || use_backlog_threads())
spin_unlock_irq(&sd->input_pkt_queue.lock);
-@@ -4787,12 +4787,12 @@ void kick_defer_list_purge(struct softne
+@@ -4789,12 +4789,12 @@ void kick_defer_list_purge(struct softne
unsigned long flags;
if (use_backlog_threads()) {
} else if (!cmpxchg(&sd->defer_ipi_scheduled, 0, 1)) {
smp_call_function_single_async(cpu, &sd->defer_csd);
-@@ -4854,7 +4854,7 @@ static int enqueue_to_backlog(struct sk_
+@@ -4856,7 +4856,7 @@ static int enqueue_to_backlog(struct sk_
reason = SKB_DROP_REASON_NOT_SPECIFIED;
sd = &per_cpu(softnet_data, cpu);
if (!netif_running(skb->dev))
goto drop;
qlen = skb_queue_len(&sd->input_pkt_queue);
-@@ -4863,7 +4863,7 @@ static int enqueue_to_backlog(struct sk_
+@@ -4865,7 +4865,7 @@ static int enqueue_to_backlog(struct sk_
enqueue:
__skb_queue_tail(&sd->input_pkt_queue, skb);
input_queue_tail_incr_save(sd, qtail);
return NET_RX_SUCCESS;
}
-@@ -4878,7 +4878,7 @@ enqueue:
+@@ -4880,7 +4880,7 @@ enqueue:
drop:
sd->dropped++;
dev_core_stats_rx_dropped_inc(skb->dev);
kfree_skb_reason(skb, reason);
-@@ -5909,7 +5909,7 @@ static void flush_backlog(struct work_st
+@@ -5911,7 +5911,7 @@ static void flush_backlog(struct work_st
local_bh_disable();
sd = this_cpu_ptr(&softnet_data);
skb_queue_walk_safe(&sd->input_pkt_queue, skb, tmp) {
if (skb->dev->reg_state == NETREG_UNREGISTERING) {
__skb_unlink(skb, &sd->input_pkt_queue);
-@@ -5917,7 +5917,7 @@ static void flush_backlog(struct work_st
+@@ -5919,7 +5919,7 @@ static void flush_backlog(struct work_st
input_queue_head_incr(sd);
}
}
skb_queue_walk_safe(&sd->process_queue, skb, tmp) {
if (skb->dev->reg_state == NETREG_UNREGISTERING) {
-@@ -5935,14 +5935,14 @@ static bool flush_required(int cpu)
+@@ -5937,14 +5937,14 @@ static bool flush_required(int cpu)
struct softnet_data *sd = &per_cpu(softnet_data, cpu);
bool do_flush;
return do_flush;
#endif
-@@ -6057,7 +6057,7 @@ static int process_backlog(struct napi_s
+@@ -6059,7 +6059,7 @@ static int process_backlog(struct napi_s
}
if (skb_queue_empty(&sd->input_pkt_queue)) {
/*
* Inline a custom version of __napi_complete().
-@@ -6073,7 +6073,7 @@ static int process_backlog(struct napi_s
+@@ -6075,7 +6075,7 @@ static int process_backlog(struct napi_s
skb_queue_splice_tail_init(&sd->input_pkt_queue,
&sd->process_queue);
}
--- a/net/core/dev.c
+++ b/net/core/dev.c
-@@ -9759,6 +9759,15 @@ static void netdev_sync_lower_features(s
+@@ -9761,6 +9761,15 @@ static void netdev_sync_lower_features(s
}
}
static netdev_features_t netdev_fix_features(struct net_device *dev,
netdev_features_t features)
{
-@@ -9840,15 +9849,9 @@ static netdev_features_t netdev_fix_feat
+@@ -9842,15 +9851,9 @@ static netdev_features_t netdev_fix_feat
features &= ~NETIF_F_LRO;
}
}
if ((features & NETIF_F_HW_TLS_RX) && !(features & NETIF_F_RXCSUM)) {
-@@ -9856,6 +9859,11 @@ static netdev_features_t netdev_fix_feat
+@@ -9858,6 +9861,11 @@ static netdev_features_t netdev_fix_feat
features &= ~NETIF_F_HW_TLS_RX;
}
--- a/net/core/dev.c
+++ b/net/core/dev.c
-@@ -10666,6 +10666,8 @@ struct rtnl_link_stats64 *dev_get_stats(
+@@ -10668,6 +10668,8 @@ struct rtnl_link_stats64 *dev_get_stats(
ops->ndo_get_stats64(dev, storage);
} else if (ops->ndo_get_stats) {
netdev_stats_to_stats64(storage, ops->ndo_get_stats(dev));
unsigned char name_assign_type,
--- a/net/core/dev.c
+++ b/net/core/dev.c
-@@ -10353,25 +10353,12 @@ err_free_name:
+@@ -10355,25 +10355,12 @@ err_free_name:
}
EXPORT_SYMBOL(register_netdevice);
/* make sure we BUG if trying to hit standard
* register/unregister code path
*/
-@@ -10391,12 +10378,32 @@ int init_dummy_netdev(struct net_device
+@@ -10393,12 +10380,32 @@ int init_dummy_netdev(struct net_device
* because users of this 'device' dont need to change
* its refcount.
*/
/**
* register_netdev - register a network device
* @dev: device to register
-@@ -10990,6 +10997,19 @@ void free_netdev(struct net_device *dev)
+@@ -10992,6 +10999,19 @@ void free_netdev(struct net_device *dev)
EXPORT_SYMBOL(free_netdev);
/**
/**
--- a/net/core/dev.c
+++ b/net/core/dev.c
-@@ -6610,7 +6610,7 @@ static int __napi_poll(struct napi_struc
+@@ -6612,7 +6612,7 @@ static int __napi_poll(struct napi_struc
* accidentally calling ->poll() when NAPI is not scheduled.
*/
work = 0;
--- a/net/core/dev.c
+++ b/net/core/dev.c
-@@ -10983,7 +10983,8 @@ void free_netdev(struct net_device *dev)
+@@ -10985,7 +10985,8 @@ void free_netdev(struct net_device *dev)
dev->xdp_bulkq = NULL;
/* Compatibility with error handling in drivers */
+++ /dev/null
-From a024e377efed31ecfb39210bed562932321345b3 Mon Sep 17 00:00:00 2001
-From: Antonio Pastor <antonio.pastor@gmail.com>
-Date: Tue, 24 Dec 2024 20:07:20 -0500
-Subject: [PATCH] net: llc: reset skb->transport_header
-
-802.2+LLC+SNAP frames received by napi_complete_done with GRO and DSA
-have skb->transport_header set two bytes short, or pointing 2 bytes
-before network_header & skb->data. As snap_rcv expects transport_header
-to point to SNAP header (OID:PID) after LLC processing advances offset
-over LLC header (llc_rcv & llc_fixup_skb), code doesn't find a match
-and packet is dropped.
-
-Between napi_complete_done and snap_rcv, transport_header is not used
-until __netif_receive_skb_core, where originally it was being reset.
-Commit fda55eca5a33 ("net: introduce skb_transport_header_was_set()")
-only does so if not set, on the assumption the value was set correctly
-by GRO (and also on assumption that "network stacks usually reset the
-transport header anyway"). Afterwards it is moved forward by
-llc_fixup_skb.
-
-Locally generated traffic shows up at __netif_receive_skb_core with no
-transport_header set and is processed without issue. On a setup with
-GRO but no DSA, transport_header and network_header are both set to
-point to skb->data which is also correct.
-
-As issue is LLC specific, to avoid impacting non-LLC traffic, and to
-follow up on original assumption made on previous code change,
-llc_fixup_skb to reset the offset after skb pull. llc_fixup_skb
-assumes the LLC header is at skb->data, and by definition SNAP header
-immediately follows.
-
-Fixes: fda55eca5a33 ("net: introduce skb_transport_header_was_set()")
-Signed-off-by: Antonio Pastor <antonio.pastor@gmail.com>
-Reviewed-by: Eric Dumazet <edumazet@google.com>
-Link: https://patch.msgid.link/20241225010723.2830290-1-antonio.pastor@gmail.com
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
----
- net/llc/llc_input.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/net/llc/llc_input.c
-+++ b/net/llc/llc_input.c
-@@ -124,8 +124,8 @@ static inline int llc_fixup_skb(struct s
- if (unlikely(!pskb_may_pull(skb, llc_len)))
- return 0;
-
-- skb->transport_header += llc_len;
- skb_pull(skb, llc_len);
-+ skb_reset_transport_header(skb);
- if (skb->protocol == htons(ETH_P_802_2)) {
- __be16 pdulen;
- s32 data_size;
INDIRECT_CALLABLE_DECLARE(struct dst_entry *ip6_dst_check(struct dst_entry *,
u32));
INDIRECT_CALLABLE_DECLARE(struct dst_entry *ipv4_dst_check(struct dst_entry *,
-@@ -2239,9 +2256,11 @@ static void __sk_free(struct sock *sk)
+@@ -2242,9 +2259,11 @@ static void __sk_free(struct sock *sk)
if (likely(sk->sk_net_refcnt))
sock_inuse_add(sock_net(sk), -1);
--- a/net/core/sock.c
+++ b/net/core/sock.c
-@@ -4140,6 +4140,8 @@ static __net_initdata struct pernet_oper
+@@ -4143,6 +4143,8 @@ static __net_initdata struct pernet_oper
static int __init proto_init(void)
{
+++ /dev/null
-From 113fb8a8d1f27156f58b27ce0fc02af9b3705bf7 Mon Sep 17 00:00:00 2001
-From: Pablo Neira Ayuso <pablo@netfilter.org>
-Date: Sun, 22 Dec 2024 11:02:39 +0100
-Subject: [PATCH] netfilter: nft_set_hash: unaligned atomic read on struct
- nft_set_ext
-
-Access to genmask field in struct nft_set_ext results in unaligned
-atomic read:
-
-[ 72.130109] Unable to handle kernel paging request at virtual address ffff0000c2bb708c
-[ 72.131036] Mem abort info:
-[ 72.131213] ESR = 0x0000000096000021
-[ 72.131446] EC = 0x25: DABT (current EL), IL = 32 bits
-[ 72.132209] SET = 0, FnV = 0
-[ 72.133216] EA = 0, S1PTW = 0
-[ 72.134080] FSC = 0x21: alignment fault
-[ 72.135593] Data abort info:
-[ 72.137194] ISV = 0, ISS = 0x00000021, ISS2 = 0x00000000
-[ 72.142351] CM = 0, WnR = 0, TnD = 0, TagAccess = 0
-[ 72.145989] GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
-[ 72.150115] swapper pgtable: 4k pages, 48-bit VAs, pgdp=0000000237d27000
-[ 72.154893] [ffff0000c2bb708c] pgd=0000000000000000, p4d=180000023ffff403, pud=180000023f84b403, pmd=180000023f835403,
-+pte=0068000102bb7707
-[ 72.163021] Internal error: Oops: 0000000096000021 [#1] SMP
-[...]
-[ 72.170041] CPU: 7 UID: 0 PID: 54 Comm: kworker/7:0 Tainted: G E 6.13.0-rc3+ #2
-[ 72.170509] Tainted: [E]=UNSIGNED_MODULE
-[ 72.170720] Hardware name: QEMU QEMU Virtual Machine, BIOS edk2-stable202302-for-qemu 03/01/2023
-[ 72.171192] Workqueue: events_power_efficient nft_rhash_gc [nf_tables]
-[ 72.171552] pstate: 21400005 (nzCv daif +PAN -UAO -TCO +DIT -SSBS BTYPE=--)
-[ 72.171915] pc : nft_rhash_gc+0x200/0x2d8 [nf_tables]
-[ 72.172166] lr : nft_rhash_gc+0x128/0x2d8 [nf_tables]
-[ 72.172546] sp : ffff800081f2bce0
-[ 72.172724] x29: ffff800081f2bd40 x28: ffff0000c2bb708c x27: 0000000000000038
-[ 72.173078] x26: ffff0000c6780ef0 x25: ffff0000c643df00 x24: ffff0000c6778f78
-[ 72.173431] x23: 000000000000001a x22: ffff0000c4b1f000 x21: ffff0000c6780f78
-[ 72.173782] x20: ffff0000c2bb70dc x19: ffff0000c2bb7080 x18: 0000000000000000
-[ 72.174135] x17: ffff0000c0a4e1c0 x16: 0000000000003000 x15: 0000ac26d173b978
-[ 72.174485] x14: ffffffffffffffff x13: 0000000000000030 x12: ffff0000c6780ef0
-[ 72.174841] x11: 0000000000000000 x10: ffff800081f2bcf8 x9 : ffff0000c3000000
-[ 72.175193] x8 : 00000000000004be x7 : 0000000000000000 x6 : 0000000000000000
-[ 72.175544] x5 : 0000000000000040 x4 : ffff0000c3000010 x3 : 0000000000000000
-[ 72.175871] x2 : 0000000000003a98 x1 : ffff0000c2bb708c x0 : 0000000000000004
-[ 72.176207] Call trace:
-[ 72.176316] nft_rhash_gc+0x200/0x2d8 [nf_tables] (P)
-[ 72.176653] process_one_work+0x178/0x3d0
-[ 72.176831] worker_thread+0x200/0x3f0
-[ 72.176995] kthread+0xe8/0xf8
-[ 72.177130] ret_from_fork+0x10/0x20
-[ 72.177289] Code: 54fff984 d503201f d2800080 91003261 (f820303f)
-[ 72.177557] ---[ end trace 0000000000000000 ]---
-
-Align struct nft_set_ext to word size to address this and
-documentation it.
-
-pahole reports that this increases the size of elements for rhash and
-pipapo in 8 bytes on x86_64.
-
-Fixes: 7ffc7481153b ("netfilter: nft_set_hash: skip duplicated elements pending gc run")
-Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
----
- include/net/netfilter/nf_tables.h | 7 +++++--
- 1 file changed, 5 insertions(+), 2 deletions(-)
-
---- a/include/net/netfilter/nf_tables.h
-+++ b/include/net/netfilter/nf_tables.h
-@@ -721,15 +721,18 @@ struct nft_set_ext_tmpl {
- /**
- * struct nft_set_ext - set extensions
- *
-- * @genmask: generation mask
-+ * @genmask: generation mask, but also flags (see NFT_SET_ELEM_DEAD_BIT)
- * @offset: offsets of individual extension types
- * @data: beginning of extension data
-+ *
-+ * This structure must be aligned to word size, otherwise atomic bitops
-+ * on genmask field can cause aligment failure on some archs.
- */
- struct nft_set_ext {
- u8 genmask;
- u8 offset[NFT_SET_EXT_NUM];
- char data[];
--};
-+} __aligned(BITS_PER_LONG / 8);
-
- static inline void nft_set_ext_prepare(struct nft_set_ext_tmpl *tmpl)
- {
#define PACKET_FANOUT_LB 1
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
-@@ -1925,6 +1925,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1911,6 +1911,7 @@ static int packet_rcv_spkt(struct sk_buf
{
struct sock *sk;
struct sockaddr_pkt *spkt;
/*
* When we registered the protocol we saved the socket in the data
-@@ -1932,6 +1933,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1918,6 +1919,7 @@ static int packet_rcv_spkt(struct sk_buf
*/
sk = pt->af_packet_priv;
/*
* Yank back the headers [hope the device set this
-@@ -1944,7 +1946,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1930,7 +1932,7 @@ static int packet_rcv_spkt(struct sk_buf
* so that this procedure is noop.
*/
goto out;
if (!net_eq(dev_net(dev), sock_net(sk)))
-@@ -2190,12 +2192,12 @@ static int packet_rcv(struct sk_buff *sk
+@@ -2176,12 +2178,12 @@ static int packet_rcv(struct sk_buff *sk
unsigned int snaplen, res;
bool is_drop_n_account = false;
if (!net_eq(dev_net(dev), sock_net(sk)))
goto drop;
-@@ -2322,12 +2324,12 @@ static int tpacket_rcv(struct sk_buff *s
+@@ -2308,12 +2310,12 @@ static int tpacket_rcv(struct sk_buff *s
BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h2)) != 32);
BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48);
if (!net_eq(dev_net(dev), sock_net(sk)))
goto drop;
-@@ -3451,6 +3453,7 @@ static int packet_create(struct net *net
+@@ -3437,6 +3439,7 @@ static int packet_create(struct net *net
mutex_init(&po->pg_vec_lock);
po->rollover = NULL;
po->prot_hook.func = packet_rcv;
if (sock->type == SOCK_PACKET)
po->prot_hook.func = packet_rcv_spkt;
-@@ -4118,6 +4121,16 @@ packet_setsockopt(struct socket *sock, i
+@@ -4104,6 +4107,16 @@ packet_setsockopt(struct socket *sock, i
packet_sock_flag_set(po, PACKET_SOCK_QDISC_BYPASS, val);
return 0;
}
default:
return -ENOPROTOOPT;
}
-@@ -4177,6 +4190,13 @@ static int packet_getsockopt(struct sock
+@@ -4163,6 +4176,13 @@ static int packet_getsockopt(struct sock
case PACKET_VNET_HDR_SZ:
val = READ_ONCE(po->vnet_hdr_sz);
break;
return features;
--- a/net/core/sock.c
+++ b/net/core/sock.c
-@@ -2441,7 +2441,7 @@ void sk_setup_caps(struct sock *sk, stru
+@@ -2444,7 +2444,7 @@ void sk_setup_caps(struct sock *sk, stru
if (sk_is_tcp(sk))
sk->sk_route_caps |= NETIF_F_GSO;
if (sk->sk_route_caps & NETIF_F_GSO)
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
-@@ -817,6 +817,16 @@ config I2C_MICROCHIP_CORE
+@@ -819,6 +819,16 @@ config I2C_MICROCHIP_CORE
This driver can also be built as a module. If so, the module will be
called i2c-microchip-core.
--- a/drivers/media/usb/uvc/uvc_driver.c
+++ b/drivers/media/usb/uvc/uvc_driver.c
-@@ -3249,6 +3249,18 @@ static const struct usb_device_id uvc_id
+@@ -3271,6 +3271,18 @@ static const struct usb_device_id uvc_id
.bInterfaceSubClass = 1,
.bInterfaceProtocol = 0,
.driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) },
+};
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
-@@ -1021,6 +1021,11 @@ config I2C_RK3X
+@@ -1023,6 +1023,11 @@ config I2C_RK3X
This driver can also be built as a module. If so, the module will
be called i2c-rk3x.
--- a/drivers/i2c/busses/Kconfig
+++ b/drivers/i2c/busses/Kconfig
-@@ -1021,6 +1021,16 @@ config I2C_RK3X
+@@ -1023,6 +1023,16 @@ config I2C_RK3X
This driver can also be built as a module. If so, the module will
be called i2c-rk3x.
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
-@@ -998,6 +998,8 @@ struct dwc3_scratchpad_array {
+@@ -1002,6 +1002,8 @@ struct dwc3_scratchpad_array {
* @bus_clk: clock for accessing the registers
* @ref_clk: reference clock
* @susp_clk: clock used when the SS phy is in low power (S3) state
* @reset: reset control
* @regs: base address for our registers
* @regs_size: address space size
-@@ -1170,6 +1172,8 @@ struct dwc3 {
+@@ -1174,6 +1176,8 @@ struct dwc3 {
struct clk *bus_clk;
struct clk *ref_clk;
struct clk *susp_clk;
}
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
-@@ -3667,7 +3667,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
+@@ -3707,7 +3707,8 @@ int xhci_queue_bulk_tx(struct xhci_hcd *
full_len = urb->transfer_buffer_length;
/* If we have scatter/gather list, we use it. */
addr = (u64) sg_dma_address(sg);
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
-@@ -18,6 +18,8 @@
+@@ -19,6 +19,8 @@
#include <linux/slab.h>
#include <linux/dmi.h>
#include <linux/dma-mapping.h>
#include "xhci.h"
#include "xhci-trace.h"
-@@ -1285,6 +1287,55 @@ static void xhci_unmap_temp_buf(struct u
+@@ -1286,6 +1288,55 @@ static void xhci_unmap_temp_buf(struct u
urb->transfer_buffer = NULL;
}
/*
* Bypass the DMA mapping if URB is suitable for Immediate Transfer (IDT),
* we'll copy the actual data into the TRB address register. This is limited to
-@@ -1305,9 +1356,11 @@ static int xhci_map_urb_for_dma(struct u
+@@ -1306,9 +1357,11 @@ static int xhci_map_urb_for_dma(struct u
if (xhci_urb_temp_buffer_required(hcd, urb))
return xhci_map_temp_buffer(hcd, urb);
}
static void xhci_unmap_urb_for_dma(struct usb_hcd *hcd, struct urb *urb)
{
struct xhci_hcd *xhci;
-@@ -1320,8 +1373,10 @@ static void xhci_unmap_urb_for_dma(struc
+@@ -1321,8 +1374,10 @@ static void xhci_unmap_urb_for_dma(struc
if ((xhci->quirks & XHCI_SG_TRB_CACHE_SIZE_QUIRK) && unmap_temp_buf)
xhci_unmap_temp_buf(hcd, urb);
/**
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
-@@ -1508,6 +1508,13 @@ struct xhci_hub {
+@@ -1509,6 +1509,13 @@ struct xhci_hub {
u8 min_rev;
};
/* There is one xhci_hcd structure per controller */
struct xhci_hcd {
struct usb_hcd *main_hcd;
-@@ -1662,6 +1669,8 @@ struct xhci_hcd {
+@@ -1663,6 +1670,8 @@ struct xhci_hcd {
#define XHCI_CDNS_SCTX_QUIRK BIT_ULL(48)
#define XHCI_ETRON_HOST BIT_ULL(49)
unsigned int num_active_eps;
unsigned int limit_active_eps;
struct xhci_port *hw_ports;
-@@ -1691,6 +1700,8 @@ struct xhci_hcd {
+@@ -1692,6 +1701,8 @@ struct xhci_hcd {
struct list_head regset_list;
void *dbc;