lkml.org 
[lkml]   [2010]   [Feb]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Subject[PATCH 4/9] cciss: simplify scatter gather code
    From
    Date
    From: Stephen M. Cameron <scameron@beardog.cce.hp.com>

    cciss: simplify scatter gather code.
    Instead of allocating an array of pointers to a structure
    containing an SGDescriptor structure, and two other elements
    that aren't really used, just allocate SGDescriptor structs.

    Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com>
    ---
    drivers/block/cciss.c | 43 +++++++++++++++----------------------------
    drivers/block/cciss.h | 8 +-------
    2 files changed, 16 insertions(+), 35 deletions(-)

    diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
    index eddb916..adc517c 100644
    --- a/drivers/block/cciss.c
    +++ b/drivers/block/cciss.c
    @@ -257,7 +257,7 @@ static inline void removeQ(CommandList_struct *c)
    hlist_del_init(&c->list);
    }

    -static void cciss_free_sg_chain_blocks(struct Cmd_sg_list **cmd_sg_list,
    +static void cciss_free_sg_chain_blocks(SGDescriptor_struct **cmd_sg_list,
    int nr_cmds)
    {
    int i;
    @@ -265,20 +265,17 @@ static void cciss_free_sg_chain_blocks(struct Cmd_sg_list **cmd_sg_list,
    if (!cmd_sg_list)
    return;
    for (i = 0; i < nr_cmds; i++) {
    - if (cmd_sg_list[i]) {
    - kfree(cmd_sg_list[i]->sgchain);
    - kfree(cmd_sg_list[i]);
    - cmd_sg_list[i] = NULL;
    - }
    + kfree(cmd_sg_list[i]);
    + cmd_sg_list[i] = NULL;
    }
    kfree(cmd_sg_list);
    }

    -static struct Cmd_sg_list **cciss_allocate_sg_chain_blocks(ctlr_info_t *h,
    - int chainsize, int nr_cmds)
    +static SGDescriptor_struct **cciss_allocate_sg_chain_blocks(
    + ctlr_info_t *h, int chainsize, int nr_cmds)
    {
    int j;
    - struct Cmd_sg_list **cmd_sg_list;
    + SGDescriptor_struct **cmd_sg_list;

    if (chainsize <= 0)
    return NULL;
    @@ -289,16 +286,10 @@ static struct Cmd_sg_list **cciss_allocate_sg_chain_blocks(ctlr_info_t *h,

    /* Build up chain blocks for each command */
    for (j = 0; j < nr_cmds; j++) {
    - cmd_sg_list[j] = kmalloc(sizeof(*cmd_sg_list[j]), GFP_KERNEL);
    - if (!cmd_sg_list[j]) {
    - dev_err(&h->pdev->dev, "Cannot get memory "
    - "for chain block.\n");
    - goto clean;
    - }
    /* Need a block of chainsized s/g elements. */
    - cmd_sg_list[j]->sgchain = kmalloc((chainsize *
    - sizeof(SGDescriptor_struct)), GFP_KERNEL);
    - if (!cmd_sg_list[j]->sgchain) {
    + cmd_sg_list[j] = kmalloc((chainsize *
    + sizeof(*cmd_sg_list[j])), GFP_KERNEL);
    + if (!cmd_sg_list[j]) {
    dev_err(&h->pdev->dev, "Cannot get memory "
    "for s/g chains.\n");
    goto clean;
    @@ -1731,7 +1722,7 @@ static void cciss_softirq_done(struct request *rq)
    pci_unmap_single(h->pdev, temp64.val,
    cmd->SG[i].Len, ddir);
    /* Point to the next block */
    - curr_sg = h->cmd_sg_list[cmd->cmdindex]->sgchain;
    + curr_sg = h->cmd_sg_list[cmd->cmdindex];
    sg_index = 0;
    }
    temp64.val32.lower = curr_sg[sg_index].Addr.lower;
    @@ -3206,7 +3197,7 @@ static void do_cciss_request(struct request_queue *q)
    curr_sg[sg_index].Ext = CCISS_SG_CHAIN;

    /* Point to next chain block. */
    - curr_sg = h->cmd_sg_list[c->cmdindex]->sgchain;
    + curr_sg = h->cmd_sg_list[c->cmdindex];
    sg_index = 0;
    chained = 1;
    }
    @@ -3223,6 +3214,7 @@ static void do_cciss_request(struct request_queue *q)

    if (chained) {
    int len;
    + dma_addr_t dma_addr;
    curr_sg = c->SG;
    sg_index = h->max_cmd_sgentries - 1;
    len = curr_sg[sg_index].Len;
    @@ -3231,16 +3223,11 @@ static void do_cciss_request(struct request_queue *q)
    * block with address of next chain block.
    */
    temp64.val = pci_map_single(h->pdev,
    - h->cmd_sg_list[c->cmdindex]->sgchain,
    - len, dir);
    -
    - h->cmd_sg_list[c->cmdindex]->sg_chain_dma = temp64.val;
    + h->cmd_sg_list[c->cmdindex], len, dir);
    + dma_addr = temp64.val;
    curr_sg[sg_index].Addr.lower = temp64.val32.lower;
    curr_sg[sg_index].Addr.upper = temp64.val32.upper;
    -
    - pci_dma_sync_single_for_device(h->pdev,
    - h->cmd_sg_list[c->cmdindex]->sg_chain_dma,
    - len, dir);
    + pci_dma_sync_single_for_device(h->pdev, dma_addr, len, dir);
    }

    /* track how many SG entries we are using */
    diff --git a/drivers/block/cciss.h b/drivers/block/cciss.h
    index 2b07bda..ac454fd 100644
    --- a/drivers/block/cciss.h
    +++ b/drivers/block/cciss.h
    @@ -55,12 +55,6 @@ typedef struct _drive_info_struct
    char device_initialized; /* indicates whether dev is initialized */
    } drive_info_struct;

    -struct Cmd_sg_list {
    - SGDescriptor_struct *sgchain;
    - dma_addr_t sg_chain_dma;
    - int chain_block_size;
    -};
    -
    struct ctlr_info
    {
    int ctlr;
    @@ -89,7 +83,7 @@ struct ctlr_info
    int maxsgentries;
    int chainsize;
    int max_cmd_sgentries;
    - struct Cmd_sg_list **cmd_sg_list;
    + SGDescriptor_struct **cmd_sg_list;

    # define DOORBELL_INT 0
    # define PERF_MODE_INT 1


    \
     
     \ /
      Last update: 2010-02-26 23:01    [W:0.028 / U:0.556 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site