diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/bpf/helpers.c | 2 | ||||
| -rw-r--r-- | kernel/bpf/ringbuf.c | 2 | ||||
| -rw-r--r-- | kernel/power/hibernate.c | 4 | ||||
| -rw-r--r-- | kernel/power/main.c | 22 | ||||
| -rw-r--r-- | kernel/power/process.c | 1 | ||||
| -rw-r--r-- | kernel/power/suspend.c | 1 | 
6 files changed, 22 insertions, 10 deletions
diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index 8eb117c52817..eb25e70e0bdc 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -4345,6 +4345,7 @@ BTF_ID_FLAGS(func, bpf_iter_kmem_cache_next, KF_ITER_NEXT | KF_RET_NULL | KF_SLE  BTF_ID_FLAGS(func, bpf_iter_kmem_cache_destroy, KF_ITER_DESTROY | KF_SLEEPABLE)  BTF_ID_FLAGS(func, bpf_local_irq_save)  BTF_ID_FLAGS(func, bpf_local_irq_restore) +#ifdef CONFIG_BPF_EVENTS  BTF_ID_FLAGS(func, bpf_probe_read_user_dynptr)  BTF_ID_FLAGS(func, bpf_probe_read_kernel_dynptr)  BTF_ID_FLAGS(func, bpf_probe_read_user_str_dynptr) @@ -4353,6 +4354,7 @@ BTF_ID_FLAGS(func, bpf_copy_from_user_dynptr, KF_SLEEPABLE)  BTF_ID_FLAGS(func, bpf_copy_from_user_str_dynptr, KF_SLEEPABLE)  BTF_ID_FLAGS(func, bpf_copy_from_user_task_dynptr, KF_SLEEPABLE | KF_TRUSTED_ARGS)  BTF_ID_FLAGS(func, bpf_copy_from_user_task_str_dynptr, KF_SLEEPABLE | KF_TRUSTED_ARGS) +#endif  #ifdef CONFIG_DMA_SHARED_BUFFER  BTF_ID_FLAGS(func, bpf_iter_dmabuf_new, KF_ITER_NEW | KF_SLEEPABLE)  BTF_ID_FLAGS(func, bpf_iter_dmabuf_next, KF_ITER_NEXT | KF_RET_NULL | KF_SLEEPABLE) diff --git a/kernel/bpf/ringbuf.c b/kernel/bpf/ringbuf.c index 719d73299397..d706c4b7f532 100644 --- a/kernel/bpf/ringbuf.c +++ b/kernel/bpf/ringbuf.c @@ -216,6 +216,8 @@ static struct bpf_map *ringbuf_map_alloc(union bpf_attr *attr)  static void bpf_ringbuf_free(struct bpf_ringbuf *rb)  { +	irq_work_sync(&rb->work); +  	/* copy pages pointer and nr_pages to local variable, as we are going  	 * to unmap rb itself with vunmap() below  	 */ diff --git a/kernel/power/hibernate.c b/kernel/power/hibernate.c index 14e85ff23551..53166ef86ba4 100644 --- a/kernel/power/hibernate.c +++ b/kernel/power/hibernate.c @@ -706,7 +706,6 @@ static void power_down(void)  #ifdef CONFIG_SUSPEND  	if (hibernation_mode == HIBERNATION_SUSPEND) { -		pm_restore_gfp_mask();  		error = suspend_devices_and_enter(mem_sleep_current);  		if (!error)  			goto exit; @@ -746,9 +745,6 @@ static void power_down(void)  		cpu_relax();  exit: -	/* Match the pm_restore_gfp_mask() call in hibernate(). */ -	pm_restrict_gfp_mask(); -  	/* Restore swap signature. */  	error = swsusp_unmark();  	if (error) diff --git a/kernel/power/main.c b/kernel/power/main.c index 3cf2d7e72567..549f51ca3a1e 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -31,23 +31,35 @@   * held, unless the suspend/hibernate code is guaranteed not to run in parallel   * with that modification).   */ +static unsigned int saved_gfp_count;  static gfp_t saved_gfp_mask;  void pm_restore_gfp_mask(void)  {  	WARN_ON(!mutex_is_locked(&system_transition_mutex)); -	if (saved_gfp_mask) { -		gfp_allowed_mask = saved_gfp_mask; -		saved_gfp_mask = 0; -	} + +	if (WARN_ON(!saved_gfp_count) || --saved_gfp_count) +		return; + +	gfp_allowed_mask = saved_gfp_mask; +	saved_gfp_mask = 0; + +	pm_pr_dbg("GFP mask restored\n");  }  void pm_restrict_gfp_mask(void)  {  	WARN_ON(!mutex_is_locked(&system_transition_mutex)); -	WARN_ON(saved_gfp_mask); + +	if (saved_gfp_count++) { +		WARN_ON((saved_gfp_mask & ~(__GFP_IO | __GFP_FS)) != gfp_allowed_mask); +		return; +	} +  	saved_gfp_mask = gfp_allowed_mask;  	gfp_allowed_mask &= ~(__GFP_IO | __GFP_FS); + +	pm_pr_dbg("GFP mask restricted\n");  }  unsigned int lock_system_sleep(void) diff --git a/kernel/power/process.c b/kernel/power/process.c index 8ff68ebaa1e0..dc0dfc349f22 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c @@ -132,6 +132,7 @@ int freeze_processes(void)  	if (!pm_freezing)  		static_branch_inc(&freezer_active); +	pm_wakeup_clear(0);  	pm_freezing = true;  	error = try_to_freeze_tasks(true);  	if (!error) diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index 4bb4686c1c08..b4ca17c2fecf 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c @@ -595,7 +595,6 @@ static int enter_state(suspend_state_t state)  	}  	pm_pr_dbg("Preparing system for sleep (%s)\n", mem_sleep_labels[state]); -	pm_wakeup_clear(0);  	pm_suspend_clear_flags();  	error = suspend_prepare(state);  	if (error)  | 
