kprintf: only call eventfd() if it is safe to interrupt
Missing ARM64 implementation, cannot test right now Change-Id: Ia05e8b7952b19bcd8fdac1f920d9bfe341be8b97
This commit is contained in:
committed by
Dominique Martinet
parent
6df4bd8f8c
commit
ad2cb6375a
@@ -604,4 +604,11 @@ __mcs_rwlock_reader_unlock(struct mcs_rwlock_lock *lock, struct mcs_rwlock_node_
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int irqflags_can_interrupt(unsigned long flags)
|
||||||
|
{
|
||||||
|
#warning "arm64 irqflags_can_interrupt not implemented"
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#endif /* !__HEADER_ARM64_COMMON_ARCH_LOCK_H */
|
#endif /* !__HEADER_ARM64_COMMON_ARCH_LOCK_H */
|
||||||
|
|||||||
@@ -602,4 +602,9 @@ __mcs_rwlock_reader_unlock(struct mcs_rwlock_lock *lock, struct mcs_rwlock_node_
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int irqflags_can_interrupt(unsigned long flags)
|
||||||
|
{
|
||||||
|
return !!(flags & 0x200);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -84,7 +84,8 @@ void kputs(char *buf)
|
|||||||
debug_spin_unlock_irqrestore(&kmsg_buf->lock, flags_inner);
|
debug_spin_unlock_irqrestore(&kmsg_buf->lock, flags_inner);
|
||||||
kprintf_unlock(flags_outer);
|
kprintf_unlock(flags_outer);
|
||||||
|
|
||||||
if (DEBUG_KMSG_USED > IHK_KMSG_HIGH_WATER_MARK) {
|
if (irqflags_can_interrupt(flags_outer) &&
|
||||||
|
DEBUG_KMSG_USED > IHK_KMSG_HIGH_WATER_MARK) {
|
||||||
eventfd(IHK_OS_EVENTFD_TYPE_KMSG);
|
eventfd(IHK_OS_EVENTFD_TYPE_KMSG);
|
||||||
ihk_mc_delay_us(IHK_KMSG_NOTIFY_DELAY);
|
ihk_mc_delay_us(IHK_KMSG_NOTIFY_DELAY);
|
||||||
}
|
}
|
||||||
@@ -123,8 +124,8 @@ int __kprintf(const char *format, ...)
|
|||||||
}
|
}
|
||||||
|
|
||||||
debug_spin_unlock_irqrestore(&kmsg_buf->lock, flags_inner);
|
debug_spin_unlock_irqrestore(&kmsg_buf->lock, flags_inner);
|
||||||
|
if (irqflags_can_interrupt(flags_inner) &&
|
||||||
if (DEBUG_KMSG_USED > IHK_KMSG_HIGH_WATER_MARK) {
|
DEBUG_KMSG_USED > IHK_KMSG_HIGH_WATER_MARK) {
|
||||||
eventfd(IHK_OS_EVENTFD_TYPE_KMSG);
|
eventfd(IHK_OS_EVENTFD_TYPE_KMSG);
|
||||||
ihk_mc_delay_us(IHK_KMSG_NOTIFY_DELAY);
|
ihk_mc_delay_us(IHK_KMSG_NOTIFY_DELAY);
|
||||||
}
|
}
|
||||||
@@ -165,7 +166,8 @@ int kprintf(const char *format, ...)
|
|||||||
debug_spin_unlock_irqrestore(&kmsg_buf->lock, flags_inner);
|
debug_spin_unlock_irqrestore(&kmsg_buf->lock, flags_inner);
|
||||||
kprintf_unlock(flags_outer);
|
kprintf_unlock(flags_outer);
|
||||||
|
|
||||||
if (DEBUG_KMSG_USED > IHK_KMSG_HIGH_WATER_MARK) {
|
if (irqflags_can_interrupt(flags_outer) &&
|
||||||
|
DEBUG_KMSG_USED > IHK_KMSG_HIGH_WATER_MARK) {
|
||||||
eventfd(IHK_OS_EVENTFD_TYPE_KMSG);
|
eventfd(IHK_OS_EVENTFD_TYPE_KMSG);
|
||||||
ihk_mc_delay_us(IHK_KMSG_NOTIFY_DELAY);
|
ihk_mc_delay_us(IHK_KMSG_NOTIFY_DELAY);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user