@@ -214,39 +214,53 @@ NB_MODULE(tensorrt_llm_transfer_agent_binding, m)
214214 .def_rw (" backend_params" , &kvc::BaseAgentConfig::backendParams);
215215
216216 // BaseTransferAgent class (abstract base)
217+ // All transfer-engine operations release the GIL: they may block on NIXL /
218+ // UCX / network / GPU memory pinning, and holding the GIL across them
219+ // starves Python listener / progress threads in the same process.
217220 nb::class_<kvc::BaseTransferAgent>(m, " BaseTransferAgent" )
218- .def (" register_memory" , &kvc::BaseTransferAgent::registerMemory, nb::arg (" descs" ))
219- .def (" deregister_memory" , &kvc::BaseTransferAgent::deregisterMemory, nb::arg (" descs" ))
221+ .def (" register_memory" , &kvc::BaseTransferAgent::registerMemory, nb::arg (" descs" ),
222+ nb::call_guard<nb::gil_scoped_release>())
223+ .def (" deregister_memory" , &kvc::BaseTransferAgent::deregisterMemory, nb::arg (" descs" ),
224+ nb::call_guard<nb::gil_scoped_release>())
220225 .def (" load_remote_agent" ,
221226 nb::overload_cast<std::string const &, kvc::AgentDesc const &>(&kvc::BaseTransferAgent::loadRemoteAgent),
222- nb::arg (" name" ), nb::arg (" agent_desc" ))
227+ nb::arg (" name" ), nb::arg (" agent_desc" ), nb::call_guard<nb::gil_scoped_release>() )
223228 .def (" load_remote_agent_by_connection" ,
224229 nb::overload_cast<std::string const &, kvc::ConnectionInfoType const &>(
225230 &kvc::BaseTransferAgent::loadRemoteAgent),
226- nb::arg (" name" ), nb::arg (" connection_info" ))
227- .def (" get_local_agent_desc" , &kvc::BaseTransferAgent::getLocalAgentDesc)
228- .def (" invalidate_remote_agent" , &kvc::BaseTransferAgent::invalidateRemoteAgent, nb::arg (" name" ))
231+ nb::arg (" name" ), nb::arg (" connection_info" ), nb::call_guard<nb::gil_scoped_release>())
232+ .def (" get_local_agent_desc" , &kvc::BaseTransferAgent::getLocalAgentDesc,
233+ nb::call_guard<nb::gil_scoped_release>())
234+ .def (" invalidate_remote_agent" , &kvc::BaseTransferAgent::invalidateRemoteAgent, nb::arg (" name" ),
235+ nb::call_guard<nb::gil_scoped_release>())
229236 .def (
230237 " submit_transfer_requests" ,
231238 [](kvc::BaseTransferAgent& self, kvc::TransferRequest const & request)
232239 { return self.submitTransferRequests (request).release (); },
233- nb::arg (" request" ), nb::rv_policy::take_ownership, nb::keep_alive<0 , 1 >())
234- .def (
235- " notify_sync_message" , &kvc::BaseTransferAgent::notifySyncMessage, nb::arg (" name" ), nb::arg (" sync_message" ))
236- .def (" get_notified_sync_messages" , &kvc::BaseTransferAgent::getNotifiedSyncMessages)
237- .def (" get_local_connection_info" , &kvc::BaseTransferAgent::getLocalConnectionInfo)
238- .def (" check_remote_descs" , &kvc::BaseTransferAgent::checkRemoteDescs, nb::arg (" name" ), nb::arg (" memory_descs" ));
240+ nb::arg (" request" ), nb::rv_policy::take_ownership, nb::call_guard<nb::gil_scoped_release>(),
241+ nb::keep_alive<0 , 1 >())
242+ .def (" notify_sync_message" , &kvc::BaseTransferAgent::notifySyncMessage, nb::arg (" name" ),
243+ nb::arg (" sync_message" ), nb::call_guard<nb::gil_scoped_release>())
244+ .def (" get_notified_sync_messages" , &kvc::BaseTransferAgent::getNotifiedSyncMessages,
245+ nb::call_guard<nb::gil_scoped_release>())
246+ .def (" get_local_connection_info" , &kvc::BaseTransferAgent::getLocalConnectionInfo,
247+ nb::call_guard<nb::gil_scoped_release>())
248+ .def (" check_remote_descs" , &kvc::BaseTransferAgent::checkRemoteDescs, nb::arg (" name" ), nb::arg (" memory_descs" ),
249+ nb::call_guard<nb::gil_scoped_release>());
239250
240251#ifdef ENABLE_NIXL
241252 // NixlTransferStatus class - release GIL for blocking operations
242253 nb::class_<kvc::NixlTransferStatus, kvc::TransferStatus>(m, " NixlTransferStatus" )
243254 .def (" is_completed" , &kvc::NixlTransferStatus::isCompleted, nb::call_guard<nb::gil_scoped_release>())
244255 .def (" wait" , &kvc::NixlTransferStatus::wait, nb::arg (" timeout_ms" ) = -1 ,
245- nb::call_guard<nb::gil_scoped_release>());
256+ nb::call_guard<nb::gil_scoped_release>())
257+ .def (" get_last_status" , &kvc::NixlTransferStatus::getLastStatus)
258+ .def (" get_last_status_str" , &kvc::NixlTransferStatus::getLastStatusStr);
246259
247260 // NixlTransferAgent class
248261 nb::class_<kvc::NixlTransferAgent, kvc::BaseTransferAgent>(m, " NixlTransferAgent" )
249- .def (nb::init<kvc::BaseAgentConfig const &>(), nb::arg (" config" ))
262+ .def (nb::init<kvc::BaseAgentConfig const &>(), nb::arg (" config" ), nb::call_guard<nb::gil_scoped_release>())
263+ .def (" shutdown" , &kvc::NixlTransferAgent::shutdown, nb::call_guard<nb::gil_scoped_release>())
250264 .def (" register_memory" , &kvc::NixlTransferAgent::registerMemory, nb::arg (" descs" ))
251265 .def (" deregister_memory" , &kvc::NixlTransferAgent::deregisterMemory, nb::arg (" descs" ))
252266 .def (" load_remote_agent" ,
0 commit comments