2015-09-11 15 views
5

Giả sử tôi đã đăng ký giao diện netlink chung sử dụng genl_register_family_with_ops với nhiều cuộc gọi lại.Linux Kernel Generic Netlink - Có đồng thời không?

Tôi không thấy bất kỳ cảnh báo nào về nó và tôi cho rằng các cuộc gọi lại được gọi là serially nhưng không có thông tin về cách gọi lại được gọi là không.

Có thể nhiều cuộc gọi lại được gọi đồng thời trên cùng giao diện netlink chung mà tôi đã đăng ký không? Tôi có cần bất kỳ sự đồng bộ nào giữa các cuộc gọi lại không?

Để làm cho câu hỏi đơn giản hơn:

Một cuộc gọi lại liên kết mạng có thể được đặt trước hoặc đồng thời chạy trong hai lõi không?

+0

Gọi lại được gọi khi xảy ra sự kiện. Nếu một sự kiện khác xảy ra trước khi cuộc gọi kết thúc, sau đó nó sẽ nhận được một cuộc gọi chồng chéo. – stark

+0

@stark Tôi đặc biệt yêu cầu nếu tôi có thể nhận được hai sự kiện trên cùng một đăng ký gia đình netlink có thể làm cho các cuộc gọi lại trùng lặp. Chỉ có một đăng ký với nhiều cuộc gọi lại. Các cuộc gọi lại của Netlink sẽ được sửa đổi các cấu trúc giống nhau và các cấu trúc sẽ chỉ được sửa đổi/truy cập bằng các cuộc gọi lại liên kết mạng. – Etherealone

+1

@Etherealone Tôi nghi ngờ câu trả lời là đây là cấu hình, nhưng tắt theo mặc định. Trong bản sao của các nguồn kernel 3.11, 'struct genl_family' chứa một' bool parallel_ops'. Trong 'linux-3.11.10-21/net/netlink/genetlink.c: 674' hoặc nearabouts, trong' genl_rcv_msg() ', nếu cờ đó không được thiết lập, thì một mutex toàn cầu bị khóa, yêu cầu được xử lý và mutex toàn cầu được mở khóa. Nếu nó được thiết lập thì khóa này không xảy ra. –

Trả lời

2

Trả lời giả định phiên bản hạt nhân Linux 3.11 hoặc 4.2, có thể hợp lệ cho nhiều người khác. Trả lời hiện tại thời điểm tháng năm 2015.

Dù callbacks có thể đồng thời hoặc không phải là một tài sản có thể cấu hình của struct genl_family lúc đăng ký, nhưng nếu không được xác định một cách rõ ràng, là lẽ mặc định để tắt. Điều này là do 1) Sự xuất hiện của một thành viên trong bool parallel_opsstruct genl_family, và 2) các thành viên chưa được khởi tạo của một tĩnh thời gian struct được cài đặt sẵn để 0 trong C.

On nhận nhắn netlink, cuối cùng chức năng genl_rcv_msg() được gọi là , xác định họ và điều kiện GeNetlink của thông báo trên parallel_ops để quyết định có khóa hay không khóa toàn cầu genl_mutex.

static int genl_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh) 
{ 
     struct genl_family *family; 
     int err; 

     family = genl_family_find_byid(nlh->nlmsg_type); 
     if (family == NULL) 
       return -ENOENT; 

     if (!family->parallel_ops) 
       genl_lock(); 

     err = genl_family_rcv_msg(family, skb, nlh); 

     if (!family->parallel_ops) 
       genl_unlock(); 

     return err; 
} 

Khi genl_family_rcv_msg() được gọi (được bảo vệ hay không được bảo vệ bởi các mutex), gọi lại thực tế được gọi here.

Các vấn đề liên quan