@@ -53,14 +53,19 @@ static const struct k_clock clock_realtime, clock_monotonic;
53
53
#error "SIGEV_THREAD_ID must not share bit with other SIGEV values!"
54
54
#endif
55
55
56
- static struct k_itimer * __lock_timer (timer_t timer_id , unsigned long * flags );
56
+ static struct k_itimer * __lock_timer (timer_t timer_id );
57
57
58
- #define lock_timer (tid , flags ) \
59
- ({ struct k_itimer *__timr; \
60
- __cond_lock(&__timr->it_lock, __timr = __lock_timer(tid, flags )); \
61
- __timr; \
58
+ #define lock_timer (tid ) \
59
+ ({ struct k_itimer *__timr; \
60
+ __cond_lock(&__timr->it_lock, __timr = __lock_timer(tid)); \
61
+ __timr; \
62
62
})
63
63
64
+ static inline void unlock_timer (struct k_itimer * timr )
65
+ {
66
+ spin_unlock_irq (& timr -> it_lock );
67
+ }
68
+
64
69
static int hash (struct signal_struct * sig , unsigned int nr )
65
70
{
66
71
return hash_32 (hash32_ptr (sig ) ^ nr , HASH_BITS (posix_timers_hashtable ));
@@ -144,11 +149,6 @@ static int posix_timer_add(struct k_itimer *timer)
144
149
return - EAGAIN ;
145
150
}
146
151
147
- static inline void unlock_timer (struct k_itimer * timr , unsigned long flags )
148
- {
149
- spin_unlock_irqrestore (& timr -> it_lock , flags );
150
- }
151
-
152
152
static int posix_get_realtime_timespec (clockid_t which_clock , struct timespec64 * tp )
153
153
{
154
154
ktime_get_real_ts64 (tp );
@@ -538,7 +538,7 @@ COMPAT_SYSCALL_DEFINE3(timer_create, clockid_t, which_clock,
538
538
}
539
539
#endif
540
540
541
- static struct k_itimer * __lock_timer (timer_t timer_id , unsigned long * flags )
541
+ static struct k_itimer * __lock_timer (timer_t timer_id )
542
542
{
543
543
struct k_itimer * timr ;
544
544
@@ -580,14 +580,14 @@ static struct k_itimer *__lock_timer(timer_t timer_id, unsigned long *flags)
580
580
guard (rcu )();
581
581
timr = posix_timer_by_id (timer_id );
582
582
if (timr ) {
583
- spin_lock_irqsave (& timr -> it_lock , * flags );
583
+ spin_lock_irq (& timr -> it_lock );
584
584
/*
585
585
* Validate under timr::it_lock that timr::it_signal is
586
586
* still valid. Pairs with #1 above.
587
587
*/
588
588
if (timr -> it_signal == current -> signal )
589
589
return timr ;
590
- spin_unlock_irqrestore (& timr -> it_lock , * flags );
590
+ spin_unlock_irq (& timr -> it_lock );
591
591
}
592
592
return NULL ;
593
593
}
@@ -680,17 +680,16 @@ void common_timer_get(struct k_itimer *timr, struct itimerspec64 *cur_setting)
680
680
static int do_timer_gettime (timer_t timer_id , struct itimerspec64 * setting )
681
681
{
682
682
struct k_itimer * timr ;
683
- unsigned long flags ;
684
683
int ret = 0 ;
685
684
686
- timr = lock_timer (timer_id , & flags );
685
+ timr = lock_timer (timer_id );
687
686
if (!timr )
688
687
return - EINVAL ;
689
688
690
689
memset (setting , 0 , sizeof (* setting ));
691
690
timr -> kclock -> timer_get (timr , setting );
692
691
693
- unlock_timer (timr , flags );
692
+ unlock_timer (timr );
694
693
return ret ;
695
694
}
696
695
@@ -746,15 +745,14 @@ SYSCALL_DEFINE2(timer_gettime32, timer_t, timer_id,
746
745
SYSCALL_DEFINE1 (timer_getoverrun , timer_t , timer_id )
747
746
{
748
747
struct k_itimer * timr ;
749
- unsigned long flags ;
750
748
int overrun ;
751
749
752
- timr = lock_timer (timer_id , & flags );
750
+ timr = lock_timer (timer_id );
753
751
if (!timr )
754
752
return - EINVAL ;
755
753
756
754
overrun = timer_overrun_to_int (timr );
757
- unlock_timer (timr , flags );
755
+ unlock_timer (timr );
758
756
759
757
return overrun ;
760
758
}
@@ -813,14 +811,13 @@ static void common_timer_wait_running(struct k_itimer *timer)
813
811
* when the task which tries to delete or disarm the timer has preempted
814
812
* the task which runs the expiry in task work context.
815
813
*/
816
- static struct k_itimer * timer_wait_running (struct k_itimer * timer ,
817
- unsigned long * flags )
814
+ static struct k_itimer * timer_wait_running (struct k_itimer * timer )
818
815
{
819
816
timer_t timer_id = READ_ONCE (timer -> it_id );
820
817
821
818
/* Prevent kfree(timer) after dropping the lock */
822
819
scoped_guard (rcu ) {
823
- unlock_timer (timer , * flags );
820
+ unlock_timer (timer );
824
821
/*
825
822
* kc->timer_wait_running() might drop RCU lock. So @timer
826
823
* cannot be touched anymore after the function returns!
@@ -829,7 +826,7 @@ static struct k_itimer *timer_wait_running(struct k_itimer *timer,
829
826
}
830
827
831
828
/* Relock the timer. It might be not longer hashed. */
832
- return lock_timer (timer_id , flags );
829
+ return lock_timer (timer_id );
833
830
}
834
831
835
832
/*
@@ -889,7 +886,6 @@ static int do_timer_settime(timer_t timer_id, int tmr_flags,
889
886
struct itimerspec64 * old_spec64 )
890
887
{
891
888
struct k_itimer * timr ;
892
- unsigned long flags ;
893
889
int error ;
894
890
895
891
if (!timespec64_valid (& new_spec64 -> it_interval ) ||
@@ -899,7 +895,7 @@ static int do_timer_settime(timer_t timer_id, int tmr_flags,
899
895
if (old_spec64 )
900
896
memset (old_spec64 , 0 , sizeof (* old_spec64 ));
901
897
902
- timr = lock_timer (timer_id , & flags );
898
+ timr = lock_timer (timer_id );
903
899
retry :
904
900
if (!timr )
905
901
return - EINVAL ;
@@ -916,10 +912,10 @@ static int do_timer_settime(timer_t timer_id, int tmr_flags,
916
912
// We already got the old time...
917
913
old_spec64 = NULL ;
918
914
/* Unlocks and relocks the timer if it still exists */
919
- timr = timer_wait_running (timr , & flags );
915
+ timr = timer_wait_running (timr );
920
916
goto retry ;
921
917
}
922
- unlock_timer (timr , flags );
918
+ unlock_timer (timr );
923
919
924
920
return error ;
925
921
}
@@ -995,10 +991,7 @@ static inline void posix_timer_cleanup_ignored(struct k_itimer *tmr)
995
991
/* Delete a POSIX.1b interval timer. */
996
992
SYSCALL_DEFINE1 (timer_delete , timer_t , timer_id )
997
993
{
998
- struct k_itimer * timer ;
999
- unsigned long flags ;
1000
-
1001
- timer = lock_timer (timer_id , & flags );
994
+ struct k_itimer * timer = lock_timer (timer_id );
1002
995
1003
996
retry_delete :
1004
997
if (!timer )
@@ -1009,7 +1002,7 @@ SYSCALL_DEFINE1(timer_delete, timer_t, timer_id)
1009
1002
1010
1003
if (unlikely (timer -> kclock -> timer_del (timer ) == TIMER_RETRY )) {
1011
1004
/* Unlocks and relocks the timer if it still exists */
1012
- timer = timer_wait_running (timer , & flags );
1005
+ timer = timer_wait_running (timer );
1013
1006
goto retry_delete ;
1014
1007
}
1015
1008
@@ -1028,7 +1021,7 @@ SYSCALL_DEFINE1(timer_delete, timer_t, timer_id)
1028
1021
WRITE_ONCE (timer -> it_signal , NULL );
1029
1022
}
1030
1023
1031
- unlock_timer (timer , flags );
1024
+ unlock_timer (timer );
1032
1025
posix_timer_unhash_and_free (timer );
1033
1026
return 0 ;
1034
1027
}
@@ -1039,12 +1032,7 @@ SYSCALL_DEFINE1(timer_delete, timer_t, timer_id)
1039
1032
*/
1040
1033
static void itimer_delete (struct k_itimer * timer )
1041
1034
{
1042
- unsigned long flags ;
1043
-
1044
- /*
1045
- * irqsave is required to make timer_wait_running() work.
1046
- */
1047
- spin_lock_irqsave (& timer -> it_lock , flags );
1035
+ spin_lock_irq (& timer -> it_lock );
1048
1036
1049
1037
retry_delete :
1050
1038
/*
@@ -1065,7 +1053,7 @@ static void itimer_delete(struct k_itimer *timer)
1065
1053
* do_exit() only for the last thread of the thread group.
1066
1054
* So no other task can access and delete that timer.
1067
1055
*/
1068
- if (WARN_ON_ONCE (timer_wait_running (timer , & flags ) != timer ))
1056
+ if (WARN_ON_ONCE (timer_wait_running (timer ) != timer ))
1069
1057
return ;
1070
1058
1071
1059
goto retry_delete ;
@@ -1082,7 +1070,7 @@ static void itimer_delete(struct k_itimer *timer)
1082
1070
*/
1083
1071
WRITE_ONCE (timer -> it_signal , NULL );
1084
1072
1085
- spin_unlock_irqrestore (& timer -> it_lock , flags );
1073
+ spin_unlock_irq (& timer -> it_lock );
1086
1074
posix_timer_unhash_and_free (timer );
1087
1075
}
1088
1076
0 commit comments