Linux 6.6.125
Greg Kroah-Hartman
maintainerI'm announcing the release of the 6.6.125 kernel.
All users of the 6.6 kernel series must upgrade.
The updated 6.6.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-6.6.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 drivers/base/base.h | 9 + drivers/base/bus.c | 2 drivers/base/dd.c | 2 drivers/bluetooth/btusb.c | 2 drivers/crypto/marvell/octeontx/otx_cptpf_ucode.c | 2 drivers/crypto/omap-crypto.c | 2 drivers/crypto/virtio/virtio_crypto_core.c | 5 drivers/crypto/virtio/virtio_crypto_skcipher_algs.c | 2 drivers/gpio/gpio-omap.c | 22 ++- drivers/net/phy/sfp.c | 2 drivers/net/wireless/realtek/rtw88/main.c | 4 drivers/scsi/qla2xxx/qla_gs.c | 41 ++--- drivers/scsi/qla2xxx/qla_init.c | 28 ++- drivers/scsi/qla2xxx/qla_isr.c | 19 ++ drivers/scsi/qla2xxx/qla_os.c | 3 drivers/spi/spi-cadence-quadspi.c | 34 ++++ fs/nfsd/nfsctl.c | 9 + fs/nfsd/stats.c | 4 fs/nfsd/stats.h | 2 fs/nilfs2/sufile.c | 4 fs/smb/client/cached_dir.h | 8 - fs/smb/server/server.c | 6 fs/smb/server/transport_tcp.c | 3 net/mptcp/pm_netlink.c | 16 +- net/netfilter/nf_tables_api.c | 2 net/netfilter/nft_compat.c | 6 net/netfilter/nft_log.c | 2 net/netfilter/nft_meta.c | 2 net/netfilter/nft_numgen.c | 2 net/netfilter/nft_set_pipapo.c | 64 ++++++-- net/netfilter/nft_tunnel.c | 5 tools/testing/selftests/net/mptcp/pm_netlink.sh | 4 tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 11 + tools/testing/vsock/control.c | 9 - tools/testing/vsock/util.c | 143 ++++++++++++++++++++ tools/testing/vsock/util.h | 7 tools/testing/vsock/vsock_test.c | 29 +--- 38 files changed, 405 insertions(+), 114 deletions(-)
Anil Gurumurthy (4):
scsi: qla2xxx: Validate sp before freeing associated memory
scsi: qla2xxx: Delay module unload while fabric scan in progress
scsi: qla2xxx: Free sp in error path to fix system crash
scsi: qla2xxx: Query FW again before proceeding with login
Bibo Mao (2):
crypto: virtio - Add spinlock protection with virtqueue notification
crypto: virtio - Remove duplicated virtqueue_kick in virtio_crypto_skcipher_crypt_req
Bitterblue Smith (1):
wifi: rtw88: Fix alignment fault in rtw_core_enable_beacon()
Danilo Krummrich (1):
gpio: omap: do not register driver in probe()
Edward Adam Davis (1):
nilfs2: Fix potential block overflow that cause system hang
Eric Dumazet (1):
mptcp: fix race in mptcp_pm_nl_flush_addrs_doit()
Greg Kroah-Hartman (1):
Linux 6.6.125
Gui-Dong Han (1):
driver core: enforce device_lock for driver_match_device()
Henrique Carvalho (2):
smb: client: split cached_fid bitfields to avoid shared-byte RMW races
smb: server: fix leak of active_num_conn in ksmbd_tcp_new_connection()
Jeff Layton (1):
nfsd: don't ignore the return code of svc_proc_register()
Kees Cook (1):
crypto: omap - Allocate OMAP_CRYPTO_FORCE_COPY scatterlists correctly
Khairul Anuar Romli (1):
spi: cadence-quadspi: Implement refcount to handle unbind during busy
Konstantin Shkolnyy (1):
vsock/test: verify socket options after setting them
Marek Behún (1):
net: sfp: Fix quirk for Ubiquiti U-Fiber Instant SFP module
Matthieu Baerts (NGI0) (1):
selftests: mptcp: pm: ensure unknown flags are ignored
Namjae Jeon (1):
ksmbd: fix infinite loop caused by next_smb2_rcv_hdr_off reset in error paths
Pablo Neira Ayuso (2):
netfilter: nf_tables: missing objects with no memcg accounting
netfilter: nft_set_pipapo: prevent overflow in lookup table allocation
Shreyas Deodhar (1):
scsi: qla2xxx: Allow recovery for tape devices
Thorsten Blum (1):
crypto: octeontx - Fix length check to avoid truncation in ucode_load_store
Zenm Chen (1):
Bluetooth: btusb: Add USB ID 7392:e611 for Edimax EW-7611UXB
Greg Kroah-Hartman
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 6 PATCHLEVEL = 6 -SUBLEVEL = 124 +SUBLEVEL = 125 EXTRAVERSION = NAME = Pinguïn Aangedreven
drivers/base/base.h +9 -0
@@ -165,9 +165,18 @@ void device_set_deferred_probe_reason(const struct device *dev, struct va_formatstatic inline int driver_match_device (struct device_driver *drv,struct device *dev) { +device_lock_assert (dev); +return drv->bus->match ? drv->bus->match (dev, drv) :1 ; } +static inline int driver_match_device_locked (struct device_driver *drv, +struct device *dev) +{ +guard (device)(dev); +return driver_match_device (drv, dev); +} +static inline void dev_sync_state (struct device *dev) {if (dev->bus->sync_state)
drivers/base/bus.c +1 -1
@@ -263,7 +263,7 @@ static ssize_t bind_store(struct device_driver *drv, const char *buf,int err = -ENODEV ; dev =bus_find_device_by_name (bus,NULL , buf); -if (dev &&driver_match_device (drv, dev)) { +if (dev &&driver_match_device_locked (drv, dev)) { err =device_driver_attach (drv, dev);if (!err) {/* success */
drivers/base/dd.c +1 -1
@@ -1169,7 +1169,7 @@ static int __driver_attach(struct device *dev, void *data)* is an error. */ - ret =driver_match_device (drv, dev); + ret =driver_match_device_locked (drv, dev);if (ret ==0 ) {/* no match */ return 0 ;
drivers/bluetooth/btusb.c +2 -0
@@ -516,6 +516,8 @@ static const struct usb_device_id quirks_table[] = { BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x2001, 0x332a), .driver_info = BTUSB_REALTEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x7392, 0xe611), .driver_info = BTUSB_REALTEK | + BTUSB_WIDEBAND_SPEECH }, /* Realtek 8852AE Bluetooth devices */ { USB_DEVICE(0x0bda, 0x2852), .driver_info = BTUSB_REALTEK |
drivers/crypto/marvell/octeontx/otx_cptpf_ucode.c +1 -1
@@ -1336,7 +1336,7 @@ static ssize_t ucode_load_store(struct device *dev,int del_grp_idx =-1 ;int ucode_idx =0 ; -if (strlen (buf) >OTX_CPT_UCODE_NAME_LENGTH ) +if (count >=OTX_CPT_UCODE_NAME_LENGTH )return -EINVAL ; eng_grps = container_of(attr, struct otx_cpt_eng_grps, ucode_load_attr);
drivers/crypto/omap-crypto.c +1 -1
@@ -21,7 +21,7 @@ static int omap_crypto_copy_sg_lists(int total, int bs,struct scatterlist *tmp;if (!(flags &OMAP_CRYPTO_FORCE_SINGLE_ENTRY )) { - new_sg =kmalloc_array (n,sizeof (*sg),GFP_KERNEL ); + new_sg =kmalloc_array (n,sizeof (*new_sg),GFP_KERNEL );if (!new_sg)return -ENOMEM ;
drivers/crypto/virtio/virtio_crypto_core.c +5 -0
@@ -77,15 +77,20 @@ static void virtcrypto_done_task(unsigned long data)struct data_queue *data_vq = (struct data_queue *)data;struct virtqueue *vq = data_vq->vq;struct virtio_crypto_request *vc_req; +unsigned long flags;unsigned int len; +spin_lock_irqsave (&data_vq->lock, flags);do {virtqueue_disable_cb (vq);while ((vc_req =virtqueue_get_buf (vq, &len)) !=NULL ) { +spin_unlock_irqrestore (&data_vq->lock, flags);if (vc_req->alg_cb) vc_req->alg_cb (vc_req, len); +spin_lock_irqsave (&data_vq->lock, flags); } }while (!virtqueue_enable_cb (vq)); +spin_unlock_irqrestore (&data_vq->lock, flags); }static void virtcrypto_dataq_callback (struct virtqueue *vq)
drivers/crypto/virtio/virtio_crypto_skcipher_algs.c +0 -2
@@ -550,8 +550,6 @@ int virtio_crypto_skcipher_crypt_req(if (ret <0 )return ret; -virtqueue_kick (data_vq->vq); -return 0 ; }
drivers/gpio/gpio-omap.c +18 -4
@@ -799,10 +799,13 @@ static struct platform_device omap_mpuio_device = {static inline void omap_mpuio_init (struct gpio_bank *bank) { -platform_set_drvdata (&omap_mpuio_device, bank); +static bool registered; -if (platform_driver_register (&omap_mpuio_driver) ==0 ) - (void )platform_device_register (&omap_mpuio_device); +platform_set_drvdata (&omap_mpuio_device, bank); +if (!registered) { + (void )platform_device_register (&omap_mpuio_device); + registered = true; + } }/*---------------------------------------------------------------------*/
@@ -1575,13 +1578,24 @@ static struct platform_driver omap_gpio_driver = {*/ static int __init omap_gpio_drv_reg (void ) { -return platform_driver_register (&omap_gpio_driver); +int ret; + + ret =platform_driver_register (&omap_mpuio_driver); +if (ret) +return ret; + + ret =platform_driver_register (&omap_gpio_driver); +if (ret) +platform_driver_unregister (&omap_mpuio_driver); + +return ret; }postcore_initcall (omap_gpio_drv_reg); static void __exit omap_gpio_exit(void) {platform_driver_unregister (&omap_gpio_driver); +platform_driver_unregister (&omap_mpuio_driver); }module_exit (omap_gpio_exit);
drivers/net/phy/sfp.c +2 -0
@@ -431,6 +431,8 @@ static void sfp_quirk_ubnt_uf_instant(const struct sfp_eeprom_id *id,*/ linkmode_zero (modes);linkmode_set_bit (ETHTOOL_LINK_MODE_1000baseX_Full_BIT, modes); +phy_interface_zero (interfaces); +__set_bit (PHY_INTERFACE_MODE_1000BASEX , interfaces); }#define SFP_QUIRK (_v, _p, _m, _f) \
drivers/net/wireless/realtek/rtw88/main.c +2 -2
@@ -2401,10 +2401,10 @@ void rtw_core_enable_beacon(struct rtw_dev *rtwdev, bool enable)if (enable) {rtw_write32_set (rtwdev,REG_BCN_CTRL ,BIT_EN_BCN_FUNCTION ); -rtw_write32_clr (rtwdev,REG_TXPAUSE ,BIT_HIGH_QUEUE ); +rtw_write8_clr (rtwdev,REG_TXPAUSE ,BIT_HIGH_QUEUE ); }else {rtw_write32_clr (rtwdev,REG_BCN_CTRL ,BIT_EN_BCN_FUNCTION ); -rtw_write32_set (rtwdev,REG_TXPAUSE ,BIT_HIGH_QUEUE ); +rtw_write8_set (rtwdev,REG_TXPAUSE ,BIT_HIGH_QUEUE ); } }
drivers/scsi/qla2xxx/qla_gs.c +20 -21
60 lines not on this page · raw message
drivers/scsi/qla2xxx/qla_init.c +17 -11
@@ -1859,15 +1859,6 @@ void qla2x00_handle_rscn(scsi_qla_host_t *vha, struct event_arg *ea)case RSCN_PORT_ADDR : fcport =qla2x00_find_fcport_by_nportid (vha, &ea->id,1 );if (fcport) { -if (ql2xfc2target && - fcport->flags &FCF_FCP2_DEVICE && -atomic_read (&fcport->state) ==FCS_ONLINE ) { -ql_dbg (ql_dbg_disc, vha,0x2115 , -"Delaying session delete for FCP2 portid=%06x %8phC " , - fcport->d_id.b24, fcport->port_name); -return ; - } -if (vha->hw->flags.edif_enabled &&DBELL_ACTIVE (vha)) {/* * On ipsec start by remote port, Target port
@@ -2471,8 +2462,23 @@ qla24xx_handle_plogi_done_event(struct scsi_qla_host *vha, struct event_arg *ea) ea->sp->gen1, fcport->rscn_gen, ea->data[0], ea->data[1], ea->iop[0], ea->iop[1]); -if ((fcport->fw_login_state ==DSC_LS_PLOGI_PEND ) || - (fcport->fw_login_state ==DSC_LS_PRLI_PEND )) { +if (fcport->fw_login_state ==DSC_LS_PLOGI_PEND ) { +ql_dbg (ql_dbg_disc, vha,0x20ea , +"%s %d %8phC Remote is trying to login\n" , + __func__, __LINE__, fcport->port_name); +/* +* If we get here, there is port thats already logged in, +* but it's state has not moved ahead. Recheck with FW on +* what state it is in and proceed ahead +*/ +if (!N2N_TOPO (vha->hw)) { + fcport->fw_login_state =DSC_LS_PRLI_COMP ; +qla24xx_post_gpdb_work (vha, fcport,0 ); + } +return ; + } + +if (fcport->fw_login_state ==DSC_LS_PRLI_PEND ) {ql_dbg (ql_dbg_disc, vha,0x20ea ,"%s %d %8phC Remote is trying to login\n" , __func__, __LINE__, fcport->port_name);
drivers/scsi/qla2xxx/qla_isr.c +17 -2
@@ -1676,13 +1676,28 @@ qla2x00_async_event(scsi_qla_host_t *vha, struct rsp_que *rsp, uint16_t *mb)/* Port logout */ fcport =qla2x00_find_fcport_by_loopid (vha, mb[1 ]); -if (!fcport) +if (!fcport) { +ql_dbg (ql_dbg_async, vha,0x5011 , +"Could not find fcport:%04x %04x %04x\n" , + mb[1 ], mb[2 ], mb[3 ]);break ; -if (atomic_read (&fcport->state) !=FCS_ONLINE ) + } + +if (atomic_read (&fcport->state) !=FCS_ONLINE ) { +ql_dbg (ql_dbg_async, vha,0x5012 , +"Port state is not online State:0x%x \n" , +atomic_read (&fcport->state)); +ql_dbg (ql_dbg_async, vha,0x5012 , +"Scheduling session for deletion \n" ); + fcport->logout_on_delete =0 ; +qlt_schedule_sess_for_deletion (fcport);break ; + } +ql_dbg (ql_dbg_async, vha,0x508a ,"Marking port lost loopid=%04x portid=%06x.\n" , fcport->loop_id, fcport->d_id.b24); +if (qla_ini_mode_enabled (vha)) { fcport->logout_on_delete =0 ;qlt_schedule_sess_for_deletion (fcport);
drivers/scsi/qla2xxx/qla_os.c +2 -1
@@ -1194,7 +1194,8 @@ qla2x00_wait_for_hba_ready(scsi_qla_host_t *vha)while ((qla2x00_reset_active (vha) || ha->dpc_active || ha->flags.mbox_busy) ||test_bit (FX00_RESET_RECOVERY , &vha->dpc_flags) || -test_bit (FX00_TARGET_SCAN , &vha->dpc_flags)) { +test_bit (FX00_TARGET_SCAN , &vha->dpc_flags) || + (vha->scan.scan_flags &SF_SCANNING )) {if (test_bit (UNLOADING , &base_vha->dpc_flags))break ;msleep (1000 );
drivers/spi/spi-cadence-quadspi.c +34 -0
@@ -100,6 +100,8 @@ struct cqspi_st {bool apb_ahb_hazard;bool is_jh7110;/* Flag for StarFive JH7110 SoC */ +refcount_t refcount; +refcount_t inflight_ops; };struct cqspi_driver_platdata {
@@ -705,6 +707,9 @@ static int cqspi_indirect_read_execute(struct cqspi_flash_pdata *f_pdata,u8 *rxbuf_end = rxbuf + n_rx;int ret =0 ; +if (!refcount_read (&cqspi->refcount)) +return -ENODEV ; +writel (from_addr, reg_base +CQSPI_REG_INDIRECTRDSTARTADDR );writel (remaining, reg_base +CQSPI_REG_INDIRECTRDBYTES );
@@ -1021,6 +1026,9 @@ static int cqspi_indirect_write_execute(struct cqspi_flash_pdata *f_pdata,unsigned int write_bytes;int ret; +if (!refcount_read (&cqspi->refcount)) +return -ENODEV ; +writel (to_addr, reg_base +CQSPI_REG_INDIRECTWRSTARTADDR );writel (remaining, reg_base +CQSPI_REG_INDIRECTWRBYTES );
@@ -1412,11 +1420,29 @@ static int cqspi_mem_process(struct spi_mem *mem, const struct spi_mem_op *op)static int cqspi_exec_mem_op (struct spi_mem *mem,const struct spi_mem_op *op) {int ret; +struct cqspi_st *cqspi =spi_controller_get_devdata (mem->spi->controller); + +if (refcount_read (&cqspi->inflight_ops) ==0 ) +return -ENODEV ; + +if (!refcount_read (&cqspi->refcount)) +return -EBUSY ; + +refcount_inc (&cqspi->inflight_ops); + +if (!refcount_read (&cqspi->refcount)) { +if (refcount_read (&cqspi->inflight_ops)) +refcount_dec (&cqspi->inflight_ops); +return -EBUSY ; + } ret =cqspi_mem_process (mem, op);if (ret)dev_err (&mem->spi->dev,"operation failed with %d\n" , ret); +if (refcount_read (&cqspi->inflight_ops) >1 ) +refcount_dec (&cqspi->inflight_ops); +return ret; }
@@ -1847,6 +1873,9 @@ static int cqspi_probe(struct platform_device *pdev) } } +refcount_set (&cqspi->refcount,1 ); +refcount_set (&cqspi->inflight_ops,1 ); + ret =devm_request_irq (dev, irq, cqspi_irq_handler,0 , pdev->name, cqspi);if (ret) {
@@ -1899,6 +1928,11 @@ static void cqspi_remove(struct platform_device *pdev) {struct cqspi_st *cqspi =platform_get_drvdata (pdev); +refcount_set (&cqspi->refcount,0 ); + +if (!refcount_dec_and_test (&cqspi->inflight_ops)) +cqspi_wait_idle (cqspi); +spi_unregister_controller (cqspi->host);cqspi_controller_enable (cqspi,0 );
fs/nfsd/nfsctl.c +8 -1
@@ -1526,17 +1526,24 @@ static __net_init int nfsd_net_init(struct net *net) retval =nfsd_stat_counters_init (nn);if (retval) goto out_repcache_error; +memset (&nn->nfsd_svcstats,0 ,sizeof (nn->nfsd_svcstats)); nn->nfsd_svcstats.program = &nfsd_program; +if (!nfsd_proc_stat_init (net)) { + retval = -ENOMEM ; + goto out_proc_error; + } + nn->nfsd_versions =NULL ; nn->nfsd4_minorversions =NULL ;nfsd4_init_leases_net (nn);get_random_bytes (&nn->siphash_key,sizeof (nn->siphash_key));seqlock_init (&nn->writeverf_lock); -nfsd_proc_stat_init (net);return 0 ; +out_proc_error: +nfsd_stat_counters_destroy (nn); out_repcache_error:nfsd_idmap_shutdown (net); out_idmap_error:
fs/nfsd/stats.c +2 -2
@@ -115,11 +115,11 @@ void nfsd_stat_counters_destroy(struct nfsd_net *nn)nfsd_percpu_counters_destroy (nn->counter,NFSD_STATS_COUNTERS_NUM ); } -void nfsd_proc_stat_init (struct net *net) +struct proc_dir_entry *nfsd_proc_stat_init (struct net *net) {struct nfsd_net *nn =net_generic (net, nfsd_net_id); -svc_proc_register (net, &nn->nfsd_svcstats, &nfsd_proc_ops); +return svc_proc_register (net, &nn->nfsd_svcstats, &nfsd_proc_ops); }void nfsd_proc_stat_shutdown (struct net *net)
fs/nfsd/stats.h +1 -1
@@ -15,7 +15,7 @@ void nfsd_percpu_counters_reset(struct percpu_counter *counters, int num);void nfsd_percpu_counters_destroy (struct percpu_counter *counters,int num);int nfsd_stat_counters_init (struct nfsd_net *nn);void nfsd_stat_counters_destroy (struct nfsd_net *nn); -void nfsd_proc_stat_init (struct net *net); +struct proc_dir_entry *nfsd_proc_stat_init (struct net *net);void nfsd_proc_stat_shutdown (struct net *net);static inline void nfsd_stats_rc_hits_inc (struct nfsd_net *nn)
fs/nilfs2/sufile.c +4 -0
@@ -1091,6 +1091,9 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range)else end_block = start_block + len -1 ; +if (end_block < nilfs->ns_first_data_block) + goto out; + segnum =nilfs_get_segnum_of_block (nilfs, start_block); segnum_end =nilfs_get_segnum_of_block (nilfs, end_block);
@@ -1188,6 +1191,7 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range) out_sem:up_read (&NILFS_MDT (sufile)->mi_sem); +out: range->len = ndiscarded << nilfs->ns_blocksize_bits;return ret; }
fs/smb/client/cached_dir.h +4 -4
@@ -34,10 +34,10 @@ struct cached_fid {struct list_head entry;struct cached_fids *cfids;const char *path; - bool has_lease:1; - bool is_open:1; - bool on_list:1; - bool file_all_info_is_valid:1; +bool has_lease; +bool is_open; +bool on_list; +bool file_all_info_is_valid;unsigned long time;/* jiffies of when lease was taken */ struct kref refcount;struct cifs_fid fid;
fs/smb/server/server.c +3 -3
@@ -126,21 +126,21 @@ static int __process_request(struct ksmbd_work *work, struct ksmbd_conn *conn, andx_again:if (command >= conn->max_cmds) { conn->ops->set_rsp_status (work,STATUS_INVALID_PARAMETER ); -return SERVER_HANDLER_CONTINUE ; +return SERVER_HANDLER_ABORT ; } cmds = &conn->cmds[command];if (!cmds->proc) {ksmbd_debug (SMB ,"*** not implemented yet cmd = %x\n" , command); conn->ops->set_rsp_status (work,STATUS_NOT_IMPLEMENTED ); -return SERVER_HANDLER_CONTINUE ; +return SERVER_HANDLER_ABORT ; }if (work->sess && conn->ops->is_sign_req (work, command)) { ret = conn->ops->check_sign_req (work);if (!ret) { conn->ops->set_rsp_status (work,STATUS_ACCESS_DENIED ); -return SERVER_HANDLER_CONTINUE ; +return SERVER_HANDLER_ABORT ; } }
fs/smb/server/transport_tcp.c +2 -1
@@ -41,6 +41,7 @@ static struct ksmbd_transport_ops ksmbd_tcp_transport_ops;static void tcp_stop_kthread (struct task_struct *kthread);static struct interface *alloc_iface (char *ifname); +static void ksmbd_tcp_disconnect (struct ksmbd_transport *t);#define KSMBD_TRANS (t) (&(t)->transport)#define TCP_TRANS (t) ((struct tcp_transport *)container_of(t, \
@@ -219,7 +220,7 @@ static int ksmbd_tcp_new_connection(struct socket *client_sk)if (IS_ERR (handler)) {pr_err ("cannot start conn thread\n" ); rc =PTR_ERR (handler); -free_transport (t); +ksmbd_tcp_disconnect (KSMBD_TRANS (t)); }return rc;
net/mptcp/pm_netlink.c +13 -3
@@ -1859,16 +1859,26 @@ static void __reset_counters(struct pm_nl_pernet *pernet)static int mptcp_nl_cmd_flush_addrs (struct sk_buff *skb,struct genl_info *info) {struct pm_nl_pernet *pernet =genl_info_pm_nl (info); -LIST_HEAD (free_list); +struct list_head free_list;spin_lock_bh (&pernet->lock); -list_splice_init (&pernet->local_addr_list, &free_list); + free_list = pernet->local_addr_list; +INIT_LIST_HEAD_RCU (&pernet->local_addr_list);__reset_counters (pernet); pernet->next_id =1 ;bitmap_zero (pernet->id_bitmap,MPTCP_PM_MAX_ADDR_ID +1 );spin_unlock_bh (&pernet->lock); -mptcp_nl_remove_addrs_list (sock_net (skb->sk), &free_list); + +if (free_list.next == &pernet->local_addr_list) +return 0 ; +synchronize_rcu (); + +/* Adjust the pointers to free_list instead of pernet->local_addr_list */ + free_list.prev->next = &free_list; + free_list.next->prev = &free_list; + +mptcp_nl_remove_addrs_list (sock_net (skb->sk), &free_list);__flush_addrs (&free_list);return 0 ; }
net/netfilter/nf_tables_api.c +1 -1
@@ -6615,7 +6615,7 @@ static int nft_setelem_catchall_insert(const struct net *net, } } - catchall =kmalloc (sizeof (*catchall),GFP_KERNEL ); + catchall =kmalloc (sizeof (*catchall),GFP_KERNEL_ACCOUNT );if (!catchall)return -ENOMEM ;
net/netfilter/nft_compat.c +3 -3
@@ -535,7 +535,7 @@ nft_match_large_init(const struct nft_ctx *ctx, const struct nft_expr *expr,struct xt_match *m = expr->ops->data;int ret; - priv->info =kmalloc (XT_ALIGN (m->matchsize),GFP_KERNEL ); + priv->info =kmalloc (XT_ALIGN (m->matchsize),GFP_KERNEL_ACCOUNT );if (!priv->info)return -ENOMEM ;
@@ -808,7 +808,7 @@ nft_match_select_ops(const struct nft_ctx *ctx, goto err; } - ops =kzalloc (sizeof (struct nft_expr_ops ),GFP_KERNEL ); + ops =kzalloc (sizeof (struct nft_expr_ops ),GFP_KERNEL_ACCOUNT );if (!ops) { err = -ENOMEM ; goto err;
@@ -898,7 +898,7 @@ nft_target_select_ops(const struct nft_ctx *ctx, goto err; } - ops =kzalloc (sizeof (struct nft_expr_ops ),GFP_KERNEL ); + ops =kzalloc (sizeof (struct nft_expr_ops ),GFP_KERNEL_ACCOUNT );if (!ops) { err = -ENOMEM ; goto err;
net/netfilter/nft_log.c +1 -1
@@ -163,7 +163,7 @@ static int nft_log_init(const struct nft_ctx *ctx, nla = tb[NFTA_LOG_PREFIX ];if (nla !=NULL ) { - priv->prefix =kmalloc (nla_len (nla) +1 ,GFP_KERNEL ); + priv->prefix =kmalloc (nla_len (nla) +1 ,GFP_KERNEL_ACCOUNT );if (priv->prefix ==NULL )return -ENOMEM ;nla_strscpy (priv->prefix, nla,nla_len (nla) +1 );
net/netfilter/nft_meta.c +1 -1
@@ -952,7 +952,7 @@ static int nft_secmark_obj_init(const struct nft_ctx *ctx,if (tb[NFTA_SECMARK_CTX ] ==NULL )return -EINVAL ; - priv->ctx =nla_strdup (tb[NFTA_SECMARK_CTX ],GFP_KERNEL ); + priv->ctx =nla_strdup (tb[NFTA_SECMARK_CTX ],GFP_KERNEL_ACCOUNT );if (!priv->ctx)return -ENOMEM ;
net/netfilter/nft_numgen.c +1 -1
@@ -66,7 +66,7 @@ static int nft_ng_inc_init(const struct nft_ctx *ctx,if (priv->offset + priv->modulus -1 < priv->offset)return -EOVERFLOW ; - priv->counter =kmalloc (sizeof (*priv->counter),GFP_KERNEL ); + priv->counter =kmalloc (sizeof (*priv->counter),GFP_KERNEL_ACCOUNT );if (!priv->counter)return -ENOMEM ;
net/netfilter/nft_set_pipapo.c +47 -17
132 lines not on this page · raw message
net/netfilter/nft_tunnel.c +3 -2
@@ -503,13 +503,14 @@ static int nft_tunnel_obj_init(const struct nft_ctx *ctx,return err; } - md =metadata_dst_alloc (priv->opts.len,METADATA_IP_TUNNEL ,GFP_KERNEL ); + md =metadata_dst_alloc (priv->opts.len,METADATA_IP_TUNNEL , +GFP_KERNEL_ACCOUNT );if (!md)return -ENOMEM ;memcpy (&md->u.tun_info, &info,sizeof (info));#ifdef CONFIG_DST_CACHE - err =dst_cache_init (&md->u.tun_info.dst_cache,GFP_KERNEL ); + err =dst_cache_init (&md->u.tun_info.dst_cache,GFP_KERNEL_ACCOUNT );if (err <0 ) {metadata_dst_free (md);return err;
tools/testing/selftests/net/mptcp/pm_netlink.sh +4 -0
@@ -127,6 +127,10 @@ id 8 flags signal 10.0.1.8" "id limit" ip netns exec $ns1 ./pm_nl_ctl flush check "ip netns exec $ns1 ./pm_nl_ctl dump" "" "flush addrs" +ip netns exec $ns1 ./pm_nl_ctl add 10.0.1.1 flags unknown +check "ip netns exec $ns1 ./pm_nl_ctl dump" "id 1 flags 10.0.1.1" "ignore unknown flags" +ip netns exec $ns1 ./pm_nl_ctl flush + ip netns exec $ns1 ./pm_nl_ctl limits 9 1 2>/dev/null check "ip netns exec $ns1 ./pm_nl_ctl limits" "$default_limits" "rcv addrs above hard limit"
tools/testing/selftests/net/mptcp/pm_nl_ctl.c +11 -0
@@ -29,6 +29,8 @@#define IPPROTO_MPTCP 262#endif +#define MPTCP_PM_ADDR_FLAG_UNKNOWN _BITUL(7) +static void syntax (char *argv[]) {fprintf (stderr,"%s add|ann|rem|csf|dsf|get|set|del|flush|dump|events|listen|accept [<args>]\n" , argv[0 ]);
@@ -825,6 +827,8 @@ int add_addr(int fd, int pm_family, int argc, char *argv[]) flags |=MPTCP_PM_ADDR_FLAG_BACKUP ; else if (!strcmp(tok, "fullmesh")) flags |=MPTCP_PM_ADDR_FLAG_FULLMESH ; + else if (!strcmp(tok, "unknown")) + flags |=MPTCP_PM_ADDR_FLAG_UNKNOWN ; else error(1, errno, "unknown flag %s", argv[arg]);
@@ -1030,6 +1034,13 @@ static void print_addr(struct rtattr *attrs, int len)printf ("," ); } +if (flags &MPTCP_PM_ADDR_FLAG_UNKNOWN ) { +printf ("unknown" ); + flags &= ~MPTCP_PM_ADDR_FLAG_UNKNOWN ; +if (flags) +printf ("," ); + } +/* bump unknown flags, if any */ if (flags)printf ("0x%x" , flags);
tools/testing/vsock/control.c +3 -6
@@ -27,6 +27,7 @@#include "timeout.h" #include "control.h" +#include "util.h" static int control_fd =-1 ;
@@ -50,7 +51,6 @@ void control_init(const char *control_host,for (ai = result; ai; ai = ai->ai_next) {int fd; -int val =1 ; fd =socket (ai->ai_family, ai->ai_socktype, ai->ai_protocol);if (fd <0 )
@@ -65,11 +65,8 @@ void control_init(const char *control_host,break ; } -if (setsockopt (fd,SOL_SOCKET ,SO_REUSEADDR , - &val,sizeof (val)) <0 ) { -perror ("setsockopt" ); -exit (EXIT_FAILURE ); - } +setsockopt_int_check (fd,SOL_SOCKET ,SO_REUSEADDR ,1 , +"setsockopt SO_REUSEADDR" );if (bind (fd, ai->ai_addr, ai->ai_addrlen) <0 ) goto next;
tools/testing/vsock/util.c +143 -0
152 lines not on this page · raw message
tools/testing/vsock/util.h +7 -0
@@ -50,4 +50,11 @@ void list_tests(const struct test_case *test_cases);void skip_test (struct test_case *test_cases,size_t test_cases_len,const char *test_id_str);unsigned long hash_djb2 (const void *data,size_t len); +void setsockopt_ull_check (int fd,int level,int optname, +unsigned long long val,char const *errmsg); +void setsockopt_int_check (int fd,int level,int optname,int val, +char const *errmsg); +void setsockopt_timeval_check (int fd,int level,int optname, +struct timeval val,char const *errmsg); +void enable_so_zerocopy_check (int fd);#endif /* UTIL_H */
tools/testing/vsock/vsock_test.c +10 -19
@@ -503,17 +503,13 @@ static void test_seqpacket_msg_bounds_server(const struct test_opts *opts) sock_buf_size =SOCK_BUF_SIZE ; -if (setsockopt (fd,AF_VSOCK ,SO_VM_SOCKETS_BUFFER_MAX_SIZE , - &sock_buf_size,sizeof (sock_buf_size))) { -perror ("setsockopt(SO_VM_SOCKETS_BUFFER_MAX_SIZE)" ); -exit (EXIT_FAILURE ); - } +setsockopt_ull_check (fd,AF_VSOCK ,SO_VM_SOCKETS_BUFFER_MAX_SIZE , + sock_buf_size, +"setsockopt(SO_VM_SOCKETS_BUFFER_MAX_SIZE)" ); -if (setsockopt (fd,AF_VSOCK ,SO_VM_SOCKETS_BUFFER_SIZE , - &sock_buf_size,sizeof (sock_buf_size))) { -perror ("setsockopt(SO_VM_SOCKETS_BUFFER_SIZE)" ); -exit (EXIT_FAILURE ); - } +setsockopt_ull_check (fd,AF_VSOCK ,SO_VM_SOCKETS_BUFFER_SIZE , + sock_buf_size, +"setsockopt(SO_VM_SOCKETS_BUFFER_SIZE)" );/* Ready to receive data. */ control_writeln ("SRVREADY" );
@@ -648,10 +644,8 @@ static void test_seqpacket_timeout_client(const struct test_opts *opts) tv.tv_sec =RCVTIMEO_TIMEOUT_SEC ; tv.tv_usec =0 ; -if (setsockopt (fd,SOL_SOCKET ,SO_RCVTIMEO , (void *)&tv,sizeof (tv)) ==-1 ) { -perror ("setsockopt(SO_RCVTIMEO)" ); -exit (EXIT_FAILURE ); - } +setsockopt_timeval_check (fd,SOL_SOCKET ,SO_RCVTIMEO , tv, +"setsockopt(SO_RCVTIMEO)" ); read_enter_ns =current_nsec ();
@@ -928,11 +922,8 @@ static void test_stream_poll_rcvlowat_client(const struct test_opts *opts)exit (EXIT_FAILURE ); } -if (setsockopt (fd,SOL_SOCKET ,SO_RCVLOWAT , - &lowat_val,sizeof (lowat_val))) { -perror ("setsockopt(SO_RCVLOWAT)" ); -exit (EXIT_FAILURE ); - } +setsockopt_int_check (fd,SOL_SOCKET ,SO_RCVLOWAT , + lowat_val,"setsockopt(SO_RCVLOWAT)" );control_expectln ("SRVSENT" );