On Fri, Oct 11, 2024 at 05:45:30PM -0700, Anjali Kulkarni wrote:
Add a new type PROC_CN_MCAST_NOTIFY to proc connector API, which allows a thread to notify the kernel that it has exited abnormally. Thread can also send the exit status code it wants returned in the notification with it. Exiting thread can call this either when it wants to call pthread_exit() with non-zero value or from signal handler.
Add a new file cn_hash.c which implements a hash table storing the exit codes of abnormally exiting threads, received by the system call above. The key used for the hash table is the pid of the thread, so when the thread actually exits, we lookup it's pid in the hash table and retrieve the exit code sent by user. If the exit code in struct task is 0, we then replace it with the user supplied non-zero exit code.
cn_hash.c implements the hash table add, delete, lookup operations. mutex_lock() and mutex_unlock() operations are used to safeguard the integrity of the hash table while adding or deleting elements. connector.c has the API calls, called from cn_proc.c, as well as calls to allocate, initialize and free the hash table.
Add a new flag in PF_* flags of task_struct - EXIT_NOTIFY. This flag is set when user sends the exit code via PROC_CN_MCAST_NOTIFY. While exiting, this flag is checked and the hash table add or delete calls are only made if this flag is set.
A refcount field hrefcnt is added in struct cn_hash_dev, to keep track of number of threads which have added an entry in hash table. Before freeing the struct cn_hash_dev, this value must be 0.
Signed-off-by: Anjali Kulkarni anjali.k.kulkarni@oracle.com
...
diff --git a/drivers/connector/cn_proc.c b/drivers/connector/cn_proc.c index 44b19e696176..8c6e002069d9 100644 --- a/drivers/connector/cn_proc.c +++ b/drivers/connector/cn_proc.c
...
@@ -326,9 +328,16 @@ void proc_exit_connector(struct task_struct *task) struct proc_event *ev; struct task_struct *parent; __u8 buffer[CN_PROC_MSG_SIZE] __aligned(8);
- __u32 uexit_code;
- int err;
- if (atomic_read(&proc_event_num_listeners) < 1)
- if (atomic_read(&proc_event_num_listeners) < 1) {
if (likely(!(task->flags & PF_EXIT_NOTIFY)))
return;
err = cn_del_elem(task->pid);
Hi Anjali,
err is set but otherwise unused in this function; probably it can be removed.
return;
- }
msg = buffer_to_cn_msg(buffer); ev = (struct proc_event *)msg->data;
...