2014-02-20 34 views
0

在2.6.27有宏DEFINE_PER_CPU(類型,變量)來定義每個CPU變量。每-CPU變量定義2.6.27

我可以使用這個宏在全局範圍內定義一個變量。但是,如果它是一個可變的結構裏面我編譯時看到錯誤..

爲前:

struct port_stats { 
    ... .... 
    DEFINE_PER_CPU(long *, stats); 
} 

我看到的是錯誤..

* 錯誤:部分屬性不允許「per_cpu__stats」 *

相同的定義是確定的,如果其以外的結構。不知道這個錯誤的含義。有什麼建議麼 ?

+0

你不能把'內由於各種原因結構DEFINE_PER_CPU',最明顯的是,它是宏擴展到與聲明的屬性和不能把屬性爲結構的成員。 你可以嘗試類似 ' struct port_stats { ...... . }; DEFINE_PER_CPU(結構port_stats,PSTAT);' – Sundar

+0

@Sundar在以後的版本支持__percpu屬性其可以指定屬性percpu只用於結構的一些成員。看起來它不適用於舊內核中基於宏的定義? – Manohar

回答

1

如果你想在Linux內核中一個struct中定義每個CPU的變量,你需要與__percpu屬性,使之指向所需的類型(因此,在這種情況下long **):

​​

(在缺少__percpu宏的舊內核中,只需將其聲明爲long **stats;,並註釋它是指向每個cpu變量數組的指針)。

然後,當您創建結構的實例,與alloc_percpu()分配percpu變量(可能會失敗):

pstats->stats = alloc_percpu(long *); 

if (!pstats->stats) 
    return -ENOMEM; 

要然後訪問percpu情況下,你需要使用get_cpu()put_cpu()

long **stats; 

stats = per_cpu_ptr(pstats->stats, get_cpu()); 

/* Read or write *stats, the per-cpu (long *) value for this cpu */ 

put_cpu(); 

當你釋放結構,還必須執行free_percpu(pstats->stats);爲好。

+0

2.6.27沒有__percpu屬性。 – Manohar

+0

Ahh對不起,這個答案適用於當前(寫作時)內核。儘管''alloc_percpu()'和'per_cpu_ptr()'在2.6.27中,你可以放棄'__percpu'指定,它只是用於額外的類型安全檢查。 – caf