锁定

此文件解释了 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 保护。

“main” 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 设备的数据:

“main” 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;