* Re: [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific
@ 2022-03-17 7:00 kernel test robot
2022-03-20 15:31 ` kernel test robot
0 siblings, 1 reply; 4+ messages in thread
From: kernel test robot @ 2022-03-17 7:00 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 22969 bytes --]
CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
In-Reply-To: <20220316114129.2520107-3-ogabbay@kernel.org>
References: <20220316114129.2520107-3-ogabbay@kernel.org>
TO: Oded Gabbay <ogabbay@kernel.org>
Hi Oded,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on next-20220316]
[cannot apply to linux/master linus/master v5.17-rc8]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Oded-Gabbay/habanalabs-set-non-0-value-in-dram-default-page-size/20220316-194323
base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git d6cd2f85931f87dbd07c664c9c6e806db1dd7c75
:::::: branch date: 19 hours ago
:::::: commit date: 19 hours ago
config: riscv-randconfig-c006-20220313 (https://download.01.org/0day-ci/archive/20220317/202203171437.0m4BxdYd-lkp(a)intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a6ec1e3d798f8eab43fb3a91028c6ab04e115fcb)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install riscv cross compiling tool for clang build
# apt-get install binutils-riscv64-linux-gnu
# https://github.com/0day-ci/linux/commit/9535025e314bc12dbdeebee7c71634699759bcfa
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Oded-Gabbay/habanalabs-set-non-0-value-in-dram-default-page-size/20220316-194323
git checkout 9535025e314bc12dbdeebee7c71634699759bcfa
# save the config file to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv clang-analyzer
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
clang-analyzer warnings: (new ones prefixed by >>)
Suppressed 10 warnings (2 in non-user code, 8 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
10 warnings generated.
Suppressed 10 warnings (3 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
11 warnings generated.
drivers/iio/dac/ad5761.c:63:8: warning: Excessive padding in 'struct ad5761_state' (67 padding bytes, where 3 is optimal).
Optimal fields order:
data,
vref,
spi,
vref_reg,
lock,
range,
use_intref,
consider reordering the fields or adding explicit padding members [clang-analyzer-optin.performance.Padding]
struct ad5761_state {
~~~~~~~^~~~~~~~~~~~~~
drivers/iio/dac/ad5761.c:63:8: note: Excessive padding in 'struct ad5761_state' (67 padding bytes, where 3 is optimal). Optimal fields order: data, vref, spi, vref_reg, lock, range, use_intref, consider reordering the fields or adding explicit padding members
struct ad5761_state {
~~~~~~~^~~~~~~~~~~~~~
Suppressed 10 warnings (3 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
10 warnings generated.
Suppressed 10 warnings (3 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
10 warnings generated.
Suppressed 10 warnings (3 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
10 warnings generated.
Suppressed 10 warnings (3 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
10 warnings generated.
Suppressed 10 warnings (3 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
10 warnings generated.
Suppressed 10 warnings (3 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
10 warnings generated.
Suppressed 10 warnings (3 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
10 warnings generated.
Suppressed 10 warnings (3 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
11 warnings generated.
drivers/misc/genwqe/card_base.c:522:3: warning: Value stored to 'err' is never read [clang-analyzer-deadcode.DeadStores]
err = -ENODEV;
^ ~~~~~~~
drivers/misc/genwqe/card_base.c:522:3: note: Value stored to 'err' is never read
err = -ENODEV;
^ ~~~~~~~
drivers/misc/genwqe/card_base.c:921:3: warning: Value stored to 'rc' is never read [clang-analyzer-deadcode.DeadStores]
rc = wait_event_interruptible_timeout(cd->health_waitq,
^
drivers/misc/genwqe/card_base.c:921:3: note: Value stored to 'rc' is never read
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
2 warnings generated.
Suppressed 2 warnings (2 in non-user code).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
13 warnings generated.
>> drivers/misc/habanalabs/common/mmu/mmu.c:220:2: warning: Value stored to 'prop' is never read [clang-analyzer-deadcode.DeadStores]
prop = &hdev->asic_prop;
^ ~~~~~~~~~~~~~~~~
drivers/misc/habanalabs/common/mmu/mmu.c:220:2: note: Value stored to 'prop' is never read
prop = &hdev->asic_prop;
^ ~~~~~~~~~~~~~~~~
drivers/misc/habanalabs/common/mmu/mmu.c:287:2: warning: Value stored to 'prop' is never read [clang-analyzer-deadcode.DeadStores]
prop = &hdev->asic_prop;
^ ~~~~~~~~~~~~~~~~
drivers/misc/habanalabs/common/mmu/mmu.c:287:2: note: Value stored to 'prop' is never read
prop = &hdev->asic_prop;
^ ~~~~~~~~~~~~~~~~
Suppressed 11 warnings (2 in non-user code, 9 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
10 warnings generated.
drivers/misc/habanalabs/common/mmu/mmu_v1.c:381:2: warning: Value stored to 'hop2_pte_addr' is never read [clang-analyzer-deadcode.DeadStores]
hop2_pte_addr = hop2_addr;
^ ~~~~~~~~~
drivers/misc/habanalabs/common/mmu/mmu_v1.c:381:2: note: Value stored to 'hop2_pte_addr' is never read
hop2_pte_addr = hop2_addr;
^ ~~~~~~~~~
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
10 warnings generated.
Suppressed 10 warnings (3 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
10 warnings generated.
Suppressed 10 warnings (3 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
9 warnings generated.
Suppressed 9 warnings (2 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
11 warnings generated.
drivers/iio/frequency/ad9523.c:266:8: warning: Excessive padding in 'struct ad9523_state' (110 padding bytes, where 46 is optimal).
Optimal fields order:
data,
spi,
reg,
pdata,
pwrdown_gpio,
reset_gpio,
sync_gpio,
vcxo_freq,
vco_freq,
vco_out_freq,
lock,
ad9523_channels,
vco_out_map,
consider reordering the fields or adding explicit padding members [clang-analyzer-optin.performance.Padding]
struct ad9523_state {
~~~~~~~^~~~~~~~~~~~~~
drivers/iio/frequency/ad9523.c:266:8: note: Excessive padding in 'struct ad9523_state' (110 padding bytes, where 46 is optimal). Optimal fields order: data, spi, reg, pdata, pwrdown_gpio, reset_gpio, sync_gpio, vcxo_freq, vco_freq, vco_out_freq, lock, ad9523_channels, vco_out_map, consider reordering the fields or adding explicit padding members
struct ad9523_state {
~~~~~~~^~~~~~~~~~~~~~
Suppressed 10 warnings (3 in non-user code, 7 with check filters).
Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
11 warnings generated.
drivers/iio/frequency/adf4350.c:33:8: warning: Excessive padding in 'struct adf4350_state' (100 padding bytes, where 36 is optimal).
Optimal fields order:
val,
r0_fract,
spi,
reg,
lock_detect_gpiod,
pdata,
clk,
clkin,
chspc,
fpfd,
min_out_freq,
freq_req,
regs,
regs_hw,
lock,
r0_int,
r1_mod,
r4_rf_div_sel,
vim +/prop +220 drivers/misc/habanalabs/common/mmu/mmu.c
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 184
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 185 /*
5c05487f155093 drivers/misc/habanalabs/common/mmu.c Ofir Bitton 2020-10-22 186 * hl_mmu_unmap_page - unmaps a virtual addr
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 187 *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 188 * @ctx: pointer to the context structure
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 189 * @virt_addr: virt addr to map from
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 190 * @page_size: size of the page to unmap
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 191 * @flush_pte: whether to do a PCI flush
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 192 *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 193 * This function does the following:
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 194 * - Check that the virt addr is mapped
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 195 * - Unmap the virt addr and frees pgts if possible
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 196 * - Returns 0 on success, -EINVAL if the given addr is not mapped
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 197 *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 198 * Because this function changes the page tables in the device and because it
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 199 * changes the MMU hash, it must be protected by a lock.
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 200 * However, because it maps only a single page, the lock should be implemented
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 201 * in a higher level in order to protect the entire mapping of the memory area
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 202 *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 203 * For optimization reasons PCI flush may be requested once after unmapping of
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 204 * large area.
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 205 */
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 206 int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size, bool flush_pte)
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 207 {
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 208 struct hl_device *hdev = ctx->hdev;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 209 struct asic_fixed_properties *prop;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 210 struct hl_mmu_properties *mmu_prop;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 211 struct hl_mmu_funcs *mmu_funcs;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 212 int i, pgt_residency, rc = 0;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 213 u32 real_page_size, npages;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 214 u64 real_virt_addr;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 215 bool is_dram_addr;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 216
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 217 if (!hdev->mmu_enable)
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 218 return 0;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 219
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 @220 prop = &hdev->asic_prop;
9488307a555925 drivers/misc/habanalabs/common/mmu.c Oded Gabbay 2021-01-11 221 is_dram_addr = hl_is_dram_va(hdev, virt_addr);
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 222 mmu_prop = hl_mmu_get_prop(hdev, page_size, is_dram_addr);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 223
ccf979ee330b19 drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-10-05 224 pgt_residency = mmu_prop->host_resident ? MMU_HR_PGT : MMU_DR_PGT;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 225 mmu_funcs = hl_mmu_get_funcs(hdev, pgt_residency, is_dram_addr);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 226
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 227 rc = hdev->asic_funcs->mmu_get_real_page_size(hdev, mmu_prop, page_size, &real_page_size,
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 228 is_dram_addr);
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 229 if (rc)
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 230 return rc;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 231
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 232 npages = page_size / real_page_size;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 233 real_virt_addr = virt_addr;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 234
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 235 for (i = 0 ; i < npages ; i++) {
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 236 rc = mmu_funcs->unmap(ctx, real_virt_addr, is_dram_addr);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 237 if (rc)
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 238 break;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 239
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 240 real_virt_addr += real_page_size;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 241 }
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 242
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 243 if (flush_pte)
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 244 mmu_funcs->flush(ctx);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 245
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 246 return rc;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 247 }
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 248
---
0-DAY CI Kernel Test Service
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific
2022-03-17 7:00 [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific kernel test robot
@ 2022-03-20 15:31 ` kernel test robot
0 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2022-03-20 15:31 UTC (permalink / raw)
To: Oded Gabbay; +Cc: llvm, kbuild-all, Ohad Sharabi
Hi Oded,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on next-20220316]
[cannot apply to linux/master linus/master v5.17-rc8]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Oded-Gabbay/habanalabs-set-non-0-value-in-dram-default-page-size/20220316-194323
base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git d6cd2f85931f87dbd07c664c9c6e806db1dd7c75
config: riscv-randconfig-c006-20220313 (https://download.01.org/0day-ci/archive/20220317/202203171437.0m4BxdYd-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a6ec1e3d798f8eab43fb3a91028c6ab04e115fcb)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install riscv cross compiling tool for clang build
# apt-get install binutils-riscv64-linux-gnu
# https://github.com/0day-ci/linux/commit/9535025e314bc12dbdeebee7c71634699759bcfa
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Oded-Gabbay/habanalabs-set-non-0-value-in-dram-default-page-size/20220316-194323
git checkout 9535025e314bc12dbdeebee7c71634699759bcfa
# save the config file to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv clang-analyzer
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <yujie.liu@intel.com>
clang-analyzer warnings: (new ones prefixed by >>)
>> drivers/misc/habanalabs/common/mmu/mmu.c:220:2: warning: Value stored to 'prop' is never read [clang-analyzer-deadcode.DeadStores]
prop = &hdev->asic_prop;
^ ~~~~~~~~~~~~~~~~
vim +/prop +220 drivers/misc/habanalabs/common/mmu/mmu.c
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 184
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 185 /*
5c05487f155093 drivers/misc/habanalabs/common/mmu.c Ofir Bitton 2020-10-22 186 * hl_mmu_unmap_page - unmaps a virtual addr
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 187 *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 188 * @ctx: pointer to the context structure
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 189 * @virt_addr: virt addr to map from
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 190 * @page_size: size of the page to unmap
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 191 * @flush_pte: whether to do a PCI flush
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 192 *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 193 * This function does the following:
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 194 * - Check that the virt addr is mapped
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 195 * - Unmap the virt addr and frees pgts if possible
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 196 * - Returns 0 on success, -EINVAL if the given addr is not mapped
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 197 *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 198 * Because this function changes the page tables in the device and because it
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 199 * changes the MMU hash, it must be protected by a lock.
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 200 * However, because it maps only a single page, the lock should be implemented
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 201 * in a higher level in order to protect the entire mapping of the memory area
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 202 *
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 203 * For optimization reasons PCI flush may be requested once after unmapping of
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 204 * large area.
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 205 */
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 206 int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size, bool flush_pte)
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 207 {
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 208 struct hl_device *hdev = ctx->hdev;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 @209 struct asic_fixed_properties *prop;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 210 struct hl_mmu_properties *mmu_prop;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 211 struct hl_mmu_funcs *mmu_funcs;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 212 int i, pgt_residency, rc = 0;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 213 u32 real_page_size, npages;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 214 u64 real_virt_addr;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 215 bool is_dram_addr;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 216
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 217 if (!hdev->mmu_enable)
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 218 return 0;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 219
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 @220 prop = &hdev->asic_prop;
9488307a555925 drivers/misc/habanalabs/common/mmu.c Oded Gabbay 2021-01-11 221 is_dram_addr = hl_is_dram_va(hdev, virt_addr);
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 222 mmu_prop = hl_mmu_get_prop(hdev, page_size, is_dram_addr);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 223
ccf979ee330b19 drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-10-05 224 pgt_residency = mmu_prop->host_resident ? MMU_HR_PGT : MMU_DR_PGT;
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 225 mmu_funcs = hl_mmu_get_funcs(hdev, pgt_residency, is_dram_addr);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 226
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 227 rc = hdev->asic_funcs->mmu_get_real_page_size(hdev, mmu_prop, page_size, &real_page_size,
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 228 is_dram_addr);
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 229 if (rc)
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 230 return rc;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 231
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 232 npages = page_size / real_page_size;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 233 real_virt_addr = virt_addr;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 234
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 235 for (i = 0 ; i < npages ; i++) {
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 236 rc = mmu_funcs->unmap(ctx, real_virt_addr, is_dram_addr);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 237 if (rc)
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 238 break;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 239
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 240 real_virt_addr += real_page_size;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 241 }
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 242
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 243 if (flush_pte)
9535025e314bc1 drivers/misc/habanalabs/common/mmu/mmu.c Ohad Sharabi 2022-03-16 244 mmu_funcs->flush(ctx);
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 245
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 246 return rc;
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 247 }
d83fe66928b2ff drivers/misc/habanalabs/common/mmu.c Moti Haimovski 2020-08-12 248
--
0-DAY CI Kernel Test Service
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific
2022-03-16 11:41 ` [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific Oded Gabbay
@ 2022-03-16 22:33 ` kernel test robot
0 siblings, 0 replies; 4+ messages in thread
From: kernel test robot @ 2022-03-16 22:33 UTC (permalink / raw)
To: Oded Gabbay; +Cc: llvm, kbuild-all
Hi Oded,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on next-20220316]
[cannot apply to linux/master linus/master v5.17-rc8]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Oded-Gabbay/habanalabs-set-non-0-value-in-dram-default-page-size/20220316-194323
base: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git d6cd2f85931f87dbd07c664c9c6e806db1dd7c75
config: x86_64-randconfig-a013-20220314 (https://download.01.org/0day-ci/archive/20220317/202203170651.S8azQIor-lkp@intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project a6ec1e3d798f8eab43fb3a91028c6ab04e115fcb)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/9535025e314bc12dbdeebee7c71634699759bcfa
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Oded-Gabbay/habanalabs-set-non-0-value-in-dram-default-page-size/20220316-194323
git checkout 9535025e314bc12dbdeebee7c71634699759bcfa
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash drivers/misc/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/misc/habanalabs/common/mmu/mmu.c:209:32: warning: variable 'prop' set but not used [-Wunused-but-set-variable]
struct asic_fixed_properties *prop;
^
drivers/misc/habanalabs/common/mmu/mmu.c:276:32: warning: variable 'prop' set but not used [-Wunused-but-set-variable]
struct asic_fixed_properties *prop;
^
2 warnings generated.
vim +/prop +209 drivers/misc/habanalabs/common/mmu/mmu.c
184
185 /*
186 * hl_mmu_unmap_page - unmaps a virtual addr
187 *
188 * @ctx: pointer to the context structure
189 * @virt_addr: virt addr to map from
190 * @page_size: size of the page to unmap
191 * @flush_pte: whether to do a PCI flush
192 *
193 * This function does the following:
194 * - Check that the virt addr is mapped
195 * - Unmap the virt addr and frees pgts if possible
196 * - Returns 0 on success, -EINVAL if the given addr is not mapped
197 *
198 * Because this function changes the page tables in the device and because it
199 * changes the MMU hash, it must be protected by a lock.
200 * However, because it maps only a single page, the lock should be implemented
201 * in a higher level in order to protect the entire mapping of the memory area
202 *
203 * For optimization reasons PCI flush may be requested once after unmapping of
204 * large area.
205 */
206 int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size, bool flush_pte)
207 {
208 struct hl_device *hdev = ctx->hdev;
> 209 struct asic_fixed_properties *prop;
210 struct hl_mmu_properties *mmu_prop;
211 struct hl_mmu_funcs *mmu_funcs;
212 int i, pgt_residency, rc = 0;
213 u32 real_page_size, npages;
214 u64 real_virt_addr;
215 bool is_dram_addr;
216
217 if (!hdev->mmu_enable)
218 return 0;
219
220 prop = &hdev->asic_prop;
221 is_dram_addr = hl_is_dram_va(hdev, virt_addr);
222 mmu_prop = hl_mmu_get_prop(hdev, page_size, is_dram_addr);
223
224 pgt_residency = mmu_prop->host_resident ? MMU_HR_PGT : MMU_DR_PGT;
225 mmu_funcs = hl_mmu_get_funcs(hdev, pgt_residency, is_dram_addr);
226
227 rc = hdev->asic_funcs->mmu_get_real_page_size(hdev, mmu_prop, page_size, &real_page_size,
228 is_dram_addr);
229 if (rc)
230 return rc;
231
232 npages = page_size / real_page_size;
233 real_virt_addr = virt_addr;
234
235 for (i = 0 ; i < npages ; i++) {
236 rc = mmu_funcs->unmap(ctx, real_virt_addr, is_dram_addr);
237 if (rc)
238 break;
239
240 real_virt_addr += real_page_size;
241 }
242
243 if (flush_pte)
244 mmu_funcs->flush(ctx);
245
246 return rc;
247 }
248
---
0-DAY CI Kernel Test Service
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific
2022-03-16 11:41 [PATCH 01/11] habanalabs: set non-0 value in dram default page size Oded Gabbay
@ 2022-03-16 11:41 ` Oded Gabbay
2022-03-16 22:33 ` kernel test robot
0 siblings, 1 reply; 4+ messages in thread
From: Oded Gabbay @ 2022-03-16 11:41 UTC (permalink / raw)
To: linux-kernel; +Cc: Ohad Sharabi
From: Ohad Sharabi <osharabi@habana.ai>
This patch breaks the cumbersome implementation of "get real page size"
along with it's multiple inner conditions and implement each case
(according to the real complexity) inside an ASIC function.
Signed-off-by: Ohad Sharabi <osharabi@habana.ai>
Reviewed-by: Oded Gabbay <ogabbay@kernel.org>
Signed-off-by: Oded Gabbay <ogabbay@kernel.org>
---
drivers/misc/habanalabs/common/habanalabs.h | 4 +
drivers/misc/habanalabs/common/mmu/mmu.c | 204 +++++++++++---------
drivers/misc/habanalabs/gaudi/gaudi.c | 3 +-
drivers/misc/habanalabs/goya/goya.c | 3 +-
4 files changed, 116 insertions(+), 98 deletions(-)
diff --git a/drivers/misc/habanalabs/common/habanalabs.h b/drivers/misc/habanalabs/common/habanalabs.h
index af47accd4a56..990190fc3054 100644
--- a/drivers/misc/habanalabs/common/habanalabs.h
+++ b/drivers/misc/habanalabs/common/habanalabs.h
@@ -1450,6 +1450,8 @@ struct hl_asic_funcs {
void (*set_pci_memory_regions)(struct hl_device *hdev);
u32* (*get_stream_master_qid_arr)(void);
bool (*is_valid_dram_page_size)(u32 page_size);
+ int (*mmu_get_real_page_size)(struct hl_device *hdev, struct hl_mmu_properties *mmu_prop,
+ u32 page_size, u32 *real_page_size, bool is_dram_addr);
};
@@ -3109,6 +3111,8 @@ int hl_mmu_ctx_init(struct hl_ctx *ctx);
void hl_mmu_ctx_fini(struct hl_ctx *ctx);
int hl_mmu_map_page(struct hl_ctx *ctx, u64 virt_addr, u64 phys_addr,
u32 page_size, bool flush_pte);
+int hl_mmu_get_real_page_size(struct hl_device *hdev, struct hl_mmu_properties *mmu_prop,
+ u32 page_size, u32 *real_page_size, bool is_dram_addr);
int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size,
bool flush_pte);
int hl_mmu_map_contiguous(struct hl_ctx *ctx, u64 virt_addr,
diff --git a/drivers/misc/habanalabs/common/mmu/mmu.c b/drivers/misc/habanalabs/common/mmu/mmu.c
index 810b73421ce1..eb85d9fb7462 100644
--- a/drivers/misc/habanalabs/common/mmu/mmu.c
+++ b/drivers/misc/habanalabs/common/mmu/mmu.c
@@ -9,6 +9,20 @@
#include "../habanalabs.h"
+/**
+ * hl_mmu_get_funcs() - get MMU functions structure
+ * @hdev: habanalabs device structure.
+ * @pgt_residency: page table residency.
+ * @is_dram_addr: true if we need HMMU functions
+ *
+ * @return appropriate MMU functions structure
+ */
+static struct hl_mmu_funcs *hl_mmu_get_funcs(struct hl_device *hdev, int pgt_residency,
+ bool is_dram_addr)
+{
+ return &hdev->mmu_func[pgt_residency];
+}
+
bool hl_is_dram_va(struct hl_device *hdev, u64 virt_addr)
{
struct asic_fixed_properties *prop = &hdev->asic_prop;
@@ -121,6 +135,53 @@ void hl_mmu_ctx_fini(struct hl_ctx *ctx)
mutex_destroy(&ctx->mmu_lock);
}
+/*
+ * hl_mmu_get_real_page_size - get real page size to use in map/unmap operation
+ *
+ * @hdev: pointer to device data.
+ * @mmu_prop: MMU properties.
+ * @page_size: page size
+ * @real_page_size: set here the actual page size to use for the operation
+ * @is_dram_addr: true if DRAM address, otherwise false.
+ *
+ * @return 0 on success, otherwise non 0 error code
+ *
+ * note that this is general implementation that can fit most MMU arch. but as this is used as an
+ * MMU function:
+ * 1. it shall not be called directly- only from mmu_func structure instance
+ * 2. each MMU may modify the implementation internally
+ */
+int hl_mmu_get_real_page_size(struct hl_device *hdev, struct hl_mmu_properties *mmu_prop,
+ u32 page_size, u32 *real_page_size, bool is_dram_addr)
+{
+ /*
+ * The H/W handles mapping of specific page sizes. Hence if the page
+ * size is bigger, we break it to sub-pages and map them separately.
+ */
+ if ((page_size % mmu_prop->page_size) == 0) {
+ *real_page_size = mmu_prop->page_size;
+ return 0;
+ }
+
+ dev_err(hdev->dev, "page size of %u is not %uKB aligned, can't map\n",
+ page_size, mmu_prop->page_size >> 10);
+
+ return -EFAULT;
+}
+
+static struct hl_mmu_properties *hl_mmu_get_prop(struct hl_device *hdev, u32 page_size,
+ bool is_dram_addr)
+{
+ struct asic_fixed_properties *prop = &hdev->asic_prop;
+
+ if (is_dram_addr)
+ return &prop->dmmu;
+ else if ((page_size % prop->pmmu_huge.page_size) == 0)
+ return &prop->pmmu_huge;
+
+ return &prop->pmmu;
+}
+
/*
* hl_mmu_unmap_page - unmaps a virtual addr
*
@@ -142,60 +203,37 @@ void hl_mmu_ctx_fini(struct hl_ctx *ctx)
* For optimization reasons PCI flush may be requested once after unmapping of
* large area.
*/
-int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size,
- bool flush_pte)
+int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size, bool flush_pte)
{
struct hl_device *hdev = ctx->hdev;
- struct asic_fixed_properties *prop = &hdev->asic_prop;
+ struct asic_fixed_properties *prop;
struct hl_mmu_properties *mmu_prop;
- u64 real_virt_addr;
+ struct hl_mmu_funcs *mmu_funcs;
+ int i, pgt_residency, rc = 0;
u32 real_page_size, npages;
- int i, rc = 0, pgt_residency;
+ u64 real_virt_addr;
bool is_dram_addr;
if (!hdev->mmu_enable)
return 0;
+ prop = &hdev->asic_prop;
is_dram_addr = hl_is_dram_va(hdev, virt_addr);
-
- if (is_dram_addr)
- mmu_prop = &prop->dmmu;
- else if ((page_size % prop->pmmu_huge.page_size) == 0)
- mmu_prop = &prop->pmmu_huge;
- else
- mmu_prop = &prop->pmmu;
+ mmu_prop = hl_mmu_get_prop(hdev, page_size, is_dram_addr);
pgt_residency = mmu_prop->host_resident ? MMU_HR_PGT : MMU_DR_PGT;
- /*
- * The H/W handles mapping of specific page sizes. Hence if the page
- * size is bigger, we break it to sub-pages and unmap them separately.
- */
- if ((page_size % mmu_prop->page_size) == 0) {
- real_page_size = mmu_prop->page_size;
- } else {
- /*
- * MMU page size may differ from DRAM page size.
- * In such case work with the DRAM page size and let the MMU
- * scrambling routine to handle this mismatch when
- * calculating the address to remove from the MMU page table
- */
- if (is_dram_addr && ((page_size % prop->dram_page_size) == 0)) {
- real_page_size = prop->dram_page_size;
- } else {
- dev_err(hdev->dev,
- "page size of %u is not %uKB aligned, can't unmap\n",
- page_size, mmu_prop->page_size >> 10);
+ mmu_funcs = hl_mmu_get_funcs(hdev, pgt_residency, is_dram_addr);
- return -EFAULT;
- }
- }
+ rc = hdev->asic_funcs->mmu_get_real_page_size(hdev, mmu_prop, page_size, &real_page_size,
+ is_dram_addr);
+ if (rc)
+ return rc;
npages = page_size / real_page_size;
real_virt_addr = virt_addr;
for (i = 0 ; i < npages ; i++) {
- rc = hdev->mmu_func[pgt_residency].unmap(ctx,
- real_virt_addr, is_dram_addr);
+ rc = mmu_funcs->unmap(ctx, real_virt_addr, is_dram_addr);
if (rc)
break;
@@ -203,7 +241,7 @@ int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size,
}
if (flush_pte)
- hdev->mmu_func[pgt_residency].flush(ctx);
+ mmu_funcs->flush(ctx);
return rc;
}
@@ -230,56 +268,33 @@ int hl_mmu_unmap_page(struct hl_ctx *ctx, u64 virt_addr, u32 page_size,
* For optimization reasons PCI flush may be requested once after mapping of
* large area.
*/
-int hl_mmu_map_page(struct hl_ctx *ctx, u64 virt_addr, u64 phys_addr,
- u32 page_size, bool flush_pte)
+int hl_mmu_map_page(struct hl_ctx *ctx, u64 virt_addr, u64 phys_addr, u32 page_size,
+ bool flush_pte)
{
+ int i, rc, pgt_residency, mapped_cnt = 0;
struct hl_device *hdev = ctx->hdev;
- struct asic_fixed_properties *prop = &hdev->asic_prop;
+ struct asic_fixed_properties *prop;
struct hl_mmu_properties *mmu_prop;
u64 real_virt_addr, real_phys_addr;
+ struct hl_mmu_funcs *mmu_funcs;
u32 real_page_size, npages;
- int i, rc, pgt_residency, mapped_cnt = 0;
bool is_dram_addr;
if (!hdev->mmu_enable)
return 0;
+ prop = &hdev->asic_prop;
is_dram_addr = hl_is_dram_va(hdev, virt_addr);
-
- if (is_dram_addr)
- mmu_prop = &prop->dmmu;
- else if ((page_size % prop->pmmu_huge.page_size) == 0)
- mmu_prop = &prop->pmmu_huge;
- else
- mmu_prop = &prop->pmmu;
+ mmu_prop = hl_mmu_get_prop(hdev, page_size, is_dram_addr);
pgt_residency = mmu_prop->host_resident ? MMU_HR_PGT : MMU_DR_PGT;
+ mmu_funcs = hl_mmu_get_funcs(hdev, pgt_residency, is_dram_addr);
- /*
- * The H/W handles mapping of specific page sizes. Hence if the page
- * size is bigger, we break it to sub-pages and map them separately.
- */
- if ((page_size % mmu_prop->page_size) == 0) {
- real_page_size = mmu_prop->page_size;
- } else if (is_dram_addr && ((page_size % prop->dram_page_size) == 0) &&
- (prop->dram_page_size < mmu_prop->page_size)) {
- /*
- * MMU page size may differ from DRAM page size.
- * In such case work with the DRAM page size and let the MMU
- * scrambling routine handle this mismatch when calculating
- * the address to place in the MMU page table. (in that case
- * also make sure that the dram_page_size smaller than the
- * mmu page size)
- */
- real_page_size = prop->dram_page_size;
- } else {
- dev_err(hdev->dev,
- "page size of %u is not %uKB aligned, can't map\n",
- page_size, mmu_prop->page_size >> 10);
-
- return -EFAULT;
- }
+ rc = hdev->asic_funcs->mmu_get_real_page_size(hdev, mmu_prop, page_size, &real_page_size,
+ is_dram_addr);
+ if (rc)
+ return rc;
/*
* Verify that the phys and virt addresses are aligned with the
@@ -302,9 +317,8 @@ int hl_mmu_map_page(struct hl_ctx *ctx, u64 virt_addr, u64 phys_addr,
real_phys_addr = phys_addr;
for (i = 0 ; i < npages ; i++) {
- rc = hdev->mmu_func[pgt_residency].map(ctx,
- real_virt_addr, real_phys_addr,
- real_page_size, is_dram_addr);
+ rc = mmu_funcs->map(ctx, real_virt_addr, real_phys_addr, real_page_size,
+ is_dram_addr);
if (rc)
goto err;
@@ -314,22 +328,21 @@ int hl_mmu_map_page(struct hl_ctx *ctx, u64 virt_addr, u64 phys_addr,
}
if (flush_pte)
- hdev->mmu_func[pgt_residency].flush(ctx);
+ mmu_funcs->flush(ctx);
return 0;
err:
real_virt_addr = virt_addr;
for (i = 0 ; i < mapped_cnt ; i++) {
- if (hdev->mmu_func[pgt_residency].unmap(ctx,
- real_virt_addr, is_dram_addr))
+ if (mmu_funcs->unmap(ctx, real_virt_addr, is_dram_addr))
dev_warn_ratelimited(hdev->dev,
"failed to unmap va: 0x%llx\n", real_virt_addr);
real_virt_addr += real_page_size;
}
- hdev->mmu_func[pgt_residency].flush(ctx);
+ mmu_funcs->flush(ctx);
return rc;
}
@@ -508,7 +521,7 @@ static void hl_mmu_pa_page_with_offset(struct hl_ctx *ctx, u64 virt_addr,
/*
* Bit arithmetics cannot be used for non power of two page
* sizes. In addition, since bit arithmetics is not used,
- * we cannot ignore dram base. All that shall be considerd.
+ * we cannot ignore dram base. All that shall be considered.
*/
dram_page_size = prop->dram_page_size;
@@ -557,40 +570,39 @@ int hl_mmu_get_tlb_info(struct hl_ctx *ctx, u64 virt_addr,
struct hl_mmu_hop_info *hops)
{
struct hl_device *hdev = ctx->hdev;
- struct asic_fixed_properties *prop = &hdev->asic_prop;
+ struct asic_fixed_properties *prop;
struct hl_mmu_properties *mmu_prop;
- int rc;
+ struct hl_mmu_funcs *mmu_funcs;
+ int pgt_residency, rc;
bool is_dram_addr;
if (!hdev->mmu_enable)
return -EOPNOTSUPP;
+ prop = &hdev->asic_prop;
hops->scrambled_vaddr = virt_addr; /* assume no scrambling */
is_dram_addr = hl_mem_area_inside_range(virt_addr, prop->dmmu.page_size,
- prop->dmmu.start_addr,
- prop->dmmu.end_addr);
+ prop->dmmu.start_addr,
+ prop->dmmu.end_addr);
- /* host-residency is the same in PMMU and HPMMU, use one of them */
+ /* host-residency is the same in PMMU and PMMU huge, no need to distinguish here */
mmu_prop = is_dram_addr ? &prop->dmmu : &prop->pmmu;
+ pgt_residency = mmu_prop->host_resident ? MMU_HR_PGT : MMU_DR_PGT;
+ mmu_funcs = hl_mmu_get_funcs(hdev, pgt_residency, is_dram_addr);
mutex_lock(&ctx->mmu_lock);
-
- if (mmu_prop->host_resident)
- rc = hdev->mmu_func[MMU_HR_PGT].get_tlb_info(ctx,
- virt_addr, hops);
- else
- rc = hdev->mmu_func[MMU_DR_PGT].get_tlb_info(ctx,
- virt_addr, hops);
-
+ rc = mmu_funcs->get_tlb_info(ctx, virt_addr, hops);
mutex_unlock(&ctx->mmu_lock);
+ if (rc)
+ return rc;
+
/* add page offset to physical address */
if (hops->unscrambled_paddr)
- hl_mmu_pa_page_with_offset(ctx, virt_addr, hops,
- &hops->unscrambled_paddr);
+ hl_mmu_pa_page_with_offset(ctx, virt_addr, hops, &hops->unscrambled_paddr);
- return rc;
+ return 0;
}
int hl_mmu_if_set_funcs(struct hl_device *hdev)
diff --git a/drivers/misc/habanalabs/gaudi/gaudi.c b/drivers/misc/habanalabs/gaudi/gaudi.c
index feb1323a8f4a..47afc5d1aef4 100644
--- a/drivers/misc/habanalabs/gaudi/gaudi.c
+++ b/drivers/misc/habanalabs/gaudi/gaudi.c
@@ -9487,7 +9487,8 @@ static const struct hl_asic_funcs gaudi_funcs = {
.get_sob_addr = gaudi_get_sob_addr,
.set_pci_memory_regions = gaudi_set_pci_memory_regions,
.get_stream_master_qid_arr = gaudi_get_stream_master_qid_arr,
- .is_valid_dram_page_size = NULL
+ .is_valid_dram_page_size = NULL,
+ .mmu_get_real_page_size = hl_mmu_get_real_page_size,
};
/**
diff --git a/drivers/misc/habanalabs/goya/goya.c b/drivers/misc/habanalabs/goya/goya.c
index 5bd665188ea6..e4b7b9706d1a 100644
--- a/drivers/misc/habanalabs/goya/goya.c
+++ b/drivers/misc/habanalabs/goya/goya.c
@@ -5765,7 +5765,8 @@ static const struct hl_asic_funcs goya_funcs = {
.get_sob_addr = &goya_get_sob_addr,
.set_pci_memory_regions = goya_set_pci_memory_regions,
.get_stream_master_qid_arr = goya_get_stream_master_qid_arr,
- .is_valid_dram_page_size = NULL
+ .is_valid_dram_page_size = NULL,
+ .mmu_get_real_page_size = hl_mmu_get_real_page_size,
};
/*
--
2.25.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2022-03-20 15:32 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-03-17 7:00 [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific kernel test robot
2022-03-20 15:31 ` kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2022-03-16 11:41 [PATCH 01/11] habanalabs: set non-0 value in dram default page size Oded Gabbay
2022-03-16 11:41 ` [PATCH 03/11] habanalabs: change mmu_get_real_page_size to be ASIC-specific Oded Gabbay
2022-03-16 22:33 ` kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.