1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 04:37:44 +00:00

Kernel+ProfileViewer: Display additional filesystem events

This commit is contained in:
Jakub Berkop 2023-08-25 23:47:42 +02:00 committed by Andrew Kaster
parent c184a0786f
commit 54e79aa1d9
16 changed files with 655 additions and 135 deletions

View file

@ -77,6 +77,66 @@ struct [[gnu::packed]] ReadPerformanceEvent {
bool success;
};
enum class FilesystemEventType : u8 {
Open,
Close,
Readv,
Read,
Pread
};
struct [[gnu::packed]] OpenEventData {
int dirfd;
size_t filename_index;
int options;
u64 mode;
};
struct [[gnu::packed]] CloseEventData {
int fd;
size_t filename_index;
};
struct [[gnu::packed]] ReadvEventData {
int fd;
size_t filename_index;
// struct iovec* iov; // TODO: Implement
// int iov_count; // TODO: Implement
};
struct [[gnu::packed]] ReadEventData {
int fd;
size_t filename_index;
};
struct [[gnu::packed]] PreadEventData {
int fd;
size_t filename_index;
FlatPtr buffer_ptr;
size_t size;
off_t offset;
};
// FIXME: This is a hack to make the compiler pack this struct correctly.
struct [[gnu::packed]] PackedErrorOr {
bool is_error;
FlatPtr value;
};
struct [[gnu::packed]] FilesystemEvent {
FilesystemEventType type;
u64 durationNs;
PackedErrorOr result;
union {
OpenEventData open;
CloseEventData close;
ReadvEventData readv;
ReadEventData read;
PreadEventData pread;
} data;
};
struct [[gnu::packed]] PerformanceEvent {
u32 type { 0 };
u8 stack_size { 0 };
@ -96,7 +156,7 @@ struct [[gnu::packed]] PerformanceEvent {
KMallocPerformanceEvent kmalloc;
KFreePerformanceEvent kfree;
SignpostPerformanceEvent signpost;
ReadPerformanceEvent read;
FilesystemEvent filesystem;
} data;
static constexpr size_t max_stack_frame_count = 64;
FlatPtr stack[max_stack_frame_count];
@ -111,11 +171,11 @@ class PerformanceEventBuffer {
public:
static OwnPtr<PerformanceEventBuffer> try_create_with_size(size_t buffer_size);
ErrorOr<void> append(int type, FlatPtr arg1, FlatPtr arg2, StringView arg3, Thread* current_thread = Thread::current(), FlatPtr arg4 = 0, u64 arg5 = 0, ErrorOr<FlatPtr> const& arg6 = 0);
ErrorOr<void> append(int type, FlatPtr arg1, FlatPtr arg2, StringView arg3, Thread* current_thread = Thread::current(), FilesystemEvent filesystem_event = {});
ErrorOr<void> append_with_ip_and_bp(ProcessID pid, ThreadID tid, FlatPtr eip, FlatPtr ebp,
int type, u32 lost_samples, FlatPtr arg1, FlatPtr arg2, StringView arg3, FlatPtr arg4 = 0, u64 arg5 = {}, ErrorOr<FlatPtr> const& arg6 = 0);
int type, u32 lost_samples, FlatPtr arg1, FlatPtr arg2, StringView arg3, FilesystemEvent filesystem_event = {});
ErrorOr<void> append_with_ip_and_bp(ProcessID pid, ThreadID tid, RegisterState const& regs,
int type, u32 lost_samples, FlatPtr arg1, FlatPtr arg2, StringView arg3, FlatPtr arg4 = 0, u64 arg5 = {}, ErrorOr<FlatPtr> const& arg6 = 0);
int type, u32 lost_samples, FlatPtr arg1, FlatPtr arg2, StringView arg3, FilesystemEvent filesystem_event = {});
void clear()
{