lkml.org 
[lkml]   [2001]   [Jun]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectAbout I/O callbacks ...

I was just thinking to implement I/O callbacks inside the kernel and test which
kind of performance could result compared to a select()/poll() implementation.
I prefer IO callbacks against async-io coz in this way is more direct to
implement an I/O driven state machine + coroutines.
This is a first draft :



#define ASCB_INFO_NPARAMS 4

struct ascb_info {
unsigned long param[ASCB_INFO_NPARAMS];
};

struct iocb {
struct iocb * next;
struct task_struct * task;
unsigned long event;
int (*iocb_func)(struct ascb_info *, void *);
void * data;
};

struct ascb {
struct ascb * next;
int (*ascb_func)(struct ascb_info *, void *);
void * data;
struct ascb_info info;
};





struct task_struct {
...
struct ascb * ascb_list;
spinlock_t ascb_list_lock;
...
};


struct file {
...
struct iocb * iocb_list;
spinlock_t iocb_list_lock;
...
};




The user call some user-space api to add the callback to the fd and this will
result ( inside the kernel ) to a call to :



int iocb_file_add(struct file * file,
int (*iocb_func)(struct ascb_info *, void *), void * data,
unsigned long event) {

/*
* Add the callback to the file list with task = current
*/


}



This is used to add callbacks to the task's list :

int ascb_task_add(struct task_struct * task,
int (*ascb_func)(struct ascb_info *, void *),
void * data, struct ascb_info * info) {

/*
* Add the callback to the task list
*/

}




Low level I/O layers will call this to dispatch I/O events :


int iocb_file_dispatch(struct file * file, unsigned long event) {

/*
* Scan the iocb_list and ( if event match ) call ascb_task_add()
* and remove ( y/n ? ) the callback from iocb_list
*/


}




In entry.S we'll have a call like do_signal() that will build the frame for a
callback call ( like do_signal() ) and will remove the entry from the list.
My first implementation should address only sockets but once the concept of
async callbacks is inside the task_struct this could be gradually extended to
std files and even used as an extension of signals.

Comments ?





- Davide


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 12:55    [W:0.024 / U:1.116 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site