mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	- Two fixes for the futex syscall related to the timeout handling.
 
     FUTEX_LOCK_PI does not support the FUTEX_CLOCK_REALTIME bit and because
     it's not set the time namespace adjustment for clock MONOTONIC is
     applied wrongly.
 
     FUTEX_WAIT cannot support the FUTEX_CLOCK_REALTIME bit because its
     always a relative timeout.
 
   - Cleanups in the futex syscall entry points which became obvious when
     the two timeout handling bugs were fixed.
 
   - Cleanup of queued_write_lock_slowpath() as suggested by Linus
 
   - Fixup of the smp_call_function_single_async() prototype
 -----BEGIN PGP SIGNATURE-----
 
 iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAmCX5X4THHRnbHhAbGlu
 dXRyb25peC5kZQAKCRCmGPVMDXSYoSpIEACRWDooQYxDnA81yib5a/R41xpp74uV
 OFtEpJoJp0oEGeKpr2lXw2wC6fKpxouLJiPzxBs43IyMm8f6613aJSTrKExWPzqV
 UYv6XYjcPZVf/sY0aLh0oO+Dte3BKupr8Nk+DVaanQ7NxBQwhu+P2ACrYSiu1AIi
 P0dGvMLJTUTlz81uSCu9csUd67Zr4ZRSa4dOHOJaR2OrRK91QPs9QWHdseHp7vAm
 N5X49kMRbBffs1Uk4b6TTBUpnPUzMXH4Wv7tp5tISVCVClbPKtLZ7IQ4TGRvnlFO
 y67YLEEkHc11wCVbjRxZTqKyiXGqo000zEDxskICSBF5GAqA4JN49/TP00NOvbHS
 zOL69jisqB3i2vUuggcDP1pzumGwHgkziOK1cljhKMBhfuErA0yrl2vWI1B5aKtH
 BdFOSKDoWnkAIw8n3Q/8QTfwLxA4DZ5NrEJjYKTVGkYpwtUDVcKdlzfd0u2rqQFU
 b0Qno4iDC3ZYibNfKcTCrkvu1iIKvr1FwWkVr1sMGH4/zFq4uRarsPMcba6Qt826
 LAESoB9bd8yFGgY3wgnTSCCJdxVggrudxHM4p6jKEr/CnWWtgmzyMvUvd+XGZqfr
 lshgI3SUQg95mu/MpRulNMxn8RvH1Tka26xoWGtCzBvl/DNGTbcFv6EsZJaN3xVe
 +VYp6ht9gKf5nA==
 =bo8R
 -----END PGP SIGNATURE-----
Merge tag 'locking-urgent-2021-05-09' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull locking fixes from Thomas Gleixner:
 "A set of locking related fixes and updates:
   - Two fixes for the futex syscall related to the timeout handling.
     FUTEX_LOCK_PI does not support the FUTEX_CLOCK_REALTIME bit and
     because it's not set the time namespace adjustment for clock
     MONOTONIC is applied wrongly.
     FUTEX_WAIT cannot support the FUTEX_CLOCK_REALTIME bit because its
     always a relative timeout.
   - Cleanups in the futex syscall entry points which became obvious
     when the two timeout handling bugs were fixed.
   - Cleanup of queued_write_lock_slowpath() as suggested by Linus
   - Fixup of the smp_call_function_single_async() prototype"
* tag 'locking-urgent-2021-05-09' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  futex: Make syscall entry points less convoluted
  futex: Get rid of the val2 conditional dance
  futex: Do not apply time namespace adjustment on FUTEX_LOCK_PI
  Revert 337f13046f ("futex: Allow FUTEX_CLOCK_REALTIME with FUTEX_WAIT op")
  locking/qrwlock: Cleanup queued_write_lock_slowpath()
  smp: Fix smp_call_function_single_async prototype
		
	
			
		
			
				
	
	
		
			73 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0-only
 | 
						|
/*
 | 
						|
 * Uniprocessor-only support functions.  The counterpart to kernel/smp.c
 | 
						|
 */
 | 
						|
 | 
						|
#include <linux/interrupt.h>
 | 
						|
#include <linux/kernel.h>
 | 
						|
#include <linux/export.h>
 | 
						|
#include <linux/smp.h>
 | 
						|
#include <linux/hypervisor.h>
 | 
						|
 | 
						|
int smp_call_function_single(int cpu, void (*func) (void *info), void *info,
 | 
						|
				int wait)
 | 
						|
{
 | 
						|
	unsigned long flags;
 | 
						|
 | 
						|
	if (cpu != 0)
 | 
						|
		return -ENXIO;
 | 
						|
 | 
						|
	local_irq_save(flags);
 | 
						|
	func(info);
 | 
						|
	local_irq_restore(flags);
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
EXPORT_SYMBOL(smp_call_function_single);
 | 
						|
 | 
						|
int smp_call_function_single_async(int cpu, struct __call_single_data *csd)
 | 
						|
{
 | 
						|
	unsigned long flags;
 | 
						|
 | 
						|
	local_irq_save(flags);
 | 
						|
	csd->func(csd->info);
 | 
						|
	local_irq_restore(flags);
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
EXPORT_SYMBOL(smp_call_function_single_async);
 | 
						|
 | 
						|
/*
 | 
						|
 * Preemption is disabled here to make sure the cond_func is called under the
 | 
						|
 * same conditions in UP and SMP.
 | 
						|
 */
 | 
						|
void on_each_cpu_cond_mask(smp_cond_func_t cond_func, smp_call_func_t func,
 | 
						|
			   void *info, bool wait, const struct cpumask *mask)
 | 
						|
{
 | 
						|
	unsigned long flags;
 | 
						|
 | 
						|
	preempt_disable();
 | 
						|
	if ((!cond_func || cond_func(0, info)) && cpumask_test_cpu(0, mask)) {
 | 
						|
		local_irq_save(flags);
 | 
						|
		func(info);
 | 
						|
		local_irq_restore(flags);
 | 
						|
	}
 | 
						|
	preempt_enable();
 | 
						|
}
 | 
						|
EXPORT_SYMBOL(on_each_cpu_cond_mask);
 | 
						|
 | 
						|
int smp_call_on_cpu(unsigned int cpu, int (*func)(void *), void *par, bool phys)
 | 
						|
{
 | 
						|
	int ret;
 | 
						|
 | 
						|
	if (cpu != 0)
 | 
						|
		return -ENXIO;
 | 
						|
 | 
						|
	if (phys)
 | 
						|
		hypervisor_pin_vcpu(0);
 | 
						|
	ret = func(par);
 | 
						|
	if (phys)
 | 
						|
		hypervisor_pin_vcpu(-1);
 | 
						|
 | 
						|
	return ret;
 | 
						|
}
 | 
						|
EXPORT_SYMBOL_GPL(smp_call_on_cpu);
 |