Locking

This file explains the locking and exclusion scheme used in the PCCARDand PCMCIA subsystems.

A) Overview, Locking Hierarchy:

pcmcia_socket_list_rwsem
  • protects only the list of sockets
  • skt_mutex
    • serializes card insert / ejection
    • ops_mutex
      • serializes socket operation

B) Exclusion

The following functions and callbacks to struct pcmcia_socket mustbe called with “skt_mutex” held:

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

The following functions and callbacks to struct pcmcia_socket mustbe called with “ops_mutex” held:

socket_reset()socket_setup()struct pccard_operations        *opsstruct pccard_resource_ops      *resource_ops;

Note that send_event() andstruct pcmcia_callback *callback must not becalled with “ops_mutex” held.

C) Protection

1. Global Data:

struct list_head pcmcia_socket_list;

protected by pcmcia_socket_list_rwsem;

2. Per-Socket Data:

The resource_ops and their data are protected by ops_mutex.

The “main” struct pcmcia_socket is protected as follows (read-only fieldsor single-use fields not mentioned):

  • by pcmcia_socket_list_rwsem:

    struct list_head        socket_list;
  • by thread_lock:

    unsigned int            thread_events;
  • by skt_mutex:

    u_int                   suspended_state;void                    (*tune_bridge);struct pcmcia_callback  *callback;int                     resume_status;
  • by 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. Per PCMCIA-device Data:

The “main” struct pcmcia_device is protected as follows (read-only fieldsor single-use fields not mentioned):

  • by 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;
  • by the PCMCIA driver:

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