5.15.124-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainerPATCH 139/155 KVM: x86: Disallow KVM_SET_SREGS{2} if incoming CR0 is invalid
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
[ Upstream commit 26a0652cb453c72f6aab0974bc4939e9b14f886b ]
Reject KVM_SET_SREGS{2} with -EINVAL if the incoming CR0 is invalid, e.g. due to setting bits 63:32, illegal combinations, or to a value that isn't allowed in VMX (non-)root mode. The VMX checks in particular are "fun" as failure to disallow Real Mode for an L2 that is configured with unrestricted guest disabled, when KVM itself has unrestricted guest enabled, will result in KVM forcing VM86 mode to virtual Real Mode for L2, but then fail to unwind the related metadata when synthesizing a nested VM-Exit back to L1 (which has unrestricted guest enabled).
Opportunistically fix a benign typo in the prototype for is_valid_cr4().
Message-Id: <[email protected]>
--- arch/x86/include/asm/kvm-x86-ops.h | 1 + arch/x86/include/asm/kvm_host.h | 3 ++- arch/x86/kvm/svm/svm.c | 6 ++++++ arch/x86/kvm/vmx/vmx.c | 28 ++++++++++++++++++------ arch/x86/kvm/x86.c | 34 +++++++++++++++++++----------- 5 files changed, 52 insertions(+), 20 deletions(-)
arch/x86/include/asm/kvm-x86-ops.h +1 -0
@@ -34,6 +34,7 @@ KVM_X86_OP(get_segment) KVM_X86_OP(get_cpl) KVM_X86_OP(set_segment) KVM_X86_OP_NULL(get_cs_db_l_bits) +KVM_X86_OP(is_valid_cr0) KVM_X86_OP(set_cr0) KVM_X86_OP(is_valid_cr4) KVM_X86_OP(set_cr4)
arch/x86/include/asm/kvm_host.h +2 -1
@@ -1333,8 +1333,9 @@ struct kvm_x86_ops {void (*set_segment)(struct kvm_vcpu *vcpu,struct kvm_segment *var,int seg);void (*get_cs_db_l_bits)(struct kvm_vcpu *vcpu,int *db,int *l); +bool (*is_valid_cr0)(struct kvm_vcpu *vcpu,unsigned long cr0);void (*set_cr0)(struct kvm_vcpu *vcpu,unsigned long cr0); -bool (*is_valid_cr4)(struct kvm_vcpu *vcpu,unsigned long cr0); +bool (*is_valid_cr4)(struct kvm_vcpu *vcpu,unsigned long cr4);void (*set_cr4)(struct kvm_vcpu *vcpu,unsigned long cr4);int (*set_efer)(struct kvm_vcpu *vcpu,u64 efer);void (*get_idt)(struct kvm_vcpu *vcpu,struct desc_ptr *dt);
arch/x86/kvm/svm/svm.c +6 -0
@@ -1734,6 +1734,11 @@ static void svm_set_gdt(struct kvm_vcpu *vcpu, struct desc_ptr *dt)vmcb_mark_dirty (svm->vmcb,VMCB_DT ); } +static bool svm_is_valid_cr0 (struct kvm_vcpu *vcpu,unsigned long cr0) +{ +return true; +} +void svm_set_cr0 (struct kvm_vcpu *vcpu,unsigned long cr0) {struct vcpu_svm *svm =to_svm (vcpu);
@@ -4596,6 +4601,7 @@ static struct kvm_x86_ops svm_x86_ops __initdata = { .set_segment = svm_set_segment, .get_cpl = svm_get_cpl, .get_cs_db_l_bits = kvm_get_cs_db_l_bits, + .is_valid_cr0 = svm_is_valid_cr0, .set_cr0 = svm_set_cr0, .is_valid_cr4 = svm_is_valid_cr4, .set_cr4 = svm_set_cr4,
arch/x86/kvm/vmx/vmx.c +21 -7
@@ -2894,6 +2894,15 @@ static void enter_rmode(struct kvm_vcpu *vcpu)struct vcpu_vmx *vmx =to_vmx (vcpu);struct kvm_vmx *kvm_vmx =to_kvm_vmx (vcpu->kvm); +/* +* KVM should never use VM86 to virtualize Real Mode when L2 is active, +* as using VM86 is unnecessary if unrestricted guest is enabled, and +* if unrestricted guest is disabled, VM-Enter (from L1) with CR0.PG=0 +* should VM-Fail and KVM should reject userspace attempts to stuff +* CR0.PG=0 when L2 is active. +*/ +WARN_ON_ONCE (is_guest_mode (vcpu)); +vmx_get_segment (vcpu, &vmx->rmode.segs[VCPU_SREG_TR ],VCPU_SREG_TR );vmx_get_segment (vcpu, &vmx->rmode.segs[VCPU_SREG_ES ],VCPU_SREG_ES );vmx_get_segment (vcpu, &vmx->rmode.segs[VCPU_SREG_DS ],VCPU_SREG_DS );
@@ -3084,6 +3093,17 @@ void ept_save_pdptrs(struct kvm_vcpu *vcpu)#define CR3_EXITING_BITS (CPU_BASED_CR3_LOAD_EXITING | \ CPU_BASED_CR3_STORE_EXITING) +static bool vmx_is_valid_cr0 (struct kvm_vcpu *vcpu,unsigned long cr0) +{ +if (is_guest_mode (vcpu)) +return nested_guest_cr0_valid (vcpu, cr0); + +if (to_vmx (vcpu)->nested.vmxon) +return nested_host_cr0_valid (vcpu, cr0); + +return true; +} +void vmx_set_cr0 (struct kvm_vcpu *vcpu,unsigned long cr0) {struct vcpu_vmx *vmx =to_vmx (vcpu);
@@ -5027,18 +5047,11 @@ static int handle_set_cr0(struct kvm_vcpu *vcpu, unsigned long val) val = (val & ~vmcs12->cr0_guest_host_mask) | (vmcs12->guest_cr0 & vmcs12->cr0_guest_host_mask); -if (!nested_guest_cr0_valid (vcpu, val)) -return 1 ; -if (kvm_set_cr0 (vcpu, val))return 1 ;vmcs_writel (CR0_READ_SHADOW , orig_val);return 0 ; }else { -if (to_vmx (vcpu)->nested.vmxon && - !nested_host_cr0_valid (vcpu, val)) -return 1 ; -return kvm_set_cr0 (vcpu, val); } }
@@ -7744,6 +7757,7 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = { .set_segment = vmx_set_segment, .get_cpl = vmx_get_cpl, .get_cs_db_l_bits = vmx_get_cs_db_l_bits, + .is_valid_cr0 = vmx_is_valid_cr0, .set_cr0 = vmx_set_cr0, .is_valid_cr4 = vmx_is_valid_cr4, .set_cr4 = vmx_set_cr4,
arch/x86/kvm/x86.c +22 -12
@@ -876,6 +876,22 @@ int load_pdptrs(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu, unsigned long cr3) }EXPORT_SYMBOL_GPL (load_pdptrs); +static bool kvm_is_valid_cr0 (struct kvm_vcpu *vcpu,unsigned long cr0) +{ +#ifdef CONFIG_X86_64 +if (cr0 &0xffffffff00000000UL ) +return false; +#endif + +if ((cr0 &X86_CR0_NW ) && !(cr0 &X86_CR0_CD )) +return false; + +if ((cr0 &X86_CR0_PG ) && !(cr0 &X86_CR0_PE )) +return false; + +return static_call (kvm_x86_is_valid_cr0)(vcpu, cr0); +} +void kvm_post_set_cr0 (struct kvm_vcpu *vcpu,unsigned long old_cr0,unsigned long cr0) {if ((cr0 ^ old_cr0) &X86_CR0_PG ) {
@@ -898,20 +914,13 @@ int kvm_set_cr0(struct kvm_vcpu *vcpu, unsigned long cr0)unsigned long old_cr0 =kvm_read_cr0 (vcpu);unsigned long pdptr_bits =X86_CR0_CD |X86_CR0_NW |X86_CR0_PG ; - cr0 |=X86_CR0_ET ; - -#ifdef CONFIG_X86_64 -if (cr0 &0xffffffff00000000UL ) +if (!kvm_is_valid_cr0 (vcpu, cr0))return 1 ; -#endif - - cr0 &= ~CR0_RESERVED_BITS ; -if ((cr0 &X86_CR0_NW ) && !(cr0 &X86_CR0_CD )) -return 1 ; + cr0 |=X86_CR0_ET ; -if ((cr0 &X86_CR0_PG ) && !(cr0 &X86_CR0_PE )) -return 1 ; +/* Write to CR0 reserved bits are ignored, even on Intel. */ + cr0 &= ~CR0_RESERVED_BITS ;#ifdef CONFIG_X86_64 if ((vcpu->arch.efer & EFER_LME) && !is_paging(vcpu) &&
@@ -10643,7 +10652,8 @@ static bool kvm_is_valid_sregs(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs)return false; } -return kvm_is_valid_cr4 (vcpu, sregs->cr4); +return kvm_is_valid_cr4 (vcpu, sregs->cr4) && +kvm_is_valid_cr0 (vcpu, sregs->cr0); } static int __set_sregs_common(struct kvm_vcpu *vcpu, struct kvm_sregs *sregs,
Signature · 1 line
2.40.1
Greg Kroah-Hartman
maintainerPATCH 140/155 virtio-net: fix race between set queues and probe
In reply to Greg Kroah-HartmanFrom: Jason Wang <[email protected]>
commit 25266128fe16d5632d43ada34c847d7b8daba539 upstream.
A race were found where set_channels could be called after registering but before virtnet_set_queues() in virtnet_probe(). Fixing this by moving the virtnet_set_queues() before netdevice registering. While at it, use _virtnet_set_queues() to avoid holding rtnl as the device is not even registered at that time.
--- drivers/net/virtio_net.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/virtio_net.c +2 -2
@@ -3319,6 +3319,8 @@ static int virtnet_probe(struct virtio_d } } +_virtnet_set_queues (vi, vi->curr_queue_pairs); +/* serialize netdev register + virtio_device_ready() with ndo_open() */ rtnl_lock ();
@@ -3339,8 +3341,6 @@ static int virtnet_probe(struct virtio_d goto free_unregister_netdev; } -virtnet_set_queues (vi, vi->curr_queue_pairs); -/* Assume link up if device can't report link status, otherwise get link status from config. */ netif_carrier_off (dev);
Greg Kroah-Hartman
maintainerPATCH 141/155 s390/dasd: fix hanging device after quiesce/resume
In reply to Greg Kroah-HartmanFrom: Stefan Haberland <[email protected]>
commit 05f1d8ed03f547054efbc4d29bb7991c958ede95 upstream.
Quiesce and resume are functions that tell the DASD driver to stop/resume issuing I/Os to a specific DASD.
On resume dasd_schedule_block_bh() is called to kick handling of IO requests again. This does unfortunately not cover internal requests which are used for path verification for example.
This could lead to a hanging device when a path event or anything else that triggers internal requests occurs on a quiesced device.
Fix by also calling dasd_schedule_device_bh() which triggers handling of internal requests on resume.
--- drivers/s390/block/dasd_ioctl.c | 1 + 1 file changed, 1 insertion(+)
drivers/s390/block/dasd_ioctl.c +1 -0
@@ -131,6 +131,7 @@ static int dasd_ioctl_resume(struct dasdspin_unlock_irqrestore (get_ccwdev_lock (base->cdev), flags);dasd_schedule_block_bh (block); +dasd_schedule_device_bh (base);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 142/155 ASoC: wm8904: Fill the cache for WM8904_ADC_TEST_0 register
In reply to Greg Kroah-HartmanFrom: Mark Brown <[email protected]>
commit f061e2be8689057cb4ec0dbffa9f03e1a23cdcb2 upstream.
The WM8904_ADC_TEST_0 register is modified as part of updating the OSR controls but does not have a cache default, leading to errors when we try to modify these controls in cache only mode with no prior read:
wm8904 3-001a: ASoC: error at snd_soc_component_update_bits on wm8904.3-001a for register: [0x000000c6] -16
Add a read of the register to probe() to fill the cache and avoid both the error messages and the misconfiguration of the chip which will result.
--- sound/soc/codecs/wm8904.c | 3 +++ 1 file changed, 3 insertions(+)
sound/soc/codecs/wm8904.c +3 -0
@@ -2306,6 +2306,9 @@ static int wm8904_i2c_probe(struct i2c_cregmap_update_bits (wm8904->regmap,WM8904_BIAS_CONTROL_0 ,WM8904_POBCTRL ,0 ); +/* Fill the cache for the ADC test register */ +regmap_read (wm8904->regmap,WM8904_ADC_TEST_0 , &val); +/* Can leave the device powered off until we need it */ regcache_cache_only (wm8904->regmap, true);regulator_bulk_disable (ARRAY_SIZE (wm8904->supplies), wm8904->supplies);
Greg Kroah-Hartman
maintainerPATCH 143/155 ceph: never send metrics if disable_send_metrics is set
In reply to Greg Kroah-HartmanFrom: Xiubo Li <[email protected]>
commit 50164507f6b7b7ed85d8c3ac0266849fbd908db7 upstream.
Even the 'disable_send_metrics' is true so when the session is being opened it will always trigger to send the metric for the first time.
--- fs/ceph/metric.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ceph/metric.c +1 -1
@@ -202,7 +202,7 @@ static void metric_delayed_work(struct wstruct ceph_mds_client *mdsc = container_of(m, struct ceph_mds_client, metric); -if (mdsc->stopping) +if (mdsc->stopping || disable_send_metrics)return ;if (!m->session || !check_session_state (m->session)) {
Greg Kroah-Hartman
maintainerPATCH 144/155 dm cache policy smq: ensure IO doesnt prevent cleaner policy progress
In reply to Greg Kroah-HartmanFrom: Joe Thornber <[email protected]>
commit 1e4ab7b4c881cf26c1c72b3f56519e03475486fb upstream.
When using the cleaner policy to decommission the cache, there is never any writeback started from the cache as it is constantly delayed due to normal I/O keeping the device busy. Meaning @idle=false was always being passed to clean_target_met()
Fix this by adding a specific 'cleaner' flag that is set when the cleaner policy is configured. This flag serves to always allow the cleaner's writeback work to be queued until the cache is decommissioned (even if the cache isn't idle).
--- drivers/md/dm-cache-policy-smq.c | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-)
drivers/md/dm-cache-policy-smq.c +18 -10
@@ -854,7 +854,13 @@ struct smq_policy {struct background_tracker *bg_work; -bool migrations_allowed; + bool migrations_allowed:1; + +/* +* If this is set the policy will try and clean the whole cache +* even if the device is not idle. +*/ + bool cleaner:1; };/*----------------------------------------------------------------*/
@@ -1133,7 +1139,7 @@ static bool clean_target_met(struct smq_* Cache entries may not be populated. So we cannot rely on the * size of the clean queue. */ -if (idle) { +if (idle || mq->cleaner) {/* * We'd like to clean everything. */
@@ -1716,11 +1722,9 @@ static void calc_hotspot_params(sector_t *hotspot_block_size /=2u ; } -static struct dm_cache_policy *__smq_create (dm_cblock_t cache_size, -sector_t origin_size, -sector_t cache_block_size, -bool mimic_mq, -bool migrations_allowed) +static struct dm_cache_policy * +__smq_create (dm_cblock_t cache_size,sector_t origin_size,sector_t cache_block_size, +bool mimic_mq,bool migrations_allowed,bool cleaner) {unsigned i;unsigned nr_sentinels_per_queue =2u *NR_CACHE_LEVELS ;
@@ -1807,6 +1811,7 @@ static struct dm_cache_policy *__smq_cre goto bad_btracker; mq->migrations_allowed = migrations_allowed; + mq->cleaner = cleaner;return &mq->policy;
@@ -1830,21 +1835,24 @@ static struct dm_cache_policy *smq_creatsector_t origin_size, sector_t cache_block_size) { - return __smq_create(cache_size, origin_size, cache_block_size, false, true); + return __smq_create(cache_size, origin_size, cache_block_size, +false ,true ,false ); }static struct dm_cache_policy *mq_create (dm_cblock_t cache_size,sector_t origin_size,sector_t cache_block_size) { -return __smq_create (cache_size, origin_size, cache_block_size, true, true); +return __smq_create (cache_size, origin_size, cache_block_size, + true, true, false); }static struct dm_cache_policy *cleaner_create (dm_cblock_t cache_size,sector_t origin_size,sector_t cache_block_size) { -return __smq_create (cache_size, origin_size, cache_block_size, false, false); +return __smq_create (cache_size, origin_size, cache_block_size, + false, false, true); }/*----------------------------------------------------------------*/
Greg Kroah-Hartman
maintainerPATCH 145/155 rbd: make get_lock_owner_info() return a single locker or NULL
In reply to Greg Kroah-HartmanFrom: Ilya Dryomov <[email protected]>
commit f38cb9d9c2045dad16eead4a2e1aedfddd94603b upstream.
Make the "num_lockers can be only 0 or 1" assumption explicit and simplify the API by getting rid of output parameters in preparation for calling get_lock_owner_info() twice before blocklisting.
--- drivers/block/rbd.c | 84 +++++++++++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 33 deletions(-)
drivers/block/rbd.c +51 -33
@@ -3851,10 +3851,17 @@ static void wake_lock_waiters(struct rbdlist_splice_tail_init (&rbd_dev->acquiring_list, &rbd_dev->running_list); } -static int get_lock_owner_info (struct rbd_device *rbd_dev, -struct ceph_locker **lockers,u32 *num_lockers) +static void free_locker (struct ceph_locker *locker) +{ +if (locker) +ceph_free_lockers (locker,1 ); +} + +static struct ceph_locker *get_lock_owner_info (struct rbd_device *rbd_dev) {struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; +struct ceph_locker *lockers; +u32 num_lockers;u8 lock_type;char *lock_tag;int ret;
@@ -3863,39 +3870,45 @@ static int get_lock_owner_info(struct rb ret =ceph_cls_lock_info (osdc, &rbd_dev->header_oid, &rbd_dev->header_oloc,RBD_LOCK_NAME , - &lock_type, &lock_tag, lockers, num_lockers); -if (ret) -return ret; + &lock_type, &lock_tag, &lockers, &num_lockers); +if (ret) { +rbd_warn (rbd_dev,"failed to retrieve lockers: %d" , ret); +return ERR_PTR (ret); + } -if (*num_lockers ==0 ) { +if (num_lockers ==0 ) {dout ("%s rbd_dev %p no lockers detected\n" , __func__, rbd_dev); + lockers =NULL ; goto out; }if (strcmp (lock_tag,RBD_LOCK_TAG )) {rbd_warn (rbd_dev,"locked by external mechanism, tag %s" , lock_tag); - ret = -EBUSY ; - goto out; + goto err_busy; }if (lock_type ==CEPH_CLS_LOCK_SHARED ) {rbd_warn (rbd_dev,"shared lock type detected" ); - ret = -EBUSY ; - goto out; + goto err_busy; } -if (strncmp ((*lockers)[0 ].id.cookie,RBD_LOCK_COOKIE_PREFIX , +WARN_ON (num_lockers !=1 ); +if (strncmp (lockers[0 ].id.cookie,RBD_LOCK_COOKIE_PREFIX ,strlen (RBD_LOCK_COOKIE_PREFIX ))) {rbd_warn (rbd_dev,"locked by external mechanism, cookie %s" , - (*lockers)[0 ].id.cookie); - ret = -EBUSY ; - goto out; + lockers[0 ].id.cookie); + goto err_busy; } out:kfree (lock_tag); -return ret; +return lockers; + +err_busy: +kfree (lock_tag); +ceph_free_lockers (lockers, num_lockers); +return ERR_PTR (-EBUSY ); } static int find_watcher(struct rbd_device *rbd_dev,
@@ -3949,51 +3962,56 @@ out:static int rbd_try_lock (struct rbd_device *rbd_dev) {struct ceph_client *client = rbd_dev->rbd_client->client; -struct ceph_locker *lockers; -u32 num_lockers; +struct ceph_locker *locker;int ret;for (;;) { + locker =NULL ; + ret =rbd_lock (rbd_dev);if (ret != -EBUSY ) -return ret; + goto out;/* determine if the current lock holder is still alive */ - ret =get_lock_owner_info (rbd_dev, &lockers, &num_lockers); -if (ret) -return ret; - -if (num_lockers ==0 ) + locker =get_lock_owner_info (rbd_dev); +if (IS_ERR (locker)) { + ret =PTR_ERR (locker); + locker =NULL ; + goto out; + } +if (!locker) goto again; - ret =find_watcher (rbd_dev, lockers); + ret =find_watcher (rbd_dev, locker);if (ret) goto out;/* request lock or error */ rbd_warn (rbd_dev,"breaking header lock owned by %s%llu" , -ENTITY_NAME (lockers[0 ].id.name)); +ENTITY_NAME (locker->id.name)); ret =ceph_monc_blocklist_add (&client->monc, - &lockers[0 ].info.addr); + &locker->info.addr);if (ret) { -rbd_warn (rbd_dev,"blocklist of %s%llu failed: %d" , -ENTITY_NAME (lockers[0 ].id.name), ret); +rbd_warn (rbd_dev,"failed to blocklist %s%llu: %d" , +ENTITY_NAME (locker->id.name), ret); goto out; } ret =ceph_cls_break_lock (&client->osdc, &rbd_dev->header_oid, &rbd_dev->header_oloc,RBD_LOCK_NAME , - lockers[0 ].id.cookie, - &lockers[0 ].id.name); -if (ret && ret != -ENOENT ) + locker->id.cookie, &locker->id.name); +if (ret && ret != -ENOENT ) { +rbd_warn (rbd_dev,"failed to break header lock: %d" , + ret); goto out; + } again: -ceph_free_lockers (lockers, num_lockers); +free_locker (locker); } out: -ceph_free_lockers (lockers, num_lockers); +free_locker (locker);return ret; }
Greg Kroah-Hartman
maintainerPATCH 146/155 rbd: harden get_lock_owner_info() a bit
In reply to Greg Kroah-HartmanFrom: Ilya Dryomov <[email protected]>
commit 8ff2c64c9765446c3cef804fb99da04916603e27 upstream.
- we want the exclusive lock type, so test for it directly
- use sscanf() to actually parse the lock cookie and avoid admitting invalid handles
- bail if locker has a blank address
--- drivers/block/rbd.c | 21 +++++++++++++++------ net/ceph/messenger.c | 1 + 2 files changed, 16 insertions(+), 6 deletions(-)
drivers/block/rbd.c +15 -6
@@ -3864,10 +3864,9 @@ static struct ceph_locker *get_lock_owneu32 num_lockers;u8 lock_type;char *lock_tag; +u64 handle;int ret; -dout ("%s rbd_dev %p\n" , __func__, rbd_dev); - ret =ceph_cls_lock_info (osdc, &rbd_dev->header_oid, &rbd_dev->header_oloc,RBD_LOCK_NAME , &lock_type, &lock_tag, &lockers, &num_lockers);
@@ -3888,18 +3887,28 @@ static struct ceph_locker *get_lock_owne goto err_busy; } -if (lock_type ==CEPH_CLS_LOCK_SHARED ) { -rbd_warn (rbd_dev,"shared lock type detected" ); +if (lock_type !=CEPH_CLS_LOCK_EXCLUSIVE ) { +rbd_warn (rbd_dev,"incompatible lock type detected" ); goto err_busy; }WARN_ON (num_lockers !=1 ); -if (strncmp (lockers[0 ].id.cookie,RBD_LOCK_COOKIE_PREFIX , -strlen (RBD_LOCK_COOKIE_PREFIX ))) { + ret =sscanf (lockers[0 ].id.cookie,RBD_LOCK_COOKIE_PREFIX " %llu" , + &handle); +if (ret !=1 ) {rbd_warn (rbd_dev,"locked by external mechanism, cookie %s" , lockers[0 ].id.cookie); goto err_busy; } +if (ceph_addr_is_blank (&lockers[0 ].info.addr)) { +rbd_warn (rbd_dev,"locker has a blank address" ); + goto err_busy; + } + +dout ("%s rbd_dev %p got locker %s%llu@%pISpc/%u handle %llu\n" , + __func__, rbd_dev,ENTITY_NAME (lockers[0 ].id.name), + &lockers[0 ].info.addr.in_addr, +le32_to_cpu (lockers[0 ].info.addr.nonce), handle); out:kfree (lock_tag);
net/ceph/messenger.c +1 -0
@@ -1144,6 +1144,7 @@ bool ceph_addr_is_blank(const struct cepreturn true; } } +EXPORT_SYMBOL (ceph_addr_is_blank);int ceph_addr_port (const struct ceph_entity_addr *addr) {
Greg Kroah-Hartman
maintainerPATCH 147/155 rbd: retrieve and check lock owner twice before blocklisting
In reply to Greg Kroah-HartmanFrom: Ilya Dryomov <[email protected]>
commit 588159009d5b7a09c3e5904cffddbe4a4e170301 upstream.
An attempt to acquire exclusive lock can race with the current lock owner closing the image:
1. lock is held by client123, rbd_lock() returns -EBUSY
2. get_lock_owner_info() returns client123 instance details
3. client123 closes the image, lock is released
4. find_watcher() returns 0 as there is no matching watcher anymore
5. client123 instance gets erroneously blocklisted
Particularly impacted is mirror snapshot scheduler in snapshot-based mirroring since it happens to open and close images a lot (images are opened only for as long as it takes to take the next mirror snapshot, the same client instance is used for all images).
To reduce the potential for erroneous blocklisting, retrieve the lock owner again after find_watcher() returns 0. If it's still there, make sure it matches the previously detected lock owner.
--- drivers/block/rbd.c | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-)
drivers/block/rbd.c +23 -2
@@ -3851,6 +3851,15 @@ static void wake_lock_waiters(struct rbdlist_splice_tail_init (&rbd_dev->acquiring_list, &rbd_dev->running_list); } +static bool locker_equal (const struct ceph_locker *lhs, +const struct ceph_locker *rhs) +{ +return lhs->id.name.type == rhs->id.name.type && + lhs->id.name.num == rhs->id.name.num && + !strcmp (lhs->id.cookie, rhs->id.cookie) && +ceph_addr_equal_no_type (&lhs->info.addr, &rhs->info.addr); +} +static void free_locker (struct ceph_locker *locker) {if (locker)
@@ -3971,11 +3980,11 @@ out:static int rbd_try_lock (struct rbd_device *rbd_dev) {struct ceph_client *client = rbd_dev->rbd_client->client; -struct ceph_locker *locker; +struct ceph_locker *locker, *refreshed_locker;int ret;for (;;) { - locker =NULL ; + locker = refreshed_locker =NULL ; ret =rbd_lock (rbd_dev);if (ret != -EBUSY )
@@ -3995,6 +4004,16 @@ static int rbd_try_lock(struct rbd_devicif (ret) goto out;/* request lock or error */ + refreshed_locker =get_lock_owner_info (rbd_dev); +if (IS_ERR (refreshed_locker)) { + ret =PTR_ERR (refreshed_locker); + refreshed_locker =NULL ; + goto out; + } +if (!refreshed_locker || + !locker_equal (locker, refreshed_locker)) + goto again; +rbd_warn (rbd_dev,"breaking header lock owned by %s%llu" ,ENTITY_NAME (locker->id.name));
@@ -4016,10 +4035,12 @@ static int rbd_try_lock(struct rbd_devic } again: +free_locker (refreshed_locker);free_locker (locker); } out: +free_locker (refreshed_locker);free_locker (locker);return ret; }
Greg Kroah-Hartman
maintainerPATCH 148/155 tracing: Fix trace_event_raw_event_synth() if else statement
In reply to Greg Kroah-HartmanFrom: Steven Rostedt (Google) <[email protected]>
commit 9971c3f944489ff7aacb9d25e0cde841a5f6018a upstream.
The test to check if the field is a stack is to be done if it is not a string. But the code had:
} if (event->fields[i]->is_stack) {and not
} else if (event->fields[i]->is_stack) {which would cause it to always be tested. Worse yet, this also included an "else" statement that was only to be called if the field was not a string and a stack, but this code allows it to be called if it was a string (and not a stack).
Also fixed some whitespace issues.
--- kernel/trace/trace_events_synth.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/trace/trace_events_synth.c +2 -2
@@ -557,8 +557,8 @@ static notrace void trace_event_raw_even event->fields[i]->is_dynamic, data_size, &n_u64); data_size += len;/* only dynamic string increments */ - }if (event->fields[i]->is_stack) { -long *stack = (long *)(long )var_ref_vals[val_idx]; + }else if (event->fields[i]->is_stack) { +long *stack = (long *)(long )var_ref_vals[val_idx]; len =trace_stack (entry, event, stack, data_size, &n_u64);
Greg Kroah-Hartman
maintainerPATCH 149/155 ACPI: processor: perflib: Use the "no limit" frequency QoS
In reply to Greg Kroah-HartmanFrom: Rafael J. Wysocki <[email protected]>
commit c02d5feb6e2f60affc6ba8606d8d614c071e2ba6 upstream.
When _PPC returns 0, it means that the CPU frequency is not limited by the platform firmware, so make acpi_processor_get_platform_limit() update the frequency QoS request used by it to "no limit" in that case.
This addresses a problem with limiting CPU frequency artificially on some systems after CPU offline/online to the frequency that corresponds to the first entry in the _PSS return package.
--- drivers/acpi/processor_perflib.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
drivers/acpi/processor_perflib.c +16 -4
@@ -53,6 +53,8 @@ static int acpi_processor_get_platform_l {acpi_status status =0 ;unsigned long long ppc =0 ; +s32 qos_value; +int index;int ret;if (!pr)
@@ -72,17 +74,27 @@ static int acpi_processor_get_platform_l } } + index = ppc; +pr_debug ("CPU %d: _PPC is %d - frequency %s limited\n" , pr->id, - (int )ppc, ppc ?"" :"not" ); + index, index ?"is" :"is not" ); - pr->performance_platform_limit = (int )ppc; + pr->performance_platform_limit = index;if (ppc >= pr->performance->state_count ||unlikely (!freq_qos_request_active (&pr->perflib_req)))return 0 ; - ret =freq_qos_update_request (&pr->perflib_req, - pr->performance->states[ppc].core_frequency *1000 ); +/* +* If _PPC returns 0, it means that all of the available states can be +* used ("no limit"). +*/ +if (index ==0 ) + qos_value =FREQ_QOS_MAX_DEFAULT_VALUE ; +else + qos_value = pr->performance->states[index].core_frequency *1000 ; + + ret =freq_qos_update_request (&pr->perflib_req, qos_value);if (ret <0 ) {pr_warn ("Failed to update perflib freq constraint: CPU%d (%d)\n" , pr->id, ret);
Greg Kroah-Hartman
maintainerPATCH 150/155 ACPI: processor: perflib: Avoid updating frequency QoS unnecessarily
In reply to Greg Kroah-HartmanFrom: Rafael J. Wysocki <[email protected]>
commit 99387b016022c29234c4ebf9abd34358c6e56532 upstream.
Modify acpi_processor_get_platform_limit() to avoid updating its frequency QoS request when the _PPC return value has not changed by comparing that value to the previous _PPC return value stored in the performance_platform_limit field of the struct acpi_processor corresponding to the given CPU.
While at it, do the _PPC return value check against the state count earlier, to avoid setting performance_platform_limit to an invalid value, and make acpi_processor_ppc_init() use FREQ_QOS_MAX_DEFAULT_VALUE as the "no limit" frequency QoS for consistency.
--- drivers/acpi/processor_perflib.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
drivers/acpi/processor_perflib.c +14 -4
@@ -76,13 +76,16 @@ static int acpi_processor_get_platform_l index = ppc; +if (pr->performance_platform_limit == index || + ppc >= pr->performance->state_count) +return 0 ; +pr_debug ("CPU %d: _PPC is %d - frequency %s limited\n" , pr->id, index, index ?"is" :"is not" ); pr->performance_platform_limit = index; -if (ppc >= pr->performance->state_count || -unlikely (!freq_qos_request_active (&pr->perflib_req))) +if (unlikely (!freq_qos_request_active (&pr->perflib_req)))return 0 ;/*
@@ -177,9 +180,16 @@ void acpi_processor_ppc_init(struct cpufif (!pr)continue ; +/* +* Reset performance_platform_limit in case there is a stale +* value in it, so as to make it match the "no limit" QoS value +* below. +*/ + pr->performance_platform_limit =0 ; + ret =freq_qos_add_request (&policy->constraints, - &pr->perflib_req, -FREQ_QOS_MAX ,INT_MAX ); + &pr->perflib_req,FREQ_QOS_MAX , +FREQ_QOS_MAX_DEFAULT_VALUE );if (ret <0 )pr_err ("Failed to add freq constraint for CPU%d (%d)\n" , cpu, ret);
Greg Kroah-Hartman
maintainerPATCH 151/155 cpufreq: intel_pstate: Drop ACPI _PSS states table patching
In reply to Greg Kroah-HartmanFrom: Rafael J. Wysocki <[email protected]>
commit e8a0e30b742f76ebd0f3b196973df4bf65d8fbbb upstream.
After making acpi_processor_get_platform_limit() use the "no limit" value for its frequency QoS request when _PPC returns 0, it is not necessary to replace the frequency corresponding to the first _PSS return package entry with the maximum turbo frequency of the given CPU in intel_pstate_init_acpi_perf_limits() any more, so drop the code doing that along with the comment explaining it.
--- drivers/cpufreq/intel_pstate.c | 14 -------------- 1 file changed, 14 deletions(-)
drivers/cpufreq/intel_pstate.c +0 -14
@@ -448,20 +448,6 @@ static void intel_pstate_init_acpi_perf_ (u32) cpu->acpi_perf_data.states[i].control); } -/* -* The _PSS table doesn't contain whole turbo frequency range. -* This just contains +1 MHZ above the max non turbo frequency, -* with control value corresponding to max turbo ratio. But -* when cpufreq set policy is called, it will call with this -* max frequency, which will cause a reduced performance as -* this driver uses real max turbo frequency as the max -* frequency. So correct this frequency in _PSS table to -* correct max turbo frequency based on the turbo state. -* Also need to convert to MHz as _PSS freq is in MHz. -*/ -if (!global.turbo_disabled) - cpu->acpi_perf_data.states[0 ].core_frequency = - policy->cpuinfo.max_freq /1000 ; cpu->valid_pss_table = true;pr_debug ("_PPC limits will be enforced\n" );
Greg Kroah-Hartman
maintainerPATCH 152/155 selftests: mptcp: sockopt: use iptables-legacy if available
In reply to Greg Kroah-HartmanFrom: Matthieu Baerts <[email protected]>
commit a5a5990c099dd354e05e89ee77cd2dbf6655d4a1 upstream.
IPTables commands using 'iptables-nft' fail on old kernels, at least on v5.15 because it doesn't see the default IPTables chains:
$ iptables -L iptables/1.8.2 Failed to initialize nft: Protocol not supported
As a first step before switching to NFTables, we can use iptables-legacy if available.
--- tools/testing/selftests/net/mptcp/mptcp_sockopt.sh | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-)
tools/testing/selftests/net/mptcp/mptcp_sockopt.sh +11 -9
@@ -13,13 +13,15 @@ timeout_poll=30 timeout_test=$((timeout_poll * 2 + 1)) mptcp_connect="" do_all_tests=1 +iptables="iptables" +ip6tables="ip6tables" add_mark_rules() { local ns=$1 local m=$2 - for t in iptables ip6tables; do + for t in ${iptables} ${ip6tables}; do # just to debug: check we have multiple subflows connection requests ip netns exec $ns $t -A OUTPUT -p tcp --syn -m mark --mark $m -j ACCEPT
@@ -90,14 +92,14 @@ if [ $? -ne 0 ];then exit $ksft_skip fi -iptables -V > /dev/null 2>&1 -if [ $? -ne 0 ];then +# Use the legacy version if available to support old kernel versions +if iptables-legacy -V &> /dev/null; then + iptables="iptables-legacy" + ip6tables="ip6tables-legacy" +elif ! iptables -V &> /dev/null; then echo "SKIP: Could not run all tests without iptables tool" exit $ksft_skip -fi - -ip6tables -V > /dev/null 2>&1 -if [ $? -ne 0 ];then +elif ! ip6tables -V &> /dev/null; then echo "SKIP: Could not run all tests without ip6tables tool" exit $ksft_skip fi
@@ -107,10 +109,10 @@ check_mark() local ns=$1 local af=$2 - tables=iptables + tables=${iptables} if [ $af -eq 6 ];then - tables=ip6tables + tables=${ip6tables} fi counters=$(ip netns exec $ns $tables -v -L OUTPUT | grep DROP)
Greg Kroah-Hartman
maintainerPATCH 153/155 io_uring: treat -EAGAIN for REQ_F_NOWAIT as final for io-wq
In reply to Greg Kroah-HartmanFrom: Jens Axboe <[email protected]>
commit a9be202269580ca611c6cebac90eaf1795497800 upstream.
io-wq assumes that an issue is blocking, but it may not be if the request type has asked for a non-blocking attempt. If we get -EAGAIN for that case, then we need to treat it as a final result and not retry or arm poll for it.
--- io_uring/io_uring.c | 8 ++++++++ 1 file changed, 8 insertions(+)
io_uring/io_uring.c +8 -0
@@ -7066,6 +7066,14 @@ static void io_wq_submit_work(struct io_*/ if (ret != -EAGAIN || !(req->ctx->flags &IORING_SETUP_IOPOLL ))break ; + +/* +* If REQ_F_NOWAIT is set, then don't wait or retry with +* poll. -EAGAIN is final for that case. +*/ +if (req->flags &REQ_F_NOWAIT ) +break ; +cond_resched (); }while (1 ); }
Greg Kroah-Hartman
maintainerPATCH 154/155 ASoC: cs42l51: fix driver to properly autoload with automatic module loading
In reply to Greg Kroah-HartmanFrom: Thomas Petazzoni <[email protected]>
commit e51df4f81b02bcdd828a04de7c1eb6a92988b61e upstream.
In commit 2cb1e0259f50 ("ASoC: cs42l51: re-hook of_match_table pointer"), 9 years ago, some random guy fixed the cs42l51 after it was split into a core part and an I2C part to properly match based on a Device Tree compatible string.
However, the fix in this commit is wrong: the MODULE_DEVICE_TABLE(of, ....) is in the core part of the driver, not the I2C part. Therefore, automatic module loading based on module.alias, based on matching with the DT compatible string, loads the core part of the driver, but not the I2C part. And threfore, the i2c_driver is not registered, and the codec is not known to the system, nor matched with a DT node with the corresponding compatible string.
In order to fix that, we move the MODULE_DEVICE_TABLE(of, ...) into the I2C part of the driver. The cs42l51_of_match[] array is also moved as well, as it is not possible to have this definition in one file, and the MODULE_DEVICE_TABLE(of, ...) invocation in another file, due to how MODULE_DEVICE_TABLE works.
Thanks to this commit, the I2C part of the driver now properly autoloads, and thanks to its dependency on the core part, the core part gets autoloaded as well, resulting in a functional sound card without having to manually load kernel modules.
--- sound/soc/codecs/cs42l51-i2c.c | 6 ++++++ sound/soc/codecs/cs42l51.c | 7 ------- sound/soc/codecs/cs42l51.h | 1 - 3 files changed, 6 insertions(+), 8 deletions(-)
sound/soc/codecs/cs42l51-i2c.c +6 -0
@@ -19,6 +19,12 @@ static struct i2c_device_id cs42l51_i2c_ };MODULE_DEVICE_TABLE (i2c, cs42l51_i2c_id); +const struct of_device_id cs42l51_of_match[] = { + { .compatible ="cirrus,cs42l51" , }, + { } +}; +MODULE_DEVICE_TABLE (of, cs42l51_of_match); +static int cs42l51_i2c_probe (struct i2c_client *i2c,const struct i2c_device_id *id) {
sound/soc/codecs/cs42l51.c +0 -7
@@ -825,13 +825,6 @@ int __maybe_unused cs42l51_resume(struct }EXPORT_SYMBOL_GPL (cs42l51_resume); -const struct of_device_id cs42l51_of_match[] = { - { .compatible ="cirrus,cs42l51" , }, - { } -}; -MODULE_DEVICE_TABLE (of, cs42l51_of_match); -EXPORT_SYMBOL_GPL (cs42l51_of_match); -MODULE_AUTHOR ("Arnaud Patard <[email protected]>" );MODULE_DESCRIPTION ("Cirrus Logic CS42L51 ALSA SoC Codec Driver" );MODULE_LICENSE ("GPL" );
sound/soc/codecs/cs42l51.h +0 -1
@@ -16,7 +16,6 @@ int cs42l51_probe(struct device *dev, stint cs42l51_remove (struct device *dev);int __maybe_unused cs42l51_suspend (struct device *dev);int __maybe_unused cs42l51_resume (struct device *dev); -extern const struct of_device_id cs42l51_of_match[];#define CS42L51_CHIP_ID 0x1B#define CS42L51_CHIP_REV_A 0x00
Greg Kroah-Hartman
maintainerPATCH 155/155 selftests: mptcp: join: only check for ip6tables if needed
In reply to Greg Kroah-HartmanFrom: Matthieu Baerts <[email protected]>
commit 016e7ba47f33064fbef8c4307a2485d2669dfd03 upstream.
If 'iptables-legacy' is available, 'ip6tables-legacy' command will be used instead of 'ip6tables'. So no need to look if 'ip6tables' is available in this case.
--- tools/testing/selftests/net/mptcp/mptcp_join.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
tools/testing/selftests/net/mptcp/mptcp_join.sh +1 -4
@@ -179,10 +179,7 @@ if iptables-legacy -V &> /dev/null; then elif ! iptables -V &> /dev/null; then echo "SKIP: Could not run all tests without iptables tool" exit $ksft_skip -fi - -ip6tables -V > /dev/null 2>&1 -if [ $? -ne 0 ];then +elif ! ip6tables -V &> /dev/null; then echo "SKIP: Could not run all tests without ip6tables tool" exit $ksft_skip fi
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.124 release. There are 155 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 Thu, 03 Aug 2023 09:18:38 +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/v5.x/stable-review/patch-5.15.124-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v5.15:
11 builds: 11 pass, 0 fail
28 boots: 28 pass, 0 fail
114 tests: 114 pass, 0 failLinux version: 5.15.124-rc1-gb2c388dc2443
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-a04Jon
Hello,
Quoted 5 lines · On Tue, 1 Aug 2023 11:18:32 +0200 Greg Kroah-Hartman…
This is the start of the stable review cycle for the 5.15.124 release. There are 155 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.
Quoted 8 lines
Responses should be made by Thu, 03 Aug 2023 09:18:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.124-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.
This rc kernel passes DAMON functionality test[1] on my test machine. Attaching the test results summary below. Please note that I retrieved the kernel from linux-stable-rc tree[2].
[1] https://github.com/awslabs/damon-tests/tree/next/corr
[2] b2c388dc2443 ("Linux 5.15.124-rc1")
Thanks,
SJ
[...]
---
ok 1 selftests: damon: debugfs_attrs.sh
ok 1 selftests: damon-tests: kunit.sh
ok 2 selftests: damon-tests: huge_count_read_write.sh
ok 3 selftests: damon-tests: buffer_overflow.sh
ok 4 selftests: damon-tests: rm_contexts.sh
ok 5 selftests: damon-tests: record_null_deref.sh
ok 6 selftests: damon-tests: dbgfs_target_ids_read_before_terminate_race.sh ok 7 selftests: damon-tests: dbgfs_target_ids_pid_leak.sh
ok 8 selftests: damon-tests: damo_tests.sh
ok 9 selftests: damon-tests: masim-record.sh
ok 10 selftests: damon-tests: build_i386.sh
ok 11 selftests: damon-tests: build_m68k.sh
ok 12 selftests: damon-tests: build_arm64.sh
ok 13 selftests: damon-tests: build_i386_idle_flag.sh
ok 14 selftests: damon-tests: build_i386_highpte.sh
ok 15 selftests: damon-tests: build_nomemcg.sh
PASS
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.124 release. There are 155 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 Thu, 03 Aug 2023 09:18:38 +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/v5.x/stable-review/patch-5.15.124-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.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
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.124 release. There are 155 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 Thu, 03 Aug 2023 09:18:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.124-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.124 release. There are 155 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 Thu, 03 Aug 2023 09:18:38 +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/v5.x/stable-review/patch-5.15.124-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Following patch caused build regression on stable-rc 5.15 and stable-rc 6.1,
Regressions found on arm:
- build/gcc-12-orion5x_defconfig
- build/clang-nightly-orion5x_defconfig
- build/gcc-8-orion5x_defconfig
- build/clang-16-orion5x_defconfig
gpio: mvebu: Make use of devm_pwmchip_add
[ Upstream commit 1945063eb59e64d2919cb14d54d081476d9e53bb ]
Build log:
------drivers/gpio/gpio-mvebu.c: In function 'mvebu_pwm_probe':drivers/gpio/gpio-mvebu.c:877:16: error: implicit declaration of function 'devm_pwmchip_add'; did you mean 'pwmchip_add'? [-Werror=implicit-function-declaration]
877 | return devm_pwmchip_add(dev, &mvpwm->chip);
| ^~~~~~~~~~~~~~~~
| pwmchip_addcc1: some warnings being treated as errors
--
Linaro LKFT
https://lkft.linaro.org
Greg Kroah-Hartman
maintainerQuoted 39 lines · Naresh Kamboju
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.124 release. There are 155 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 Thu, 03 Aug 2023 09:18:38 +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/v5.x/stable-review/patch-5.15.124-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.thanks,
greg k-h
Following patch caused build regression on stable-rc 5.15 and stable-rc 6.1,
Regressions found on arm:
- build/gcc-12-orion5x_defconfig
- build/clang-nightly-orion5x_defconfig
- build/gcc-8-orion5x_defconfig
- build/clang-16-orion5x_defconfiggpio: mvebu: Make use of
devm_pwmchip_add
[ Upstream commit1945063eb59e64d2919cb14d54d081476d9e53bb]Build log:
------drivers/gpio/gpio-mvebu.c: In function 'mvebu_pwm_probe':drivers/gpio/gpio-mvebu.c:877:16: error: implicit declaration of function 'devm_pwmchip_add'; did you mean 'pwmchip_add'? [-Werror=implicit-function-declaration]
Quoted 6 lines
877 | return devm_pwmchip_add(dev, &mvpwm->chip); | ^~~~~~~~~~~~~~~~ | pwmchip_addcc1: some warnings being treated as errors
Ah, looks like 88da4e811311 ("pwm: Add a stub for devm_pwmchip_add()") is needed, I'll queue that up for 5.15 and 6.1 and push out new -rc releases.
thanks,
greg k-h
Hi Greg,
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.15.124 release. There are 155 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.
Quoted 9 lines
Responses should be made by Thu, 03 Aug 2023 09:18:38 +0000. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.15.124-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.15.y
and the diffstat can be found below.
No problems seen on x86_64 and aarch64.
Thanks,
Harshit
Quoted 3 lines
thanks,
greg k-h