Squash commits for public release
This commit is contained in:
36
kernel/include/syscalls/interruptible_area.h
Normal file
36
kernel/include/syscalls/interruptible_area.h
Normal file
@@ -0,0 +1,36 @@
|
||||
#ifndef _KERNEL_SYSCALLS_INTERRUPTIBLE_AREA_H
|
||||
#define _KERNEL_SYSCALLS_INTERRUPTIBLE_AREA_H
|
||||
|
||||
#include <libkern/libkern.h>
|
||||
#include <platform/generic/system.h>
|
||||
#include <tasking/cpu.h>
|
||||
|
||||
/**
|
||||
* By design the whole kernel is not interruptible, but some parts inside kernel
|
||||
* could be interrupted without any bad consequences and at the same time these
|
||||
* parts take a lot of cpu time, like copying data from/to user. We might want
|
||||
* to mark them as interruptible.
|
||||
*/
|
||||
|
||||
static ALWAYS_INLINE int interruptible_area_start()
|
||||
{
|
||||
int res = THIS_CPU->int_depth_counter;
|
||||
THIS_CPU->int_depth_counter = 0;
|
||||
system_enable_interrupts_no_counter();
|
||||
return res;
|
||||
}
|
||||
|
||||
static ALWAYS_INLINE int interruptible_area_end(int old)
|
||||
{
|
||||
system_disable_interrupts_no_counter();
|
||||
THIS_CPU->int_depth_counter = old;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef PREEMPT_KERNEL
|
||||
#define INTERRUPTIBLE_AREA for (int __i = 0, __j = interruptible_area_start(); __i < 1; interruptible_area_end(__j), __i++)
|
||||
#else
|
||||
#define INTERRUPTIBLE_AREA if (true)
|
||||
#endif
|
||||
|
||||
#endif // _KERNEL_SYSCALLS_INTERRUPTIBLE_AREA_H
|
||||
Reference in New Issue
Block a user