RCU 사용시 br_fdb_get 함수에 대한 질문입니다.
글쓴이: trymp / 작성시간: 화, 2012/01/10 - 10:53오전
리눅스의 bridge 쪽을 보고 있는데요.
bridge 에서 forward database 를 RCU 로 보호하고 있잖아요.
근데, br_fdb_get 함수를 보니 fdb 포인터를 얻어 와서 아래와 같이 반환 하더군요.
struct net_bridge_fdb_entry *br_fdb_get(struct net_bridge *br, unsigned char *addr) { struct net_bridge_fdb_entry *fdb; rcu_read_lock(); fdb = __br_fdb_get(br, addr); if (fdb && !atomic_inc_not_zero(&fdb->use_count)) fdb = NULL; rcu_read_unlock(); return fdb; }
위와 같이 하면 rcu_read_unlock() 을 했기때문에 반환된 fdb 가 나중에 지워질수 있지 않나요.
나중에 정작 사용하려는 곳에서 fdb가 이미 free 되었는지, 아닌지에 대해서 보장이 안될 것 같습니다. (제 생각으론)
그래서 제가 잘못 이해하고 있는 것인지, 아니면 저렇게 사용하는게 맞는 것인지,
고수님들의 조언 부탁드립니다.
Forums:
보통 이런 경우에...
참조 카운트 값을 이용해서 삭제되는 것을 방지 합니다.
atomic_inc_not_zero()에서 참조 카운트가 증가 하므로 fdb 값을 반환해도 삭제는 안된다고 보장 됩니다.
아마 삭제하는 부분에 use_count 값을 보고 삭제 여부를 결정하는 코드가 존재 할 것 입니다.
감사합니다..
^^
댓글 달기