RCU 사용시 br_fdb_get 함수에 대한 질문입니다.

trymp의 이미지

리눅스의 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 되었는지, 아닌지에 대해서 보장이 안될 것 같습니다. (제 생각으론)

그래서 제가 잘못 이해하고 있는 것인지, 아니면 저렇게 사용하는게 맞는 것인지,

고수님들의 조언 부탁드립니다.

익명 사용자의 이미지

참조 카운트 값을 이용해서 삭제되는 것을 방지 합니다.
atomic_inc_not_zero()에서 참조 카운트가 증가 하므로 fdb 값을 반환해도 삭제는 안된다고 보장 됩니다.
아마 삭제하는 부분에 use_count 값을 보고 삭제 여부를 결정하는 코드가 존재 할 것 입니다.

trymp의 이미지

^^