On 06/25/2012 07:21 PM, Christoph Hellwig wrote: > On Mon, Jun 25, 2012 at 07:17:07PM +0800, Liu Yuan wrote: >> On 06/25/2012 07:10 PM, Christoph Hellwig wrote: >>> How do you ensure this is always called from the main thread? Calling >>> queue_request from helper threads seems like it would cause major >>> problems. >> >> What kind of problems? >> >> For now queue_request() is already called in worker threads context. >> Looks to me we should add a thread safe version of queue_request() that >> can be called in worker threads. > > - get_vnode_info is expected to be called from the main thread, > - req_done is expected to be called freom the main thread > - and most serious one is request_in_recovery, which manipulates > sys->wait_rw_queue and sys->wait_obj_queue without taking locks. > Ah, it's really a problem to call queue_request() from worker thread, and now exec_local_req() is always called from worker thread. Sending a gateway request through network as my previous patch does seems the simplest way to avoid this problem, but a connection to local node is unnecessary. How about this, we put the work into a worker thread using queue_work() and make queue_request() called in the worker_done() function. thanks, levin |