I find the nomenclature here a bit confusing.
ddi_copyin or copyin are most often used to copy from user space *in* to
kernel space.
ddi_copyout or copyout likewise usually reference copying data *out*
from the kernel to user space.
In otherwords, the "in/out" are normally used to in reference to kernel
space.
Your proposal, bp_copyin makes the "in" for this API in reference to the
buf. (Which may or may not be userspace.)
I find the reversal of the point of reference confusing. Does anyone else?
-- Garrett
Christopher Horne wrote:
> I am sponsoring the following fasttrack for Mark Johnson, requesting patch
> binding and a timeout of 10/16/2007.
>
> -Chris
>
> Template Version: @(#)sac_nextcase 1.64 07/13/07 SMI
>
> 1. Introduction
> 1.1 Project/Component Working Name:
>
> bp_copyin()/bp_copyout()
>
> 1.2 Name of Document Author/Supplier:
>
> Author: Mark Johnson
>
> 1.3 Date of This Document:
>
> Tue Oct 9 10:36:08 MDT 2007
>
> 4. Technical Description
>
> 4.1 Introduction
>
> This case introduces two new buf interfaces, and is the second of
> two fasttracks to address st tape driver performance on x86.
>
> dma-max-arch scsi capability
> bp_copyin()/bp_copyout()
>
> There is a recently escalated bug outstanding for this issue.
>
> 6567168 s10 x86 st tape driver performance issue
> http://monaco.sfbay/detail.jsf?cr=6567168
>
> 4.2 Background
>
> Most tape drives cannot handle partial DMAs. An entire tape block
> must be transferred in a single DMA.
>
> For our SPARC based systems, this is relatively simple. Since
> these systems have an IOMMU, the only real consideration is the
> underlying HBA's maximum DMA size, which is returned via the
> 'dma-max' scsi capability.
>
> For current x86 bases systems, this becomes more complicated. Not
> only can the maximum DMA be limited by the underlying HBA's maximum
> DMA size, but it can also be limited by the DMA engines
> scatter/gather list constraints (if the memory is completely
> fragmented).
>
> Today on x86, the st tape driver will allocate physically
> contiguous memory and then bp_mapin/bcopy/bp_mapout all transfers
> where the tape blocksize is greater than 64KBytes.
>
> There are two parts to the solution. The first is to provide a way
> for the st driver to query what the DMA constraints of the HBA are,
> taking the sgllen into account. The second is to provide a 64-bit
> optimized bp copy for block sizes which are too large to fit within
> the HBA's sgllen constraints, but are within the HBA's maximum DMA
> size.
>
> For example, the ST driver may find out that the maximum DMA
> supported by the HBA ('dma-max') is 4M and the maximum DMA supported
> by the HBA/system is 1M ('dma-max-arch'). The st driver can then
> allow any blocksize <= 1M to go directly to the HBA and then use
> the optimized copy for block sizes greater than 1M and less than or
> equal to 4M. Today it does an un-optimized copy for block sizes
> greater than 64K.
>
> This case addresses the second part of the problem. It provides two
> new general purpose buf routines to copy data in and out of bufs.
> These routines are supported on all architectures.
>
> Some implementation notes of interest. The routines will first look
> to see if the buf has already been mapped info kernel VA space. If
> not, they implement an optimized copy on 64-bit kernels using seg
> kpm.
>
>
> 4.3 Interface Table
>
> INTERFACE COMMITMENT LEVEL COMMENT
>
> bp_copyin(9F) Committed optimize bp_mapin,
> bcopy,
> bp_copyout(9F) Committed bp_mapout.
>
> 4.4 Man page changes
>
> See below.
>
> 6. Resources and Schedule
> 6.4. Steering Committee requested information
> 6.4.1. Consolidation C-team Name:
> ON
> 6.5. ARC review type: FastTrack
> 6.6. ARC Exposure: open
>
>
>
> A.1 man page for bp_copyin(9F)
>
> Kernel Functions for Drivers bp_copyin(9F)
>
> NAME
> bp_copyin - copy from a kernel virtual address to a buf
>
> SYNOPSIS
> #include <sys/types.h>
> #include <sys/buf.h>
>
> int bp_copyin(caddr_t vaddr, struct buf *bp,
> offset_t offset, size_t size);
>
> INTERFACE LEVEL
> Architecture independent level 1 (DDI/DKI).
>
> PARAMETERS
> vaddr Kernel virtual address to copy from.
>
> bp Pointer to the buffer header structure to copy to.
>
> offset Offset into bp where to start copying.
>
> size Size of copy.
>
> DESCRIPTION
> bp_copyin() copies 'size' bytes starting from kernel virtual
> address 'vaddr' to 'offset' bytes into the memory associated
> with 'bp'. The 'offset' only applies to 'bp'.
>
> RETURN VALUES
> Under normal conditions, 0 is returned to indicate a
> successful copy. Otherwise, -1 is returned if 'bp' references
> invalid pages.
>
> CONTEXT
> bp_copyin() can be called from user or kernel context only.
>
> SEE ALSO
> bp_copyout(9F), buf(9S), ddi_copyin(9F), bp_mapin(9F),
> bp_mapout(9F).
>
> A.2 man page for bp_copyout(9F)
>
> Kernel Functions for Drivers bp_copyout(9F)
>
> NAME
> bp_copyout - copy from a buf to a kernel virtual address
>
> SYNOPSIS
> #include <sys/types.h>
> #include <sys/buf.h>
>
> int bp_copyout(struct buf *bp, caddr_t vaddr,
> offset_t offset, size_t size);
>
> INTERFACE LEVEL
> Architecture independent level 1 (DDI/DKI).
>
> PARAMETERS
> bp Pointer to the buffer header structure to copy from.
>
> vaddr Kernel virtual address to copy to.
>
> offset Offset into bp where to start copying.
>
> size Size of copy.
>
> DESCRIPTION
> bp_copyput() copies 'size' bytes starting at 'offset' bytes
> into the memory associated with 'bp' to the destination
> address kernel virtual address 'vaddr'. The 'offset' only
> applies to 'bp'.
>
> RETURN VALUES
> Under normal conditions, 0 is returned to indicate a
> successful copy. Otherwise, -1 is returned if 'bp' references
> invalid pages.
>
> CONTEXT
> bp_copyout() can be called from user or kernel context only.
>
> SEE ALSO
> bp_copyin(9F), buf(9S), ddi_copyout(9F), bp_mapin(9F),
> bp_mapout(9F).
>