From patchwork Wed Jan 4 14:01:38 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jinpu Wang X-Patchwork-Id: 9496949 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 2119860237 for ; Wed, 4 Jan 2017 14:02:09 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1038627EED for ; Wed, 4 Jan 2017 14:02:09 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 01E5B27F7F; Wed, 4 Jan 2017 14:02:08 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.3 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RCVD_IN_SORBS_SPAM,T_DKIM_INVALID,T_TVD_MIME_EPI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7849027F89 for ; Wed, 4 Jan 2017 14:02:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1760690AbdADOCC (ORCPT ); Wed, 4 Jan 2017 09:02:02 -0500 Received: from mail-oi0-f54.google.com ([209.85.218.54]:34099 "EHLO mail-oi0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751908AbdADOCA (ORCPT ); Wed, 4 Jan 2017 09:02:00 -0500 Received: by mail-oi0-f54.google.com with SMTP id 3so361050032oih.1 for ; Wed, 04 Jan 2017 06:02:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=profitbricks-com.20150623.gappssmtp.com; s=20150623; h=mime-version:from:date:message-id:subject:to; bh=RJGI4r6wWM0Pw77VX85N6aTRSTe/fccJTQzKOWodHow=; b=VLAkYG38stmCFTCvNNuY3Y7bzyyln9RL5rb0hD3zG/K56vGZfoP7IsJ4vYoMVovSSg 1REsgoUcw2q8wuLTTXkV3SpszaBf1cDgolPcupl15088T3gZMm/0Ml77LGvv4CsfHmGg Z37w4vF4TWxq7IcLUBSA9F+R/4tckIYiorvyLJwtuBExgPJ9MA7jZD4Te3jPJLJBKZnF U29AtOqnzkdybSafn7Wze3NuwUWUNzp+FhxTjt4xFZF2KFxPwweHrQfc65KZPCONZi3Q s3zE27iNl1uu/FgAWHQ3XiMucighLXaiLoFLuDOo9807lNmDs7s5JVhg2y3E3iBjGPP9 BFuA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=RJGI4r6wWM0Pw77VX85N6aTRSTe/fccJTQzKOWodHow=; b=nofF5CTcjLVy73CsSjQ7dUOUMz0OYfiL1DOJbbuCnZxAZQ/rSCJtEOB31y1C++tgmP p0e2VsIacyHvO/esyrhz+FcYItwKGPj7K4utyHw1JwRLlNGFWmpNpw0Elm9x8u1Wg2C7 yx2kX2fFJME/3yhc/ngSDbML4x4r+Yb5qpQlmLQgNXsGPiaPcC3Pvl9pbkXFM72scI0i b7dLl48UlSlSRV3YSjh7XJK0SI+VVDjk0Oqr37JM/LJBnsP14MfLoPDFet691BGkIq5C R7NNzgDVZlkKdHpOi8IbLG5Me6/5yygwAQj92Tody/KSfvPs/IQoO3U3vI+Cmd0SGwXF kAsg== X-Gm-Message-State: AIkVDXJyRD/asi5j5f1c9y36WnjTVg0EQkAQM9NiIgulTbURCjjtOdxXqYZdx9i2gKxLhReNsJu0CqrbHuhLv5SJ X-Received: by 10.157.62.10 with SMTP id a10mr35165282otd.95.1483538519321; Wed, 04 Jan 2017 06:01:59 -0800 (PST) MIME-Version: 1.0 Received: by 10.182.241.198 with HTTP; Wed, 4 Jan 2017 06:01:38 -0800 (PST) From: Jinpu Wang Date: Wed, 4 Jan 2017 15:01:38 +0100 Message-ID: Subject: [PATCH 1/1] IB/core: create struct ib_port_cache To: Doug Ledford , Jason Gunthorpe , "Hefty, Sean" , Hal Rosenstock , "linux-rdma@vger.kernel.org" , Michael Wang Sender: linux-rdma-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rdma@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Hi Folks, This is a follow up for http://www.spinics.net/lists/linux-rdma/msg44536.html. As Jason suggested, I'm moving 4 elments for per port arrays into a seperate ib_port_cache structure. Please apply after the first 4 patches. From 66e011a67bcae22ed1f5c180b5b40c085ed10fd3 Mon Sep 17 00:00:00 2001 From: Jack Wang Date: Wed, 4 Jan 2017 14:09:05 +0100 Subject: [PATCH 1/1] IB/core: create struct ib_port_cache As Jason suggested, we have 4 elements for per port arrays, it's better to have a seperate structure to represent them. Signed-off-by: Jack Wang --- drivers/infiniband/core/cache.c | 74 ++++++++++++++++++++--------------------- include/rdma/ib_verbs.h | 10 ++++-- 2 files changed, 44 insertions(+), 40 deletions(-) From 66e011a67bcae22ed1f5c180b5b40c085ed10fd3 Mon Sep 17 00:00:00 2001 From: Jack Wang Date: Wed, 4 Jan 2017 14:09:05 +0100 Subject: [PATCH 5/5] IB/core: create struct ib_port_cache As Jason suggested, we have 4 elements for per port arrays, it's better to have a seperate structure to represent them. Signed-off-by: Jack Wang --- drivers/infiniband/core/cache.c | 74 ++++++++++++++++++++--------------------- include/rdma/ib_verbs.h | 10 ++++-- 2 files changed, 44 insertions(+), 40 deletions(-) diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c index f91886b..740229b 100644 --- a/drivers/infiniband/core/cache.c +++ b/drivers/infiniband/core/cache.c @@ -314,7 +314,7 @@ static void make_default_gid(struct net_device *dev, union ib_gid *gid) int ib_cache_gid_add(struct ib_device *ib_dev, u8 port, union ib_gid *gid, struct ib_gid_attr *attr) { - struct ib_gid_table **ports_table = ib_dev->cache.gid_cache; + struct ib_gid_table **ports_table = ib_dev->cache.port_cache.gid_cache; struct ib_gid_table *table; int ix; int ret = 0; @@ -369,7 +369,7 @@ int ib_cache_gid_add(struct ib_device *ib_dev, u8 port, int ib_cache_gid_del(struct ib_device *ib_dev, u8 port, union ib_gid *gid, struct ib_gid_attr *attr) { - struct ib_gid_table **ports_table = ib_dev->cache.gid_cache; + struct ib_gid_table **ports_table = ib_dev->cache.port_cache.gid_cache; struct ib_gid_table *table; int ix; @@ -399,7 +399,7 @@ int ib_cache_gid_del(struct ib_device *ib_dev, u8 port, int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port, struct net_device *ndev) { - struct ib_gid_table **ports_table = ib_dev->cache.gid_cache; + struct ib_gid_table **ports_table = ib_dev->cache.port_cache.gid_cache; struct ib_gid_table *table; int ix; bool deleted = false; @@ -428,7 +428,7 @@ int ib_cache_gid_del_all_netdev_gids(struct ib_device *ib_dev, u8 port, static int __ib_cache_gid_get(struct ib_device *ib_dev, u8 port, int index, union ib_gid *gid, struct ib_gid_attr *attr) { - struct ib_gid_table **ports_table = ib_dev->cache.gid_cache; + struct ib_gid_table **ports_table = ib_dev->cache.port_cache.gid_cache; struct ib_gid_table *table; table = ports_table[port - rdma_start_port(ib_dev)]; @@ -455,7 +455,7 @@ static int _ib_cache_gid_table_find(struct ib_device *ib_dev, unsigned long mask, u8 *port, u16 *index) { - struct ib_gid_table **ports_table = ib_dev->cache.gid_cache; + struct ib_gid_table **ports_table = ib_dev->cache.port_cache.gid_cache; struct ib_gid_table *table; u8 p; int local_index; @@ -503,7 +503,7 @@ int ib_find_cached_gid_by_port(struct ib_device *ib_dev, u16 *index) { int local_index; - struct ib_gid_table **ports_table = ib_dev->cache.gid_cache; + struct ib_gid_table **ports_table = ib_dev->cache.port_cache.gid_cache; struct ib_gid_table *table; unsigned long mask = GID_ATTR_FIND_MASK_GID | GID_ATTR_FIND_MASK_GID_TYPE; @@ -562,7 +562,7 @@ static int ib_cache_gid_find_by_filter(struct ib_device *ib_dev, void *context, u16 *index) { - struct ib_gid_table **ports_table = ib_dev->cache.gid_cache; + struct ib_gid_table **ports_table = ib_dev->cache.port_cache.gid_cache; struct ib_gid_table *table; unsigned int i; unsigned long flags; @@ -668,7 +668,7 @@ void ib_cache_gid_set_default_gid(struct ib_device *ib_dev, u8 port, unsigned long gid_type_mask, enum ib_cache_gid_default_mode mode) { - struct ib_gid_table **ports_table = ib_dev->cache.gid_cache; + struct ib_gid_table **ports_table = ib_dev->cache.port_cache.gid_cache; union ib_gid gid; struct ib_gid_attr gid_attr; struct ib_gid_attr zattr_type = zattr; @@ -791,7 +791,7 @@ static int _gid_table_setup_one(struct ib_device *ib_dev) goto rollback_table_setup; } - ib_dev->cache.gid_cache = table; + ib_dev->cache.port_cache.gid_cache = table; return 0; rollback_table_setup: @@ -807,7 +807,7 @@ static int _gid_table_setup_one(struct ib_device *ib_dev) static void gid_table_release_one(struct ib_device *ib_dev) { - struct ib_gid_table **table = ib_dev->cache.gid_cache; + struct ib_gid_table **table = ib_dev->cache.port_cache.gid_cache; u8 port; if (!table) @@ -817,12 +817,12 @@ static void gid_table_release_one(struct ib_device *ib_dev) release_gid_table(table[port]); kfree(table); - ib_dev->cache.gid_cache = NULL; + ib_dev->cache.port_cache.gid_cache = NULL; } static void gid_table_cleanup_one(struct ib_device *ib_dev) { - struct ib_gid_table **table = ib_dev->cache.gid_cache; + struct ib_gid_table **table = ib_dev->cache.port_cache.gid_cache; u8 port; if (!table) @@ -860,7 +860,7 @@ int ib_get_cached_gid(struct ib_device *device, { int res; unsigned long flags; - struct ib_gid_table **ports_table = device->cache.gid_cache; + struct ib_gid_table **ports_table = device->cache.port_cache.gid_cache; struct ib_gid_table *table = ports_table[port_num - rdma_start_port(device)]; if (port_num < rdma_start_port(device) || port_num > rdma_end_port(device)) @@ -917,7 +917,7 @@ int ib_get_cached_pkey(struct ib_device *device, read_lock_irqsave(&device->cache.lock, flags); - cache = device->cache.pkey_cache[port_num - rdma_start_port(device)]; + cache = device->cache.port_cache.pkey_cache[port_num - rdma_start_port(device)]; if (index < 0 || index >= cache->table_len) ret = -EINVAL; @@ -946,7 +946,7 @@ int ib_find_cached_pkey(struct ib_device *device, read_lock_irqsave(&device->cache.lock, flags); - cache = device->cache.pkey_cache[port_num - rdma_start_port(device)]; + cache = device->cache.port_cache.pkey_cache[port_num - rdma_start_port(device)]; *index = -1; @@ -986,7 +986,7 @@ int ib_find_exact_cached_pkey(struct ib_device *device, read_lock_irqsave(&device->cache.lock, flags); - cache = device->cache.pkey_cache[port_num - rdma_start_port(device)]; + cache = device->cache.port_cache.pkey_cache[port_num - rdma_start_port(device)]; *index = -1; @@ -1014,7 +1014,7 @@ int ib_get_cached_lmc(struct ib_device *device, return -EINVAL; read_lock_irqsave(&device->cache.lock, flags); - *lmc = device->cache.lmc_cache[port_num - rdma_start_port(device)]; + *lmc = device->cache.port_cache.lmc_cache[port_num - rdma_start_port(device)]; read_unlock_irqrestore(&device->cache.lock, flags); return ret; @@ -1032,7 +1032,7 @@ int ib_get_cached_port_state(struct ib_device *device, return -EINVAL; read_lock_irqsave(&device->cache.lock, flags); - *port_state = device->cache.port_state_cache[port_num - rdma_start_port(device)]; + *port_state = device->cache.port_cache.port_state_cache[port_num - rdma_start_port(device)]; read_unlock_irqrestore(&device->cache.lock, flags); return ret; @@ -1051,7 +1051,7 @@ static void ib_cache_update(struct ib_device *device, int i; int ret; struct ib_gid_table *table; - struct ib_gid_table **ports_table = device->cache.gid_cache; + struct ib_gid_table **ports_table = device->cache.port_cache.gid_cache; bool use_roce_gid_table = rdma_cap_roce_gid_table(device, port); @@ -1110,9 +1110,9 @@ static void ib_cache_update(struct ib_device *device, write_lock_irq(&device->cache.lock); - old_pkey_cache = device->cache.pkey_cache[port - rdma_start_port(device)]; + old_pkey_cache = device->cache.port_cache.pkey_cache[port - rdma_start_port(device)]; - device->cache.pkey_cache[port - rdma_start_port(device)] = pkey_cache; + device->cache.port_cache.pkey_cache[port - rdma_start_port(device)] = pkey_cache; if (!use_roce_gid_table) { write_lock(&table->rwlock); for (i = 0; i < gid_cache->table_len; i++) { @@ -1122,8 +1122,8 @@ static void ib_cache_update(struct ib_device *device, write_unlock(&table->rwlock); } - device->cache.lmc_cache[port - rdma_start_port(device)] = tprops->lmc; - device->cache.port_state_cache[port - rdma_start_port(device)] = + device->cache.port_cache.lmc_cache[port - rdma_start_port(device)] = tprops->lmc; + device->cache.port_cache.port_state_cache[port - rdma_start_port(device)] = tprops->state; write_unlock_irq(&device->cache.lock); @@ -1177,19 +1177,19 @@ int ib_cache_setup_one(struct ib_device *device) rwlock_init(&device->cache.lock); - device->cache.pkey_cache = - kzalloc(sizeof *device->cache.pkey_cache * + device->cache.port_cache.pkey_cache = + kzalloc(sizeof *device->cache.port_cache.pkey_cache * (rdma_end_port(device) - rdma_start_port(device) + 1), GFP_KERNEL); - device->cache.lmc_cache = kmalloc(sizeof *device->cache.lmc_cache * + device->cache.port_cache.lmc_cache = kmalloc(sizeof *device->cache.port_cache.lmc_cache * (rdma_end_port(device) - rdma_start_port(device) + 1), GFP_KERNEL); - device->cache.port_state_cache = kmalloc(sizeof *device->cache.port_state_cache * + device->cache.port_cache.port_state_cache = kmalloc(sizeof *device->cache.port_cache.port_state_cache * (rdma_end_port(device) - rdma_start_port(device) + 1), GFP_KERNEL); - if (!device->cache.pkey_cache || !device->cache.port_state_cache || - !device->cache.lmc_cache) { + if (!device->cache.port_cache.pkey_cache || !device->cache.port_cache.port_state_cache || + !device->cache.port_cache.lmc_cache) { err = -ENOMEM; goto free; } @@ -1212,9 +1212,9 @@ int ib_cache_setup_one(struct ib_device *device) err: gid_table_cleanup_one(device); free: - kfree(device->cache.pkey_cache); - kfree(device->cache.lmc_cache); - kfree(device->cache.port_state_cache); + kfree(device->cache.port_cache.pkey_cache); + kfree(device->cache.port_cache.lmc_cache); + kfree(device->cache.port_cache.port_state_cache); return err; } @@ -1228,15 +1228,15 @@ void ib_cache_release_one(struct ib_device *device) * all the device's resources when the cache could no * longer be accessed. */ - if (device->cache.pkey_cache) + if (device->cache.port_cache.pkey_cache) for (p = 0; p <= rdma_end_port(device) - rdma_start_port(device); ++p) - kfree(device->cache.pkey_cache[p]); + kfree(device->cache.port_cache.pkey_cache[p]); gid_table_release_one(device); - kfree(device->cache.pkey_cache); - kfree(device->cache.lmc_cache); - kfree(device->cache.port_state_cache); + kfree(device->cache.port_cache.pkey_cache); + kfree(device->cache.port_cache.lmc_cache); + kfree(device->cache.port_cache.port_state_cache); } void ib_cache_cleanup_one(struct ib_device *device) diff --git a/include/rdma/ib_verbs.h b/include/rdma/ib_verbs.h index fafa988..4443770 100644 --- a/include/rdma/ib_verbs.h +++ b/include/rdma/ib_verbs.h @@ -1775,15 +1775,19 @@ enum ib_mad_result { #define IB_DEVICE_NAME_MAX 64 -struct ib_cache { - rwlock_t lock; - struct ib_event_handler event_handler; +struct ib_port_cache { struct ib_pkey_cache **pkey_cache; struct ib_gid_table **gid_cache; u8 *lmc_cache; enum ib_port_state *port_state_cache; }; +struct ib_cache { + rwlock_t lock; + struct ib_event_handler event_handler; + struct ib_port_cache port_cache; +}; + struct ib_dma_mapping_ops { int (*mapping_error)(struct ib_device *dev, u64 dma_addr); -- 2.7.4