luo_session_global
static struct luo_session_global luo_session_global = {
.list = LIST_HEAD_INIT(luo_session_global.incoming.list),
.rwsem = __RWSEM_INITIALIZER(luo_session_global.incoming.rwsem),
.list = LIST_HEAD_INIT(luo_session_global.outgoing.list),
.rwsem = __RWSEM_INITIALIZER(luo_session_global.outgoing.rwsem),
if (sh == &luo_session_global.outgoing) {
sh = &luo_session_global.incoming;
sh = &luo_session_global.outgoing;
err = luo_session_insert(&luo_session_global.outgoing, session);
luo_session_remove(&luo_session_global.outgoing, session);
struct luo_session_header *sh = &luo_session_global.incoming;
luo_session_global.outgoing.header_ser = header_ser;
luo_session_global.outgoing.ser = (void *)(header_ser + 1);
luo_session_global.outgoing.active = true;
luo_session_global.incoming.header_ser = header_ser;
luo_session_global.incoming.ser = (void *)(header_ser + 1);
luo_session_global.incoming.active = true;
struct luo_session_header *sh = &luo_session_global.incoming;
struct luo_session_header *sh = &luo_session_global.outgoing;
down_write(&luo_session_global.incoming.rwsem);
down_write(&luo_session_global.outgoing.rwsem);
if (luo_session_global.incoming.count ||
luo_session_global.outgoing.count) {
up_write(&luo_session_global.outgoing.rwsem);
up_write(&luo_session_global.incoming.rwsem);
up_write(&luo_session_global.outgoing.rwsem);
up_write(&luo_session_global.incoming.rwsem);