鎖定

此檔案解釋了 PCCARD 和 PCMCIA 子系統中使用的鎖定和互斥方案。

A) 概述,鎖定層次結構:

pcmcia_socket_list_rwsem
  • 僅保護套接字列表

  • skt_mutex
    • 序列化卡插入/彈出

    • ops_mutex
      • 序列化套接字操作

B) 互斥

以下函式和對 struct pcmcia_socket 的回撥必須在持有 “skt_mutex” 的情況下呼叫

socket_detect_change()
send_event()
socket_reset()
socket_shutdown()
socket_setup()
socket_remove()
socket_insert()
socket_early_resume()
socket_late_resume()
socket_resume()
socket_suspend()

struct pcmcia_callback  *callback

以下函式和對 struct pcmcia_socket 的回撥必須在持有 “ops_mutex” 的情況下呼叫

socket_reset()
socket_setup()

struct pccard_operations        *ops
struct pccard_resource_ops      *resource_ops;

請注意,send_event() 和 struct pcmcia_callback *callback 不得在持有 “ops_mutex” 的情況下呼叫。

C) 保護

1. 全域性資料:

struct list_head pcmcia_socket_list;

受 pcmcia_socket_list_rwsem 保護;

2. 每個套接字的資料:

resource_ops 及其資料受 ops_mutex 保護。

“主” struct pcmcia_socket 的保護方式如下(未提及只讀欄位或單次使用欄位)

  • 由 pcmcia_socket_list_rwsem 保護

    struct list_head        socket_list;
    
  • 由 thread_lock 保護

    unsigned int            thread_events;
    
  • 由 skt_mutex 保護

    u_int                   suspended_state;
    void                    (*tune_bridge);
    struct pcmcia_callback  *callback;
    int                     resume_status;
    
  • 由 ops_mutex 保護

    socket_state_t          socket;
    u_int                   state;
    u_short                 lock_count;
    pccard_mem_map          cis_mem;
    void __iomem            *cis_virt;
    struct { }              irq;
    io_window_t             io[];
    pccard_mem_map          win[];
    struct list_head        cis_cache;
    size_t                  fake_cis_len;
    u8                      *fake_cis;
    u_int                   irq_mask;
    void                    (*zoom_video);
    int                     (*power_hook);
    u8                      resource...;
    struct list_head        devices_list;
    u8                      device_count;
    struct                  pcmcia_state;
    

3. 每個 PCMCIA 裝置的資料:

“主” struct pcmcia_device 的保護方式如下(未提及只讀欄位或單次使用欄位)

  • 由 pcmcia_socket->ops_mutex 保護

    struct list_head        socket_device_list;
    struct config_t         *function_config;
    u16                     _irq:1;
    u16                     _io:1;
    u16                     _win:4;
    u16                     _locked:1;
    u16                     allow_func_id_match:1;
    u16                     suspended:1;
    u16                     _removed:1;
    
  • 由 PCMCIA 驅動程式保護

    io_req_t                io;
    irq_req_t               irq;
    config_req_t            conf;
    window_handle_t         win;