我想知道使用ipset添加/删除条目是否线程安全。例如,如果有两个并发进程执行这些操作
ipset -A myset 1.1.1.1 # process 1's operation
ipset -A myset 2.2.2.2 # process 2's operation我是否需要添加一个同步机制来确保运行的第二个进程等待第一个进程完成,以避免以某种方式破坏我的ipset (例如,在我的IPset中以1.2.1.2结束),还是这个功能已经由ipset提供了?
谢谢!
发布于 2014-01-31 09:14:26
不-您不需要为此在用户空间中添加任何锁定机制。内核模块代码已经在每个集合周围有一个锁,在添加和删除操作中被写锁定。
下面是ipset内核模块的相关代码。注意写锁&解锁。
static int
call_ad(struct sock *ctnl, struct sk_buff *skb, struct ip_set *set,
struct nlattr *tb[], enum ipset_adt adt,
u32 flags, bool use_lineno)
{
int ret;
u32 lineno = 0;
bool eexist = flags & IPSET_FLAG_EXIST, retried = false;
do {
write_lock_bh(&set->lock);
ret = set->variant->uadt(set, tb, adt, &lineno, flags, retried);
write_unlock_bh(&set->lock);
retried = true;https://stackoverflow.com/questions/21423725
复制相似问题