On Tue, Oct 09, 2007 at 08:59:06PM -0700, Garrett D'Amore wrote: > 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. >
actually, iirc this isn't correct. ddi_copyin() will copy from userland -or- the kernel into the kernel. ddi_copyout() will copy from the kernel to userland -or- the kernel. this is why drivers should use these routies vs copyin() and copyout(). if drivers use copyin() and copyout() and they are not layering safe and can not be accessed from within the kernel via the ldi. these new bp "in/out" interfaces behave the same way the ddi "in/out" interfaces do, which (to me) makes complete sense to me. > 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.) > correct. i see no problem with this. ed > 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). > > > > _______________________________________________ > opensolaris-arc mailing list > opensolaris-arc at opensolaris.org
