6.1.77-rc1 review
Subsystems (6)
Greg Kroah-Hartman
maintainerPATCH 151/219 um: time-travel: fix time corruption
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit abe4eaa8618bb36c2b33e9cdde0499296a23448c ]
In 'basic' time-travel mode (without =inf-cpu or =ext), we still get timer interrupts. These can happen at arbitrary points in time, i.e. while in timer_read(), which pushes time forward just a little bit. Then, if we happen to get the interrupt after calculating the new time to push to, but before actually finishing that, the interrupt will set the time to a value that's incompatible with the forward, and we'll crash because time goes backwards when we do the forwarding.
Fix this by reading the time_travel_time, calculating the adjustment, and doing the adjustment all with interrupts disabled.
--- arch/um/kernel/time.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-)
arch/um/kernel/time.c +27 -5
@@ -432,9 +432,29 @@ static void time_travel_update_time(unsigned long long next, bool idle)time_travel_del_event (&ne); } +static void time_travel_update_time_rel (unsigned long long offs) +{ +unsigned long flags; + +/* +* Disable interrupts before calculating the new time so +* that a real timer interrupt (signal) can't happen at +* a bad time e.g. after we read time_travel_time but +* before we've completed updating the time. +*/ +local_irq_save (flags); +time_travel_update_time (time_travel_time + offs, false); +local_irq_restore (flags); +} +void time_travel_ndelay (unsigned long nsec) { -time_travel_update_time (time_travel_time + nsec, false); +/* +* Not strictly needed to use _rel() version since this is +* only used in INFCPU/EXT modes, but it doesn't hurt and +* is more readable too. +*/ +time_travel_update_time_rel (nsec); }EXPORT_SYMBOL (time_travel_ndelay);
@@ -568,7 +588,11 @@ static void time_travel_set_start(void)#define time_travel_time 0#define time_travel_ext_waiting 0 -static inline void time_travel_update_time (unsigned long long ns,bool retearly) +static inline void time_travel_update_time (unsigned long long ns,bool idle) +{ +} + +static inline void time_travel_update_time_rel (unsigned long long offs) { }
@@ -720,9 +744,7 @@ static u64 timer_read(struct clocksource *cs)*/ if (!irqs_disabled () && !in_interrupt () && !in_softirq () && !time_travel_ext_waiting) -time_travel_update_time (time_travel_time + -TIMER_MULTIPLIER , - false); +time_travel_update_time_rel (TIMER_MULTIPLIER );return time_travel_time /TIMER_MULTIPLIER ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 152/219 i3c: master: cdns: Update maximum prescaler value for i2c clock
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harshit Shah <[email protected]>
[ Upstream commit 374c13f9080a1b9835a5ed3e7bea93cf8e2dc262 ]
As per the Cadence IP document fixed the I2C clock divider value limit from 16 bits instead of 10 bits. Without this change setting up the I2C clock to low frequencies will not work as the prescaler value might be greater than 10 bit number.
I3C clock divider value is 10 bits only. Updating the macro names for both.
--- drivers/i3c/master/i3c-master-cdns.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/i3c/master/i3c-master-cdns.c +4 -3
@@ -77,7 +77,8 @@#define PRESCL_CTRL0 0x14#define PRESCL_CTRL0_I2C (x) ((x) << 16)#define PRESCL_CTRL0_I3C (x) (x) -#define PRESCL_CTRL0_MAX GENMASK(9, 0) +#define PRESCL_CTRL0_I3C_MAX GENMASK(9, 0) +#define PRESCL_CTRL0_I2C_MAX GENMASK(15, 0)#define PRESCL_CTRL1 0x18#define PRESCL_CTRL1_PP_LOW_MASK GENMASK(15, 8)
@@ -1234,7 +1235,7 @@ static int cdns_i3c_master_bus_init(struct i3c_master_controller *m)return -EINVAL ; pres =DIV_ROUND_UP (sysclk_rate, (bus->scl_rate.i3c *4 )) -1 ; -if (pres >PRESCL_CTRL0_MAX ) +if (pres >PRESCL_CTRL0_I3C_MAX )return -ERANGE ; bus->scl_rate.i3c = sysclk_rate / ((pres +1 ) *4 );
@@ -1247,7 +1248,7 @@ static int cdns_i3c_master_bus_init(struct i3c_master_controller *m) max_i2cfreq = bus->scl_rate.i2c; pres = (sysclk_rate / (max_i2cfreq *5 )) -1 ; -if (pres >PRESCL_CTRL0_MAX ) +if (pres >PRESCL_CTRL0_I2C_MAX )return -ERANGE ; bus->scl_rate.i2c = sysclk_rate / ((pres +1 ) *5 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 153/219 xen/gntdev: Fix the abuse of underlying struct page in DMA-buf import
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksandr Tyshchenko <[email protected]>
[ Upstream commit 2d2db7d40254d5fb53b11ebd703cd1ed0c5de7a1 ]
DO NOT access the underlying struct page of an sg table exported by DMA-buf in dmabuf_imp_to_refs(), this is not allowed. Please see drivers/dma-buf/dma-buf.c:mangle_sg_table() for details.
Fortunately, here (for special Xen device) we can avoid using pages and calculate gfns directly from dma addresses provided by the sg table.
--- drivers/xen/gntdev-dmabuf.c | 50 ++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-)
drivers/xen/gntdev-dmabuf.c +25 -25
@@ -11,6 +11,7 @@#include <linux/kernel.h> #include <linux/errno.h> #include <linux/dma-buf.h> +#include <linux/dma-direct.h> #include <linux/slab.h> #include <linux/types.h> #include <linux/uaccess.h>
@@ -50,7 +51,7 @@ struct gntdev_dmabuf {/* Number of pages this buffer has. */ int nr_pages; -/* Pages of this buffer. */ +/* Pages of this buffer (only for dma-buf export). */ struct page **pages; };
@@ -484,7 +485,7 @@ static int dmabuf_exp_from_refs(struct gntdev_priv *priv, int flags,/* DMA buffer import support. */ static int -dmabuf_imp_grant_foreign_access (struct page **pages,u32 *refs, +dmabuf_imp_grant_foreign_access (unsigned long *gfns,u32 *refs,int count,int domid) {grant_ref_t priv_gref_head;
@@ -507,7 +508,7 @@ dmabuf_imp_grant_foreign_access(struct page **pages, u32 *refs, }gnttab_grant_foreign_access_ref (cur_ref, domid, -xen_page_to_gfn (pages[i]),0 ); + gfns[i],0 ); refs[i] = cur_ref; }
@@ -529,7 +530,6 @@ static void dmabuf_imp_end_foreign_access(u32 *refs, int count)static void dmabuf_imp_free_storage (struct gntdev_dmabuf *gntdev_dmabuf) { -kfree (gntdev_dmabuf->pages);kfree (gntdev_dmabuf->u.imp.refs);kfree (gntdev_dmabuf); }
@@ -549,12 +549,6 @@ static struct gntdev_dmabuf *dmabuf_imp_alloc_storage(int count)if (!gntdev_dmabuf->u.imp.refs) goto fail; - gntdev_dmabuf->pages =kcalloc (count, -sizeof (gntdev_dmabuf->pages[0 ]), -GFP_KERNEL ); -if (!gntdev_dmabuf->pages) - goto fail; - gntdev_dmabuf->nr_pages = count;for (i =0 ; i < count; i++)
@@ -576,7 +570,8 @@ dmabuf_imp_to_refs(struct gntdev_dmabuf_priv *priv, struct device *dev,struct dma_buf *dma_buf;struct dma_buf_attachment *attach;struct sg_table *sgt; -struct sg_page_iter sg_iter; +struct sg_dma_page_iter sg_iter; +unsigned long *gfns;int i; dma_buf =dma_buf_get (fd);
@@ -624,26 +619,31 @@ dmabuf_imp_to_refs(struct gntdev_dmabuf_priv *priv, struct device *dev, gntdev_dmabuf->u.imp.sgt = sgt; -/* Now convert sgt to array of pages and check for page validity. */ + gfns =kcalloc (count,sizeof (*gfns),GFP_KERNEL ); +if (!gfns) { + ret =ERR_PTR (-ENOMEM ); + goto fail_unmap; + } + +/* +* Now convert sgt to array of gfns without accessing underlying pages. +* It is not allowed to access the underlying struct page of an sg table +* exported by DMA-buf, but since we deal with special Xen dma device here +* (not a normal physical one) look at the dma addresses in the sg table +* and then calculate gfns directly from them. +*/ i =0 ; -for_each_sgtable_page (sgt, &sg_iter,0 ) { -struct page *page =sg_page_iter_page (&sg_iter); -/* -* Check if page is valid: this can happen if we are given -* a page from VRAM or other resources which are not backed -* by a struct page. -*/ -if (!pfn_valid (page_to_pfn (page))) { - ret =ERR_PTR (-EINVAL ); - goto fail_unmap; - } +for_each_sgtable_dma_page (sgt, &sg_iter,0 ) { +dma_addr_t addr =sg_page_iter_dma_address (&sg_iter); +unsigned long pfn =bfn_to_pfn (XEN_PFN_DOWN (dma_to_phys (dev, addr))); - gntdev_dmabuf->pages[i++] = page; + gfns[i++] =pfn_to_gfn (pfn); } - ret =ERR_PTR (dmabuf_imp_grant_foreign_access (gntdev_dmabuf->pages, + ret =ERR_PTR (dmabuf_imp_grant_foreign_access (gfns, gntdev_dmabuf->u.imp.refs, count, domid)); +kfree (gfns);if (IS_ERR (ret)) goto fail_end_access;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 154/219 mfd: ti_am335x_tscadc: Fix TI SoC dependencies
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Robinson <[email protected]>
[ Upstream commit 284d16c456e5d4b143f375b8ccc4038ab3f4ee0f ]
The ti_am335x_tscadc is specific to some TI SoCs, update the dependencies for those SoCs and compile testing.
--- drivers/mfd/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/mfd/Kconfig +1 -0
@@ -1440,6 +1440,7 @@ config MFD_DAVINCI_VOICECODEC config MFD_TI_AM335X_TSCADC tristate "TI ADC / Touch Screen chip support" + depends on ARCH_OMAP2PLUS || ARCH_K3 || COMPILE_TEST select MFD_CORE select REGMAP select REGMAP_MMIO
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 155/219 mailbox: arm_mhuv2: Fix a bug for mhuv2_sender_interrupt
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiaowu.ding <[email protected]>
[ Upstream commit ee01c0b4384d19ecc5dfa7db3fd4303f965c3eba ]
Message Handling Unit version is v2.1.
When arm_mhuv2 working with the data protocol transfer mode. We have split one mhu into two channels, and every channel include four channel windows, the two channels share one gic spi interrupt.
There is a problem with the sending scenario.
The first channel will take up 0-3 channel windows, and the second channel take up 4-7 channel windows. When the first channel send the data, and the receiver will clear all the four channels status. Although we only enabled the interrupt on the last channel window with register CH_INT_EN,the register CHCOMB_INT_ST0 will be 0xf, not be 0x8. Currently we just clear the last channel windows int status with the data proctol mode.So after that,the CHCOMB_INT_ST0 status will be 0x7, not be the 0x0.
Then the second channel send the data, the receiver read the data, clear all the four channel windows status, trigger the sender interrupt. But currently the CHCOMB_INT_ST0 register will be 0xf7, get_irq_chan_comb function will always return the first channel.
So this patch clear all channel windows int status to avoid this interrupt confusion.
--- drivers/mailbox/arm_mhuv2.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/mailbox/arm_mhuv2.c +2 -1
@@ -553,7 +553,8 @@ static irqreturn_t mhuv2_sender_interrupt(int irq, void *data) priv = chan->con_priv;if (!IS_PROTOCOL_DOORBELL (priv)) { -writel_relaxed (1 , &mhu->send->ch_wn[priv->ch_wn_idx + priv->windows -1 ].int_clr); +for (i =0 ; i < priv->windows; i++) +writel_relaxed (1 , &mhu->send->ch_wn[priv->ch_wn_idx + i].int_clr);if (chan->cl) {mbox_chan_txdone (chan,0 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 156/219 PCI: Only override AMD USB controller if required
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guilherme G. Piccoli <[email protected]>
[ Upstream commit e585a37e5061f6d5060517aed1ca4ccb2e56a34c ]
By running a Van Gogh device (Steam Deck), the following message was noticed in the kernel log:
pci 0000:04:00.3: PCI class overridden (0x0c03fe -> 0x0c03fe) so dwc3 driver can claim this instead of xhci
Effectively this means the quirk executed but changed nothing, since the class of this device was already the proper one (likely adjusted by newer firmware versions).
Check and perform the override only if necessary.
--- drivers/pci/quirks.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/pci/quirks.c +7 -4
@@ -607,10 +607,13 @@ static void quirk_amd_dwc_class(struct pci_dev *pdev) {u32 class = pdev->class; -/* Use "USB Device (not host controller)" class */ - pdev->class =PCI_CLASS_SERIAL_USB_DEVICE ; -pci_info (pdev,"PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n" , - class, pdev->class); +if (class !=PCI_CLASS_SERIAL_USB_DEVICE ) { +/* Use "USB Device (not host controller)" class */ + pdev->class =PCI_CLASS_SERIAL_USB_DEVICE ; +pci_info (pdev, +"PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n" , + class, pdev->class); + } }DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_AMD ,PCI_DEVICE_ID_AMD_NL_USB , quirk_amd_dwc_class);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 157/219 PCI: switchtec: Fix stdev_release() crash after surprise hot remove
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Stodden <[email protected]>
[ Upstream commit df25461119d987b8c81d232cfe4411e91dcabe66 ]
A PCI device hot removal may occur while stdev->cdev is held open. The call to stdev_release() then happens during close or exit, at a point way past switchtec_pci_remove(). Otherwise the last ref would vanish with the trailing put_device(), just before return.
At that later point in time, the devm cleanup has already removed the stdev->mmio_mrpc mapping. Also, the stdev->pdev reference was not a counted one. Therefore, in DMA mode, the iowrite32() in stdev_release() will cause a fatal page fault, and the subsequent dma_free_coherent(), if reached, would pass a stale &stdev->pdev->dev pointer.
Fix by moving MRPC DMA shutdown into switchtec_pci_remove(), after stdev_kill(). Counting the stdev->pdev ref is now optional, but may prevent future accidents.
Reproducible via the script at
https://lore.kernel.org/r/[email protected]
--- drivers/pci/switch/switchtec.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-)
drivers/pci/switch/switchtec.c +17 -8
@@ -1308,13 +1308,6 @@ static void stdev_release(struct device *dev) {struct switchtec_dev *stdev =to_stdev (dev); -if (stdev->dma_mrpc) { -iowrite32 (0 , &stdev->mmio_mrpc->dma_en); -flush_wc_buf (stdev); -writeq (0 , &stdev->mmio_mrpc->dma_addr); -dma_free_coherent (&stdev->pdev->dev,sizeof (*stdev->dma_mrpc), - stdev->dma_mrpc, stdev->dma_mrpc_dma_addr); - }kfree (stdev); }
@@ -1358,7 +1351,7 @@ static struct switchtec_dev *stdev_create(struct pci_dev *pdev)return ERR_PTR (-ENOMEM ); stdev->alive = true; - stdev->pdev = pdev; + stdev->pdev =pci_dev_get (pdev);INIT_LIST_HEAD (&stdev->mrpc_queue);mutex_init (&stdev->mrpc_mutex); stdev->mrpc_busy =0 ;
@@ -1391,6 +1384,7 @@ static struct switchtec_dev *stdev_create(struct pci_dev *pdev)return stdev; err_put: +pci_dev_put (stdev->pdev);put_device (&stdev->dev);return ERR_PTR (rc); }
@@ -1646,6 +1640,18 @@ static int switchtec_init_pci(struct switchtec_dev *stdev,return 0 ; } +static void switchtec_exit_pci (struct switchtec_dev *stdev) +{ +if (stdev->dma_mrpc) { +iowrite32 (0 , &stdev->mmio_mrpc->dma_en); +flush_wc_buf (stdev); +writeq (0 , &stdev->mmio_mrpc->dma_addr); +dma_free_coherent (&stdev->pdev->dev,sizeof (*stdev->dma_mrpc), + stdev->dma_mrpc, stdev->dma_mrpc_dma_addr); + stdev->dma_mrpc =NULL ; + } +} +static int switchtec_pci_probe (struct pci_dev *pdev,const struct pci_device_id *id) {
@@ -1705,6 +1711,9 @@ static void switchtec_pci_remove(struct pci_dev *pdev)ida_free (&switchtec_minor_ida,MINOR (stdev->dev.devt));dev_info (&stdev->dev,"unregistered.\n" );stdev_kill (stdev); +switchtec_exit_pci (stdev); +pci_dev_put (stdev->pdev); + stdev->pdev =NULL ;put_device (&stdev->dev); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 158/219 perf cs-etm: Bump minimum OpenCSD version to ensure a bugfix is present
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clark <[email protected]>
[ Upstream commit 2dbba30fd69b604802a9535b74bddb5bcca23793 ]
Since commit d927ef5004ef ("perf cs-etm: Add exception level consistency check"), the exception that was added to Perf will be triggered unless the following bugfix from OpenCSD is present:
- _Version 1.2.1_:
- __Bugfix__:
ETM4x / ETE - output of context elements to client can in some circumstances be delayed until after subsequent atoms have been processed leading to incorrect memory decode access via the client callbacks. Fixed to flush context elements immediately they are committed.
Rather than remove the assert and silently fail, just increase the minimum version requirement to avoid hard to debug issues and regressions.
--- tools/build/feature/test-libopencsd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/build/feature/test-libopencsd.c +2 -2
@@ -4,9 +4,9 @@/* * Check OpenCSD library version is sufficient to provide required features */ -#define OCSD_MIN_VER ((1 << 16) | (1 << 8) | (1)) +#define OCSD_MIN_VER ((1 << 16) | (2 << 8) | (1))#if !defined(OCSD_VER_NUM ) || (OCSD_VER_NUM <OCSD_MIN_VER ) -#error "OpenCSD >= 1.1.1 is required" +#error "OpenCSD >= 1.2.1 is required"#endif int main (void )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 159/219 xhci: fix possible null pointer deref during xhci urb enqueue
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
[ Upstream commit e2e2aacf042f52854c92775b7800ba668e0bdfe4 ]
There is a short gap between urb being submitted and actually added to the endpoint queue (linked). If the device is disconnected during this time then usb core is not yet aware of the pending urb, and device may be freed just before xhci_urq_enqueue() continues, dereferencing the freed device.
Freeing the device is protected by the xhci spinlock, so make sure we take and keep the lock while checking that device exists, dereference it, and add the urb to the queue.
Remove the unnecessary URB check, usb core checks it before calling xhci_urb_enqueue()
--- drivers/usb/host/xhci.c | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-)
drivers/usb/host/xhci.c +23 -17
@@ -1654,24 +1654,7 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flagstruct urb_priv *urb_priv;int num_tds; -if (!urb) -return -EINVAL ; - ret =xhci_check_args (hcd, urb->dev, urb->ep, - true, true, __func__); -if (ret <=0 ) -return ret ? ret : -EINVAL ; - - slot_id = urb->dev->slot_id; ep_index =xhci_get_endpoint_index (&urb->ep->desc); - ep_state = &xhci->devs[slot_id]->eps[ep_index].ep_state; - -if (!HCD_HW_ACCESSIBLE (hcd)) -return -ESHUTDOWN ; - -if (xhci->devs[slot_id]->flags &VDEV_PORT_ERROR ) { -xhci_dbg (xhci,"Can't queue urb, port error, link inactive\n" ); -return -ENODEV ; - }if (usb_endpoint_xfer_isoc (&urb->ep->desc)) num_tds = urb->number_of_packets;
@@ -1710,12 +1693,35 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flagspin_lock_irqsave (&xhci->lock, flags); + ret =xhci_check_args (hcd, urb->dev, urb->ep, + true, true, __func__); +if (ret <=0 ) { + ret = ret ? ret : -EINVAL ; + goto free_priv; + } + + slot_id = urb->dev->slot_id; + +if (!HCD_HW_ACCESSIBLE (hcd)) { + ret = -ESHUTDOWN ; + goto free_priv; + } + +if (xhci->devs[slot_id]->flags &VDEV_PORT_ERROR ) { +xhci_dbg (xhci,"Can't queue urb, port error, link inactive\n" ); + ret = -ENODEV ; + goto free_priv; + } +if (xhci->xhc_state &XHCI_STATE_DYING ) {xhci_dbg (xhci,"Ep 0x%x: URB %p submitted for non-responsive xHCI host.\n" , urb->ep->desc.bEndpointAddress, urb); ret = -ESHUTDOWN ; goto free_priv; } + + ep_state = &xhci->devs[slot_id]->eps[ep_index].ep_state; +if (*ep_state & (EP_GETTING_STREAMS |EP_GETTING_NO_STREAMS )) {xhci_warn (xhci,"WARN: Can't enqueue URB, ep in streams transition state %x\n" , *ep_state);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 160/219 usb: hub: Replace hardcoded quirk value with BIT() macro
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hardik Gajjar <[email protected]>
[ Upstream commit 6666ea93d2c422ebeb8039d11e642552da682070 ]
This patch replaces the hardcoded quirk value in the macro with BIT().
--- drivers/usb/core/hub.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/core/hub.c +2 -2
@@ -47,8 +47,8 @@#define USB_VENDOR_TEXAS_INSTRUMENTS 0x0451#define USB_PRODUCT_TUSB8041_USB3 0x8140#define USB_PRODUCT_TUSB8041_USB2 0x8142 -#define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND 0x01 -#define HUB_QUIRK_DISABLE_AUTOSUSPEND 0x02 +#define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND BIT(0) +#define HUB_QUIRK_DISABLE_AUTOSUSPEND BIT(1)#define USB_TP_TRANSMISSION_DELAY 40/* ns */ #define USB_TP_TRANSMISSION_DELAY_MAX 65535/* ns */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 161/219 usb: hub: Add quirk to decrease IN-ep poll interval for Microchip USB491x hub
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hardik Gajjar <[email protected]>
[ Upstream commit 855d75cf8311fee156fabb5639bb53757ca83dd4 ]
There is a potential delay in notifying Linux USB drivers of downstream USB bus activity when connecting a high-speed or superSpeed device via the Microchip USB491x hub. This delay is due to the fixed bInterval value of 12 in the silicon of the Microchip USB491x hub.
Microchip requested to ignore the device descriptor and decrease that value to 9 as it was too late to modify that in silicon.
This patch speeds up the USB enummeration process that helps to pass Apple Carplay certifications and improve the User experience when utilizing the USB device via Microchip Multihost USB491x Hub.
A new hub quirk HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL speeds up the notification process for Microchip USB491x hub by limiting the maximum bInterval value to 9.
--- drivers/usb/core/hub.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+)
drivers/usb/core/hub.c +29 -0
@@ -47,12 +47,18 @@#define USB_VENDOR_TEXAS_INSTRUMENTS 0x0451#define USB_PRODUCT_TUSB8041_USB3 0x8140#define USB_PRODUCT_TUSB8041_USB2 0x8142 +#define USB_VENDOR_MICROCHIP 0x0424 +#define USB_PRODUCT_USB4913 0x4913 +#define USB_PRODUCT_USB4914 0x4914 +#define USB_PRODUCT_USB4915 0x4915#define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND BIT(0)#define HUB_QUIRK_DISABLE_AUTOSUSPEND BIT(1) +#define HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL BIT(2)#define USB_TP_TRANSMISSION_DELAY 40/* ns */ #define USB_TP_TRANSMISSION_DELAY_MAX 65535/* ns */ #define USB_PING_RESPONSE_TIME 400/* ns */ +#define USB_REDUCE_FRAME_INTR_BINTERVAL 9/* Protect struct usb_device->state and ->children members * Note: Both are also protected by ->dev.sem, except that ->state can
@@ -1904,6 +1910,14 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)usb_autopm_get_interface_no_resume (intf); } +if ((id->driver_info &HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL ) && + desc->endpoint[0 ].desc.bInterval >USB_REDUCE_FRAME_INTR_BINTERVAL ) { + desc->endpoint[0 ].desc.bInterval = +USB_REDUCE_FRAME_INTR_BINTERVAL ; +/* Tell the HCD about the interrupt ep's new bInterval */ +usb_set_interface (hdev,0 ,0 ); + } +if (hub_configure (hub, &desc->endpoint[0 ].desc) >=0 ) {onboard_hub_create_pdevs (hdev, &hub->onboard_hub_devs);
@@ -5885,6 +5899,21 @@ static const struct usb_device_id hub_id_table[] = { .idVendor = USB_VENDOR_TEXAS_INSTRUMENTS, .idProduct = USB_PRODUCT_TUSB8041_USB3, .driver_info = HUB_QUIRK_DISABLE_AUTOSUSPEND}, + { .match_flags = USB_DEVICE_ID_MATCH_VENDOR + | USB_DEVICE_ID_MATCH_PRODUCT, + .idVendor = USB_VENDOR_MICROCHIP, + .idProduct = USB_PRODUCT_USB4913, + .driver_info = HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL}, + { .match_flags = USB_DEVICE_ID_MATCH_VENDOR + | USB_DEVICE_ID_MATCH_PRODUCT, + .idVendor = USB_VENDOR_MICROCHIP, + .idProduct = USB_PRODUCT_USB4914, + .driver_info = HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL}, + { .match_flags = USB_DEVICE_ID_MATCH_VENDOR + | USB_DEVICE_ID_MATCH_PRODUCT, + .idVendor = USB_VENDOR_MICROCHIP, + .idProduct = USB_PRODUCT_USB4915, + .driver_info = HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL}, { .match_flags = USB_DEVICE_ID_MATCH_DEV_CLASS, .bDeviceClass = USB_CLASS_HUB}, { .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 162/219 selftests/sgx: Fix linker script asserts
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jo Van Bulck <[email protected]>
[ Upstream commit 9fd552ee32c6c1e27c125016b87d295bea6faea7 ]
DEFINED only considers symbols, not section names. Hence, replace the check for .got.plt with the _GLOBAL_OFFSET_TABLE_ symbol and remove other (non-essential) asserts.
--- tools/testing/selftests/sgx/test_encl.lds | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
tools/testing/selftests/sgx/test_encl.lds +1 -5
@@ -34,8 +34,4 @@ SECTIONS } } -ASSERT(!DEFINED(.altinstructions), "ALTERNATIVES are not supported in enclaves") -ASSERT(!DEFINED(.altinstr_replacement), "ALTERNATIVES are not supported in enclaves") -ASSERT(!DEFINED(.discard.retpoline_safe), "RETPOLINE ALTERNATIVES are not supported in enclaves") -ASSERT(!DEFINED(.discard.nospec), "RETPOLINE ALTERNATIVES are not supported in enclaves") -ASSERT(!DEFINED(.got.plt), "Libcalls are not supported in enclaves") +ASSERT(!DEFINED(_GLOBAL_OFFSET_TABLE_), "Libcalls through GOT are not supported in enclaves")
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 163/219 tty: allow TIOCSLCKTRMIOS with CAP_CHECKPOINT_RESTORE
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Reber <[email protected]>
[ Upstream commit e0f25b8992345aa5f113da2815f5add98738c611 ]
The capability CAP_CHECKPOINT_RESTORE was introduced to allow non-root users to checkpoint and restore processes as non-root with CRIU.
This change extends CAP_CHECKPOINT_RESTORE to enable the CRIU option '--shell-job' as non-root. CRIU's man-page describes the '--shell-job' option like this:
Allow one to dump shell jobs. This implies the restored task will inherit session and process group ID from the criu itself. This option also allows to migrate a single external tty connection, to migrate applications like top.
TIOCSLCKTRMIOS can only be done if the process has CAP_SYS_ADMIN and this change extends it to CAP_SYS_ADMIN or CAP_CHECKPOINT_RESTORE.
With this change it is possible to checkpoint and restore processes which have a tty connection as non-root if CAP_CHECKPOINT_RESTORE is set.
--- drivers/tty/tty_ioctl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/tty/tty_ioctl.c +2 -2
@@ -859,7 +859,7 @@ int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) ret = -EFAULT ;return ret;case TIOCSLCKTRMIOS : -if (!capable (CAP_SYS_ADMIN )) +if (!checkpoint_restore_ns_capable (&init_user_ns))return -EPERM ;copy_termios_locked (real_tty, &kterm); if (user_termios_to_kernel_termios(&kterm,
@@ -876,7 +876,7 @@ int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) ret = -EFAULT ;return ret;case TIOCSLCKTRMIOS : -if (!capable (CAP_SYS_ADMIN )) +if (!checkpoint_restore_ns_capable (&init_user_ns))return -EPERM ;copy_termios_locked (real_tty, &kterm); if (user_termios_to_kernel_termios_1(&kterm,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 164/219 fs/kernfs/dir: obey S_ISGID
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Max Kellermann <[email protected]>
[ Upstream commit 5133bee62f0ea5d4c316d503cc0040cac5637601 ]
Handling of S_ISGID is usually done by inode_init_owner() in all other filesystems, but kernfs doesn't use that function. In kernfs, struct kernfs_node is the primary data structure, and struct inode is only created from it on demand. Therefore, inode_init_owner() can't be used and we need to imitate its behavior.
S_ISGID support is useful for the cgroup filesystem; it allows subtrees managed by an unprivileged process to retain a certain owner gid, which then enables sharing access to the subtree with another unprivileged process.
--
v1 -> v2: minor coding style fix (comment)
--- fs/kernfs/dir.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
fs/kernfs/dir.c +12 -0
@@ -669,6 +669,18 @@ struct kernfs_node *kernfs_new_node(struct kernfs_node *parent, {struct kernfs_node *kn; +if (parent->mode &S_ISGID ) { +/* this code block imitates inode_init_owner() for +* kernfs +*/ + +if (parent->iattr) + gid = parent->iattr->ia_gid; + +if (flags &KERNFS_DIR ) + mode |=S_ISGID ; + } + kn =__kernfs_new_node (kernfs_root (parent), parent, name, mode, uid, gid, flags);if (kn) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 165/219 spmi: mediatek: Fix UAF on device remove
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yu-Che Cheng <[email protected]>
[ Upstream commit e821d50ab5b956ed0effa49faaf29912fd4106d9 ]
The pmif driver data that contains the clocks is allocated along with spmi_controller.
On device remove, spmi_controller will be freed first, and then devres , including the clocks, will be cleanup.
This leads to UAF because putting the clocks will access the clocks in the pmif driver data, which is already freed along with spmi_controller.
This can be reproduced by enabling DEBUG_TEST_DRIVER_REMOVE and building the kernel with KASAN.
Fix the UAF issue by using unmanaged clk_bulk_get() and putting the clocks before freeing spmi_controller.
--- drivers/spmi/spmi-mtk-pmif.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/spmi/spmi-mtk-pmif.c +5 -2
@@ -475,7 +475,7 @@ static int mtk_spmi_probe(struct platform_device *pdev)for (i =0 ; i < arb->nclks; i++) arb->clks[i].id = pmif_clock_names[i]; - err =devm_clk_bulk_get (&pdev->dev, arb->nclks, arb->clks); + err =clk_bulk_get (&pdev->dev, arb->nclks, arb->clks);if (err) {dev_err (&pdev->dev,"Failed to get clocks: %d\n" , err); goto err_put_ctrl;
@@ -484,7 +484,7 @@ static int mtk_spmi_probe(struct platform_device *pdev) err =clk_bulk_prepare_enable (arb->nclks, arb->clks);if (err) {dev_err (&pdev->dev,"Failed to enable clocks: %d\n" , err); - goto err_put_ctrl; + goto err_put_clks; } ctrl->cmd = pmif_arb_cmd;
@@ -510,6 +510,8 @@ static int mtk_spmi_probe(struct platform_device *pdev) err_domain_remove:clk_bulk_disable_unprepare (arb->nclks, arb->clks); +err_put_clks: +clk_bulk_put (arb->nclks, arb->clks); err_put_ctrl:spmi_controller_put (ctrl);return err;
@@ -521,6 +523,7 @@ static int mtk_spmi_remove(struct platform_device *pdev)struct pmif *arb =spmi_controller_get_drvdata (ctrl);clk_bulk_disable_unprepare (arb->nclks, arb->clks); +clk_bulk_put (arb->nclks, arb->clks);spmi_controller_remove (ctrl);spmi_controller_put (ctrl);return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 166/219 PCI: Fix 64GT/s effective data rate calculation
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit ac4f1897fa5433a1b07a625503a91b6aa9d7e643 ]
Unlike the lower rates, the PCIe 64GT/s Data Rate uses 1b/1b encoding, not 128b/130b (PCIe r6.1 sec 1.2, Table 1-1). Correct the PCIE_SPEED2MBS_ENC() calculation to reflect that.
--- drivers/pci/pci.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/pci.h +1 -1
@@ -274,7 +274,7 @@ void pci_bus_put(struct pci_bus *bus);/* PCIe speed to Mb/s reduced by encoding overhead */ #define PCIE_SPEED2MBS_ENC (speed) \ - ((speed) == PCIE_SPEED_64_0GT ? 64000*128/130 : \ + ((speed) == PCIE_SPEED_64_0GT ? 64000*1/1 : \ (speed) == PCIE_SPEED_32_0GT ? 32000*128/130 : \ (speed) == PCIE_SPEED_16_0GT ? 16000*128/130 : \ (speed) == PCIE_SPEED_8_0GT ? 8000*128/130 : \
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 167/219 PCI/AER: Decode Requester ID when no error info found
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjorn Helgaas <[email protected]>
[ Upstream commit 1291b716bbf969e101d517bfb8ba18d958f758b8 ]
When a device with AER detects an error, it logs error information in its own AER Error Status registers. It may send an Error Message to the Root Port (RCEC in the case of an RCiEP), which logs the fact that an Error Message was received (Root Error Status) and the Requester ID of the message source (Error Source Identification).
aer_print_port_info() prints the Requester ID from the Root Port Error Source in the usual Linux "bb:dd.f" format, but when find_source_device() finds no error details in the hierarchy below the Root Port, it printed the raw Requester ID without decoding it.
Decode the Requester ID in the usual Linux format so it matches other messages.
Sample message changes:
- pcieport 0000:00:1c.5: AER: Correctable error received: 0000:00:1c.5
- pcieport 0000:00:1c.5: AER: can't find device of ID00e5
+ pcieport 0000:00:1c.5: AER: Correctable error message received from 0000:00:1c.5
+ pcieport 0000:00:1c.5: AER: found no error details for 0000:00:1c.5
--- drivers/pci/pcie/aer.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/pci/pcie/aer.c +7 -2
@@ -748,7 +748,7 @@ static void aer_print_port_info(struct pci_dev *dev, struct aer_err_info *info)u8 bus = info->id >>8 ;u8 devfn = info->id &0xff ; - pci_info(dev, "%s%s error received: %04x:%02x:%02x.%d\n", + pci_info(dev, "%s%s error message received from %04x:%02x:%02x.%d\n", info->multi_error_valid ? "Multiple " : "", aer_error_severity_string[info->severity], pci_domain_nr(dev->bus), bus, PCI_SLOT(devfn),
@@ -936,7 +936,12 @@ static bool find_source_device(struct pci_dev *parent,pci_walk_bus (parent->subordinate, find_device_iter, e_info);if (!e_info->error_dev_num) { -pci_info (parent,"can't find device of ID%04x\n" , e_info->id); +u8 bus = e_info->id >>8 ; +u8 devfn = e_info->id &0xff ; + +pci_info (parent,"found no error details for %04x:%02x:%02x.%d\n" , +pci_domain_nr (parent->bus), bus,PCI_SLOT (devfn), +PCI_FUNC (devfn));return false; }return true;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 168/219 9p: Fix initialisation of netfs_inode for 9p
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
[ Upstream commit 9546ac78b232bac56ff975072b1965e0e755ebd4 ]
The 9p filesystem is calling netfs_inode_init() in v9fs_init_inode() - before the struct inode fields have been initialised from the obtained file stats (ie. after v9fs_stat2inode*() has been called), but netfslib wants to set a couple of its fields from i_size.
--- fs/9p/v9fs_vfs.h | 1 + fs/9p/vfs_inode.c | 6 +++--- fs/9p/vfs_inode_dotl.c | 1 + 3 files changed, 5 insertions(+), 3 deletions(-)
fs/9p/v9fs_vfs.h +1 -0
@@ -46,6 +46,7 @@ struct inode *v9fs_alloc_inode(struct super_block *sb);void v9fs_free_inode (struct inode *inode);struct inode *v9fs_get_inode (struct super_block *sb,umode_t mode,dev_t rdev); +void v9fs_set_netfs_context (struct inode *inode);int v9fs_init_inode (struct v9fs_session_info *v9ses,struct inode *inode,umode_t mode,dev_t rdev);void v9fs_evict_inode (struct inode *inode);
fs/9p/vfs_inode.c +3 -3
@@ -250,7 +250,7 @@ void v9fs_free_inode(struct inode *inode)/* * Set parameters for the netfs library */ -static void v9fs_set_netfs_context (struct inode *inode) +void v9fs_set_netfs_context (struct inode *inode) {struct v9fs_inode *v9inode =V9FS_I (inode);netfs_inode_init (&v9inode->netfs, &v9fs_req_ops);
@@ -344,8 +344,6 @@ int v9fs_init_inode(struct v9fs_session_info *v9ses, err = -EINVAL ; goto error; } - -v9fs_set_netfs_context (inode); error:return err;
@@ -377,6 +375,7 @@ struct inode *v9fs_get_inode(struct super_block *sb, umode_t mode, dev_t rdev)iput (inode);return ERR_PTR (err); } +v9fs_set_netfs_context (inode);return inode; }
@@ -479,6 +478,7 @@ static struct inode *v9fs_qid_iget(struct super_block *sb, goto error;v9fs_stat2inode (st, inode, sb,0 ); +v9fs_set_netfs_context (inode);v9fs_cache_inode_get_cookie (inode);unlock_new_inode (inode);return inode;
fs/9p/vfs_inode_dotl.c +1 -0
@@ -130,6 +130,7 @@ static struct inode *v9fs_qid_iget_dotl(struct super_block *sb, goto error;v9fs_stat2inode_dotl (st, inode,0 ); +v9fs_set_netfs_context (inode);v9fs_cache_inode_get_cookie (inode); retval =v9fs_get_acl (inode, fid);if (retval)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 169/219 misc: lis3lv02d_i2c: Add missing setting of the reg_ctrl callback
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
[ Upstream commit b1b9f7a494400c0c39f8cd83de3aaa6111c55087 ]
The lis3lv02d_i2c driver was missing a line to set the lis3_dev's reg_ctrl callback.
lis3_reg_ctrl(on) is called from the init callback, but due to the missing reg_ctrl callback the regulators where never turned off again leading to the following oops/backtrace when detaching the driver:
[ 82.313527] ------------[ cut here ]------------ [ 82.313546] WARNING: CPU: 1 PID: 1724 at drivers/regulator/core.c:2396 _regulator_put+0x219/0x230 ... [ 82.313695] RIP: 0010:_regulator_put+0x219/0x230 ... [ 82.314767] Call Trace: [ 82.314770] <TASK> [ 82.314772] ? _regulator_put+0x219/0x230 [ 82.314777] ? __warn+0x81/0x170 [ 82.314784] ? _regulator_put+0x219/0x230 [ 82.314791] ? report_bug+0x18d/0x1c0 [ 82.314801] ? handle_bug+0x3c/0x80 [ 82.314806] ? exc_invalid_op+0x13/0x60 [ 82.314812] ? asm_exc_invalid_op+0x16/0x20 [ 82.314845] ? _regulator_put+0x219/0x230 [ 82.314857] regulator_bulk_free+0x39/0x60 [ 82.314865] i2c_device_remove+0x22/0xb0
Add the missing setting of the callback so that the regulators properly get turned off again when not used.
--- drivers/misc/lis3lv02d/lis3lv02d_i2c.c | 1 + 1 file changed, 1 insertion(+)
drivers/misc/lis3lv02d/lis3lv02d_i2c.c +1 -0
@@ -151,6 +151,7 @@ static int lis3lv02d_i2c_probe(struct i2c_client *client, lis3_dev.init = lis3_i2c_init; lis3_dev.read = lis3_i2c_read; lis3_dev.write = lis3_i2c_write; + lis3_dev.reg_ctrl = lis3_reg_ctrl; lis3_dev.irq = client->irq; lis3_dev.ac = lis3lv02d_axis_map; lis3_dev.pm_dev = &client->dev;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 170/219 libsubcmd: Fix memory leak in uniq()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit ad30469a841b50dbb541df4d6971d891f703c297 ]
uniq() will write one command name over another causing the overwritten string to be leaked. Fix by doing a pass that removes duplicates and a second that removes the holes.
--- tools/lib/subcmd/help.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
tools/lib/subcmd/help.c +14 -4
@@ -50,11 +50,21 @@ void uniq(struct cmdnames *cmds)if (!cmds->cnt)return ; -for (i = j =1 ; i < cmds->cnt; i++) -if (strcmp (cmds->names[i]->name, cmds->names[i-1 ]->name)) - cmds->names[j++] = cmds->names[i]; - +for (i =1 ; i < cmds->cnt; i++) { +if (!strcmp (cmds->names[i]->name, cmds->names[i-1 ]->name)) +zfree (&cmds->names[i -1 ]); + } +for (i =0 , j =0 ; i < cmds->cnt; i++) { +if (cmds->names[i]) { +if (i == j) + j++; +else + cmds->names[j++] = cmds->names[i]; + } + } cmds->cnt = j; +while (j < i) + cmds->names[j++] =NULL ; }void exclude_cmds (struct cmdnames *cmds,struct cmdnames *excludes)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 171/219 drm/amdkfd: Fix lock dependency warning
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Kuehling <[email protected]>
[ Upstream commit 47bf0f83fc86df1bf42b385a91aadb910137c5c9 ]
======================================================
WARNING: possible circular locking dependency detected
6.5.0-kfd-fkuehlin #276 Not tainted
------------------------------------------------------
kworker/8:2/2676 is trying to acquire lock:ffff9435aae95c88 ((work_completion)(&svm_bo->eviction_work)){+.+.}-{0:0}, at: __flush_work+0x52/0x550
but task is already holding lock:ffff9435cd8e1720 (&svms->lock){+.+.}-{3:3}, at: svm_range_deferred_list_work+0xe8/0x340 [amdgpu]
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #2 (&svms->lock){+.+.}-{3:3}:
__mutex_lock+0x97/0xd30
kfd_ioctl_alloc_memory_of_gpu+0x6d/0x3c0 [amdgpu]
kfd_ioctl+0x1b2/0x5d0 [amdgpu]
__x64_sys_ioctl+0x86/0xc0
do_syscall_64+0x39/0x80
entry_SYSCALL_64_after_hwframe+0x63/0xcd-> #1 (&mm->mmap_lock){++++}-{3:3}:
down_read+0x42/0x160
svm_range_evict_svm_bo_worker+0x8b/0x340 [amdgpu]
process_one_work+0x27a/0x540
worker_thread+0x53/0x3e0
kthread+0xeb/0x120
ret_from_fork+0x31/0x50
ret_from_fork_asm+0x11/0x20-> #0 ((work_completion)(&svm_bo->eviction_work)){+.+.}-{0:0}:
__lock_acquire+0x1426/0x2200
lock_acquire+0xc1/0x2b0
__flush_work+0x80/0x550
__cancel_work_timer+0x109/0x190
svm_range_bo_release+0xdc/0x1c0 [amdgpu]
svm_range_free+0x175/0x180 [amdgpu]
svm_range_deferred_list_work+0x15d/0x340 [amdgpu]
process_one_work+0x27a/0x540
worker_thread+0x53/0x3e0
kthread+0xeb/0x120
ret_from_fork+0x31/0x50
ret_from_fork_asm+0x11/0x20other info that might help us debug this:
Chain exists of: (work_completion)(&svm_bo->eviction_work) --> &mm->mmap_lock --> &svms->lock Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&svms->lock);
lock(&mm->mmap_lock);
lock(&svms->lock);lock((work_completion)(&svm_bo->eviction_work));
I believe this cannot really lead to a deadlock in practice, because svm_range_evict_svm_bo_worker only takes the mmap_read_lock if the BO refcount is non-0. That means it's impossible that svm_range_bo_release is running concurrently. However, there is no good way to annotate this.
To avoid the problem, take a BO reference in svm_range_schedule_evict_svm_bo instead of in the worker. That way it's impossible for a BO to get freed while eviction work is pending and the cancel_work_sync call in svm_range_bo_release can be eliminated.
v2: Use svm_bo_ref_unless_zero and explained why that's safe. Also removed redundant checks that are already done in amdkfd_fence_enable_signaling.
--- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_svm.c +10 -16
@@ -380,14 +380,9 @@ static void svm_range_bo_release(struct kref *kref)spin_lock (&svm_bo->list_lock); }spin_unlock (&svm_bo->list_lock); -if (!dma_fence_is_signaled (&svm_bo->eviction_fence->base)) { -/* We're not in the eviction worker. -* Signal the fence and synchronize with any -* pending eviction work. -*/ +if (!dma_fence_is_signaled (&svm_bo->eviction_fence->base)) +/* We're not in the eviction worker. Signal the fence. */ dma_fence_signal (&svm_bo->eviction_fence->base); -cancel_work_sync (&svm_bo->eviction_work); - }dma_fence_put (&svm_bo->eviction_fence->base);amdgpu_bo_unref (&svm_bo->bo);kfree (svm_bo);
@@ -3310,13 +3305,14 @@ svm_range_trigger_migration(struct mm_struct *mm, struct svm_range *prange,int svm_range_schedule_evict_svm_bo (struct amdgpu_amdkfd_fence *fence) { -if (!fence) -return -EINVAL ; - -if (dma_fence_is_signaled (&fence->base)) -return 0 ; - -if (fence->svm_bo) { +/* Dereferencing fence->svm_bo is safe here because the fence hasn't +* signaled yet and we're under the protection of the fence->lock. +* After the fence is signaled in svm_range_bo_release, we cannot get +* here any more. +* +* Reference is dropped in svm_range_evict_svm_bo_worker. +*/ +if (svm_bo_ref_unless_zero (fence->svm_bo)) {WRITE_ONCE (fence->svm_bo->evicting,1 );schedule_work (&fence->svm_bo->eviction_work); }
@@ -3331,8 +3327,6 @@ static void svm_range_evict_svm_bo_worker(struct work_struct *work)int r =0 ; svm_bo = container_of(work, struct svm_range_bo, eviction_work); -if (!svm_bo_ref_unless_zero (svm_bo)) -return ;/* svm_bo was freed while eviction was pending */ if (mmget_not_zero (svm_bo->eviction_fence->mm)) { mm = svm_bo->eviction_fence->mm;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 172/219 drm/amdkfd: Fix lock dependency warning with srcu
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Philip Yang <[email protected]>
[ Upstream commit 2a9de42e8d3c82c6990d226198602be44f43f340 ]
======================================================
WARNING: possible circular locking dependency detected 6.5.0-kfd-yangp #2289 Not tainted
------------------------------------------------------
kworker/0:2/996 is trying to acquire lock:
(srcu){.+.+}-{0:0}, at: __synchronize_srcu+0x5/0x1a0but task is already holding lock:
((work_completion)(&svms->deferred_list_work)){+.+.}-{0:0}, at:
process_one_work+0x211/0x560which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #3 ((work_completion)(&svms->deferred_list_work)){+.+.}-{0:0}:
__flush_work+0x88/0x4f0
svm_range_list_lock_and_flush_work+0x3d/0x110 [amdgpu]
svm_range_set_attr+0xd6/0x14c0 [amdgpu]
kfd_ioctl+0x1d1/0x630 [amdgpu]
__x64_sys_ioctl+0x88/0xc0-> #2 (&info->lock#2){+.+.}-{3:3}:
__mutex_lock+0x99/0xc70
amdgpu_amdkfd_gpuvm_restore_process_bos+0x54/0x740 [amdgpu]
restore_process_helper+0x22/0x80 [amdgpu]
restore_process_worker+0x2d/0xa0 [amdgpu]
process_one_work+0x29b/0x560
worker_thread+0x3d/0x3d0-> #1 ((work_completion)(&(&process->restore_work)->work)){+.+.}-{0:0}:
__flush_work+0x88/0x4f0
__cancel_work_timer+0x12c/0x1c0
kfd_process_notifier_release_internal+0x37/0x1f0 [amdgpu]
__mmu_notifier_release+0xad/0x240
exit_mmap+0x6a/0x3a0
mmput+0x6a/0x120
do_exit+0x322/0xb90
do_group_exit+0x37/0xa0
__x64_sys_exit_group+0x18/0x20
do_syscall_64+0x38/0x80-> #0 (srcu){.+.+}-{0:0}:
__lock_acquire+0x1521/0x2510
lock_sync+0x5f/0x90
__synchronize_srcu+0x4f/0x1a0
__mmu_notifier_release+0x128/0x240
exit_mmap+0x6a/0x3a0
mmput+0x6a/0x120
svm_range_deferred_list_work+0x19f/0x350 [amdgpu]
process_one_work+0x29b/0x560
worker_thread+0x3d/0x3d0other info that might help us debug this:
Chain exists of: srcu --> &info->lock#2 --> (work_completion)(&svms->deferred_list_work) Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock((work_completion)(&svms->deferred_list_work));
lock(&info->lock#2);
lock((work_completion)(&svms->deferred_list_work));
sync(srcu);--- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_svm.c +4 -2
@@ -2241,8 +2241,10 @@ static void svm_range_deferred_list_work(struct work_struct *work)mutex_unlock (&svms->lock);mmap_write_unlock (mm); -/* Pairs with mmget in svm_range_add_list_work */ -mmput (mm); +/* Pairs with mmget in svm_range_add_list_work. If dropping the +* last mm refcount, schedule release work to avoid circular locking +*/ +mmput_async (mm);spin_lock (&svms->deferred_list_lock); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 173/219 =?UTF-8?q?virtio=5Fnet:=20Fix=20"=E2=80=98%d=E2=80=99=20directive?= =?UTF-8?q?=20writing=20between=201=20and=2011=20bytes=20into=20a=20region?= =?UTF-8?q?=20of=20size=2010"=20warnings?=
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhu Yanjun <[email protected]>
[ Upstream commit e3fe8d28c67bf6c291e920c6d04fa22afa14e6e4 ]
Fix the warnings when building virtio_net driver.
"drivers/net/virtio_net.c: In function ‘init_vqs’:drivers/net/virtio_net.c:4551:48: warning: ‘%d’ directive writing between 1 and 11 bytes into a region of size 10 [-Wformat-overflow=]
4551 | sprintf(vi->rq[i].name, "input.%d", i);
| ^~
In function ‘virtnet_find_vqs’,
inlined from ‘init_vqs’ at drivers/net/virtio_net.c:4645:8:drivers/net/virtio_net.c:4551:41: note: directive argument in the range [-2147483643, 65534]
4551 | sprintf(vi->rq[i].name, "input.%d", i);
| ^~~~~~~~~~drivers/net/virtio_net.c:4551:17: note: ‘sprintf’ output between 8 and 18 bytes into a destination of size 16
4551 | sprintf(vi->rq[i].name, "input.%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~drivers/net/virtio_net.c: In function ‘init_vqs’:drivers/net/virtio_net.c:4552:49: warning: ‘%d’ directive writing between 1 and 11 bytes into a region of size 9 [-Wformat-overflow=]
4552 | sprintf(vi->sq[i].name, "output.%d", i);
| ^~
In function ‘virtnet_find_vqs’,
inlined from ‘init_vqs’ at drivers/net/virtio_net.c:4645:8:drivers/net/virtio_net.c:4552:41: note: directive argument in the range [-2147483643, 65534]
4552 | sprintf(vi->sq[i].name, "output.%d", i);
| ^~~~~~~~~~~drivers/net/virtio_net.c:4552:17: note: ‘sprintf’ output between 9 and 19 bytes into a destination of size 16
4552 | sprintf(vi->sq[i].name, "output.%d", i);
"
--- drivers/net/virtio_net.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/net/virtio_net.c +5 -4
@@ -3474,10 +3474,11 @@ static int virtnet_find_vqs(struct virtnet_info *vi) {vq_callback_t **callbacks;struct virtqueue **vqs; -int ret = -ENOMEM ; -int i, total_vqs;const char **names; +int ret = -ENOMEM ; +int total_vqs;bool *ctx; +u16 i;/* We expect 1 RX virtqueue followed by 1 TX virtqueue, followed by * possible N-1 RX/TX queue pairs used in multiqueue mode, followed by
@@ -3514,8 +3515,8 @@ static int virtnet_find_vqs(struct virtnet_info *vi)for (i =0 ; i < vi->max_queue_pairs; i++) { callbacks[rxq2vq (i)] = skb_recv_done; callbacks[txq2vq (i)] = skb_xmit_done; -sprintf (vi->rq[i].name,"input.%d" , i); -sprintf (vi->sq[i].name,"output.%d" , i); +sprintf (vi->rq[i].name,"input.%u" , i); +sprintf (vi->sq[i].name,"output.%u" , i); names[rxq2vq (i)] = vi->rq[i].name; names[txq2vq (i)] = vi->sq[i].name;if (ctx)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 174/219 blk-mq: fix IO hang from sbitmap wakeup race
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
[ Upstream commit 5266caaf5660529e3da53004b8b7174cab6374ed ]
In blk_mq_mark_tag_wait(), __add_wait_queue() may be re-ordered with the following blk_mq_get_driver_tag() in case of getting driver tag failure.
Then in __sbitmap_queue_wake_up(), waitqueue_active() may not observe the added waiter in blk_mq_mark_tag_wait() and wake up nothing, meantime blk_mq_mark_tag_wait() can't get driver tag successfully.
This issue can be reproduced by running the following test in loop, and fio hang can be observed in < 30min when running it on my test VM in laptop.
modprobe -r scsi_debug
modprobe scsi_debug delay=0 dev_size_mb=4096 max_queue=1 host_max_queue=1 submit_queues=4 dev=ls -d /sys/bus/pseudo/drivers/scsi_debug/adapter*/host*/target*/*/block/* | head -1 | xargs basename fio --filename=/dev/"$dev" --direct=1 --rw=randrw --bs=4k --iodepth=1 \
--runtime=100 --numjobs=40 --time_based --name=test \
--ioengine=libaio
Fix the issue by adding one explicit barrier in blk_mq_mark_tag_wait(), which is just fine in case of running out of tag.
--- block/blk-mq.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
block/blk-mq.c +16 -0
@@ -1859,6 +1859,22 @@ static bool blk_mq_mark_tag_wait(struct blk_mq_hw_ctx *hctx, wait->flags &= ~WQ_FLAG_EXCLUSIVE ;__add_wait_queue (wq, wait); +/* +* Add one explicit barrier since blk_mq_get_driver_tag() may +* not imply barrier in case of failure. +* +* Order adding us to wait queue and allocating driver tag. +* +* The pair is the one implied in sbitmap_queue_wake_up() which +* orders clearing sbitmap tag bits and waitqueue_active() in +* __sbitmap_queue_wake_up(), since waitqueue_active() is lockless +* +* Otherwise, re-order of adding wait queue and getting driver tag +* may cause __sbitmap_queue_wake_up() to wake up nothing because +* the waitqueue_active() may not observe us in wait queue. +*/ +smp_mb (); +/* * It's possible that a tag was freed in the window between the * allocation failure and adding the hardware queue to the wait
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 175/219 ceph: reinitialize mds feature bit even when session in open
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Venky Shankar <[email protected]>
[ Upstream commit f48e0342a74d7770cdf1d11894bdc3b6d989b29e ]
Following along the same lines as per the user-space fix. Right now this isn't really an issue with the ceph kernel driver because of the feature bit laginess, however, that can change over time (when the new snaprealm info type is ported to the kernel driver) and depending on the MDS version that's being upgraded can cause message decoding issues - so, fix that early on.
--- fs/ceph/mds_client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ceph/mds_client.c +1 -1
@@ -3650,11 +3650,11 @@ static void handle_session(struct ceph_mds_session *session,if (session->s_state ==CEPH_MDS_SESSION_RECONNECTING )pr_info ("mds%d reconnect success\n" , session->s_mds); + session->s_features = features;if (session->s_state ==CEPH_MDS_SESSION_OPEN ) {pr_notice ("mds%d is already opened\n" , session->s_mds); }else { session->s_state =CEPH_MDS_SESSION_OPEN ; - session->s_features = features;renewed_caps (mdsc, session,0 );if (test_bit (CEPHFS_FEATURE_METRIC_COLLECT , &session->s_features))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 176/219 ceph: fix deadlock or deadcode of misusing dget()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiubo Li <[email protected]>
[ Upstream commit b493ad718b1f0357394d2cdecbf00a44a36fa085 ]
The lock order is incorrect between denty and its parent, we should always make sure that the parent get the lock first.
But since this deadcode is never used and the parent dir will always be set from the callers, let's just remove it.
--- fs/ceph/caps.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
fs/ceph/caps.c +3 -6
@@ -4597,12 +4597,14 @@ int ceph_encode_dentry_release(void **p, struct dentry *dentry,struct inode *dir, int mds, int drop, int unless) { - struct dentry *parent = NULL; struct ceph_mds_request_release *rel = *p;struct ceph_dentry_info *di =ceph_dentry (dentry);int force =0 ;int ret; +/* This shouldn't happen */ +BUG_ON (!dir); +/* * force an record for the directory caps if we have a dentry lease. * this is racy (can't take i_ceph_lock and d_lock together), but it
@@ -4612,14 +4614,9 @@ int ceph_encode_dentry_release(void **p, struct dentry *dentry,spin_lock (&dentry->d_lock);if (di->lease_session && di->lease_session->s_mds == mds) force =1 ; -if (!dir) { - parent =dget (dentry->d_parent); - dir =d_inode (parent); - }spin_unlock (&dentry->d_lock); ret =ceph_encode_inode_release (p, dir, mds, drop, unless, force); -dput (parent);spin_lock (&dentry->d_lock);if (ret && di->lease_session && di->lease_session->s_mds == mds) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 177/219 ceph: fix invalid pointer access if get_quota_realm return ERR_PTR
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wenchao Hao <[email protected]>
[ Upstream commit 0f4cf64eabc6e16cfc2704f1960e82dc79d91c8d ]
This issue is reported by smatch that get_quota_realm() might return ERR_PTR but we did not handle it. It's not a immediate bug, while we still should address it to avoid potential bugs if get_quota_realm() is changed to return other ERR_PTR in future.
Set ceph_snap_realm's pointer in get_quota_realm()'s to address this issue, the pointer would be set to NULL if get_quota_realm() failed to get struct ceph_snap_realm, so no ERR_PTR would happen any more.
[ xiubli: minor code style clean up ]
--- fs/ceph/quota.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-)
fs/ceph/quota.c +22 -17
@@ -194,10 +194,10 @@ void ceph_cleanup_quotarealms_inodes(struct ceph_mds_client *mdsc) }/* -* This function walks through the snaprealm for an inode and returns the -* ceph_snap_realm for the first snaprealm that has quotas set (max_files, +* This function walks through the snaprealm for an inode and set the +* realmp with the first snaprealm that has quotas set (max_files, * max_bytes, or any, depending on the 'which_quota' argument). If the root is -* reached, return the root ceph_snap_realm instead. +* reached, set the realmp with the root ceph_snap_realm instead. * * Note that the caller is responsible for calling ceph_put_snap_realm() on the * returned realm.
@@ -208,18 +208,19 @@ void ceph_cleanup_quotarealms_inodes(struct ceph_mds_client *mdsc)* this function will return -EAGAIN; otherwise, the snaprealms walk-through * will be restarted. */ -static struct ceph_snap_realm *get_quota_realm (struct ceph_mds_client *mdsc, -struct inode *inode, -enum quota_get_realm which_quota, -bool retry) +static int get_quota_realm (struct ceph_mds_client *mdsc,struct inode *inode, +enum quota_get_realm which_quota, +struct ceph_snap_realm **realmp,bool retry) {struct ceph_inode_info *ci =NULL ;struct ceph_snap_realm *realm, *next;struct inode *in;bool has_quota; +if (realmp) + *realmp =NULL ;if (ceph_snap (inode) !=CEPH_NOSNAP ) -return NULL ; +return 0 ; restart: realm =ceph_inode (inode)->i_snap_realm;
@@ -245,7 +246,7 @@ static struct ceph_snap_realm *get_quota_realm(struct ceph_mds_client *mdsc,break ;ceph_put_snap_realm (mdsc, realm);if (!retry) -return ERR_PTR (-EAGAIN ); +return -EAGAIN ; goto restart; }
@@ -254,8 +255,11 @@ static struct ceph_snap_realm *get_quota_realm(struct ceph_mds_client *mdsc,iput (in); next = realm->parent; -if (has_quota || !next) -return realm; +if (has_quota || !next) { +if (realmp) + *realmp = realm; +return 0 ; + }ceph_get_snap_realm (mdsc, next);ceph_put_snap_realm (mdsc, realm);
@@ -264,7 +268,7 @@ static struct ceph_snap_realm *get_quota_realm(struct ceph_mds_client *mdsc,if (realm)ceph_put_snap_realm (mdsc, realm); -return NULL ; +return 0 ; }bool ceph_quota_is_same_realm (struct inode *old,struct inode *new)
@@ -272,6 +276,7 @@ bool ceph_quota_is_same_realm(struct inode *old, struct inode *new)struct ceph_mds_client *mdsc =ceph_sb_to_mdsc (old->i_sb);struct ceph_snap_realm *old_realm, *new_realm;bool is_same; +int ret; restart:/*
@@ -281,9 +286,9 @@ bool ceph_quota_is_same_realm(struct inode *old, struct inode *new)* dropped and we can then restart the whole operation. */ down_read (&mdsc->snap_rwsem); - old_realm =get_quota_realm (mdsc, old,QUOTA_GET_ANY , true); - new_realm =get_quota_realm (mdsc, new,QUOTA_GET_ANY , false); -if (PTR_ERR (new_realm) == -EAGAIN ) { +get_quota_realm (mdsc, old,QUOTA_GET_ANY , &old_realm, true); + ret =get_quota_realm (mdsc, new,QUOTA_GET_ANY , &new_realm, false); +if (ret == -EAGAIN ) {up_read (&mdsc->snap_rwsem);if (old_realm)ceph_put_snap_realm (mdsc, old_realm);
@@ -485,8 +490,8 @@ bool ceph_quota_update_statfs(struct ceph_fs_client *fsc, struct kstatfs *buf)bool is_updated = false;down_read (&mdsc->snap_rwsem); - realm =get_quota_realm (mdsc,d_inode (fsc->sb->s_root), -QUOTA_GET_MAX_BYTES , true); +get_quota_realm (mdsc,d_inode (fsc->sb->s_root),QUOTA_GET_MAX_BYTES , + &realm, true);up_read (&mdsc->snap_rwsem);if (!realm)return false;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 178/219 drm/amd/powerplay: Fix kzalloc parameter ATOM_Tonga_PPM_Table in get_platform_power_management_table()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit 6616b5e1999146b1304abe78232af810080c67e3 ]
In 'struct phm_ppm_table *ptr' allocation using kzalloc, an incorrect structure type is passed to sizeof() in kzalloc, larger structure types were used, thus using correct type 'struct phm_ppm_table' fixes the below:
drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/process_pptables_v1_0.c:203 get_platform_power_management_table() warn: struct type mismatch 'phm_ppm_table vs _ATOM_Tonga_PPM_Table'
--- drivers/gpu/drm/amd/pm/powerplay/hwmgr/process_pptables_v1_0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/powerplay/hwmgr/process_pptables_v1_0.c +1 -1
@@ -200,7 +200,7 @@ static int get_platform_power_management_table(struct pp_hwmgr *hwmgr, ATOM_Tonga_PPM_Table *atom_ppm_table) { - struct phm_ppm_table *ptr = kzalloc(sizeof(ATOM_Tonga_PPM_Table), GFP_KERNEL); + struct phm_ppm_table *ptr = kzalloc(sizeof(*ptr), GFP_KERNEL);struct phm_ppt_v1_information *pp_table_information = (struct phm_ppt_v1_information *)(hwmgr->pptable);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 179/219 drm/amdgpu: Fix with right return code -EIO in amdgpu_gmc_vram_checking()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit fac4ebd79fed60e79cccafdad45a2bb8d3795044 ]
The amdgpu_gmc_vram_checking() function in emulation checks whether all of the memory range of shared system memory could be accessed by GPU, from this aspect, -EIO is returned for error scenarios.
Fixes the below:drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c:919 gmc_v6_0_hw_init() warn: missing error code? 'r' drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c:1103 gmc_v7_0_hw_init() warn: missing error code? 'r' drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c:1223 gmc_v8_0_hw_init() warn: missing error code? 'r' drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c:2344 gmc_v9_0_hw_init() warn: missing error code? 'r'
--- drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c +14 -7
@@ -808,19 +808,26 @@ int amdgpu_gmc_vram_checking(struct amdgpu_device *adev)* seconds, so here, we just pick up three parts for emulation. */ ret =memcmp (vram_ptr, cptr,10 ); -if (ret) -return ret; +if (ret) { + ret = -EIO ; + goto release_buffer; + } ret =memcmp (vram_ptr + (size /2 ), cptr,10 ); -if (ret) -return ret; +if (ret) { + ret = -EIO ; + goto release_buffer; + } ret =memcmp (vram_ptr + size -10 , cptr,10 ); -if (ret) -return ret; +if (ret) { + ret = -EIO ; + goto release_buffer; + } +release_buffer:amdgpu_bo_free_kernel (&vram_bo, &vram_gpu, &vram_ptr); -return 0 ; +return ret; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 180/219 drm/amdgpu: Release adev->pm.fw before return in amdgpu_device_need_post()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit 8a44fdd3cf91debbd09b43bd2519ad2b2486ccf4 ]
In function 'amdgpu_device_need_post(struct amdgpu_device *adev)' - 'adev->pm.fw' may not be released before return.
Using the function release_firmware() to release adev->pm.fw.
Thus fixing the below:drivers/gpu/drm/amd/amdgpu/amdgpu_device.c:1571 amdgpu_device_need_post() warn: 'adev->pm.fw' from request_firmware() not released on lines: 1554.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +1 -0
@@ -1310,6 +1310,7 @@ bool amdgpu_device_need_post(struct amdgpu_device *adev)return true; fw_ver = *((uint32_t *)adev->pm.fw->data +69 ); +release_firmware (adev->pm.fw);if (fw_ver <0x00160e00 )return true; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 181/219 drm/amdkfd: Fix node NULL check in svm_range_get_range_boundaries()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit d7a254fad873775ce6c32b77796c81e81e6b7f2e ]
Range interval [start, last] is ordered by rb_tree, rb_prev, rb_next return value still needs NULL check, thus modified from "node" to "rb_node".
Fixes the below:drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_svm.c:2691 svm_range_get_range_boundaries() warn: can 'node' even be NULL?
--- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_svm.c +5 -5
@@ -2553,6 +2553,7 @@ svm_range_get_range_boundaries(struct kfd_process *p, int64_t addr, {struct vm_area_struct *vma;struct interval_tree_node *node; +struct rb_node *rb_node;unsigned long start_limit, end_limit; vma =find_vma (p->mm, addr <<PAGE_SHIFT );
@@ -2575,16 +2576,15 @@ svm_range_get_range_boundaries(struct kfd_process *p, int64_t addr,if (node) { end_limit =min (end_limit, node->start);/* Last range that ends before the fault address */ - node =container_of (rb_prev (&node->rb), - struct interval_tree_node, rb); + rb_node =rb_prev (&node->rb); }else {/* Last range must end before addr because * there was no range after addr */ - node =container_of (rb_last (&p->svms.objects.rb_root), - struct interval_tree_node, rb); + rb_node =rb_last (&p->svms.objects.rb_root); } -if (node) { +if (rb_node) { + node = container_of(rb_node, struct interval_tree_node, rb);if (node->last >= addr) {WARN (1 ,"Overlap with prev node and page fault addr\n" );return -EFAULT ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 182/219 perf: Fix the nr_addr_filters fix
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
[ Upstream commit 388a1fb7da6aaa1970c7e2a7d7fcd983a87a8484 ]
Thomas reported that commit 652ffc2104ec ("perf/core: Fix narrow startup race when creating the perf nr_addr_filters sysfs file") made the entire attribute group vanish, instead of only the nr_addr_filters attribute.
Additionally a stray return.
Insufficient coffee was involved with both writing and merging the patch.
--- kernel/events/core.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
kernel/events/core.c +1 -3
@@ -11232,12 +11232,10 @@ static umode_t pmu_dev_is_visible(struct kobject *kobj, struct attribute *a, intstruct device *dev =kobj_to_dev (kobj);struct pmu *pmu =dev_get_drvdata (dev); -if (!pmu->nr_addr_filters) +if (n ==2 && !pmu->nr_addr_filters)return 0 ;return a->mode; - -return 0 ; }static struct attribute_group pmu_dev_attr_group = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 183/219 wifi: cfg80211: fix RCU dereference in __cfg80211_bss_update
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Edward Adam Davis <[email protected]>
[ Upstream commit 1184950e341c11b6f82bc5b59564411d9537ab27 ]
Replace rcu_dereference() with rcu_access_pointer() since we hold the lock here (and aren't in an RCU critical section).
--- net/wireless/scan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/wireless/scan.c +1 -1
@@ -1811,7 +1811,7 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev, &hidden->hidden_list); hidden->refcount++; - ies = (void *)rcu_dereference (new->pub.beacon_ies); + ies = (void *)rcu_access_pointer (new->pub.beacon_ies);rcu_assign_pointer (new->pub.beacon_ies, hidden->pub.beacon_ies);if (ies)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 184/219 drm: using mul_u32_u32() requires linux/math64.h
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Rothwell <[email protected]>
[ Upstream commit 933a2a376fb3f22ba4774f74233571504ac56b02 ]
Some pending include file cleanups produced this error:
In file included from include/linux/kernel.h:27,
from drivers/gpu/ipu-v3/ipu-dp.c:7:
include/drm/drm_color_mgmt.h: In function 'drm_color_lut_extract':include/drm/drm_color_mgmt.h:45:46: error: implicit declaration of function 'mul_u32_u32' [-Werror=implicit-function-declaration]
45 | return DIV_ROUND_CLOSEST_ULL(mul_u32_u32(user_input, (1 << bit_precision) - 1),
| ^~~~~~~~~~~
--- include/drm/drm_color_mgmt.h | 1 + 1 file changed, 1 insertion(+)
include/drm/drm_color_mgmt.h +1 -0
@@ -24,6 +24,7 @@#define __DRM_COLOR_MGMT_H__#include <linux/ctype.h> +#include <linux/math64.h> #include <drm/drm_property.h> struct drm_crtc ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 185/219 scsi: isci: Fix an error code problem in isci_io_request_build()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Su Hui <[email protected]>
[ Upstream commit 658365c6b0857e6a306436e315a8633937e3af42 ]
Clang static complains that Value stored to 'status' is never read. Return 'status' rather than 'SCI_SUCCESS'.
--- drivers/scsi/isci/request.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/isci/request.c +1 -1
@@ -3390,7 +3390,7 @@ static enum sci_status isci_io_request_build(struct isci_host *ihost,return SCI_FAILURE ; } -return SCI_SUCCESS ; +return status; }static struct isci_request *isci_request_from_tag (struct isci_host *ihost,u16 tag)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 186/219 regulator: ti-abb: dont use devm_platform_ioremap_resource_byname for shared interrupt register
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Romain Naour <[email protected]>
[ Upstream commit a67e1f0bd4564b485e0f0c3ed7f6bf17688be268 ]
We can't use devm_platform_ioremap_resource_byname() to remap the interrupt register that can be shared between regulator-abb-{ivahd,dspeve,gpu} drivers instances.
The combined helper introduce a call to devm_request_mem_region() that creates a new busy resource region on PRM_IRQSTATUS_MPU register (0x4ae06010). The first devm_request_mem_region() call succeeds for regulator-abb-ivahd but fails for the two other regulator-abb-dspeve and regulator-abb-gpu.
# cat /proc/iomem | grep -i 4ae06 4ae06010-4ae06013 : 4ae07e34.regulator-abb-ivahd int-address 4ae06014-4ae06017 : 4ae07ddc.regulator-abb-mpu int-address
regulator-abb-dspeve and regulator-abb-gpu are missing due to devm_request_mem_region() failure (EBUSY):
[ 1.326660] ti_abb 4ae07e30.regulator-abb-dspeve: can't request region for resource [mem 0x4ae06010-0x4ae06013] [ 1.326660] ti_abb: probe of 4ae07e30.regulator-abb-dspeve failed with error -16 [ 1.327239] ti_abb 4ae07de4.regulator-abb-gpu: can't request region for resource [mem 0x4ae06010-0x4ae06013] [ 1.327270] ti_abb: probe of 4ae07de4.regulator-abb-gpu failed with error -16
Quoted 1 line
From
arm/boot/dts/dra7.dtsi:
The abb_mpu is the only instance using its own interrupt register:
(0x4ae06014) PRM_IRQSTATUS_MPU_2, ABB_MPU_DONE_ST (bit 7)
The other tree instances (abb_ivahd, abb_dspeve, abb_gpu) share PRM_IRQSTATUS_MPU register (0x4ae06010) but use different bits ABB_IVA_DONE_ST (bit 30), ABB_DSPEVE_DONE_ST( bit 29) and ABB_GPU_DONE_ST (but 28).
The commit b36c6b1887ff ("regulator: ti-abb: Make use of the helper function devm_ioremap related") overlooked the following comment implicitly explaining why devm_ioremap() is used in this case:
/*
* We may have shared interrupt register offsets which are
* write-1-to-clear between domains ensuring exclusivity. */
Fixes and partially reverts commit b36c6b1887ff ("regulator: ti-abb:
Make use of the helper function devm_ioremap related").
Improve the existing comment to avoid further conversion to devm_platform_ioremap_resource_byname().
--- drivers/regulator/ti-abb-regulator.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-)
drivers/regulator/ti-abb-regulator.c +19 -3
@@ -734,9 +734,25 @@ static int ti_abb_probe(struct platform_device *pdev)return PTR_ERR (abb->setup_reg); } - abb->int_base =devm_platform_ioremap_resource_byname (pdev,"int-address" ); -if (IS_ERR (abb->int_base)) -return PTR_ERR (abb->int_base); + pname ="int-address" ; + res =platform_get_resource_byname (pdev,IORESOURCE_MEM , pname); +if (!res) { +dev_err (dev,"Missing '%s' IO resource\n" , pname); +return -ENODEV ; + } +/* +* The MPU interrupt status register (PRM_IRQSTATUS_MPU) is +* shared between regulator-abb-{ivahd,dspeve,gpu} driver +* instances. Therefore use devm_ioremap() rather than +* devm_platform_ioremap_resource_byname() to avoid busy +* resource region conflicts. +*/ + abb->int_base =devm_ioremap (dev, res->start, +resource_size (res)); +if (!abb->int_base) { +dev_err (dev,"Unable to map '%s'\n" , pname); +return -ENOMEM ; + }/* Map Optional resources */ pname ="efuse-address" ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 187/219 scsi: core: Move scsi_host_busy() out of host lock for waking up EH handler
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
[ Upstream commit 4373534a9850627a2695317944898eb1283a2db0 ]
Inside scsi_eh_wakeup(), scsi_host_busy() is called & checked with host lock every time for deciding if error handler kthread needs to be waken up.
This can be too heavy in case of recovery, such as:
- N hardware queues
- queue depth is M for each hardware queue
- each scsi_host_busy() iterates over (N * M) tag/requests
If recovery is triggered in case that all requests are in-flight, each scsi_eh_wakeup() is strictly serialized, when scsi_eh_wakeup() is called for the last in-flight request, scsi_host_busy() has been run for (N * M -
1) times, and request has been iterated for (N*M - 1) * (N * M) times.
If both N and M are big enough, hard lockup can be triggered on acquiring host lock, and it is observed on mpi3mr(128 hw queues, queue depth 8169).
Fix the issue by calling scsi_host_busy() outside the host lock. We don't need the host lock for getting busy count because host the lock never covers that.
[mkp: Drop unnecessary 'busy' variables pointed out by Bart]
--- drivers/scsi/scsi_error.c | 8 ++++---- drivers/scsi/scsi_lib.c | 2 +- drivers/scsi/scsi_priv.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-)
drivers/scsi/scsi_error.c +4 -4
@@ -61,11 +61,11 @@ static int scsi_eh_try_stu(struct scsi_cmnd *scmd);static enum scsi_disposition scsi_try_to_abort_cmd (struct scsi_host_template *,struct scsi_cmnd *); -void scsi_eh_wakeup (struct Scsi_Host *shost) +void scsi_eh_wakeup (struct Scsi_Host *shost,unsigned int busy) {lockdep_assert_held (shost->host_lock); -if (scsi_host_busy (shost) == shost->host_failed) { +if (busy == shost->host_failed) {trace_scsi_eh_wakeup (shost);wake_up_process (shost->ehandler); SCSI_LOG_ERROR_RECOVERY(5, shost_printk(KERN_INFO, shost,
@@ -88,7 +88,7 @@ void scsi_schedule_eh(struct Scsi_Host *shost)if (scsi_host_set_state (shost,SHOST_RECOVERY ) ==0 ||scsi_host_set_state (shost,SHOST_CANCEL_RECOVERY ) ==0 ) { shost->host_eh_scheduled++; -scsi_eh_wakeup (shost); +scsi_eh_wakeup (shost,scsi_host_busy (shost)); }spin_unlock_irqrestore (shost->host_lock, flags);
@@ -281,7 +281,7 @@ static void scsi_eh_inc_host_failed(struct rcu_head *head)spin_lock_irqsave (shost->host_lock, flags); shost->host_failed++; -scsi_eh_wakeup (shost); +scsi_eh_wakeup (shost,scsi_host_busy (shost));spin_unlock_irqrestore (shost->host_lock, flags); }
drivers/scsi/scsi_lib.c +1 -1
@@ -282,7 +282,7 @@ static void scsi_dec_host_busy(struct Scsi_Host *shost, struct scsi_cmnd *cmd)if (unlikely (scsi_host_in_recovery (shost))) {spin_lock_irqsave (shost->host_lock, flags);if (shost->host_failed || shost->host_eh_scheduled) -scsi_eh_wakeup (shost); +scsi_eh_wakeup (shost,scsi_host_busy (shost));spin_unlock_irqrestore (shost->host_lock, flags); }rcu_read_unlock ();
drivers/scsi/scsi_priv.h +1 -1
@@ -86,7 +86,7 @@ extern void scmd_eh_abort_handler(struct work_struct *work);extern enum blk_eh_timer_return scsi_timeout (struct request *req);extern int scsi_error_handler (void *host);extern enum scsi_disposition scsi_decide_disposition (struct scsi_cmnd *cmd); -extern void scsi_eh_wakeup (struct Scsi_Host *shost); +extern void scsi_eh_wakeup (struct Scsi_Host *shost,unsigned int busy);extern void scsi_eh_scmd_add (struct scsi_cmnd *); void scsi_eh_ready_devs(struct Scsi_Host *shost, struct list_head *work_q,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 188/219 HID: hidraw: fix a problem of memory leak in hidraw_release()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Su Hui <[email protected]>
[ Upstream commit a3bdcdd022c68942a774e8e63424cc11c85aab78 ]
'struct hidraw_list' is a circular queue whose head can be smaller than tail. Using 'list->tail != list->head' to release all memory that should be released.
--- drivers/hid/hidraw.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/hid/hidraw.c +5 -2
@@ -355,8 +355,11 @@ static int hidraw_release(struct inode * inode, struct file * file)down_write (&minors_rwsem);spin_lock_irqsave (&hidraw_table[minor]->list_lock, flags); -for (int i = list->tail; i < list->head; i++) -kfree (list->buffer[i].value); +while (list->tail != list->head) { +kfree (list->buffer[list->tail].value); + list->buffer[list->tail].value =NULL ; + list->tail = (list->tail +1 ) & (HIDRAW_BUFFER_SIZE -1 ); + }list_del (&list->node);spin_unlock_irqrestore (&hidraw_table[minor]->list_lock, flags);kfree (list);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 189/219 selftests: net: give more time for GRO aggregation
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit 89abe628375301fedb68770644df845d49018d8b ]
The gro.sh test-case relay on the gro_flush_timeout to ensure that all the segments belonging to any given batch are properly aggregated.
The other end, the sender is a user-space program transmitting each packet with a separate write syscall. A busy host and/or stracing the sender program can make the relevant segments reach the GRO engine after the flush timeout triggers.
Give the GRO flush timeout more slack, to avoid sporadic self-tests failures.
--- tools/testing/selftests/net/setup_veth.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/net/setup_veth.sh +1 -1
@@ -8,7 +8,7 @@ setup_veth_ns() { local -r ns_mac="$4" [[ -e /var/run/netns/"${ns_name}" ]] || ip netns add "${ns_name}" - echo 100000 > "/sys/class/net/${ns_dev}/gro_flush_timeout" + echo 1000000 > "/sys/class/net/${ns_dev}/gro_flush_timeout" ip link set dev "${ns_dev}" netns "${ns_name}" mtu 65535 ip -netns "${ns_name}" link set dev "${ns_dev}" up
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 190/219 ip6_tunnel: make sure to pull inner header in __ip6_tnl_rcv()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 8d975c15c0cd744000ca386247432d57b21f9df0 ]
syzbot found __ip6_tnl_rcv() could access unitiliazed data [1].
Call pskb_inet_may_pull() to fix this, and initialize ipv6h variable after this call as it can change skb->head.
[1]
BUG: KMSAN: uninit-value in __INET_ECN_decapsulate include/net/inet_ecn.h:253 [inline] BUG: KMSAN: uninit-value in INET_ECN_decapsulate include/net/inet_ecn.h:275 [inline] BUG: KMSAN: uninit-value in IP6_ECN_decapsulate+0x7df/0x1e50 include/net/inet_ecn.h:321 __INET_ECN_decapsulate include/net/inet_ecn.h:253 [inline] INET_ECN_decapsulate include/net/inet_ecn.h:275 [inline] IP6_ECN_decapsulate+0x7df/0x1e50 include/net/inet_ecn.h:321 ip6ip6_dscp_ecn_decapsulate+0x178/0x1b0 net/ipv6/ip6_tunnel.c:727 __ip6_tnl_rcv+0xd4e/0x1590 net/ipv6/ip6_tunnel.c:845 ip6_tnl_rcv+0xce/0x100 net/ipv6/ip6_tunnel.c:888 gre_rcv+0x143f/0x1870 ip6_protocol_deliver_rcu+0xda6/0x2a60 net/ipv6/ip6_input.c:438 ip6_input_finish net/ipv6/ip6_input.c:483 [inline] NF_HOOK include/linux/netfilter.h:314 [inline] ip6_input+0x15d/0x430 net/ipv6/ip6_input.c:492 ip6_mc_input+0xa7e/0xc80 net/ipv6/ip6_input.c:586 dst_input include/net/dst.h:461 [inline] ip6_rcv_finish+0x5db/0x870 net/ipv6/ip6_input.c:79 NF_HOOK include/linux/netfilter.h:314 [inline] ipv6_rcv+0xda/0x390 net/ipv6/ip6_input.c:310 __netif_receive_skb_one_core net/core/dev.c:5532 [inline] __netif_receive_skb+0x1a6/0x5a0 net/core/dev.c:5646 netif_receive_skb_internal net/core/dev.c:5732 [inline] netif_receive_skb+0x58/0x660 net/core/dev.c:5791 tun_rx_batched+0x3ee/0x980 drivers/net/tun.c:1555 tun_get_user+0x53af/0x66d0 drivers/net/tun.c:2002 tun_chr_write_iter+0x3af/0x5d0 drivers/net/tun.c:2048 call_write_iter include/linux/fs.h:2084 [inline] new_sync_write fs/read_write.c:497 [inline] vfs_write+0x786/0x1200 fs/read_write.c:590 ksys_write+0x20f/0x4c0 fs/read_write.c:643 __do_sys_write fs/read_write.c:655 [inline] __se_sys_write fs/read_write.c:652 [inline] __x64_sys_write+0x93/0xd0 fs/read_write.c:652 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x6d/0x140 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b
Uninit was created at:
slab_post_alloc_hook+0x129/0xa70 mm/slab.h:768 slab_alloc_node mm/slub.c:3478 [inline] kmem_cache_alloc_node+0x5e9/0xb10 mm/slub.c:3523 kmalloc_reserve+0x13d/0x4a0 net/core/skbuff.c:560 __alloc_skb+0x318/0x740 net/core/skbuff.c:651 alloc_skb include/linux/skbuff.h:1286 [inline] alloc_skb_with_frags+0xc8/0xbd0 net/core/skbuff.c:6334 sock_alloc_send_pskb+0xa80/0xbf0 net/core/sock.c:2787 tun_alloc_skb drivers/net/tun.c:1531 [inline] tun_get_user+0x1e8a/0x66d0 drivers/net/tun.c:1846 tun_chr_write_iter+0x3af/0x5d0 drivers/net/tun.c:2048 call_write_iter include/linux/fs.h:2084 [inline] new_sync_write fs/read_write.c:497 [inline] vfs_write+0x786/0x1200 fs/read_write.c:590 ksys_write+0x20f/0x4c0 fs/read_write.c:643 __do_sys_write fs/read_write.c:655 [inline] __se_sys_write fs/read_write.c:652 [inline] __x64_sys_write+0x93/0xd0 fs/read_write.c:652 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x6d/0x140 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b CPU: 0 PID: 5034 Comm: syz-executor331 Not tainted 6.7.0-syzkaller-00562-g9f8413c4a66f #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 11/17/2023
--- net/ipv6/ip6_tunnel.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)
net/ipv6/ip6_tunnel.c +18 -3
@@ -796,8 +796,8 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb, struct sk_buff *skb), bool log_ecn_err) { -const struct ipv6hdr *ipv6h =ipv6_hdr (skb); -int err; +const struct ipv6hdr *ipv6h; +int nh, err; if ((!(tpi->flags & TUNNEL_CSUM) && (tunnel->parms.i_flags & TUNNEL_CSUM)) ||
@@ -829,7 +829,6 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb, goto drop; } - ipv6h =ipv6_hdr (skb); skb->protocol =eth_type_trans (skb, tunnel->dev);skb_postpull_rcsum (skb,eth_hdr (skb),ETH_HLEN ); }else {
@@ -837,7 +836,23 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,skb_reset_mac_header (skb); } +/* Save offset of outer header relative to skb->head, +* because we are going to reset the network header to the inner header +* and might change skb->head. +*/ + nh =skb_network_header (skb) - skb->head; +skb_reset_network_header (skb); + +if (!pskb_inet_may_pull (skb)) { +DEV_STATS_INC (tunnel->dev, rx_length_errors); +DEV_STATS_INC (tunnel->dev, rx_errors); + goto drop; + } + +/* Get the outer header. */ + ipv6h = (struct ipv6hdr *)(skb->head + nh); +memset (skb->cb,0 ,sizeof (struct inet6_skb_parm ));__skb_tunnel_rx (skb, tunnel->dev, tunnel->net);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 191/219 ipv4: raw: add drop reasons
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 42186e6c00352ce9df9e3f12b1ff82e61978d40b ]
Use existing helpers and drop reason codes for RAW input path.
Stable-dep-of: e622502c310f ("ipmr: fix kernel panic when forwarding mcast packets")
--- net/ipv4/raw.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
net/ipv4/raw.c +5 -3
@@ -286,11 +286,13 @@ void raw_icmp_error(struct sk_buff *skb, int protocol, u32 info)static int raw_rcv_skb (struct sock *sk,struct sk_buff *skb) { +enum skb_drop_reason reason; +/* Charge it to the socket. */ ipv4_pktinfo_prepare (sk, skb); -if (sock_queue_rcv_skb (sk, skb) <0 ) { -kfree_skb (skb); +if (sock_queue_rcv_skb_reason (sk, skb, &reason) <0 ) { +kfree_skb_reason (skb, reason);return NET_RX_DROP ; }
@@ -301,7 +303,7 @@ int raw_rcv(struct sock *sk, struct sk_buff *skb) {if (!xfrm4_policy_check (sk,XFRM_POLICY_IN , skb)) {atomic_inc (&sk->sk_drops); -kfree_skb (skb); +kfree_skb_reason (skb,SKB_DROP_REASON_XFRM_POLICY );return NET_RX_DROP ; }nf_reset_ct (skb);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 192/219 ipmr: fix kernel panic when forwarding mcast packets
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Dichtel <[email protected]>
[ Upstream commit e622502c310f1069fd9f41cd38210553115f610a ]
The stacktrace was:
[ 86.305548] BUG: kernel NULL pointer dereference, address: 0000000000000092 [ 86.306815] #PF: supervisor read access in kernel mode [ 86.307717] #PF: error_code(0x0000) - not-present page [ 86.308624] PGD 0 P4D 0 [ 86.309091] Oops: 0000 [#1] PREEMPT SMP NOPTI [ 86.309883] CPU: 2 PID: 3139 Comm: pimd Tainted: G U 6.8.0-6wind-knet #1 [ 86.311027] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.11.1-0-g0551a4be2c-prebuilt.qemu-project.org 04/01/2014 [ 86.312728] RIP: 0010:ip_mr_forward (/build/work/knet/net/ipv4/ipmr.c:1985) [ 86.313399] Code: f9 1f 0f 87 85 03 00 00 48 8d 04 5b 48 8d 04 83 49 8d 44 c5 00 48 8b 40 70 48 39 c2 0f 84 d9 00 00 00 49 8b 46 58 48 83 e0 fe <80> b8 92 00 00 00 00 0f 84 55 ff ff ff 49 83 47 38 01 45 85 e4 0f [ 86.316565] RSP: 0018:ffffad21c0583ae0 EFLAGS: 00010246 [ 86.317497] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000 [ 86.318596] RDX: ffff9559cb46c000 RSI: 0000000000000000 RDI: 0000000000000000 [ 86.319627] RBP: ffffad21c0583b30 R08: 0000000000000000 R09: 0000000000000000 [ 86.320650] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000001 [ 86.321672] R13: ffff9559c093a000 R14: ffff9559cc00b800 R15: ffff9559c09c1d80 [ 86.322873] FS: 00007f85db661980(0000) GS:ffff955a79d00000(0000) knlGS:0000000000000000 [ 86.324291] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 86.325314] CR2: 0000000000000092 CR3: 000000002f13a000 CR4: 0000000000350ef0 [ 86.326589] Call Trace: [ 86.327036] <TASK> [ 86.327434] ? show_regs (/build/work/knet/arch/x86/kernel/dumpstack.c:479) [ 86.328049] ? __die (/build/work/knet/arch/x86/kernel/dumpstack.c:421 /build/work/knet/arch/x86/kernel/dumpstack.c:434) [ 86.328508] ? page_fault_oops (/build/work/knet/arch/x86/mm/fault.c:707) [ 86.329107] ? do_user_addr_fault (/build/work/knet/arch/x86/mm/fault.c:1264) [ 86.329756] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.330350] ? __irq_work_queue_local (/build/work/knet/kernel/irq_work.c:111 (discriminator 1)) [ 86.331013] ? exc_page_fault (/build/work/knet/./arch/x86/include/asm/paravirt.h:693 /build/work/knet/arch/x86/mm/fault.c:1515 /build/work/knet/arch/x86/mm/fault.c:1563) [ 86.331702] ? asm_exc_page_fault (/build/work/knet/./arch/x86/include/asm/idtentry.h:570) [ 86.332468] ? ip_mr_forward (/build/work/knet/net/ipv4/ipmr.c:1985) [ 86.333183] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.333920] ipmr_mfc_add (/build/work/knet/./include/linux/rcupdate.h:782 /build/work/knet/net/ipv4/ipmr.c:1009 /build/work/knet/net/ipv4/ipmr.c:1273) [ 86.334583] ? __pfx_ipmr_hash_cmp (/build/work/knet/net/ipv4/ipmr.c:363) [ 86.335357] ip_mroute_setsockopt (/build/work/knet/net/ipv4/ipmr.c:1470) [ 86.336135] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.336854] ? ip_mroute_setsockopt (/build/work/knet/net/ipv4/ipmr.c:1470) [ 86.337679] do_ip_setsockopt (/build/work/knet/net/ipv4/ip_sockglue.c:944) [ 86.338408] ? __pfx_unix_stream_read_actor (/build/work/knet/net/unix/af_unix.c:2862) [ 86.339232] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.339809] ? aa_sk_perm (/build/work/knet/security/apparmor/include/cred.h:153 /build/work/knet/security/apparmor/net.c:181) [ 86.340342] ip_setsockopt (/build/work/knet/net/ipv4/ip_sockglue.c:1415) [ 86.340859] raw_setsockopt (/build/work/knet/net/ipv4/raw.c:836) [ 86.341408] ? security_socket_setsockopt (/build/work/knet/security/security.c:4561 (discriminator 13)) [ 86.342116] sock_common_setsockopt (/build/work/knet/net/core/sock.c:3716) [ 86.342747] do_sock_setsockopt (/build/work/knet/net/socket.c:2313) [ 86.343363] __sys_setsockopt (/build/work/knet/./include/linux/file.h:32 /build/work/knet/net/socket.c:2336) [ 86.344020] __x64_sys_setsockopt (/build/work/knet/net/socket.c:2340) [ 86.344766] do_syscall_64 (/build/work/knet/arch/x86/entry/common.c:52 /build/work/knet/arch/x86/entry/common.c:83) [ 86.345433] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.346161] ? syscall_exit_work (/build/work/knet/./include/linux/audit.h:357 /build/work/knet/kernel/entry/common.c:160) [ 86.346938] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.347657] ? syscall_exit_to_user_mode (/build/work/knet/kernel/entry/common.c:215) [ 86.348538] ? srso_return_thunk (/build/work/knet/arch/x86/lib/retpoline.S:223) [ 86.349262] ? do_syscall_64 (/build/work/knet/./arch/x86/include/asm/cpufeature.h:171 /build/work/knet/arch/x86/entry/common.c:98) [ 86.349971] entry_SYSCALL_64_after_hwframe (/build/work/knet/arch/x86/entry/entry_64.S:129)
The original packet in ipmr_cache_report() may be queued and then forwarded with ip_mr_forward(). This last function has the assumption that the skb dst is set.
After the below commit, the skb dst is dropped by ipv4_pktinfo_prepare(), which causes the oops.
--- include/net/ip.h | 2 +- net/ipv4/ip_sockglue.c | 6 ++++-- net/ipv4/ipmr.c | 2 +- net/ipv4/raw.c | 2 +- net/ipv4/udp.c | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-)
include/net/ip.h +1 -1
@@ -752,7 +752,7 @@ int ip_options_rcv_srr(struct sk_buff *skb, struct net_device *dev);* Functions provided by ip_sockglue.c */ -void ipv4_pktinfo_prepare (const struct sock *sk,struct sk_buff *skb); +void ipv4_pktinfo_prepare (const struct sock *sk,struct sk_buff *skb,bool drop_dst);void ip_cmsg_recv_offset (struct msghdr *msg,struct sock *sk,struct sk_buff *skb,int tlen,int offset); int ip_cmsg_send(struct sock *sk, struct msghdr *msg,
net/ipv4/ip_sockglue.c +4 -2
@@ -1406,12 +1406,13 @@ int do_ip_setsockopt(struct sock *sk, int level, int optname,* ipv4_pktinfo_prepare - transfer some info from rtable to skb * @sk: socket * @skb: buffer +* @drop_dst: if true, drops skb dst * * To support IP_CMSG_PKTINFO option, we store rt_iif and specific * destination in skb->cb[] before dst drop. * This way, receiver doesn't make cache line misses to read rtable. */ -void ipv4_pktinfo_prepare (const struct sock *sk,struct sk_buff *skb) +void ipv4_pktinfo_prepare (const struct sock *sk,struct sk_buff *skb,bool drop_dst) {struct in_pktinfo *pktinfo =PKTINFO_SKB_CB (skb); bool prepare = (inet_sk(sk)->cmsg_flags & IP_CMSG_PKTINFO) ||
@@ -1440,7 +1441,8 @@ void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb) pktinfo->ipi_ifindex =0 ; pktinfo->ipi_spec_dst.s_addr =0 ; } -skb_dst_drop (skb); +if (drop_dst) +skb_dst_drop (skb); } int ip_setsockopt(struct sock *sk, int level, int optname, sockptr_t optval,
net/ipv4/ipmr.c +1 -1
@@ -1073,7 +1073,7 @@ static int ipmr_cache_report(const struct mr_table *mrt, msg = (struct igmpmsg *)skb_network_header (skb); msg->im_vif = vifi; msg->im_vif_hi = vifi >>8 ; -ipv4_pktinfo_prepare (mroute_sk, pkt); +ipv4_pktinfo_prepare (mroute_sk, pkt, false);memcpy (skb->cb, pkt->cb,sizeof (skb->cb));/* Add our header */ igmp =skb_put (skb,sizeof (struct igmphdr ));
net/ipv4/raw.c +1 -1
@@ -290,7 +290,7 @@ static int raw_rcv_skb(struct sock *sk, struct sk_buff *skb)/* Charge it to the socket. */ -ipv4_pktinfo_prepare (sk, skb); +ipv4_pktinfo_prepare (sk, skb, true);if (sock_queue_rcv_skb_reason (sk, skb, &reason) <0 ) {kfree_skb_reason (skb, reason);return NET_RX_DROP ;
net/ipv4/udp.c +1 -1
@@ -2196,7 +2196,7 @@ static int udp_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb)udp_csum_pull_header (skb); -ipv4_pktinfo_prepare (sk, skb); +ipv4_pktinfo_prepare (sk, skb, true);return __udp_queue_rcv_skb (sk, skb); csum_error:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 193/219 net: lan966x: Fix port configuration when using SGMII interface
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Horatiu Vultur <[email protected]>
[ Upstream commit 62b4248105353e7d1debd30ca5c57ec5e5f28e35 ]
In case the interface between the MAC and the PHY is SGMII, then the bit GIGA_MODE on the MAC side needs to be set regardless of the speed at which it is running.
--- drivers/net/ethernet/microchip/lan966x/lan966x_port.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/microchip/lan966x/lan966x_port.c +3 -2
@@ -168,9 +168,10 @@ static void lan966x_port_link_up(struct lan966x_port *port)lan966x_taprio_speed_set (port, config->speed);/* Also the GIGA_MODE_ENA(1) needs to be set regardless of the -* port speed for QSGMII ports. +* port speed for QSGMII or SGMII ports. */ -if (phy_interface_num_ports (config->portmode) ==4 ) +if (phy_interface_num_ports (config->portmode) ==4 || + config->portmode ==PHY_INTERFACE_MODE_SGMII ) mode =DEV_MAC_MODE_CFG_GIGA_MODE_ENA_SET (1 ); lan_wr(config->duplex | mode,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 194/219 tcp: add sanity checks to rx zerocopy
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 577e4432f3ac810049cb7e6b71f4d96ec7c6e894 ]
TCP rx zerocopy intent is to map pages initially allocated from NIC drivers, not pages owned by a fs.
This patch adds to can_map_frag() these additional checks:
- Page must not be a compound one.
- page->mapping must be NULL.
This fixes the panic reported by ZhangPeng.
syzbot was able to loopback packets built with sendfile(), mapping pages owned by an ext4 file to TCP rx zerocopy.
r3 = socket$inet_tcp(0x2, 0x1, 0x0) mmap(&(0x7f0000ff9000/0x4000)=nil, 0x4000, 0x0, 0x12, r3, 0x0) r4 = socket$inet_tcp(0x2, 0x1, 0x0)
bind$inet(r4, &(0x7f0000000000)={0x2, 0x4e24, @multicast1}, 0x10) connect$inet(r4, &(0x7f00000006c0)={0x2, 0x4e24, @empty}, 0x10) r5 = openat$dir(0xffffffffffffff9c, &(0x7f00000000c0)='./file0\x00',
0x181e42, 0x0)
fallocate(r5, 0x0, 0x0, 0x85b8)
sendfile(r4, r5, 0x0, 0x8ba0)
getsockopt$inet_tcp_TCP_ZEROCOPY_RECEIVE(r4, 0x6, 0x23,
&(0x7f00000001c0)={&(0x7f0000ffb000/0x3000)=nil, 0x3000, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0}, &(0x7f0000000440)=0x40)
r6 = openat$dir(0xffffffffffffff9c, &(0x7f00000000c0)='./file0\x00',
0x181e42, 0x0)--- net/ipv4/tcp.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
net/ipv4/tcp.c +11 -1
@@ -1934,7 +1934,17 @@ static skb_frag_t *skb_advance_to_frag(struct sk_buff *skb, u32 offset_skb,static bool can_map_frag (const skb_frag_t *frag) { -return skb_frag_size (frag) ==PAGE_SIZE && !skb_frag_off (frag); +struct page *page; + +if (skb_frag_size (frag) !=PAGE_SIZE ||skb_frag_off (frag)) +return false; + + page =skb_frag_page (frag); + +if (PageCompound (page) || page->mapping) +return false; + +return true; } static int find_next_mappable_frag(const skb_frag_t *frag,
Signature · 1 line
2.43.0
Re: [PATCH 6.1 194/219] tcp: add sanity checks to rx zerocopy
Quoted 7 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit
577e4432f3ac810049cb7e6b71f4d96ec7c6e894]
Um, I thought this was an inapproproate way to fix the problem and I said so at the time. Why did this get applied? I'm starting to get quite angry at networking developers poking around in the guts of MM. They don't know what they're doing and it shows.
Re: [PATCH 6.1 194/219] tcp: add sanity checks to rx zerocopy
... and the patch has the wrong email address for linux-mm on it, further reducing the number of experts who are going to see it.
Quoted 14 lines · Matthew Wilcox
Quoted 7 lines · Greg Kroah-Hartman
6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit
577e4432f3ac810049cb7e6b71f4d96ec7c6e894]Um, I thought this was an inapproproate way to fix the problem and I said so at the time. Why did this get applied? I'm starting to get quite angry at networking developers poking around in the guts of MM. They don't know what they're doing and it shows.
Greg Kroah-Hartman
maintainerPATCH 195/219 ixgbe: Refactor returning internal error codes
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jedrzej Jagielski <[email protected]>
[ Upstream commit 5795f533f30a80aa0473652876296ebc9129e33a ]
Change returning codes to the kernel ones instead of the internal ones for the entire ixgbe driver.
Stable-dep-of: bbc404d20d1b ("ixgbe: Fix an error handling path in ixgbe_read_iosf_sb_reg_x550()")
--- .../net/ethernet/intel/ixgbe/ixgbe_82598.c | 36 ++--- .../net/ethernet/intel/ixgbe/ixgbe_82599.c | 61 ++++---- .../net/ethernet/intel/ixgbe/ixgbe_common.c | 145 ++++++++---------- .../net/ethernet/intel/ixgbe/ixgbe_ethtool.c | 2 +- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 26 ++-- drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c | 34 ++-- drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h | 1 - drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | 84 +++++----- .../net/ethernet/intel/ixgbe/ixgbe_sriov.c | 2 +- drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | 39 ----- drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c | 44 +++--- drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | 107 +++++++------ 12 files changed, 264 insertions(+), 317 deletions(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_82598.c +18 -18
@@ -123,14 +123,14 @@ static s32 ixgbe_init_phy_ops_82598(struct ixgbe_hw *hw)if (ret_val)return ret_val;if (hw->phy.sfp_type == ixgbe_sfp_type_unknown) -return IXGBE_ERR_SFP_NOT_SUPPORTED ; +return -EOPNOTSUPP ;/* Check to see if SFP+ module is supported */ ret_val =ixgbe_get_sfp_init_sequence_offsets (hw, &list_offset, &data_offset);if (ret_val) -return IXGBE_ERR_SFP_NOT_SUPPORTED ; +return -EOPNOTSUPP ;break ;default :break ;
@@ -213,7 +213,7 @@ static s32 ixgbe_get_link_capabilities_82598(struct ixgbe_hw *hw,break ;default : -return IXGBE_ERR_LINK_SETUP ; +return -EIO ; }return 0 ;
@@ -283,7 +283,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)/* Validate the water mark configuration */ if (!hw->fc.pause_time) -return IXGBE_ERR_INVALID_LINK_SETTINGS ; +return -EINVAL ;/* Low water mark of zero causes XOFF floods */ for (i =0 ; i <MAX_TRAFFIC_CLASS ; i++) {
@@ -292,7 +292,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)if (!hw->fc.low_water[i] || hw->fc.low_water[i] >= hw->fc.high_water[i]) {hw_dbg (hw,"Invalid water mark configuration\n" ); -return IXGBE_ERR_INVALID_LINK_SETTINGS ; +return -EINVAL ; } } }
@@ -369,7 +369,7 @@ static s32 ixgbe_fc_enable_82598(struct ixgbe_hw *hw)break ;default :hw_dbg (hw,"Flow control param set incorrectly\n" ); -return IXGBE_ERR_CONFIG ; +return -EIO ; }/* Set 802.3x based flow control settings. */
@@ -438,7 +438,7 @@ static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw,msleep (100 ); }if (!(links_reg &IXGBE_LINKS_KX_AN_COMP )) { - status =IXGBE_ERR_AUTONEG_NOT_COMPLETE ; + status = -EIO ;hw_dbg (hw,"Autonegotiation did not complete.\n" ); } }
@@ -478,7 +478,7 @@ static s32 ixgbe_validate_link_ready(struct ixgbe_hw *hw)if (timeout ==IXGBE_VALIDATE_LINK_READY_TIMEOUT ) {hw_dbg (hw,"Link was indicated but link is down\n" ); -return IXGBE_ERR_LINK_SETUP ; +return -EIO ; }return 0 ;
@@ -594,7 +594,7 @@ static s32 ixgbe_setup_mac_link_82598(struct ixgbe_hw *hw, speed &= link_capabilities;if (speed ==IXGBE_LINK_SPEED_UNKNOWN ) -return IXGBE_ERR_LINK_SETUP ; +return -EINVAL ;/* Set KX4/KX support according to speed requested */ else if (link_mode == IXGBE_AUTOC_LMS_KX4_AN ||
@@ -701,9 +701,9 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)/* Init PHY and function pointers, perform SFP setup */ phy_status = hw->phy.ops.init (hw); -if (phy_status ==IXGBE_ERR_SFP_NOT_SUPPORTED ) +if (phy_status == -EOPNOTSUPP )return phy_status; -if (phy_status ==IXGBE_ERR_SFP_NOT_PRESENT ) +if (phy_status == -ENOENT ) goto mac_reset_top; hw->phy.ops.reset (hw);
@@ -727,7 +727,7 @@ static s32 ixgbe_reset_hw_82598(struct ixgbe_hw *hw)udelay (1 ); }if (ctrl &IXGBE_CTRL_RST ) { - status =IXGBE_ERR_RESET_FAILED ; + status = -EIO ;hw_dbg (hw,"Reset polling failed to complete.\n" ); }
@@ -789,7 +789,7 @@ static s32 ixgbe_set_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)/* Make sure we are using a valid rar index range */ if (rar >= rar_entries) {hw_dbg (hw,"RAR index %d is out of range.\n" , rar); -return IXGBE_ERR_INVALID_ARGUMENT ; +return -EINVAL ; } rar_high =IXGBE_READ_REG (hw,IXGBE_RAH (rar));
@@ -814,7 +814,7 @@ static s32 ixgbe_clear_vmdq_82598(struct ixgbe_hw *hw, u32 rar, u32 vmdq)/* Make sure we are using a valid rar index range */ if (rar >= rar_entries) {hw_dbg (hw,"RAR index %d is out of range.\n" , rar); -return IXGBE_ERR_INVALID_ARGUMENT ; +return -EINVAL ; } rar_high =IXGBE_READ_REG (hw,IXGBE_RAH (rar));
@@ -845,7 +845,7 @@ static s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, u32 vind,u32 vftabyte;if (vlan >4095 ) -return IXGBE_ERR_PARAM ; +return -EINVAL ;/* Determine 32-bit word position in array */ regindex = (vlan >>5 ) &0x7F ;/* upper seven bits */
@@ -964,7 +964,7 @@ static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr, gssr =IXGBE_GSSR_PHY0_SM ;if (hw->mac.ops.acquire_swfw_sync (hw, gssr) !=0 ) -return IXGBE_ERR_SWFW_SYNC ; +return -EBUSY ;if (hw->phy.type == ixgbe_phy_nl) {/*
@@ -993,7 +993,7 @@ static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr,if (sfp_stat !=IXGBE_I2C_EEPROM_STATUS_PASS ) {hw_dbg (hw,"EEPROM read did not pass.\n" ); - status =IXGBE_ERR_SFP_NOT_PRESENT ; + status = -ENOENT ; goto out; }
@@ -1003,7 +1003,7 @@ static s32 ixgbe_read_i2c_phy_82598(struct ixgbe_hw *hw, u8 dev_addr, *eeprom_data = (u8)(sfp_data >>8 ); }else { - status =IXGBE_ERR_PHY ; + status = -EIO ; } out:
drivers/net/ethernet/intel/ixgbe/ixgbe_82599.c +30 -31
233 lines not on this page · raw message
drivers/net/ethernet/intel/ixgbe/ixgbe_common.c +67 -78
508 lines not on this page · raw message
drivers/net/ethernet/intel/ixgbe/ixgbe_ethtool.c +1 -1
@@ -3339,7 +3339,7 @@ static int ixgbe_get_module_eeprom(struct net_device *dev, {struct ixgbe_adapter *adapter =netdev_priv (dev);struct ixgbe_hw *hw = &adapter->hw; -s32 status =IXGBE_ERR_PHY_ADDR_INVALID ; +s32 status = -EFAULT ;u8 databyte =0xFF ;int i =0 ;
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +13 -13
@@ -5520,7 +5520,7 @@ static int ixgbe_non_sfp_link_config(struct ixgbe_hw *hw) {u32 speed;bool autoneg, link_up = false; -int ret =IXGBE_ERR_LINK_SETUP ; +int ret = -EIO ;if (hw->mac.ops.check_link) ret = hw->mac.ops.check_link (hw, &speed, &link_up, false);
@@ -5991,13 +5991,13 @@ void ixgbe_reset(struct ixgbe_adapter *adapter) err = hw->mac.ops.init_hw (hw);switch (err) {case 0 : -case IXGBE_ERR_SFP_NOT_PRESENT : -case IXGBE_ERR_SFP_NOT_SUPPORTED : +case -ENOENT : +case -EOPNOTSUPP :break ; -case IXGBE_ERR_PRIMARY_REQUESTS_PENDING : +case -EALREADY :e_dev_err ("primary disable timed out\n" );break ; -case IXGBE_ERR_EEPROM_VERSION : +case -EACCES :/* We are running on a pre-production device, log a warning */ e_dev_warn ("This device is a pre-production adapter/LOM. " "Please be aware there may be issues associated with "
@@ -7837,10 +7837,10 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter) adapter->sfp_poll_time = jiffies +IXGBE_SFP_POLL_JIFFIES -1 ; err = hw->phy.ops.identify_sfp (hw); -if (err ==IXGBE_ERR_SFP_NOT_SUPPORTED ) +if (err == -EOPNOTSUPP ) goto sfp_out; -if (err ==IXGBE_ERR_SFP_NOT_PRESENT ) { +if (err == -ENOENT ) {/* If no cable is present, then we need to reset * the next time we find a good cable. */ adapter->flags2 |=IXGBE_FLAG2_SFP_NEEDS_RESET ;
@@ -7866,7 +7866,7 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter)else err = hw->mac.ops.setup_sfp (hw); -if (err ==IXGBE_ERR_SFP_NOT_SUPPORTED ) +if (err == -EOPNOTSUPP ) goto sfp_out; adapter->flags |=IXGBE_FLAG_NEED_LINK_CONFIG ;
@@ -7875,8 +7875,8 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter) sfp_out:clear_bit (__IXGBE_IN_SFP_INIT, &adapter->state); -if ((err ==IXGBE_ERR_SFP_NOT_SUPPORTED ) && - (adapter->netdev->reg_state ==NETREG_REGISTERED )) { +if (err == -EOPNOTSUPP && + adapter->netdev->reg_state ==NETREG_REGISTERED ) {e_dev_err ("failed to initialize because an unsupported " "SFP+ module type was detected.\n" ); e_dev_err("Reload the driver after installing a "
@@ -10943,9 +10943,9 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent) err = hw->mac.ops.reset_hw (hw); hw->phy.reset_if_overtemp = false;ixgbe_set_eee_capable (adapter); -if (err ==IXGBE_ERR_SFP_NOT_PRESENT ) { +if (err == -ENOENT ) { err =0 ; - }else if (err ==IXGBE_ERR_SFP_NOT_SUPPORTED ) { + }else if (err == -EOPNOTSUPP ) {e_dev_err ("failed to load because an unsupported SFP+ or QSFP module type was detected.\n" );e_dev_err ("Reload the driver after installing a supported module.\n" ); goto err_sw_init;
@@ -11161,7 +11161,7 @@ static int ixgbe_probe(struct pci_dev *pdev, const struct pci_device_id *ent)/* reset the hardware with the new settings */ err = hw->mac.ops.start_hw (hw); -if (err ==IXGBE_ERR_EEPROM_VERSION ) { +if (err == -EACCES ) {/* We are running on a pre-production device, log a warning */ e_dev_warn ("This device is a pre-production adapter/LOM. " "Please be aware there may be issues associated "
drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.c +17 -17
@@ -24,7 +24,7 @@ s32 ixgbe_read_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id) size = mbx->size;if (!mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;return mbx->ops->read (hw, msg, size, mbx_id); }
@@ -43,10 +43,10 @@ s32 ixgbe_write_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size, u16 mbx_id)struct ixgbe_mbx_info *mbx = &hw->mbx;if (size > mbx->size) -return IXGBE_ERR_MBX ; +return -EINVAL ;if (!mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;return mbx->ops->write (hw, msg, size, mbx_id); }
@@ -63,7 +63,7 @@ s32 ixgbe_check_for_msg(struct ixgbe_hw *hw, u16 mbx_id)struct ixgbe_mbx_info *mbx = &hw->mbx;if (!mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;return mbx->ops->check_for_msg (hw, mbx_id); }
@@ -80,7 +80,7 @@ s32 ixgbe_check_for_ack(struct ixgbe_hw *hw, u16 mbx_id)struct ixgbe_mbx_info *mbx = &hw->mbx;if (!mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;return mbx->ops->check_for_ack (hw, mbx_id); }
@@ -97,7 +97,7 @@ s32 ixgbe_check_for_rst(struct ixgbe_hw *hw, u16 mbx_id)struct ixgbe_mbx_info *mbx = &hw->mbx;if (!mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;return mbx->ops->check_for_rst (hw, mbx_id); }
@@ -115,12 +115,12 @@ static s32 ixgbe_poll_for_msg(struct ixgbe_hw *hw, u16 mbx_id)int countdown = mbx->timeout;if (!countdown || !mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;while (mbx->ops->check_for_msg (hw, mbx_id)) { countdown--;if (!countdown) -return IXGBE_ERR_MBX ; +return -EIO ;udelay (mbx->usec_delay); }
@@ -140,12 +140,12 @@ static s32 ixgbe_poll_for_ack(struct ixgbe_hw *hw, u16 mbx_id)int countdown = mbx->timeout;if (!countdown || !mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ;while (mbx->ops->check_for_ack (hw, mbx_id)) { countdown--;if (!countdown) -return IXGBE_ERR_MBX ; +return -EIO ;udelay (mbx->usec_delay); }
@@ -169,7 +169,7 @@ static s32 ixgbe_read_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size,s32 ret_val;if (!mbx->ops) -return IXGBE_ERR_MBX ; +return -EIO ; ret_val =ixgbe_poll_for_msg (hw, mbx_id);if (ret_val)
@@ -197,7 +197,7 @@ static s32 ixgbe_write_posted_mbx(struct ixgbe_hw *hw, u32 *msg, u16 size,/* exit if either we can't write or there isn't a defined timeout */ if (!mbx->ops || !mbx->timeout) -return IXGBE_ERR_MBX ; +return -EIO ;/* send msg */ ret_val = mbx->ops->write (hw, msg, size, mbx_id);
@@ -217,7 +217,7 @@ static s32 ixgbe_check_for_bit_pf(struct ixgbe_hw *hw, u32 mask, s32 index)return 0 ; } -return IXGBE_ERR_MBX ; +return -EIO ; }/**
@@ -238,7 +238,7 @@ static s32 ixgbe_check_for_msg_pf(struct ixgbe_hw *hw, u16 vf_number)return 0 ; } -return IXGBE_ERR_MBX ; +return -EIO ; }/**
@@ -259,7 +259,7 @@ static s32 ixgbe_check_for_ack_pf(struct ixgbe_hw *hw, u16 vf_number)return 0 ; } -return IXGBE_ERR_MBX ; +return -EIO ; }/**
@@ -295,7 +295,7 @@ static s32 ixgbe_check_for_rst_pf(struct ixgbe_hw *hw, u16 vf_number)return 0 ; } -return IXGBE_ERR_MBX ; +return -EIO ; }/**
@@ -317,7 +317,7 @@ static s32 ixgbe_obtain_mbx_lock_pf(struct ixgbe_hw *hw, u16 vf_number)if (p2v_mailbox &IXGBE_PFMAILBOX_PFU )return 0 ; -return IXGBE_ERR_MBX ; +return -EIO ; }/**
drivers/net/ethernet/intel/ixgbe/ixgbe_mbx.h +0 -1
@@ -7,7 +7,6 @@#include "ixgbe_type.h" #define IXGBE_VFMAILBOX_SIZE 16/* 16 32 bit words - 64 bytes */ -#define IXGBE_ERR_MBX -100#define IXGBE_VFMAILBOX 0x002FC#define IXGBE_VFMBMEM 0x00200
drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c +42 -42
321 lines not on this page · raw message
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c +1 -1
@@ -1329,7 +1329,7 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)break ;default :e_err (drv,"Unhandled Msg %8.8x\n" , msgbuf[0 ]); - retval =IXGBE_ERR_MBX ; + retval = -EIO ;break ; }
drivers/net/ethernet/intel/ixgbe/ixgbe_type.h +0 -39
@@ -3665,45 +3665,6 @@ struct ixgbe_info {const u32 *mvals; }; - -/* Error Codes */ -#define IXGBE_ERR_EEPROM -1 -#define IXGBE_ERR_EEPROM_CHECKSUM -2 -#define IXGBE_ERR_PHY -3 -#define IXGBE_ERR_CONFIG -4 -#define IXGBE_ERR_PARAM -5 -#define IXGBE_ERR_MAC_TYPE -6 -#define IXGBE_ERR_UNKNOWN_PHY -7 -#define IXGBE_ERR_LINK_SETUP -8 -#define IXGBE_ERR_ADAPTER_STOPPED -9 -#define IXGBE_ERR_INVALID_MAC_ADDR -10 -#define IXGBE_ERR_DEVICE_NOT_SUPPORTED -11 -#define IXGBE_ERR_PRIMARY_REQUESTS_PENDING -12 -#define IXGBE_ERR_INVALID_LINK_SETTINGS -13 -#define IXGBE_ERR_AUTONEG_NOT_COMPLETE -14 -#define IXGBE_ERR_RESET_FAILED -15 -#define IXGBE_ERR_SWFW_SYNC -16 -#define IXGBE_ERR_PHY_ADDR_INVALID -17 -#define IXGBE_ERR_I2C -18 -#define IXGBE_ERR_SFP_NOT_SUPPORTED -19 -#define IXGBE_ERR_SFP_NOT_PRESENT -20 -#define IXGBE_ERR_SFP_NO_INIT_SEQ_PRESENT -21 -#define IXGBE_ERR_NO_SAN_ADDR_PTR -22 -#define IXGBE_ERR_FDIR_REINIT_FAILED -23 -#define IXGBE_ERR_EEPROM_VERSION -24 -#define IXGBE_ERR_NO_SPACE -25 -#define IXGBE_ERR_OVERTEMP -26 -#define IXGBE_ERR_FC_NOT_NEGOTIATED -27 -#define IXGBE_ERR_FC_NOT_SUPPORTED -28 -#define IXGBE_ERR_SFP_SETUP_NOT_COMPLETE -30 -#define IXGBE_ERR_PBA_SECTION -31 -#define IXGBE_ERR_INVALID_ARGUMENT -32 -#define IXGBE_ERR_HOST_INTERFACE_COMMAND -33 -#define IXGBE_ERR_FDIR_CMD_INCOMPLETE -38 -#define IXGBE_ERR_FW_RESP_INVALID -39 -#define IXGBE_ERR_TOKEN_RETRY -40 -#define IXGBE_NOT_IMPLEMENTED 0x7FFFFFFF -#define IXGBE_FUSES0_GROUP (_i) (0x11158 + ((_i) * 4))#define IXGBE_FUSES0_300MHZ BIT(5)#define IXGBE_FUSES0_REV_MASK (3u << 6)
drivers/net/ethernet/intel/ixgbe/ixgbe_x540.c +22 -22
173 lines not on this page · raw message
drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c +53 -54
409 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 196/219 ixgbe: Refactor overtemp event handling
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jedrzej Jagielski <[email protected]>
[ Upstream commit 6c1b4af8c1b20c70dde01e58381685d6a4a1d2c8 ]
Currently ixgbe driver is notified of overheating events via internal IXGBE_ERR_OVERTEMP error code.
Change the approach for handle_lasi() to use freshly introduced is_overtemp function parameter which set when such event occurs. Change check_overtemp() to bool and return true if overtemp event occurs.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 16 +++----- drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | 21 +++++----- drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h | 2 +- drivers/net/ethernet/intel/ixgbe/ixgbe_type.h | 4 +- drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | 41 +++++++++++-------- 5 files changed, 43 insertions(+), 41 deletions(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c +6 -10
@@ -2764,7 +2764,6 @@ static void ixgbe_check_overtemp_subtask(struct ixgbe_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw;u32 eicr = adapter->interrupt_event; -s32 rc;if (test_bit (__IXGBE_DOWN, &adapter->state))return ;
@@ -2798,14 +2797,13 @@ static void ixgbe_check_overtemp_subtask(struct ixgbe_adapter *adapter) }/* Check if this is not due to overtemp */ -if (hw->phy.ops.check_overtemp (hw) !=IXGBE_ERR_OVERTEMP ) +if (!hw->phy.ops.check_overtemp (hw))return ;break ;case IXGBE_DEV_ID_X550EM_A_1G_T :case IXGBE_DEV_ID_X550EM_A_1G_T_L : - rc = hw->phy.ops.check_overtemp (hw); -if (rc !=IXGBE_ERR_OVERTEMP ) +if (!hw->phy.ops.check_overtemp (hw))return ;break ;default :
@@ -7946,7 +7944,7 @@ static void ixgbe_service_timer(struct timer_list *t)static void ixgbe_phy_interrupt_subtask (struct ixgbe_adapter *adapter) {struct ixgbe_hw *hw = &adapter->hw; -u32 status; +bool overtemp;if (!(adapter->flags2 &IXGBE_FLAG2_PHY_INTERRUPT ))return ;
@@ -7956,11 +7954,9 @@ static void ixgbe_phy_interrupt_subtask(struct ixgbe_adapter *adapter)if (!hw->phy.ops.handle_lasi)return ; - status = hw->phy.ops.handle_lasi (&adapter->hw); -if (status !=IXGBE_ERR_OVERTEMP ) -return ; - -e_crit (drv,"%s\n" , ixgbe_overheat_msg); + hw->phy.ops.handle_lasi (&adapter->hw, &overtemp); +if (overtemp) +e_crit (drv,"%s\n" , ixgbe_overheat_msg); }static void ixgbe_reset_subtask (struct ixgbe_adapter *adapter)
drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c +11 -10
@@ -408,8 +408,7 @@ s32 ixgbe_reset_phy_generic(struct ixgbe_hw *hw)return status;/* Don't reset PHY if it's shut down due to overtemp. */ -if (!hw->phy.reset_if_overtemp && - (IXGBE_ERR_OVERTEMP == hw->phy.ops.check_overtemp (hw))) +if (!hw->phy.reset_if_overtemp && hw->phy.ops.check_overtemp (hw))return 0 ;/* Blocked by MNG FW so bail */
@@ -2621,22 +2620,24 @@ static void ixgbe_i2c_bus_clear(struct ixgbe_hw *hw)* @hw: pointer to hardware structure * * Checks if the LASI temp alarm status was triggered due to overtemp +* +* Return true when an overtemp event detected, otherwise false. **/ -s32 ixgbe_tn_check_overtemp (struct ixgbe_hw *hw) +bool ixgbe_tn_check_overtemp (struct ixgbe_hw *hw) {u16 phy_data =0 ; +u32 status;if (hw->device_id !=IXGBE_DEV_ID_82599_T3_LOM ) -return 0 ; +return false;/* Check that the LASI temp alarm status was triggered */ - hw->phy.ops.read_reg (hw,IXGBE_TN_LASI_STATUS_REG , -MDIO_MMD_PMAPMD , &phy_data); - -if (!(phy_data &IXGBE_TN_LASI_STATUS_TEMP_ALARM )) -return 0 ; + status = hw->phy.ops.read_reg (hw,IXGBE_TN_LASI_STATUS_REG , +MDIO_MMD_PMAPMD , &phy_data); +if (status) +return false; -return IXGBE_ERR_OVERTEMP ; +return !!(phy_data &IXGBE_TN_LASI_STATUS_TEMP_ALARM ); }/** ixgbe_set_copper_phy_power - Control power for copper phy
drivers/net/ethernet/intel/ixgbe/ixgbe_phy.h +1 -1
@@ -155,7 +155,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw);s32 ixgbe_get_sfp_init_sequence_offsets (struct ixgbe_hw *hw,u16 *list_offset,u16 *data_offset); -s32 ixgbe_tn_check_overtemp (struct ixgbe_hw *hw); +bool ixgbe_tn_check_overtemp (struct ixgbe_hw *hw);s32 ixgbe_read_i2c_byte_generic (struct ixgbe_hw *hw,u8 byte_offset,u8 dev_addr,u8 *data); s32 ixgbe_read_i2c_byte_generic_unlocked(struct ixgbe_hw *hw, u8 byte_offset,
drivers/net/ethernet/intel/ixgbe/ixgbe_type.h +2 -2
@@ -3509,10 +3509,10 @@ struct ixgbe_phy_operations {s32 (*read_i2c_sff8472)(struct ixgbe_hw *,u8 ,u8 *);s32 (*read_i2c_eeprom)(struct ixgbe_hw *,u8 ,u8 *);s32 (*write_i2c_eeprom)(struct ixgbe_hw *,u8 ,u8 ); -s32 (*check_overtemp)(struct ixgbe_hw *); +bool (*check_overtemp)(struct ixgbe_hw *);s32 (*set_phy_power)(struct ixgbe_hw *,bool on);s32 (*enter_lplu)(struct ixgbe_hw *); -s32 (*handle_lasi)(struct ixgbe_hw *hw); +s32 (*handle_lasi)(struct ixgbe_hw *hw,bool *);s32 (*read_i2c_byte_unlocked)(struct ixgbe_hw *,u8 offset,u8 addr,u8 *value); s32 (*write_i2c_byte_unlocked)(struct ixgbe_hw *, u8 offset, u8 addr,
drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c +23 -18
117 lines not on this page · raw message
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 197/219 ixgbe: Fix an error handling path in ixgbe_read_iosf_sb_reg_x550()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe JAILLET <[email protected]>
[ Upstream commit bbc404d20d1b46d89b461918bc44587620eda200 ]
All error handling paths, except this one, go to 'out' where release_swfw_sync() is called.
This call balances the acquire_swfw_sync() call done at the beginning of the function.
Branch to the error handling path in order to correctly release some resources in case of error.
--- drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c +2 -1
@@ -717,7 +717,8 @@ static s32 ixgbe_read_iosf_sb_reg_x550(struct ixgbe_hw *hw, u32 reg_addr, error = (command &IXGBE_SB_IOSF_CTRL_CMPL_ERR_MASK ) >>IXGBE_SB_IOSF_CTRL_CMPL_ERR_SHIFT ;hw_dbg (hw,"Failed to read, error %x\n" , error); -return -EIO ; + ret = -EIO ; + goto out; }if (!ret)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 198/219 net: dsa: qca8k: fix illegal usage of GPIO
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Vokáč <[email protected]>
[ Upstream commit c44fc98f0a8ffd94fa0bd291928e7e312ffc7ca4 ]
When working with GPIO, its direction must be set either when the GPIO is requested by gpiod_get*() or later on by one of the gpiod_direction_*() functions. Neither of this is done here which results in undefined behavior on some systems.
As the reset GPIO is used right after it is requested here, it makes sense to configure it as GPIOD_OUT_HIGH right away. With that, the following gpiod_set_value_cansleep(1) becomes redundant and can be safely removed.
--- drivers/net/dsa/qca/qca8k-8xxx.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/dsa/qca/qca8k-8xxx.c +1 -2
@@ -1935,12 +1935,11 @@ qca8k_sw_probe(struct mdio_device *mdiodev) priv->info =of_device_get_match_data (priv->dev); priv->reset_gpio =devm_gpiod_get_optional (priv->dev,"reset" , -GPIOD_ASIS ); +GPIOD_OUT_HIGH );if (IS_ERR (priv->reset_gpio))return PTR_ERR (priv->reset_gpio);if (priv->reset_gpio) { -gpiod_set_value_cansleep (priv->reset_gpio,1 );/* The active low duration must be greater than 10 ms * and checkpatch.pl wants 20 ms. */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 199/219 ipv6: Ensure natural alignment of const ipv6 loopback and router addresses
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Helge Deller <[email protected]>
[ Upstream commit 60365049ccbacd101654a66ddcb299abfabd4fc5 ]
On a parisc64 kernel I sometimes notice this kernel warning:
Kernel unaligned access to 0x40ff8814 at ndisc_send_skb+0xc0/0x4d8
The address 0x40ff8814 points to the in6addr_linklocal_allrouters variable and the warning simply means that some ipv6 function tries to read a 64-bit word directly from the not-64-bit aligned in6addr_linklocal_allrouters variable.
Unaligned accesses are non-critical as the architecture or exception handlers usually will fix it up at runtime. Nevertheless it may trigger a performance penality for some architectures. For details read the "unaligned-memory-access" kernel documentation.
The patch below ensures that the ipv6 loopback and router addresses will always be naturally aligned. This prevents the unaligned accesses for all architectures.
--- net/ipv6/addrconf_core.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
net/ipv6/addrconf_core.c +14 -7
@@ -220,19 +220,26 @@ const struct ipv6_stub *ipv6_stub __read_mostly = &(struct ipv6_stub) {EXPORT_SYMBOL_GPL (ipv6_stub);/* IPv6 Wildcard Address and Loopback Address defined by RFC2553 */ -const struct in6_addr in6addr_loopback =IN6ADDR_LOOPBACK_INIT ; +const struct in6_addr in6addr_loopback__aligned(BITS_PER_LONG/8) + =IN6ADDR_LOOPBACK_INIT ;EXPORT_SYMBOL (in6addr_loopback); -const struct in6_addr in6addr_any =IN6ADDR_ANY_INIT ; +const struct in6_addr in6addr_any__aligned(BITS_PER_LONG/8) + =IN6ADDR_ANY_INIT ;EXPORT_SYMBOL (in6addr_any); -const struct in6_addr in6addr_linklocal_allnodes =IN6ADDR_LINKLOCAL_ALLNODES_INIT ; +const struct in6_addr in6addr_linklocal_allnodes__aligned(BITS_PER_LONG/8) + =IN6ADDR_LINKLOCAL_ALLNODES_INIT ;EXPORT_SYMBOL (in6addr_linklocal_allnodes); -const struct in6_addr in6addr_linklocal_allrouters =IN6ADDR_LINKLOCAL_ALLROUTERS_INIT ; +const struct in6_addr in6addr_linklocal_allrouters__aligned(BITS_PER_LONG/8) + =IN6ADDR_LINKLOCAL_ALLROUTERS_INIT ;EXPORT_SYMBOL (in6addr_linklocal_allrouters); -const struct in6_addr in6addr_interfacelocal_allnodes =IN6ADDR_INTERFACELOCAL_ALLNODES_INIT ; +const struct in6_addr in6addr_interfacelocal_allnodes__aligned(BITS_PER_LONG/8) + =IN6ADDR_INTERFACELOCAL_ALLNODES_INIT ;EXPORT_SYMBOL (in6addr_interfacelocal_allnodes); -const struct in6_addr in6addr_interfacelocal_allrouters =IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT ; +const struct in6_addr in6addr_interfacelocal_allrouters__aligned(BITS_PER_LONG/8) + =IN6ADDR_INTERFACELOCAL_ALLROUTERS_INIT ;EXPORT_SYMBOL (in6addr_interfacelocal_allrouters); -const struct in6_addr in6addr_sitelocal_allrouters =IN6ADDR_SITELOCAL_ALLROUTERS_INIT ; +const struct in6_addr in6addr_sitelocal_allrouters__aligned(BITS_PER_LONG/8) + =IN6ADDR_SITELOCAL_ALLROUTERS_INIT ;EXPORT_SYMBOL (in6addr_sitelocal_allrouters);static void snmp6_free_dev (struct inet6_dev *idev)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 200/219 llc: call sock_orphan() at release time
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit aa2b2eb3934859904c287bf5434647ba72e14c1c ]
syzbot reported an interesting trace [1] caused by a stale sk->sk_wq pointer in a closed llc socket.
In commit ff7b11aa481f ("net: socket: set sock->sk to NULL after calling proto_ops::release()") Eric Biggers hinted that some protocols are missing a sock_orphan(), we need to perform a full audit.
In net-next, I plan to clear sock->sk from sock_orphan() and amend Eric patch to add a warning.
[1]
BUG: KASAN: slab-use-after-free in list_empty include/linux/list.h:373 [inline] BUG: KASAN: slab-use-after-free in waitqueue_active include/linux/wait.h:127 [inline] BUG: KASAN: slab-use-after-free in sock_def_write_space_wfree net/core/sock.c:3384 [inline] BUG: KASAN: slab-use-after-free in sock_wfree+0x9a8/0x9d0 net/core/sock.c:2468 Read of size 8 at addr ffff88802f4fc880 by task ksoftirqd/1/27 CPU: 1 PID: 27 Comm: ksoftirqd/1 Not tainted 6.8.0-rc1-syzkaller-00049-g6098d87eaf31 #0 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.2-debian-1.16.2-1 04/01/2014 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0xd9/0x1b0 lib/dump_stack.c:106 print_address_description mm/kasan/report.c:377 [inline] print_report+0xc4/0x620 mm/kasan/report.c:488 kasan_report+0xda/0x110 mm/kasan/report.c:601 list_empty include/linux/list.h:373 [inline] waitqueue_active include/linux/wait.h:127 [inline] sock_def_write_space_wfree net/core/sock.c:3384 [inline] sock_wfree+0x9a8/0x9d0 net/core/sock.c:2468 skb_release_head_state+0xa3/0x2b0 net/core/skbuff.c:1080 skb_release_all net/core/skbuff.c:1092 [inline] napi_consume_skb+0x119/0x2b0 net/core/skbuff.c:1404 e1000_unmap_and_free_tx_resource+0x144/0x200 drivers/net/ethernet/intel/e1000/e1000_main.c:1970 e1000_clean_tx_irq drivers/net/ethernet/intel/e1000/e1000_main.c:3860 [inline] e1000_clean+0x4a1/0x26e0 drivers/net/ethernet/intel/e1000/e1000_main.c:3801 __napi_poll.constprop.0+0xb4/0x540 net/core/dev.c:6576 napi_poll net/core/dev.c:6645 [inline] net_rx_action+0x956/0xe90 net/core/dev.c:6778 __do_softirq+0x21a/0x8de kernel/softirq.c:553 run_ksoftirqd kernel/softirq.c:921 [inline] run_ksoftirqd+0x31/0x60 kernel/softirq.c:913 smpboot_thread_fn+0x660/0xa10 kernel/smpboot.c:164 kthread+0x2c6/0x3a0 kernel/kthread.c:388 ret_from_fork+0x45/0x80 arch/x86/kernel/process.c:147 ret_from_fork_asm+0x11/0x20 arch/x86/entry/entry_64.S:242 </TASK> Allocated by task 5167: kasan_save_stack+0x33/0x50 mm/kasan/common.c:47 kasan_save_track+0x14/0x30 mm/kasan/common.c:68 unpoison_slab_object mm/kasan/common.c:314 [inline] __kasan_slab_alloc+0x81/0x90 mm/kasan/common.c:340 kasan_slab_alloc include/linux/kasan.h:201 [inline] slab_post_alloc_hook mm/slub.c:3813 [inline] slab_alloc_node mm/slub.c:3860 [inline] kmem_cache_alloc_lru+0x142/0x6f0 mm/slub.c:3879 alloc_inode_sb include/linux/fs.h:3019 [inline] sock_alloc_inode+0x25/0x1c0 net/socket.c:308 alloc_inode+0x5d/0x220 fs/inode.c:260 new_inode_pseudo+0x16/0x80 fs/inode.c:1005 sock_alloc+0x40/0x270 net/socket.c:634 __sock_create+0xbc/0x800 net/socket.c:1535 sock_create net/socket.c:1622 [inline] __sys_socket_create net/socket.c:1659 [inline] __sys_socket+0x14c/0x260 net/socket.c:1706 __do_sys_socket net/socket.c:1720 [inline] __se_sys_socket net/socket.c:1718 [inline] __x64_sys_socket+0x72/0xb0 net/socket.c:1718 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xd3/0x250 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b Freed by task 0: kasan_save_stack+0x33/0x50 mm/kasan/common.c:47 kasan_save_track+0x14/0x30 mm/kasan/common.c:68 kasan_save_free_info+0x3f/0x60 mm/kasan/generic.c:640 poison_slab_object mm/kasan/common.c:241 [inline] __kasan_slab_free+0x121/0x1b0 mm/kasan/common.c:257 kasan_slab_free include/linux/kasan.h:184 [inline] slab_free_hook mm/slub.c:2121 [inline] slab_free mm/slub.c:4299 [inline] kmem_cache_free+0x129/0x350 mm/slub.c:4363 i_callback+0x43/0x70 fs/inode.c:249 rcu_do_batch kernel/rcu/tree.c:2158 [inline] rcu_core+0x819/0x1680 kernel/rcu/tree.c:2433 __do_softirq+0x21a/0x8de kernel/softirq.c:553 Last potentially related work creation: kasan_save_stack+0x33/0x50 mm/kasan/common.c:47 __kasan_record_aux_stack+0xba/0x100 mm/kasan/generic.c:586 __call_rcu_common.constprop.0+0x9a/0x7b0 kernel/rcu/tree.c:2683 destroy_inode+0x129/0x1b0 fs/inode.c:315 iput_final fs/inode.c:1739 [inline] iput.part.0+0x560/0x7b0 fs/inode.c:1765 iput+0x5c/0x80 fs/inode.c:1755 dentry_unlink_inode+0x292/0x430 fs/dcache.c:400 __dentry_kill+0x1ca/0x5f0 fs/dcache.c:603 dput.part.0+0x4ac/0x9a0 fs/dcache.c:845 dput+0x1f/0x30 fs/dcache.c:835 __fput+0x3b9/0xb70 fs/file_table.c:384 task_work_run+0x14d/0x240 kernel/task_work.c:180 exit_task_work include/linux/task_work.h:38 [inline] do_exit+0xa8a/0x2ad0 kernel/exit.c:871 do_group_exit+0xd4/0x2a0 kernel/exit.c:1020 __do_sys_exit_group kernel/exit.c:1031 [inline] __se_sys_exit_group kernel/exit.c:1029 [inline] __x64_sys_exit_group+0x3e/0x50 kernel/exit.c:1029 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xd3/0x250 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b The buggy address belongs to the object at ffff88802f4fc800 which belongs to the cache sock_inode_cache of size 1408
The buggy address is located 128 bytes inside of
freed 1408-byte region [ffff88802f4fc800, ffff88802f4fcd80)
The buggy address belongs to the physical page:
page:ffffea0000bd3e00 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x2f4f8 head:ffffea0000bd3e00 order:3 entire_mapcount:0 nr_pages_mapped:0 pincount:0 anon flags: 0xfff00000000840(slab|head|node=0|zone=1|lastcpupid=0x7ff)page_type: 0xffffffff()
raw: 00fff00000000840 ffff888013b06b40 0000000000000000 0000000000000001 raw: 0000000000000000 0000000080150015 00000001ffffffff 0000000000000000 page dumped because: kasan: bad access detected page_owner tracks the page as allocated page last allocated via order 3, migratetype Reclaimable, gfp_mask 0xd20d0(__GFP_IO|__GFP_FS|__GFP_NOWARN|__GFP_NORETRY|__GFP_COMP|__GFP_NOMEMALLOC|__GFP_RECLAIMABLE), pid 4956, tgid 4956 (sshd), ts 31423924727, free_ts 0 set_page_owner include/linux/page_owner.h:31 [inline] post_alloc_hook+0x2d0/0x350 mm/page_alloc.c:1533 prep_new_page mm/page_alloc.c:1540 [inline] get_page_from_freelist+0xa28/0x3780 mm/page_alloc.c:3311 __alloc_pages+0x22f/0x2440 mm/page_alloc.c:4567 __alloc_pages_node include/linux/gfp.h:238 [inline] alloc_pages_node include/linux/gfp.h:261 [inline] alloc_slab_page mm/slub.c:2190 [inline] allocate_slab mm/slub.c:2354 [inline] new_slab+0xcc/0x3a0 mm/slub.c:2407 ___slab_alloc+0x4af/0x19a0 mm/slub.c:3540 __slab_alloc.constprop.0+0x56/0xa0 mm/slub.c:3625 __slab_alloc_node mm/slub.c:3678 [inline] slab_alloc_node mm/slub.c:3850 [inline] kmem_cache_alloc_lru+0x379/0x6f0 mm/slub.c:3879 alloc_inode_sb include/linux/fs.h:3019 [inline] sock_alloc_inode+0x25/0x1c0 net/socket.c:308 alloc_inode+0x5d/0x220 fs/inode.c:260 new_inode_pseudo+0x16/0x80 fs/inode.c:1005 sock_alloc+0x40/0x270 net/socket.c:634 __sock_create+0xbc/0x800 net/socket.c:1535 sock_create net/socket.c:1622 [inline] __sys_socket_create net/socket.c:1659 [inline] __sys_socket+0x14c/0x260 net/socket.c:1706 __do_sys_socket net/socket.c:1720 [inline] __se_sys_socket net/socket.c:1718 [inline] __x64_sys_socket+0x72/0xb0 net/socket.c:1718 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xd3/0x250 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b
page_owner free stack trace missing
Memory state around the buggy address:
ffff88802f4fc780: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
ffff88802f4fc800: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
>ffff88802f4fc880: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff88802f4fc900: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff88802f4fc980: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb--- net/llc/af_llc.c | 2 ++ 1 file changed, 2 insertions(+)
net/llc/af_llc.c +2 -0
@@ -226,6 +226,8 @@ static int llc_ui_release(struct socket *sock) }netdev_put (llc->dev, &llc->dev_tracker);sock_put (sk); +sock_orphan (sk); + sock->sk =NULL ;llc_sk_free (sk); out:return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 201/219 bridge: mcast: fix disabled snooping after long uptime
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Lüssing <[email protected]>
[ Upstream commit f5c3eb4b7251baba5cd72c9e93920e710ac8194a ]
The original idea of the delay_time check was to not apply multicast snooping too early when an MLD querier appears. And to instead wait at least for MLD reports to arrive before switching from flooding to group based, MLD snooped forwarding, to avoid temporary packet loss.
However in a batman-adv mesh network it was noticed that after 248 days of uptime 32bit MIPS based devices would start to signal that they had stopped applying multicast snooping due to missing queriers - even though they were the elected querier and still sending MLD queries themselves.
While time_is_before_jiffies() generally is safe against jiffies wrap-arounds, like the code comments in jiffies.h explain, it won't be able to track a difference larger than ULONG_MAX/2. With a 32bit large jiffies and one jiffies tick every 10ms (CONFIG_HZ=100) on these MIPS devices running OpenWrt this would result in a difference larger than ULONG_MAX/2 after 248 (= 2^32/100/60/60/24/2) days and time_is_before_jiffies() would then start to return false instead of true. Leading to multicast snooping not being applied to multicast packets anymore.
Fix this issue by using a proper timer_list object which won't have this ULONG_MAX/2 difference limitation.
--- net/bridge/br_multicast.c | 20 +++++++++++++++----- net/bridge/br_private.h | 4 ++-- 2 files changed, 17 insertions(+), 7 deletions(-)
net/bridge/br_multicast.c +15 -5
@@ -1607,6 +1607,10 @@ static void br_ip6_multicast_querier_expired(struct timer_list *t) }#endif +static void br_multicast_query_delay_expired (struct timer_list *t) +{ +} +static void br_multicast_select_own_querier (struct net_bridge_mcast *brmctx,struct br_ip *ip,struct sk_buff *skb)
@@ -3024,7 +3028,7 @@ br_multicast_update_query_timer(struct net_bridge_mcast *brmctx, unsigned long max_delay) {if (!timer_pending (&query->timer)) - query->delay_time = jiffies + max_delay; +mod_timer (&query->delay_timer, jiffies + max_delay);mod_timer (&query->timer, jiffies + brmctx->multicast_querier_interval); }
@@ -3867,13 +3871,11 @@ void br_multicast_ctx_init(struct net_bridge *br, brmctx->multicast_querier_interval =255 *HZ ; brmctx->multicast_membership_interval =260 *HZ ; - brmctx->ip4_other_query.delay_time =0 ; brmctx->ip4_querier.port_ifidx =0 ;seqcount_spinlock_init (&brmctx->ip4_querier.seq, &br->multicast_lock); brmctx->multicast_igmp_version =2 ;#if IS_ENABLED (CONFIG_IPV6 ) brmctx->multicast_mld_version =1 ; - brmctx->ip6_other_query.delay_time =0 ; brmctx->ip6_querier.port_ifidx =0 ;seqcount_spinlock_init (&brmctx->ip6_querier.seq, &br->multicast_lock);#endif
@@ -3882,6 +3884,8 @@ void br_multicast_ctx_init(struct net_bridge *br, br_ip4_multicast_local_router_expired, 0);timer_setup (&brmctx->ip4_other_query.timer, br_ip4_multicast_querier_expired,0 ); +timer_setup (&brmctx->ip4_other_query.delay_timer, + br_multicast_query_delay_expired,0 );timer_setup (&brmctx->ip4_own_query.timer, br_ip4_multicast_query_expired,0 );#if IS_ENABLED (CONFIG_IPV6 )
@@ -3889,6 +3893,8 @@ void br_multicast_ctx_init(struct net_bridge *br, br_ip6_multicast_local_router_expired, 0);timer_setup (&brmctx->ip6_other_query.timer, br_ip6_multicast_querier_expired,0 ); +timer_setup (&brmctx->ip6_other_query.delay_timer, + br_multicast_query_delay_expired,0 );timer_setup (&brmctx->ip6_own_query.timer, br_ip6_multicast_query_expired,0 );#endif
@@ -4023,10 +4029,12 @@ static void __br_multicast_stop(struct net_bridge_mcast *brmctx) {del_timer_sync (&brmctx->ip4_mc_router_timer);del_timer_sync (&brmctx->ip4_other_query.timer); +del_timer_sync (&brmctx->ip4_other_query.delay_timer);del_timer_sync (&brmctx->ip4_own_query.timer);#if IS_ENABLED (CONFIG_IPV6 )del_timer_sync (&brmctx->ip6_mc_router_timer);del_timer_sync (&brmctx->ip6_other_query.timer); +del_timer_sync (&brmctx->ip6_other_query.delay_timer);del_timer_sync (&brmctx->ip6_own_query.timer);#endif }
@@ -4469,13 +4477,15 @@ int br_multicast_set_querier(struct net_bridge_mcast *brmctx, unsigned long val) max_delay = brmctx->multicast_query_response_interval;if (!timer_pending (&brmctx->ip4_other_query.timer)) - brmctx->ip4_other_query.delay_time = jiffies + max_delay; +mod_timer (&brmctx->ip4_other_query.delay_timer, + jiffies + max_delay);br_multicast_start_querier (brmctx, &brmctx->ip4_own_query);#if IS_ENABLED (CONFIG_IPV6 )if (!timer_pending (&brmctx->ip6_other_query.timer)) - brmctx->ip6_other_query.delay_time = jiffies + max_delay; +mod_timer (&brmctx->ip6_other_query.delay_timer, + jiffies + max_delay);br_multicast_start_querier (brmctx, &brmctx->ip6_own_query);#endif
net/bridge/br_private.h +2 -2
@@ -77,7 +77,7 @@ struct bridge_mcast_own_query {/* other querier */ struct bridge_mcast_other_query {struct timer_list timer; -unsigned long delay_time; +struct timer_list delay_timer; };/* selected querier */
@@ -1083,7 +1083,7 @@ __br_multicast_querier_exists(struct net_bridge_mcast *brmctx, own_querier_enabled = false; } -return time_is_before_jiffies (querier->delay_time) && +return !timer_pending (&querier->delay_timer) && (own_querier_enabled ||timer_pending (&querier->timer)); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 202/219 selftests: net: add missing config for GENEVE
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthias May <[email protected]>
[ Upstream commit c9ec85153fea6873c52ed4f5055c87263f1b54f9 ]
l2_tos_ttl_inherit.sh verifies the inheritance of tos and ttl for GRETAP, VXLAN and GENEVE.
Before testing it checks if the required module is available and if not skips the tests accordingly.
Currently only GRETAP and VXLAN are tested because the GENEVE module is missing.
--- tools/testing/selftests/net/config | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/net/config +1 -0
@@ -13,6 +13,7 @@ CONFIG_IPV6_VTI=y CONFIG_DUMMY=y CONFIG_BRIDGE=y CONFIG_VLAN_8021Q=y +CONFIG_GENEVE=m CONFIG_IFB=y CONFIG_NETFILTER=y CONFIG_NETFILTER_ADVANCED=y
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 203/219 netfilter: conntrack: correct window scaling with retransmitted SYN
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ryan Schaefer <[email protected]>
[ Upstream commit fb366fc7541a1de521ab3df58471746aa793b833 ]
commit c7aab4f17021 ("netfilter: nf_conntrack_tcp: re-init for syn packets only") introduces a bug where SYNs in ORIGINAL direction on reused 5-tuple result in incorrect window scale negotiation. This commit merged the SYN re-initialization and simultaneous open or SYN retransmits cases. Merging this block added the logic in tcp_init_sender() that performed window scale negotiation to the retransmitted syn case. Previously. this would only result in updating the sender's scale and flags. After the merge the additional logic results in improperly clearing the scale in ORIGINAL direction before any packets in the REPLY direction are received. This results in packets incorrectly being marked invalid for being out-of-window.
This can be reproduced with the following trace:
Packet Sequence:
Quoted 2 lines
Flags [S], seq 1687765604, win 62727, options [.. wscale 7], length 0 Flags [S], seq 1944817196, win 62727, options [.. wscale 7], length 0
In order to fix the issue, only evaluate window negotiation for packets in the REPLY direction. This was tested with simultaneous open, fast open, and the above reproduction.
--- net/netfilter/nf_conntrack_proto_tcp.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
net/netfilter/nf_conntrack_proto_tcp.c +6 -4
@@ -457,7 +457,8 @@ static void tcp_init_sender(struct ip_ct_tcp_state *sender,const struct sk_buff *skb, unsigned int dataoff, const struct tcphdr *tcph, - u32 end, u32 win) + u32 end, u32 win, + enum ip_conntrack_dir dir) {/* SYN-ACK in reply to a SYN * or SYN from reply direction in simultaneous open.
@@ -471,7 +472,8 @@ static void tcp_init_sender(struct ip_ct_tcp_state *sender,* Both sides must send the Window Scale option * to enable window scaling in either direction. */ -if (!(sender->flags &IP_CT_TCP_FLAG_WINDOW_SCALE && +if (dir ==IP_CT_DIR_REPLY && + !(sender->flags &IP_CT_TCP_FLAG_WINDOW_SCALE && receiver->flags &IP_CT_TCP_FLAG_WINDOW_SCALE )) { sender->td_scale =0 ; receiver->td_scale =0 ;
@@ -542,7 +544,7 @@ tcp_in_window(struct nf_conn *ct, enum ip_conntrack_dir dir,if (tcph->syn) {tcp_init_sender (sender, receiver, skb, dataoff, tcph, - end, win); + end, win, dir);if (!tcph->ack)/* Simultaneous open */ return NFCT_TCP_ACCEPT ;
@@ -585,7 +587,7 @@ tcp_in_window(struct nf_conn *ct, enum ip_conntrack_dir dir,*/ tcp_init_sender (sender, receiver, skb, dataoff, tcph, - end, win); + end, win, dir);if (dir ==IP_CT_DIR_REPLY && !tcph->ack)return NFCT_TCP_ACCEPT ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 204/219 netfilter: nf_tables: restrict tunnel object to NFPROTO_NETDEV
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 776d451648443f9884be4a1b4e38e8faf1c621f9 ]
Bail out on using the tunnel dst template from other than netdev family. Add the infrastructure to check for the family in objects.
--- include/net/netfilter/nf_tables.h | 2 ++ net/netfilter/nf_tables_api.c | 14 +++++++++----- net/netfilter/nft_tunnel.c | 1 + 3 files changed, 12 insertions(+), 5 deletions(-)
include/net/netfilter/nf_tables.h +2 -0
@@ -1286,6 +1286,7 @@ void nft_obj_notify(struct net *net, const struct nft_table *table,* @type: stateful object numeric type * @owner: module owner * @maxattr: maximum netlink attribute +* @family: address family for AF-specific object types * @policy: netlink attribute policy */ struct nft_object_type {
@@ -1295,6 +1296,7 @@ struct nft_object_type {struct list_head list;u32 type;unsigned int maxattr; +u8 family;struct module *owner;const struct nla_policy *policy; };
net/netfilter/nf_tables_api.c +9 -5
@@ -7129,11 +7129,15 @@ static int nft_object_dump(struct sk_buff *skb, unsigned int attr,return -1 ; } -static const struct nft_object_type *__nft_obj_type_get (u32 objtype) +static const struct nft_object_type *__nft_obj_type_get (u32 objtype,u8 family) {const struct nft_object_type *type;list_for_each_entry (type, &nf_tables_objects, list) { +if (type->family !=NFPROTO_UNSPEC && + type->family != family) +continue ; +if (objtype == type->type)return type; }
@@ -7141,11 +7145,11 @@ static const struct nft_object_type *__nft_obj_type_get(u32 objtype) }static const struct nft_object_type * -nft_obj_type_get (struct net *net,u32 objtype) +nft_obj_type_get (struct net *net,u32 objtype,u8 family) {const struct nft_object_type *type; - type =__nft_obj_type_get (objtype); + type =__nft_obj_type_get (objtype, family);if (type !=NULL &&try_module_get (type->owner))return type;
@@ -7238,7 +7242,7 @@ static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info,if (info->nlh->nlmsg_flags &NLM_F_REPLACE )return -EOPNOTSUPP ; - type =__nft_obj_type_get (objtype); + type =__nft_obj_type_get (objtype, family);if (WARN_ON_ONCE (!type))return -ENOENT ;
@@ -7252,7 +7256,7 @@ static int nf_tables_newobj(struct sk_buff *skb, const struct nfnl_info *info,if (!nft_use_inc (&table->use))return -EMFILE ; - type =nft_obj_type_get (net, objtype); + type =nft_obj_type_get (net, objtype, family);if (IS_ERR (type)) { err =PTR_ERR (type); goto err_type;
net/netfilter/nft_tunnel.c +1 -0
@@ -713,6 +713,7 @@ static const struct nft_object_ops nft_tunnel_obj_ops = {static struct nft_object_type nft_tunnel_obj_type__read_mostly = { .type =NFT_OBJECT_TUNNEL , + .family =NFPROTO_NETDEV , .ops = &nft_tunnel_obj_ops, .maxattr =NFTA_TUNNEL_KEY_MAX , .policy = nft_tunnel_key_policy,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 205/219 netfilter: nf_log: replace BUG_ON by WARN_ON_ONCE when putting logger
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 259eb32971e9eb24d1777a28d82730659f50fdcb ]
Module reference is bumped for each user, this should not ever happen.
But BUG_ON check should use rcu_access_pointer() instead.
If this ever happens, do WARN_ON_ONCE() instead of BUG_ON() and consolidate pointer check under the rcu read side lock section.
--- net/netfilter/nf_log.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
net/netfilter/nf_log.c +4 -3
@@ -193,11 +193,12 @@ void nf_logger_put(int pf, enum nf_log_type type)return ; } -BUG_ON (loggers[pf][type] ==NULL ); -rcu_read_lock (); logger =rcu_dereference (loggers[pf][type]); -module_put (logger->me); +if (!logger) +WARN_ON_ONCE (1 ); +else +module_put (logger->me);rcu_read_unlock (); }EXPORT_SYMBOL_GPL (nf_logger_put);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 206/219 netfilter: nft_ct: sanitize layer 3 and 4 protocol number in custom expectations
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 8059918a1377f2f1fff06af4f5a4ed3d5acd6bc4 ]
- Disallow families other than NFPROTO_{IPV4,IPV6,INET}.
- Disallow layer 4 protocol with no ports, since destination port is a mandatory attribute for this object.
--- net/netfilter/nft_ct.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
net/netfilter/nft_ct.c +24 -0
@@ -1231,7 +1231,31 @@ static int nft_ct_expect_obj_init(const struct nft_ctx *ctx,if (tb[NFTA_CT_EXPECT_L3PROTO ]) priv->l3num =ntohs (nla_get_be16 (tb[NFTA_CT_EXPECT_L3PROTO ])); +switch (priv->l3num) { +case NFPROTO_IPV4 : +case NFPROTO_IPV6 : +if (priv->l3num != ctx->family) +return -EINVAL ; + + fallthrough; +case NFPROTO_INET : +break ; +default : +return -EOPNOTSUPP ; + } + priv->l4proto =nla_get_u8 (tb[NFTA_CT_EXPECT_L4PROTO ]); +switch (priv->l4proto) { +case IPPROTO_TCP : +case IPPROTO_UDP : +case IPPROTO_UDPLITE : +case IPPROTO_DCCP : +case IPPROTO_SCTP : +break ; +default : +return -EOPNOTSUPP ; + } + priv->dport =nla_get_be16 (tb[NFTA_CT_EXPECT_DPORT ]); priv->timeout =nla_get_u32 (tb[NFTA_CT_EXPECT_TIMEOUT ]); priv->size =nla_get_u8 (tb[NFTA_CT_EXPECT_SIZE ]);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 207/219 net: ipv4: fix a memleak in ip_setup_cork
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhipeng Lu <[email protected]>
[ Upstream commit 5dee6d6923458e26966717f2a3eae7d09fc10bf6 ]
When inetdev_valid_mtu fails, cork->opt should be freed if it is allocated in ip_setup_cork. Otherwise there could be a memleak.
--- net/ipv4/ip_output.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
net/ipv4/ip_output.c +6 -6
@@ -1268,6 +1268,12 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork,if (unlikely (!rt))return -EFAULT ; + cork->fragsize =ip_sk_use_pmtu (sk) ? +dst_mtu (&rt->dst) :READ_ONCE (rt->dst.dev->mtu); + +if (!inetdev_valid_mtu (cork->fragsize)) +return -ENETUNREACH ; +/* * setup for corking. */
@@ -1284,12 +1290,6 @@ static int ip_setup_cork(struct sock *sk, struct inet_cork *cork, cork->addr = ipc->addr; } - cork->fragsize =ip_sk_use_pmtu (sk) ? -dst_mtu (&rt->dst) :READ_ONCE (rt->dst.dev->mtu); - -if (!inetdev_valid_mtu (cork->fragsize)) -return -ENETUNREACH ; - cork->gso_size = ipc->gso_size; cork->dst = &rt->dst;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 208/219 af_unix: fix lockdep positive in sk_diag_dump_icons()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 4d322dce82a1d44f8c83f0f54f95dd1b8dcf46c9 ]
syzbot reported a lockdep splat [1].
Blamed commit hinted about the possible lockdep
violation, and code used unix_state_lock_nested()
in an attempt to silence lockdep.
It is not sufficient, because unix_state_lock_nested() is already used from unix_state_double_lock().
We need to use a separate subclass.
This patch adds a distinct enumeration to make things more explicit.
Also use swap() in unix_state_double_lock() as a clean up.
v2: add a missing inline keyword to unix_state_lock_nested()
[1]
WARNING: possible circular locking dependency detected 6.8.0-rc1-syzkaller-00356-g8a696a29c690 #0 Not tainted
syz-executor.1/2542 is trying to acquire lock:
ffff88808b5df9e8 (rlock-AF_UNIX){+.+.}-{2:2}, at: skb_queue_tail+0x36/0x120 net/core/skbuff.c:3863
but task is already holding lock:
ffff88808b5dfe70 (&u->lock/1){+.+.}-{2:2}, at: unix_dgram_sendmsg+0xfc7/0x2200 net/unix/af_unix.c:2089
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #1 (&u->lock/1){+.+.}-{2:2}:
lock_acquire+0x1e3/0x530 kernel/locking/lockdep.c:5754
_raw_spin_lock_nested+0x31/0x40 kernel/locking/spinlock.c:378
sk_diag_dump_icons net/unix/diag.c:87 [inline]
sk_diag_fill+0x6ea/0xfe0 net/unix/diag.c:157
sk_diag_dump net/unix/diag.c:196 [inline]
unix_diag_dump+0x3e9/0x630 net/unix/diag.c:220
netlink_dump+0x5c1/0xcd0 net/netlink/af_netlink.c:2264
__netlink_dump_start+0x5d7/0x780 net/netlink/af_netlink.c:2370
netlink_dump_start include/linux/netlink.h:338 [inline]
unix_diag_handler_dump+0x1c3/0x8f0 net/unix/diag.c:319
sock_diag_rcv_msg+0xe3/0x400
netlink_rcv_skb+0x1df/0x430 net/netlink/af_netlink.c:2543
sock_diag_rcv+0x2a/0x40 net/core/sock_diag.c:280
netlink_unicast_kernel net/netlink/af_netlink.c:1341 [inline]
netlink_unicast+0x7e6/0x980 net/netlink/af_netlink.c:1367
netlink_sendmsg+0xa37/0xd70 net/netlink/af_netlink.c:1908
sock_sendmsg_nosec net/socket.c:730 [inline]
__sock_sendmsg net/socket.c:745 [inline]
sock_write_iter+0x39a/0x520 net/socket.c:1160
call_write_iter include/linux/fs.h:2085 [inline]
new_sync_write fs/read_write.c:497 [inline]
vfs_write+0xa74/0xca0 fs/read_write.c:590
ksys_write+0x1a0/0x2c0 fs/read_write.c:643
do_syscall_x64 arch/x86/entry/common.c:52 [inline]
do_syscall_64+0xf5/0x230 arch/x86/entry/common.c:83
entry_SYSCALL_64_after_hwframe+0x63/0x6b-> #0 (rlock-AF_UNIX){+.+.}-{2:2}:
check_prev_add kernel/locking/lockdep.c:3134 [inline]
check_prevs_add kernel/locking/lockdep.c:3253 [inline]
validate_chain+0x1909/0x5ab0 kernel/locking/lockdep.c:3869
__lock_acquire+0x1345/0x1fd0 kernel/locking/lockdep.c:5137
lock_acquire+0x1e3/0x530 kernel/locking/lockdep.c:5754
__raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline]
_raw_spin_lock_irqsave+0xd5/0x120 kernel/locking/spinlock.c:162
skb_queue_tail+0x36/0x120 net/core/skbuff.c:3863
unix_dgram_sendmsg+0x15d9/0x2200 net/unix/af_unix.c:2112
sock_sendmsg_nosec net/socket.c:730 [inline]
__sock_sendmsg net/socket.c:745 [inline]
____sys_sendmsg+0x592/0x890 net/socket.c:2584
___sys_sendmsg net/socket.c:2638 [inline]
__sys_sendmmsg+0x3b2/0x730 net/socket.c:2724
__do_sys_sendmmsg net/socket.c:2753 [inline]
__se_sys_sendmmsg net/socket.c:2750 [inline]
__x64_sys_sendmmsg+0xa0/0xb0 net/socket.c:2750
do_syscall_x64 arch/x86/entry/common.c:52 [inline]
do_syscall_64+0xf5/0x230 arch/x86/entry/common.c:83
entry_SYSCALL_64_after_hwframe+0x63/0x6bother info that might help us debug this:
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&u->lock/1);
lock(rlock-AF_UNIX);
lock(&u->lock/1); lock(rlock-AF_UNIX);
*** DEADLOCK ***
1 lock held by syz-executor.1/2542:
#0: ffff88808b5dfe70 (&u->lock/1){+.+.}-{2:2}, at: unix_dgram_sendmsg+0xfc7/0x2200 net/unix/af_unix.c:2089
stack backtrace: CPU: 1 PID: 2542 Comm: syz-executor.1 Not tainted 6.8.0-rc1-syzkaller-00356-g8a696a29c690 #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 11/17/2023 Call Trace: <TASK> __dump_stack lib/dump_stack.c:88 [inline] dump_stack_lvl+0x1e7/0x2d0 lib/dump_stack.c:106 check_noncircular+0x366/0x490 kernel/locking/lockdep.c:2187 check_prev_add kernel/locking/lockdep.c:3134 [inline] check_prevs_add kernel/locking/lockdep.c:3253 [inline] validate_chain+0x1909/0x5ab0 kernel/locking/lockdep.c:3869 __lock_acquire+0x1345/0x1fd0 kernel/locking/lockdep.c:5137 lock_acquire+0x1e3/0x530 kernel/locking/lockdep.c:5754 __raw_spin_lock_irqsave include/linux/spinlock_api_smp.h:110 [inline] _raw_spin_lock_irqsave+0xd5/0x120 kernel/locking/spinlock.c:162 skb_queue_tail+0x36/0x120 net/core/skbuff.c:3863 unix_dgram_sendmsg+0x15d9/0x2200 net/unix/af_unix.c:2112 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg net/socket.c:745 [inline] ____sys_sendmsg+0x592/0x890 net/socket.c:2584 ___sys_sendmsg net/socket.c:2638 [inline] __sys_sendmmsg+0x3b2/0x730 net/socket.c:2724 __do_sys_sendmmsg net/socket.c:2753 [inline] __se_sys_sendmmsg net/socket.c:2750 [inline] __x64_sys_sendmmsg+0xa0/0xb0 net/socket.c:2750 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0xf5/0x230 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b RIP: 0033:0x7f26d887cda9 Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 e1 20 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b0 ff ff ff f7 d8 64 89 01 48 RSP: 002b:00007f26d95a60c8 EFLAGS: 00000246 ORIG_RAX: 0000000000000133 RAX: ffffffffffffffda RBX: 00007f26d89abf80 RCX: 00007f26d887cda9 RDX: 000000000000003e RSI: 00000000200bd000 RDI: 0000000000000004 RBP: 00007f26d88c947a R08: 0000000000000000 R09: 0000000000000000 R10: 00000000000008c0 R11: 0000000000000246 R12: 0000000000000000 R13: 000000000000000b R14: 00007f26d89abf80 R15: 00007ffcfe081a68
--- include/net/af_unix.h | 20 ++++++++++++++------ net/unix/af_unix.c | 14 ++++++-------- net/unix/diag.c | 2 +- 3 files changed, 21 insertions(+), 15 deletions(-)
include/net/af_unix.h +14 -6
@@ -45,12 +45,6 @@ struct scm_stat {#define UNIXCB (skb) (*(struct unix_skb_parms *)&((skb)->cb)) -#define unix_state_lock (s) spin_lock(&unix_sk(s)->lock) -#define unix_state_unlock (s) spin_unlock(&unix_sk(s)->lock) -#define unix_state_lock_nested (s) \ - spin_lock_nested(&unix_sk(s)->lock, \ - SINGLE_DEPTH_NESTING) -/* The AF_UNIX socket */ struct unix_sock {/* WARNING: sk has to be the first member */
@@ -79,6 +73,20 @@ static inline struct unix_sock *unix_sk(const struct sock *sk) }#define unix_peer (sk) (unix_sk(sk)->peer) +#define unix_state_lock (s) spin_lock(&unix_sk(s)->lock) +#define unix_state_unlock (s) spin_unlock(&unix_sk(s)->lock) +enum unix_socket_lock_class { +U_LOCK_NORMAL , +U_LOCK_SECOND ,/* for double locking, see unix_state_double_lock(). */ +U_LOCK_DIAG ,/* used while dumping icons, see sk_diag_dump_icons(). */ +}; + +static inline void unix_state_lock_nested (struct sock *sk, +enum unix_socket_lock_class subclass) +{ +spin_lock_nested (&unix_sk (sk)->lock, subclass); +} +#define peer_wait peer_wq.waitlong unix_inq_len (struct sock *sk);
net/unix/af_unix.c +6 -8
@@ -1322,13 +1322,11 @@ static void unix_state_double_lock(struct sock *sk1, struct sock *sk2)unix_state_lock (sk1);return ; } -if (sk1 < sk2) { -unix_state_lock (sk1); -unix_state_lock_nested (sk2); - }else { -unix_state_lock (sk2); -unix_state_lock_nested (sk1); - } +if (sk1 > sk2) +swap (sk1, sk2); + +unix_state_lock (sk1); +unix_state_lock_nested (sk2,U_LOCK_SECOND ); }static void unix_state_double_unlock (struct sock *sk1,struct sock *sk2)
@@ -1559,7 +1557,7 @@ static int unix_stream_connect(struct socket *sock, struct sockaddr *uaddr, goto out_unlock; } -unix_state_lock_nested (sk); +unix_state_lock_nested (sk,U_LOCK_SECOND );if (sk->sk_state != st) {unix_state_unlock (sk);
net/unix/diag.c +1 -1
@@ -84,7 +84,7 @@ static int sk_diag_dump_icons(struct sock *sk, struct sk_buff *nlskb)* queue lock. With the other's queue locked it's * OK to lock the state. */ -unix_state_lock_nested (req); +unix_state_lock_nested (req,U_LOCK_DIAG ); peer =unix_sk (req)->peer; buf[i++] = (peer ?sock_i_ino (peer) :0 );unix_state_unlock (req);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 209/219 selftests: net: fix available tunnels detection
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit e4e4b6d568d2549583cbda3f8ce567e586cb05da ]
The pmtu.sh test tries to detect the tunnel protocols available in the running kernel and properly skip the unsupported cases.
In a few more complex setup, such detection is unsuccessful, as the script currently ignores some intermediate error code at setup time.
Before:
# which: no nettest in (/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin)
# TEST: vti6: PMTU exceptions (ESP-in-UDP) [FAIL]
# PMTU exception wasn't created after creating tunnel exceeding link layer MTU
# ./pmtu.sh: line 931: kill: (7543) - No such process
# ./pmtu.sh: line 931: kill: (7544) - No such process
After:
# xfrm4 not supported
# TEST: vti4: PMTU exceptions [SKIP]
--- tools/testing/selftests/net/pmtu.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
tools/testing/selftests/net/pmtu.sh +8 -8
@@ -713,23 +713,23 @@ setup_xfrm6() { } setup_xfrm4udp() { - setup_xfrm 4 ${veth4_a_addr} ${veth4_b_addr} "encap espinudp 4500 4500 0.0.0.0" - setup_nettest_xfrm 4 4500 + setup_xfrm 4 ${veth4_a_addr} ${veth4_b_addr} "encap espinudp 4500 4500 0.0.0.0" && \ + setup_nettest_xfrm 4 4500 } setup_xfrm6udp() { - setup_xfrm 6 ${veth6_a_addr} ${veth6_b_addr} "encap espinudp 4500 4500 0.0.0.0" - setup_nettest_xfrm 6 4500 + setup_xfrm 6 ${veth6_a_addr} ${veth6_b_addr} "encap espinudp 4500 4500 0.0.0.0" && \ + setup_nettest_xfrm 6 4500 } setup_xfrm4udprouted() { - setup_xfrm 4 ${prefix4}.${a_r1}.1 ${prefix4}.${b_r1}.1 "encap espinudp 4500 4500 0.0.0.0" - setup_nettest_xfrm 4 4500 + setup_xfrm 4 ${prefix4}.${a_r1}.1 ${prefix4}.${b_r1}.1 "encap espinudp 4500 4500 0.0.0.0" && \ + setup_nettest_xfrm 4 4500 } setup_xfrm6udprouted() { - setup_xfrm 6 ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 "encap espinudp 4500 4500 0.0.0.0" - setup_nettest_xfrm 6 4500 + setup_xfrm 6 ${prefix6}:${a_r1}::1 ${prefix6}:${b_r1}::1 "encap espinudp 4500 4500 0.0.0.0" && \ + setup_nettest_xfrm 6 4500 } setup_routing_old() {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 210/219 net: sysfs: Fix /sys/class/net/<iface> path
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit ae3f4b44641dfff969604735a0dcbf931f383285 ]
The documentation is pointing to the wrong path for the interface. Documentation is pointing to /sys/class/<iface>, instead of /sys/class/net/<iface>.
Fix it by adding the net/ directory before the interface.
--- .../ABI/testing/sysfs-class-net-queues | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-)
Documentation/ABI/testing/sysfs-class-net-queues +11 -11
@@ -1,4 +1,4 @@ -What: /sys/class/<iface>/queues/rx-<queue>/rps_cpus +What: /sys/class/net/<iface>/queues/rx-<queue>/rps_cpus Date: March 2010 KernelVersion: 2.6.35 Contact: [email protected]
@@ -8,7 +8,7 @@ Description: network device queue. Possible values depend on the number of available CPU(s) in the system. -What: /sys/class/<iface>/queues/rx-<queue>/rps_flow_cnt +What: /sys/class/net/<iface>/queues/rx-<queue>/rps_flow_cnt Date: April 2010 KernelVersion: 2.6.35 Contact: [email protected]
@@ -16,7 +16,7 @@ Description: Number of Receive Packet Steering flows being currently processed by this particular network device receive queue. -What: /sys/class/<iface>/queues/tx-<queue>/tx_timeout +What: /sys/class/net/<iface>/queues/tx-<queue>/tx_timeout Date: November 2011 KernelVersion: 3.3 Contact: [email protected]
@@ -24,7 +24,7 @@ Description: Indicates the number of transmit timeout events seen by this network interface transmit queue. -What: /sys/class/<iface>/queues/tx-<queue>/tx_maxrate +What: /sys/class/net/<iface>/queues/tx-<queue>/tx_maxrate Date: March 2015 KernelVersion: 4.1 Contact: [email protected]
@@ -32,7 +32,7 @@ Description: A Mbps max-rate set for the queue, a value of zero means disabled, default is disabled. -What: /sys/class/<iface>/queues/tx-<queue>/xps_cpus +What: /sys/class/net/<iface>/queues/tx-<queue>/xps_cpus Date: November 2010 KernelVersion: 2.6.38 Contact: [email protected]
@@ -42,7 +42,7 @@ Description: network device transmit queue. Possible vaules depend on the number of available CPU(s) in the system. -What: /sys/class/<iface>/queues/tx-<queue>/xps_rxqs +What: /sys/class/net/<iface>/queues/tx-<queue>/xps_rxqs Date: June 2018 KernelVersion: 4.18.0 Contact: [email protected]
@@ -53,7 +53,7 @@ Description: number of available receive queue(s) in the network device. Default is disabled. -What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/hold_time +What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/hold_time Date: November 2011 KernelVersion: 3.3 Contact: [email protected]
@@ -62,7 +62,7 @@ Description: of this particular network device transmit queue. Default value is 1000. -What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/inflight +What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/inflight Date: November 2011 KernelVersion: 3.3 Contact: [email protected]
@@ -70,7 +70,7 @@ Description: Indicates the number of bytes (objects) in flight on this network device transmit queue. -What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit +What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit Date: November 2011 KernelVersion: 3.3 Contact: [email protected]
@@ -79,7 +79,7 @@ Description: on this network device transmit queue. This value is clamped to be within the bounds defined by limit_max and limit_min. -What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit_max +What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit_max Date: November 2011 KernelVersion: 3.3 Contact: [email protected]
@@ -88,7 +88,7 @@ Description: queued on this network device transmit queue. See include/linux/dynamic_queue_limits.h for the default value. -What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit_min +What: /sys/class/net/<iface>/queues/tx-<queue>/byte_queue_limits/limit_min Date: November 2011 KernelVersion: 3.3 Contact: [email protected]
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 211/219 selftests: team: Add missing config options
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Poirier <[email protected]>
[ Upstream commit 7b6fb3050d8f5e2b6858eef344e47ac1f5442827 ]
Similar to commit dd2d40acdbb2 ("selftests: bonding: Add more missing config options"), add more networking-specific config options which are needed for team device tests.
For testing, I used the minimal config generated by virtme-ng and I added the options in the config file. Afterwards, the team device test passed.
--- tools/testing/selftests/drivers/net/team/config | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/testing/selftests/drivers/net/team/config +3 -1
@@ -1,3 +1,5 @@ +CONFIG_DUMMY=y +CONFIG_IPV6=y +CONFIG_MACVLAN=y CONFIG_NET_TEAM=y CONFIG_NET_TEAM_MODE_LOADBALANCE=y -CONFIG_MACVLAN=y
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 212/219 selftests: bonding: Check initial state
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Poirier <[email protected]>
[ Upstream commit 8cc063ae1b3dbe416ce62a15d49af4c2314b45fe ]
The purpose of the test_LAG_cleanup() function is to check that some hardware addresses are removed from underlying devices after they have been unenslaved. The test function simply checks that those addresses are not present at the end. However, if the addresses were never added to begin with due to some error in device setup, the test function currently passes. This is a false positive since in that situation the test did not actually exercise the intended functionality.
Add a check that the expected addresses are indeed present after device setup. This makes the test function more robust.
I noticed this problem when running the team/dev_addr_lists.sh test on a system without support for dummy and ipv6:
tools/testing/selftests/drivers/net/team# ./dev_addr_lists.sh
Error: Unknown device type.
Error: Unknown device type.
This program is not intended to be run as root. RTNETLINK answers: Operation not supported
TEST: team cleanup mode lacp [ OK ]
--- .../testing/selftests/drivers/net/bonding/lag_lib.sh | 11 +++++++++++ 1 file changed, 11 insertions(+)
tools/testing/selftests/drivers/net/bonding/lag_lib.sh +11 -0
@@ -46,6 +46,17 @@ test_LAG_cleanup() ip link add mv0 link "$name" up address "$ucaddr" type macvlan # Used to test dev->mc handling ip address add "$addr6" dev "$name" + + # Check that addresses were added as expected + (grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy1 || + grep_bridge_fdb "$ucaddr" bridge fdb show dev dummy2) >/dev/null + check_err $? "macvlan unicast address not found on a slave" + + # mcaddr is added asynchronously by addrconf_dad_work(), use busywait + (busywait 10000 grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy1 || + grep_bridge_fdb "$mcaddr" bridge fdb show dev dummy2) >/dev/null + check_err $? "IPv6 solicited-node multicast mac address not found on a slave" + ip link set dev "$name" down ip link del "$name"
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 213/219 arm64: irq: set the correct node for shadow call stack
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huang Shijie <[email protected]>
commit 7b1a09e44dc64f4f5930659b6d14a27183c00705 upstream.
The init_irq_stacks() has been changed to use the correct node:
https://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux.git/commit/?id=75b5e0bf90bf
The init_irq_scs() has the same issue with init_irq_stacks():
cpu_to_node() is not initialized yet, it does not work.
This patch uses early_cpu_to_node() to set the init_irq_scs() with the correct node.
--- arch/arm64/kernel/irq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/kernel/irq.c +1 -1
@@ -47,7 +47,7 @@ static void init_irq_scs(void)for_each_possible_cpu (cpu)per_cpu (irq_shadow_call_stack_ptr, cpu) = -scs_alloc (cpu_to_node (cpu)); +scs_alloc (early_cpu_to_node (cpu)); }#ifdef CONFIG_VMAP_STACK
Greg Kroah-Hartman
maintainerPATCH 214/219 mm, kmsan: fix infinite recursion due to RCU critical section
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marco Elver <[email protected]>
commit f6564fce256a3944aa1bc76cb3c40e792d97c1eb upstream.
Alexander Potapenko writes in [1]: "For every memory access in the code instrumented by KMSAN we call kmsan_get_metadata() to obtain the metadata for the memory being accessed. For virtual memory the metadata pointers are stored in the corresponding struct page, therefore we need to call virt_to_page() to get them.
According to the comment in arch/x86/include/asm/page.h, virt_to_page(kaddr) returns a valid pointer iff virt_addr_valid(kaddr) is true, so KMSAN needs to call virt_addr_valid() as well.
To avoid recursion, kmsan_get_metadata() must not call instrumented code, therefore ./arch/x86/include/asm/kmsan.h forks parts of arch/x86/mm/physaddr.c to check whether a virtual address is valid or not.
But the introduction of rcu_read_lock() to pfn_valid() added instrumented RCU API calls to virt_to_page_or_null(), which is called by kmsan_get_metadata(), so there is an infinite recursion now. I do not think it is correct to stop that recursion by doing kmsan_enter_runtime()/kmsan_exit_runtime() in kmsan_get_metadata(): that would prevent instrumented functions called from within the runtime from tracking the shadow values, which might introduce false positives."
Fix the issue by switching pfn_valid() to the _sched() variant of rcu_read_lock/unlock(), which does not require calling into RCU. Given the critical section in pfn_valid() is very small, this is a reasonable trade-off (with preemptible RCU).
KMSAN further needs to be careful to suppress calls into the scheduler, which would be another source of recursion. This can be done by wrapping the call to pfn_valid() into preempt_disable/enable_no_resched(). The downside is that this sacrifices breaking scheduling guarantees; however, a kernel compiled with KMSAN has already given up any performance guarantees due to being heavily instrumented.
Note, KMSAN code already disables tracing via Makefile, and since mmzone.h is included, it is not necessary to use the notrace variant, which is generally preferred in all other cases.
--- arch/x86/include/asm/kmsan.h | 17 ++++++++++++++++- include/linux/mmzone.h | 6 +++--- 2 files changed, 19 insertions(+), 4 deletions(-)
arch/x86/include/asm/kmsan.h +16 -1
@@ -64,6 +64,7 @@ static inline bool kmsan_virt_addr_valid {unsigned long x = (unsigned long )addr;unsigned long y = x - __START_KERNEL_map; +bool ret;/* use the carry flag to determine if x was < __START_KERNEL_map */ if (unlikely (x > y)) {
@@ -79,7 +80,21 @@ static inline bool kmsan_virt_addr_valid return false; } -return pfn_valid (x >>PAGE_SHIFT ); +/* +* pfn_valid() relies on RCU, and may call into the scheduler on exiting +* the critical section. However, this would result in recursion with +* KMSAN. Therefore, disable preemption here, and re-enable preemption +* below while suppressing reschedules to avoid recursion. +* +* Note, this sacrifices occasionally breaking scheduling guarantees. +* Although, a kernel compiled with KMSAN has already given up on any +* performance guarantees due to being heavily instrumented. +*/ +preempt_disable (); + ret =pfn_valid (x >>PAGE_SHIFT ); +preempt_enable_no_resched (); + +return ret; }#endif /* !MODULE */
include/linux/mmzone.h +3 -3
@@ -1854,9 +1854,9 @@ static inline int pfn_valid(unsigned lonif (pfn_to_section_nr (pfn) >=NR_MEM_SECTIONS )return 0 ; ms =__pfn_to_section (pfn); -rcu_read_lock (); +rcu_read_lock_sched ();if (!valid_section (ms)) { -rcu_read_unlock (); +rcu_read_unlock_sched ();return 0 ; }/*
@@ -1864,7 +1864,7 @@ static inline int pfn_valid(unsigned lon* the entire section-sized span. */ ret =early_section (ms) ||pfn_section_valid (ms, pfn); -rcu_read_unlock (); +rcu_read_unlock_sched ();return ret; }
PATCH 214/219 mm, kmsan: fix infinite recursion due to RCU critical section
Are there any plans to backport this to 5.15, or 5.10?
The buggy commit (commit id: 5ec8e8ea8b77 "mm/sparsemem: fix race in accessing memory_section->usage") this commit fixes was backported to 5.10 and 5.15 and wondering if there are any plans of backporting the fix to 5.10, or 5.15?
Greg KH
maintainerRe: [PATCH 6.1 214/219] mm, kmsan: fix infinite recursion due to RCU critical section
Quoted 6 lines · Arnav Kansal
Are there any plans to backport this to 5.15, or 5.10?
The buggy commit (commit id:
5ec8e8ea8b77"mm/sparsemem: fix race in accessingmemory_section->usage") this commit fixes was backported to 5.10 and 5.15 and wondering if there are any plans of backporting the fix to 5.10, or 5.15?
Does it apply cleanly there? If not, can you provide a working backport? If so, can you send the tested commit as well?
thanks,
greg k-h
Re: [PATCH 6.1 214/219] mm, kmsan: fix infinite recursion due to RCU critical section
It does not apply cleanly there. It seems to me that the commit (commit
id: 5ec8e8ea8b77 "mm/sparsemem: fix race in accessing memory_section->usage") is not a bug for 5.15 or 5.10 due to the absence of relevant KMSAN bits in those branches.
Greg KH
maintainerRe: [PATCH 6.1 214/219] mm, kmsan: fix infinite recursion due to RCU critical section
Quoted 4 lines · Arnav Kansal
It does not apply cleanly there. It seems to me that the commit (commit
id:5ec8e8ea8b77"mm/sparsemem: fix race in accessingmemory_section->usage") is not a bug for 5.15 or 5.10 due to the absence of relevant KMSAN bits in those branches.
I do not understand this message at all. What does not apply where?
confused,
greg k-h
Re: [PATCH 6.1 214/219] mm, kmsan: fix infinite recursion due to RCU critical section
I was initially interested in backporting the commit dc904345e3 ("mm,
kmsan: fix infinite recursion due to RCU critical section") to 5.10 and 5.15. However, this commit does not apply cleanly to those versions. Additionally, it seems this commit was intended to fix a bug introduced by commit 5ec8e8ea8b77 ("mm/sparsemem: fix race in accessing memory_section->usage") in 6.1, but that buggy commit may not be problematic in 5.10 or 5.15.
Thanks,
Arnav
Greg Kroah-Hartman
maintainerPATCH 215/219 Revert "drm/amd/display: Disable PSR-SU on Parade 0803 TCON again"
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Gray <[email protected]>
This reverts commit 85d16c03ddd3f9b10212674e16ee8662b185bd14.
duplicated a change made in 6.1.6920907717918f0487258424631b704c7248a72da2
--- drivers/gpu/drm/amd/display/modules/power/power_helpers.c | 2 -- 1 file changed, 2 deletions(-)
drivers/gpu/drm/amd/display/modules/power/power_helpers.c +0 -2
@@ -818,8 +818,6 @@ bool is_psr_su_specific_panel(struct dc_ isPSRSUSupported = false; else if (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x03) isPSRSUSupported = false; - else if (dpcd_caps->sink_dev_id_str[1] == 0x08 && dpcd_caps->sink_dev_id_str[0] == 0x03) - isPSRSUSupported = false; else if (dpcd_caps->psr_info.force_psrsu_cap == 0x1) isPSRSUSupported = true; }
Greg Kroah-Hartman
maintainerPATCH 216/219 drm/msm/dsi: Enable runtime PM
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konrad Dybcio <[email protected]>
commit 6ab502bc1cf3147ea1d8540d04b83a7a4cb6d1f1 upstream.
Some devices power the DSI PHY/PLL through a power rail that we model as a GENPD. Enable runtime PM to make it suspendable.
Patchwork: https://patchwork.freedesktop.org/patch/543352/
--- drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/msm/dsi/phy/dsi_phy.c +4 -0
@@ -673,6 +673,10 @@ static int dsi_phy_driver_probe(struct preturn dev_err_probe (dev,PTR_ERR (phy->ahb_clk),"Unable to get ahb clk\n" ); + ret =devm_pm_runtime_enable (&pdev->dev); +if (ret) +return ret; +/* PLL init will call into clk_register which requires * register access, so we need to enable power and ahb clock. */
Greg Kroah-Hartman
maintainerPATCH 217/219 LoongArch/smp: Call rcutree_report_cpu_starting() at tlb_init()
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Huacai Chen <[email protected]>
commit 5056c596c3d1848021a4eaa76ee42f4c05c50346 upstream.
Machines which have more than 8 nodes fail to boot SMP after commit a2ccf46333d7b2cf96 ("LoongArch/smp: Call rcutree_report_cpu_starting() earlier"). Because such machines use tlb-based per-cpu base address rather than dmw-based per-cpu base address, resulting per-cpu variables can only be accessed after tlb_init(). But rcutree_report_cpu_starting() is now called before tlb_init() and accesses per-cpu variables indeed.
Since the original patch want to avoid the lockdep warning caused by page allocation in tlb_init(), we can move rcutree_report_cpu_starting() to tlb_init() where after tlb exception configuration but before page allocation.
--- arch/loongarch/kernel/smp.c | 1 - arch/loongarch/mm/tlb.c | 16 ++++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-)
arch/loongarch/kernel/smp.c +0 -1
@@ -473,7 +473,6 @@ asmlinkage void start_secondary(void)sync_counter (); cpu =raw_smp_processor_id ();set_my_cpu_offset (per_cpu_offset (cpu)); -rcu_cpu_starting (cpu);cpu_probe ();constant_clockevent_init ();
arch/loongarch/mm/tlb.c +10 -6
@@ -271,12 +271,16 @@ void setup_tlb_handler(int cpu)set_handler (EXCCODE_TLBNR *VECSIZE , handle_tlb_protect,VECSIZE );set_handler (EXCCODE_TLBNX *VECSIZE , handle_tlb_protect,VECSIZE );set_handler (EXCCODE_TLBPE *VECSIZE , handle_tlb_protect,VECSIZE ); - } + }else { +int vec_sz__maybe_unused ; +void *addr__maybe_unused ; +struct page *page__maybe_unused ; + +/* Avoid lockdep warning */ +rcu_cpu_starting (cpu); +#ifdef CONFIG_NUMA - else { -void *addr; -struct page *page; -const int vec_sz =sizeof (exception_handlers); + vec_sz =sizeof (exception_handlers);if (pcpu_handlers[cpu])return ;
@@ -292,8 +296,8 @@ void setup_tlb_handler(int cpu)csr_write64 (pcpu_handlers[cpu],LOONGARCH_CSR_EENTRY );csr_write64 (pcpu_handlers[cpu],LOONGARCH_CSR_MERRENTRY );csr_write64 (pcpu_handlers[cpu] +80 *VECSIZE ,LOONGARCH_CSR_TLBRENTRY ); - }#endif + } }void tlb_init (int cpu)
Greg Kroah-Hartman
maintainerPATCH 218/219 gve: Fix use-after-free vulnerability
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Praveen Kaligineedi <[email protected]>
From: Bailey Forrest <[email protected]>
Call skb_shinfo() after gve_prep_tso() on DQO TX path. gve_prep_tso() calls skb_cow_head(), which may reallocate shinfo causing a use after free.
This bug was unintentionally fixed by 'a6fb8d5a8b69 ("gve: Tx path for DQO-QPL")' while adding DQO-QPL format support in 6.6. That patch is not appropriate for stable releases.
--- drivers/net/ethernet/google/gve/gve_tx_dqo.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/ethernet/google/gve/gve_tx_dqo.c +4 -1
@@ -350,6 +350,7 @@ static void gve_tx_fill_pkt_desc_dqo(str/* Validates and prepares `skb` for TSO. * * Returns header length, or < 0 if invalid. +* Warning : Might change skb->head (and thus skb_shinfo). */ static int gve_prep_tso (struct sk_buff *skb) {
@@ -451,8 +452,8 @@ gve_tx_fill_general_ctx_desc(struct gve_static int gve_tx_add_skb_no_copy_dqo (struct gve_tx_ring *tx,struct sk_buff *skb) { -const struct skb_shared_info *shinfo =skb_shinfo (skb);const bool is_gso =skb_is_gso (skb); +struct skb_shared_info *shinfo;u32 desc_idx = tx->dqo_tx.tail;struct gve_tx_pending_packet_dqo *pkt;
@@ -477,6 +478,8 @@ static int gve_tx_add_skb_no_copy_dqo(st desc_idx = (desc_idx +1 ) & tx->mask; } +/* Must get after gve_prep_tso(), which can change shinfo. */ + shinfo =skb_shinfo (skb);gve_tx_fill_general_ctx_desc (&tx->dqo.tx_ring[desc_idx].general_ctx, &metadata); desc_idx = (desc_idx +1 ) & tx->mask;
Greg Kroah-Hartman
maintainerPATCH 219/219 bonding: remove print in bond_verify_device_path
In reply to Greg Kroah-Hartman6.1-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhengchao Shao <[email protected]>
commit 486058f42a4728053ae69ebbf78e9731d8ce6f8b upstream.
As suggested by Paolo in link[1], if the memory allocation fails, the mm layer will emit a lot warning comprising the backtrace, so remove the print.
[1] https://lore.kernel.org/all/[email protected]/
--- drivers/net/bonding/bond_main.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
drivers/net/bonding/bond_main.c +1 -4
@@ -2943,11 +2943,8 @@ struct bond_vlan_tag *bond_verify_deviceif (start_dev == end_dev) { tags =kcalloc (level +1 ,sizeof (*tags),GFP_ATOMIC ); -if (!tags) { -net_err_ratelimited ("%s: %s: Failed to allocate tags\n" , - __func__, start_dev->name); +if (!tags)return ERR_PTR (-ENOMEM ); - } tags[level].vlan_proto =VLAN_N_VID ;return tags; }
Hello!
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.77 release. There are 219 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon, 05 Feb 2024 03:51:47 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.77-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
We're seeing lots of build problems and warnings with Clang 17 and Clang nightly:
-----8<-----
/builds/linux/drivers/usb/host/xhci.c:1684:37: error: variable 'slot_id' is uninitialized when used here [-Werror,-Wuninitialized]
1684 | ret = xhci_check_maxpacket(xhci, slot_id,
| ^~~~~~~
/builds/linux/drivers/usb/host/xhci.c:1652:22: note: initialize the variable 'slot_id' to silence this warning
1652 | unsigned int slot_id, ep_index;
| ^
| = 0 1 error generated.
make[5]: *** [/builds/linux/scripts/Makefile.build:250: drivers/usb/host/xhci.o] Error 1
----->8-----
Bisection points to:
commit 37ef029fe9a5639f12250f75f5d1594c6a11e181
Author: Mathias Nyman <[email protected]>
Date: Fri Dec 1 17:06:47 2023 +0200
xhci: fix possible null pointer deref during xhci urb enqueue
[ Upstream commit e2e2aacf042f52854c92775b7800ba668e0bdfe4 ]
Reverting the patch makes the build pass.
The problem manifests as build error in i386 and x86_64, and as new warnings on Arm, Arm64, and RISC-V.
Some reproducers:
tuxmake --runtime podman --target-arch arm --toolchain clang-17 --kconfig omap2plus_defconfig LLVM=1 LLVM_IAS=1 tuxmake --runtime podman --target-arch x86_64 --toolchain clang-17 --kconfig x86_64_defconfig LLVM=1 LLVM_IAS=1
Greetings!
Daniel Díaz
[email protected]
Greg Kroah-Hartman
maintainerQuoted 37 lines · Daniel Díaz
Hello!
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.77 release. There are 219 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon, 05 Feb 2024 03:51:47 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.77-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
We're seeing lots of build problems and warnings with Clang 17 and Clang nightly:
-----8<-----
/builds/linux/drivers/usb/host/xhci.c:1684:37: error: variable 'slot_id' is uninitialized when used here [-Werror,-Wuninitialized]
1684 | ret = xhci_check_maxpacket(xhci,slot_id,
| ^~~~~~~
/builds/linux/drivers/usb/host/xhci.c:1652:22: note: initialize the variable 'slot_id' to silence this warning1652 | unsigned int slot_id, ep_index; | ^ | = 01 error generated.
make[5]: *** [/builds/linux/scripts/Makefile.build:250:drivers/usb/host/xhci.o] Error 1
----->8-----Bisection points to:
Quoted 8 lines
commit
37ef029fe9a5639f12250f75f5d1594c6a11e181
Author: Mathias Nyman <[email protected]>
Date: Fri Dec 1 17:06:47 2023 +0200xhci: fix possible null pointer deref during xhci urb enqueue [ Upstream commit
e2e2aacf042f52854c92775b7800ba668e0bdfe4]Reverting the patch makes the build pass.
Thanks, will drop. Odd that gcc doesn't catch this as well :(
greg k-h
Quoted 42 lines · Greg Kroah-Hartman
Quoted 41 lines · Daniel Díaz
Hello!
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.77 release. There are 219 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon, 05 Feb 2024 03:51:47 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.77-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
We're seeing lots of build problems and warnings with Clang 17 and Clang nightly:
-----8<-----
/builds/linux/drivers/usb/host/xhci.c:1684:37: error: variable 'slot_id' is uninitialized when used here [-Werror,-Wuninitialized]
1684 | ret = xhci_check_maxpacket(xhci,slot_id,
| ^~~~~~~
/builds/linux/drivers/usb/host/xhci.c:1652:22: note: initialize the variable 'slot_id' to silence this warning1652 | unsigned int slot_id, ep_index; | ^ | = 01 error generated.
make[5]: *** [/builds/linux/scripts/Makefile.build:250:drivers/usb/host/xhci.o] Error 1
----->8-----Bisection points to:
commit 37ef029fe9a5639f12250f75f5d1594c6a11e181 Author: Mathias Nyman <[email protected]> Date: Fri Dec 1 17:06:47 2023 +0200
Quoted 7 lines
Quoted 4 lines
xhci: fix possible null pointer deref during xhci urb enqueue [ Upstream commit
e2e2aacf042f52854c92775b7800ba668e0bdfe4]Reverting the patch makes the build pass.
Thanks, will drop. Odd that gcc doesn't catch this as well :(
I have never been able to track down the reason, but gcc on many if not most architectures doesn't catch problems like this. I often see a warning pointing to a real problem on, say, parisc builds but not elsewhere, even though the compiler version is the same.
The above problem is seen because commit e34900f46cd6 ("xhci: Reconfigure endpoint 0 max packet size only during endpoint reset") removed the call to xhci_check_maxpacket(), but that commit is not in stable releases.
Guenter
Quoted 45 lines · Daniel Díaz
Hello!
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.77 release. There are 219 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon, 05 Feb 2024 03:51:47 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.77-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
We're seeing lots of build problems and warnings with Clang 17 and Clang nightly:
-----8<-----
/builds/linux/drivers/usb/host/xhci.c:1684:37: error: variable 'slot_id' is uninitialized when used here [-Werror,-Wuninitialized]
1684 | ret = xhci_check_maxpacket(xhci,slot_id,
| ^~~~~~~
/builds/linux/drivers/usb/host/xhci.c:1652:22: note: initialize the variable 'slot_id' to silence this warning1652 | unsigned int slot_id, ep_index; | ^ | = 01 error generated.
make[5]: *** [/builds/linux/scripts/Makefile.build:250:drivers/usb/host/xhci.o] Error 1
----->8-----Bisection points to:
commit 37ef029fe9a5639f12250f75f5d1594c6a11e181 Author: Mathias Nyman <[email protected]> Date: Fri Dec 1 17:06:47 2023 +0200 xhci: fix possible null pointer deref during xhci urb enqueue [ Upstream commit e2e2aacf042f52854c92775b7800ba668e0bdfe4 ]
Quoted 2 lines
Reverting the patch makes the build pass.
Hi Daniel and Greg,
Reverting this patch causes some boot failures :-
https://linux.kernelci.org/test/job/stable-rc/branch/linux-6.1.y/kernel/v6.1.76-220-g4f7472958779c/plan/baseline/
Not sure if reverting would be the best way to fix this issue.
Thanks,
Shreeya Patel
Quoted 16 lines
The problem manifests as build error in i386 and
x86_64, and as new warnings on Arm, Arm64, and RISC-V.Some reproducers:
tuxmake --runtime podman --target-arch arm --toolchain clang-17 --kconfig omap2plus_defconfig LLVM=1 LLVM_IAS=1 tuxmake --runtime podman --target-arch x86_64 --toolchain clang-17 --kconfig x86_64_defconfig LLVM=1 LLVM_IAS=1Greetings!
Daniel Díaz
[email protected]
Hi!
Quoted 4 lines
This is the start of the stable review cycle for the 6.1.77 release. There are 219 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
CIP testing did not find any problems here:
https://gitlab.com/cip-project/cip-testing/linux-stable-rc-ci/-/tree/linux-6.1.y
Best regards,
Pavel
Signature · 2 lines
DENX Software Engineering GmbH, Managing Director: Erika Unter HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.77 release. There are 219 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon, 05 Feb 2024 03:51:47 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.77-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
On ARCH_BRCMSTB using 32-bit and 64-bit ARM kernels, build tested on BMIPS_GENERIC:
Signature · 1 line
Florian
Hi Greg,
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.77 release. There are 219 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon, 05 Feb 2024 03:51:47 +0000. Anything received after that time might be too late.
Quoted 7 lines
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.77-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
I tested 6.1.77-rc1 (4f7472958779) on Kalray kvx arch (not upstream yet), just to let you know everything works in our CI.
It ran on real hw (k200, k200lp and k300 boards), on qemu as well as on our internal instruction set simulator (ISS).
Tests were run on several interfaces/drivers (usb, qsfp ethernet, eMMC, PCIe endpoint+RC, SPI, remoteproc, uart, iommu). LTP and uClibc-ng testsuites are also run without any regression.
Everything looks fine to us.
Thanks a lot!
--
Yann
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.77 release. There are 219 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Mon, 05 Feb 2024 03:51:47 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v6.x/stable-review/patch-6.1.77-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-6.1.y
and the diffstat can be found below.thanks,
greg k-h
No new regressions for Tegra ...
Test results for stable-v6.7:
10 builds: 10 pass, 0 fail
26 boots: 26 pass, 0 fail
116 tests: 115 pass, 1 failLinux version: 6.7.4-rc2-g10be46ba2b8a
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra194-p3509-0000+p3668-0000,
tegra20-ventana, tegra210-p2371-2180,
tegra210-p3450-0000, tegra30-cardhu-a04Test failures: tegra186-p2771-0000: pm-system-suspend.sh
Jon
Signature · 1 line
nvpublic
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.1.77 release. There are 219 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Again, I'm super late here but I did test this the other day..
Thanks,
Conor.