mirror of
https://github.com/rd-stuffs/msm-4.14.git
synced 2025-02-20 11:45:48 +08:00
This scope of this driver's lock usage is extremely wide, leading to excessively long lock hold times. Additionally, there is lots of excessive linked-list traversal and unnecessary dynamic memory allocation in a critical path, causing poor performance across the board. Fix all of this by greatly reducing the scope of the locks used and by significantly reducing the amount of operations performed when msm_dma_map_sg_attrs() is called. The entire driver's code is overhauled for better cleanliness and performance. Note that ION must be modified to pass a known structure via the private dma_buf pointer, so that the IOMMU driver can prevent races when operating on the same buffer concurrently. This is the only way to eliminate said buffer races without hurting the IOMMU driver's performance. Some additional members are added to the device struct as well to make these various performance improvements possible. This also removes the manual cache maintenance since ION already handles it. Signed-off-by: Sultan Alsawaf <sultan@kerneltoast.com> Signed-off-by: azrim <mirzaspc@gmail.com>
96 lines
2.7 KiB
C
96 lines
2.7 KiB
C
/* Copyright (c) 2015-2016, 2018 The Linux Foundation. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 and
|
|
* only version 2 as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#ifndef _LINUX_MSM_DMA_IOMMU_MAPPING_H
|
|
#define _LINUX_MSM_DMA_IOMMU_MAPPING_H
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/dma-buf.h>
|
|
#include <linux/scatterlist.h>
|
|
#include <linux/dma-mapping.h>
|
|
|
|
#ifdef CONFIG_QCOM_LAZY_MAPPING
|
|
struct msm_iommu_data {
|
|
struct list_head map_list;
|
|
struct mutex lock;
|
|
};
|
|
|
|
/*
|
|
* This function is not taking a reference to the dma_buf here. It is expected
|
|
* that clients hold reference to the dma_buf until they are done with mapping
|
|
* and unmapping.
|
|
*/
|
|
int msm_dma_map_sg_attrs(struct device *dev, struct scatterlist *sg, int nents,
|
|
enum dma_data_direction dir, struct dma_buf *dma_buf,
|
|
unsigned long attrs);
|
|
|
|
void msm_dma_unmap_sg_attrs(struct device *dev, struct scatterlist *sgl,
|
|
int nents, enum dma_data_direction dir,
|
|
struct dma_buf *dma_buf, unsigned long attrs);
|
|
|
|
void msm_dma_unmap_all_for_dev(struct device *dev);
|
|
|
|
/*
|
|
* Below is private function only to be called by framework (ION) and not by
|
|
* clients.
|
|
*/
|
|
void msm_dma_buf_freed(struct msm_iommu_data *data);
|
|
|
|
#else /*CONFIG_QCOM_LAZY_MAPPING*/
|
|
|
|
static inline int msm_dma_map_sg_attrs(struct device *dev,
|
|
struct scatterlist *sg, int nents,
|
|
enum dma_data_direction dir, struct dma_buf *dma_buf,
|
|
unsigned long attrs)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
|
|
static inline int msm_dma_map_sg_lazy(struct device *dev,
|
|
struct scatterlist *sg, int nents,
|
|
enum dma_data_direction dir,
|
|
struct dma_buf *dma_buf)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
|
|
static inline int msm_dma_map_sg(struct device *dev, struct scatterlist *sg,
|
|
int nents, enum dma_data_direction dir,
|
|
struct dma_buf *dma_buf)
|
|
{
|
|
return -EINVAL;
|
|
}
|
|
|
|
static inline void msm_dma_unmap_sg(struct device *dev,
|
|
struct scatterlist *sgl, int nents,
|
|
enum dma_data_direction dir,
|
|
struct dma_buf *dma_buf)
|
|
{
|
|
}
|
|
|
|
static inline void msm_dma_unmap_sg_attrs(struct device *dev,
|
|
struct scatterlist *sgl,
|
|
int nents, enum dma_data_direction dir,
|
|
struct dma_buf *dma_buf, unsigned long attrs)
|
|
{
|
|
}
|
|
|
|
static inline int msm_dma_unmap_all_for_dev(struct device *dev)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void msm_dma_buf_freed(void *buffer) {}
|
|
#endif /*CONFIG_QCOM_LAZY_MAPPING*/
|
|
|
|
#endif
|