svn commit: r312720 - in projects/clang400-import: etc/devd lib/libc/aarch64/sys sbin/restore share/man/man4 share/man/man5 sys/amd64/linux sys/arm/freescale/imx sys/arm/ti/cpsw sys/arm64/arm64 sys...
Dimitry Andric
dim at FreeBSD.org
Tue Jan 24 19:59:28 UTC 2017
Author: dim
Date: Tue Jan 24 19:59:25 2017
New Revision: 312720
URL: https://svnweb.freebsd.org/changeset/base/312720
Log:
Merge ^/head r312624 through r312719.
Added:
projects/clang400-import/sys/contrib/dev/rtwn/rtwn-rtl8192eufw.fw.uu
- copied unchanged from r312719, head/sys/contrib/dev/rtwn/rtwn-rtl8192eufw.fw.uu
projects/clang400-import/sys/dev/rtwn/rtl8192c/r92c_llt.c
- copied unchanged from r312719, head/sys/dev/rtwn/rtl8192c/r92c_llt.c
projects/clang400-import/sys/dev/rtwn/rtl8192e/
- copied from r312719, head/sys/dev/rtwn/rtl8192e/
projects/clang400-import/sys/modules/rtwnfw/rtwnrtl8192eu/
- copied from r312719, head/sys/modules/rtwnfw/rtwnrtl8192eu/
projects/clang400-import/usr.bin/truss/riscv64-freebsd.c
- copied unchanged from r312719, head/usr.bin/truss/riscv64-freebsd.c
Modified:
projects/clang400-import/etc/devd/usb.conf
projects/clang400-import/lib/libc/aarch64/sys/cerror.S
projects/clang400-import/sbin/restore/restore.8
projects/clang400-import/share/man/man4/rtwn.4
projects/clang400-import/share/man/man4/rtwn_usb.4
projects/clang400-import/share/man/man4/rtwnfw.4
projects/clang400-import/share/man/man5/tmpfs.5
projects/clang400-import/sys/amd64/linux/linux_sysvec.c
projects/clang400-import/sys/arm/freescale/imx/imx_machdep.c
projects/clang400-import/sys/arm/ti/cpsw/if_cpsw.c
projects/clang400-import/sys/arm/ti/cpsw/if_cpswvar.h
projects/clang400-import/sys/arm64/arm64/mp_machdep.c
projects/clang400-import/sys/boot/fdt/dts/arm/beaglebone-black.dts
projects/clang400-import/sys/cam/ctl/ctl_backend_ramdisk.c
projects/clang400-import/sys/cam/ctl/ctl_frontend.h
projects/clang400-import/sys/cam/ctl/ctl_frontend_cam_sim.c
projects/clang400-import/sys/cam/ctl/ctl_frontend_ioctl.c
projects/clang400-import/sys/cam/ctl/ctl_frontend_iscsi.c
projects/clang400-import/sys/cam/ctl/ctl_tpc_local.c
projects/clang400-import/sys/cam/ctl/scsi_ctl.c
projects/clang400-import/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
projects/clang400-import/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h
projects/clang400-import/sys/cddl/dev/dtrace/dtrace_ioctl.c
projects/clang400-import/sys/conf/files
projects/clang400-import/sys/dev/ath/if_ath.c
projects/clang400-import/sys/dev/ath/if_ath_tx.c
projects/clang400-import/sys/dev/ath/if_ath_tx_edma.c
projects/clang400-import/sys/dev/e1000/em_txrx.c
projects/clang400-import/sys/dev/e1000/if_em.c
projects/clang400-import/sys/dev/hyperv/netvsc/hn_nvs.c
projects/clang400-import/sys/dev/hyperv/netvsc/hn_nvs.h
projects/clang400-import/sys/dev/hyperv/netvsc/if_hn.c
projects/clang400-import/sys/dev/hyperv/netvsc/if_hnreg.h
projects/clang400-import/sys/dev/hyperv/netvsc/if_hnvar.h
projects/clang400-import/sys/dev/mrsas/mrsas_linux.c
projects/clang400-import/sys/dev/rtwn/if_rtwn.c
projects/clang400-import/sys/dev/rtwn/if_rtwnvar.h
projects/clang400-import/sys/dev/rtwn/rtl8188e/usb/r88eu_attach.c
projects/clang400-import/sys/dev/rtwn/rtl8192c/pci/r92ce_attach.c
projects/clang400-import/sys/dev/rtwn/rtl8192c/r92c.h
projects/clang400-import/sys/dev/rtwn/rtl8192c/r92c_init.c
projects/clang400-import/sys/dev/rtwn/rtl8192c/r92c_reg.h
projects/clang400-import/sys/dev/rtwn/rtl8192c/usb/r92cu_attach.c
projects/clang400-import/sys/dev/rtwn/rtl8812a/r12a_beacon.c
projects/clang400-import/sys/dev/rtwn/rtl8812a/r12a_fw.c
projects/clang400-import/sys/dev/rtwn/rtl8812a/usb/r12au_attach.c
projects/clang400-import/sys/dev/rtwn/rtl8821a/r21a_init.c
projects/clang400-import/sys/dev/rtwn/rtl8821a/usb/r21au_attach.c
projects/clang400-import/sys/dev/rtwn/usb/rtwn_usb_attach.h
projects/clang400-import/sys/dev/usb/usbdevs
projects/clang400-import/sys/kern/kern_switch.c
projects/clang400-import/sys/kern/kern_time.c
projects/clang400-import/sys/kern/subr_clock.c
projects/clang400-import/sys/kern/subr_gtaskqueue.c
projects/clang400-import/sys/kern/vfs_lookup.c
projects/clang400-import/sys/kern/vfs_vnops.c
projects/clang400-import/sys/libkern/bcd.c
projects/clang400-import/sys/modules/rtwn/Makefile
projects/clang400-import/sys/modules/rtwn_usb/Makefile
projects/clang400-import/sys/modules/rtwnfw/Makefile
projects/clang400-import/sys/net/ieee8023ad_lacp.c
projects/clang400-import/sys/net/if.c
projects/clang400-import/sys/net/iflib.c
projects/clang400-import/sys/net80211/ieee80211.c
projects/clang400-import/sys/powerpc/powerpc/db_trace.c
projects/clang400-import/sys/riscv/include/frame.h
projects/clang400-import/sys/riscv/riscv/trap.c
projects/clang400-import/sys/sys/eventhandler.h
projects/clang400-import/sys/sys/gtaskqueue.h
projects/clang400-import/sys/sys/libkern.h
projects/clang400-import/usr.bin/find/find.1
projects/clang400-import/usr.bin/iscsictl/iscsictl.c
projects/clang400-import/usr.bin/mail/popen.c
projects/clang400-import/usr.bin/mail/send.c
projects/clang400-import/usr.bin/sort/radixsort.c
projects/clang400-import/usr.sbin/ctladm/ctladm.8
projects/clang400-import/usr.sbin/pw/psdate.c
projects/clang400-import/usr.sbin/pw/pw_user.c
projects/clang400-import/usr.sbin/pw/tests/pw_usermod.sh
projects/clang400-import/usr.sbin/wpa/wpa_cli/wpa_cli.8
Directory Properties:
projects/clang400-import/ (props changed)
projects/clang400-import/sys/cddl/contrib/opensolaris/ (props changed)
Modified: projects/clang400-import/etc/devd/usb.conf
==============================================================================
--- projects/clang400-import/etc/devd/usb.conf Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/etc/devd/usb.conf Tue Jan 24 19:59:25 2017 (r312720)
@@ -2753,7 +2753,7 @@ nomatch 32 {
match "bus" "uhub[0-9]+";
match "mode" "host";
match "vendor" "0x0bda";
- match "product" "(0x818a|0x8191)";
+ match "product" "(0x818a|0x818b|0x8191)";
action "kldload -n if_rtwn_usb";
};
@@ -3793,7 +3793,7 @@ nomatch 32 {
match "bus" "uhub[0-9]+";
match "mode" "host";
match "vendor" "0x1199";
- match "product" "(0x68aa|0x68c0|0x9041)";
+ match "product" "(0x68aa|0x68c0|0x9041|0x9071)";
action "kldload -n u3g";
};
@@ -3905,7 +3905,7 @@ nomatch 32 {
match "bus" "uhub[0-9]+";
match "mode" "host";
match "vendor" "0x12d1";
- match "product" "(0x1573|0x1803|0x1c05|0x1c0b)";
+ match "product" "(0x1573|0x15c1|0x1803|0x1c05|0x1c0b)";
action "kldload -n u3g";
};
@@ -5025,7 +5025,7 @@ nomatch 32 {
match "bus" "uhub[0-9]+";
match "mode" "host";
match "vendor" "0x2001";
- match "product" "(0x3307|0x3308|0x3309|0x330a|0x330d|0x330f|0x3310|0x3314|0x3315|0x3316|0x3318)";
+ match "product" "(0x3307|0x3308|0x3309|0x330a|0x330d|0x330f|0x3310|0x3314|0x3315|0x3316|0x3318|0x3319)";
action "kldload -n if_rtwn_usb";
};
@@ -5297,7 +5297,7 @@ nomatch 32 {
match "bus" "uhub[0-9]+";
match "mode" "host";
match "vendor" "0x2357";
- match "product" "0x0101";
+ match "product" "(0x0101|0x0108|0x0109)";
action "kldload -n if_rtwn_usb";
};
@@ -5889,5 +5889,5 @@ nomatch 32 {
action "kldload -n umass";
};
-# 2743 USB entries processed
+# 2751 USB entries processed
Modified: projects/clang400-import/lib/libc/aarch64/sys/cerror.S
==============================================================================
--- projects/clang400-import/lib/libc/aarch64/sys/cerror.S Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/lib/libc/aarch64/sys/cerror.S Tue Jan 24 19:59:25 2017 (r312720)
@@ -34,7 +34,7 @@ ENTRY(cerror)
stp x0, lr, [sp]
bl _C_LABEL(__error)
ldp x1, lr, [sp]
- str x1, [x0]
+ str w1, [x0]
movn x0, #0
movn x1, #0
add sp, sp, #16
Modified: projects/clang400-import/sbin/restore/restore.8
==============================================================================
--- projects/clang400-import/sbin/restore/restore.8 Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/sbin/restore/restore.8 Tue Jan 24 19:59:25 2017 (r312720)
@@ -349,6 +349,8 @@ To prevent this, the
.Fl u
(unlink) flag causes restore to remove old entries before attempting
to create new ones.
+This flag is recommended when using extended attributes
+to avoid improperly accumulating attributes on pre-existing files.
.It Fl v
Normally
.Nm
Modified: projects/clang400-import/share/man/man4/rtwn.4
==============================================================================
--- projects/clang400-import/share/man/man4/rtwn.4 Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/share/man/man4/rtwn.4 Tue Jan 24 19:59:25 2017 (r312720)
@@ -18,7 +18,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd October 17, 2016
+.Dd January 24, 2017
.Dt RTWN 4
.Os
.Sh NAME
@@ -52,9 +52,9 @@ if_rtwn_usb_load="YES"
The
.Nm
driver provides support for wireless network devices based on
-the Realtek RTL8192C, RTL8188E, RTL8812A and RTL8821A programming APIs.
-These APIs are used by a wide variety of chips; most chips with USB
-and some with PCI interface are supported.
+the Realtek RTL8192C, RTL8188E, RTL8192E, RTL8812A and RTL8821A
+programming APIs. These APIs are used by a wide variety of chips;
+most chips with USB and some with PCI interface are supported.
.Pp
To enable use for PCI/PCIe systems, see the rtwn_pci(4) driver;
for USB devices, use the rtwn_usb(4) driver.
@@ -98,6 +98,7 @@ when an interface is brought up:
.It Pa /boot/kernel/rtwn-rtl8192cfwE.ko
.It Pa /boot/kernel/rtwn-rtl8192cfwT.ko
.It Pa /boot/kernel/rtwn-rtl8192cfwU.ko
+.It Pa /boot/kernel/rtwn-rtl8192eufw.ko
.It Pa /boot/kernel/rtwn-rtl8812aufw.ko
.It Pa /boot/kernel/rtwn-rtl8821aufw.ko
.El
Modified: projects/clang400-import/share/man/man4/rtwn_usb.4
==============================================================================
--- projects/clang400-import/share/man/man4/rtwn_usb.4 Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/share/man/man4/rtwn_usb.4 Tue Jan 24 19:59:25 2017 (r312720)
@@ -29,7 +29,7 @@
.\"
.\" $FreeBSD$
.\"/
-.Dd January 6, 2017
+.Dd January 24, 2017
.Dt RTWN_USB 4
.Os
.Sh NAME
@@ -56,7 +56,7 @@ driver.
.Sh HARDWARE
The
.Nm
-driver supports Realtek RTL8188CU/RTL8188RU/RTL8188EU/RTL8192CU/RTL8812AU/RTL8821AU
+driver supports Realtek RTL8188CU/RTL8188RU/RTL8188EU/RTL8192CU/RTL8192EU/RTL8812AU/RTL8821AU
based USB wireless network adapters, including:
.Pp
.Bl -column -compact "Belkin F7D1102 Surf Wireless Micro" "Bus"
@@ -70,6 +70,7 @@ based USB wireless network adapters, inc
.It "D-Link DWA-123 rev D1" Ta USB 2.0
.It "D-Link DWA-125 rev D1" Ta USB 2.0
.It "D-Link DWA-131" Ta USB 2.0
+.It "D-Link DWA-131 rev E1" Ta USB 2.0
.It "D-Link DWA-171 rev A1" Ta USB 2.0
.It "D-Link DWA-172 rev A1" Ta USB 2.0
.It "D-Link DWA-180 rev A1" Ta USB 2.0
@@ -94,7 +95,10 @@ based USB wireless network adapters, inc
.It "TP-LINK TL-WN723N v3" Ta USB 2.0
.It "TP-LINK TL-WN725N v2" Ta USB 2.0
.It "TP-LINK TL-WN821N v4" Ta USB 2.0
+.It "TP-LINK TL-WN821N v5" Ta USB 2.0
+.It "TP-LINK TL-WN822N v4" Ta USB 2.0
.It "TP-LINK TL-WN823N v1" Ta USB 2.0
+.It "TP-LINK TL-WN823N v2" Ta USB 2.0
.It "TRENDnet TEW-805UB" Ta USB 3.0
.It "ZyXEL NWD6605" Ta USB 3.0
.El
Modified: projects/clang400-import/share/man/man4/rtwnfw.4
==============================================================================
--- projects/clang400-import/share/man/man4/rtwnfw.4 Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/share/man/man4/rtwnfw.4 Tue Jan 24 19:59:25 2017 (r312720)
@@ -23,7 +23,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd October 28, 2015
+.Dd January 24, 2017
.Dt RTWNFW 4
.Os
.Sh NAME
@@ -46,6 +46,7 @@ of the following:
.Cd "device rtwn-rtl8192cfwE"
.Cd "device rtwn-rtl8192cfwT"
.Cd "device rtwn-rtl8192cfwU"
+.Cd "device rtwn-rtl8192eufw"
.Cd "device rtwn-rtl8812aufw"
.Cd "device rtwn-rtl8821aufw"
.Ed
@@ -59,6 +60,7 @@ rtwn-rtl8192cfwE_B_load="YES"
rtwn-rtl8192cfwE_load="YES"
rtwn-rtl8192cfwT_load="YES"
rtwn-rtl8192cfwU_load="YES"
+rtwn-rtl8192eufw_load="YES"
rtwn-rtl8812aufw_load="YES"
rtwn-rtl8821aufw_load="YES"
.Ed
@@ -66,8 +68,8 @@ rtwn-rtl8821aufw_load="YES"
rtwn-rtl8192cfwE and rtl8192cfwE_B modules provide access
to firmware sets for the Realtek RTL8188CE chip based PCIe adapters.
Other modules provide access to firmware sets for the Realtek RTL8188CUS,
-RTL8188CE-VAU, RTL8188EUS, RTL8188RU, RTL8192CU, RTL8812AU and RTL8821AU
-chip based USB WiFi adapters.
+RTL8188CE-VAU, RTL8188EUS, RTL8188RU, RTL8192CU, RTL8192EU, RTL8812AU and
+RTL8821AU chip based USB WiFi adapters.
They may be
statically linked into the kernel, or loaded as a modules.
.Pp
Modified: projects/clang400-import/share/man/man5/tmpfs.5
==============================================================================
--- projects/clang400-import/share/man/man5/tmpfs.5 Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/share/man/man5/tmpfs.5 Tue Jan 24 19:59:25 2017 (r312720)
@@ -54,7 +54,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 17, 2017
+.Dd January 20, 2017
.Dt TMPFS 5
.Os
.Sh NAME
@@ -77,7 +77,7 @@ tmpfs_load="YES"
.Sh DESCRIPTION
The
.Nm
-driver implements in-memory, or
+driver implements an in-memory, or
.Tn tmpfs
file system.
The filesystem stores both file metadata and data in main memory.
@@ -85,22 +85,22 @@ This allows very fast and low latency ac
The data is volatile.
An umount or system reboot invalidates it.
These properties make the filesystem's mounts suitable for fast
-scratch storage, e.g.
+scratch storage, like
.Pa /tmp .
.Pp
If the system becomes low on memory and swap is configured (see
.Xr swapon 8 ),
-file data may be written to the swap space, freeing memory
+the system can transfer file data to swap space, freeing memory
for other needs.
-The current implementation never swaps out metadata, including
-the directory content.
+Metadata, including the directory content, is never swapped out by the
+current implementation.
Keep this in mind when planning the mount limits, especially when expecting
to place many small files on a tmpfs mount.
.Pp
-When a file from a tmpfs mount is mmaped (see
-.Xr mmap 2 )
-into the process address space, the swap VM object which manages the file
-pages is used to implement mapping and to avoid double-copying of
+When
+.Xr mmap 2
+is used on a file from a tmpfs mount, the swap VM object managing the
+file pages is used to implement mapping and avoid double-copying of
the file data.
This quirk causes process inspection tools, like
.Xr procstat 1 ,
@@ -120,6 +120,10 @@ Defaults to the mount point's UID.
.It Cm mode
Specifies the mode (in octal notation) of the root inode of the file system.
Defaults to the mount point's mode.
+.It Cm nonc
+Do not use namecache to resolve names to files for the created mount.
+This saves memory, but currently might impair scalability for highly
+used mounts on large machines.
.It Cm inodes
Specifies the maximum number of nodes available to the file system.
If not specified, the file system chooses a reasonable maximum based on
Modified: projects/clang400-import/sys/amd64/linux/linux_sysvec.c
==============================================================================
--- projects/clang400-import/sys/amd64/linux/linux_sysvec.c Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/sys/amd64/linux/linux_sysvec.c Tue Jan 24 19:59:25 2017 (r312720)
@@ -718,7 +718,7 @@ exec_linux_imgact_try(struct image_param
{
const char *head = (const char *)imgp->image_header;
char *rpath;
- int error = -1, len;
+ int error = -1;
/*
* The interpreter for shell scripts run from a linux binary needs
@@ -736,17 +736,12 @@ exec_linux_imgact_try(struct image_param
linux_emul_convpath(FIRST_THREAD_IN_PROC(imgp->proc),
imgp->interpreter_name, UIO_SYSSPACE,
&rpath, 0, AT_FDCWD);
- if (rpath != NULL) {
- len = strlen(rpath) + 1;
-
- if (len <= MAXSHELLCMDLEN)
- memcpy(imgp->interpreter_name,
- rpath, len);
- free(rpath, M_TEMP);
- }
+ if (rpath != NULL)
+ imgp->args->fname_buf =
+ imgp->interpreter_name = rpath;
}
}
- return(error);
+ return (error);
}
#define LINUX_VSYSCALL_START (-10UL << 20)
Modified: projects/clang400-import/sys/arm/freescale/imx/imx_machdep.c
==============================================================================
--- projects/clang400-import/sys/arm/freescale/imx/imx_machdep.c Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/sys/arm/freescale/imx/imx_machdep.c Tue Jan 24 19:59:25 2017 (r312720)
@@ -69,11 +69,18 @@ imx_wdog_cpu_reset(vm_offset_t wdcr_phys
* Trigger an immediate reset by clearing the SRS bit in the watchdog
* control register. The reset happens on the next cycle of the wdog
* 32KHz clock, so hang out in a spin loop until the reset takes effect.
+ *
+ * Imx6 erratum ERR004346 says the SRS bit has to be cleared twice
+ * within the same cycle of the 32khz clock to reliably trigger the
+ * reset. Writing it 3 times in a row ensures at least 2 of the writes
+ * happen in the same 32k clock cycle.
*/
if ((pcr = devmap_ptov(wdcr_physaddr, sizeof(*pcr))) == NULL) {
printf("cpu_reset() can't find its control register... locking up now.");
} else {
*pcr &= ~WDOG_CR_SRS;
+ *pcr &= ~WDOG_CR_SRS;
+ *pcr &= ~WDOG_CR_SRS;
}
for (;;)
continue;
Modified: projects/clang400-import/sys/arm/ti/cpsw/if_cpsw.c
==============================================================================
--- projects/clang400-import/sys/arm/ti/cpsw/if_cpsw.c Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/sys/arm/ti/cpsw/if_cpsw.c Tue Jan 24 19:59:25 2017 (r312720)
@@ -1582,14 +1582,19 @@ cpsw_intr_rx(void *arg)
static struct mbuf *
cpsw_rx_dequeue(struct cpsw_softc *sc)
{
+ int nsegs, port, removed;
struct cpsw_cpdma_bd bd;
struct cpsw_slot *last, *slot;
struct cpswp_softc *psc;
- struct mbuf *mb_head, *mb_tail;
- int port, removed = 0;
+ struct mbuf *m, *m0, *mb_head, *mb_tail;
+ uint16_t m0_flags;
+ nsegs = 0;
+ m0 = NULL;
last = NULL;
- mb_head = mb_tail = NULL;
+ mb_head = NULL;
+ mb_tail = NULL;
+ removed = 0;
/* Pull completed packets off hardware RX queue. */
while ((slot = STAILQ_FIRST(&sc->rx.active)) != NULL) {
@@ -1612,10 +1617,12 @@ cpsw_rx_dequeue(struct cpsw_softc *sc)
bus_dmamap_sync(sc->mbuf_dtag, slot->dmamap, BUS_DMASYNC_POSTREAD);
bus_dmamap_unload(sc->mbuf_dtag, slot->dmamap);
+ m = slot->mbuf;
+ slot->mbuf = NULL;
+
if (bd.flags & CPDMA_BD_TDOWNCMPLT) {
CPSW_DEBUGF(sc, ("RX teardown is complete"));
- m_freem(slot->mbuf);
- slot->mbuf = NULL;
+ m_freem(m);
sc->rx.running = 0;
sc->rx.teardown = 0;
break;
@@ -1627,28 +1634,36 @@ cpsw_rx_dequeue(struct cpsw_softc *sc)
psc = device_get_softc(sc->port[port].dev);
/* Set up mbuf */
- /* TODO: track SOP/EOP bits to assemble a full mbuf
- out of received fragments. */
- slot->mbuf->m_data += bd.bufoff;
- slot->mbuf->m_len = bd.buflen;
+ m->m_data += bd.bufoff;
+ m->m_len = bd.buflen;
if (bd.flags & CPDMA_BD_SOP) {
- slot->mbuf->m_pkthdr.len = bd.pktlen;
- slot->mbuf->m_pkthdr.rcvif = psc->ifp;
- slot->mbuf->m_flags |= M_PKTHDR;
- }
- slot->mbuf->m_next = NULL;
- slot->mbuf->m_nextpkt = NULL;
- if (bd.flags & CPDMA_BD_PASS_CRC)
- m_adj(slot->mbuf, -ETHER_CRC_LEN);
+ m->m_pkthdr.len = bd.pktlen;
+ m->m_pkthdr.rcvif = psc->ifp;
+ m->m_flags |= M_PKTHDR;
+ m0_flags = bd.flags;
+ m0 = m;
+ }
+ nsegs++;
+ m->m_next = NULL;
+ m->m_nextpkt = NULL;
+ if (bd.flags & CPDMA_BD_EOP && m0 != NULL) {
+ if (m0_flags & CPDMA_BD_PASS_CRC)
+ m_adj(m0, -ETHER_CRC_LEN);
+ m0_flags = 0;
+ m0 = NULL;
+ if (nsegs > sc->rx.longest_chain)
+ sc->rx.longest_chain = nsegs;
+ nsegs = 0;
+ }
if ((psc->ifp->if_capenable & IFCAP_RXCSUM) != 0) {
/* check for valid CRC by looking into pkt_err[5:4] */
if ((bd.flags &
(CPDMA_BD_SOP | CPDMA_BD_PKT_ERR_MASK)) ==
CPDMA_BD_SOP) {
- slot->mbuf->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
- slot->mbuf->m_pkthdr.csum_flags |= CSUM_IP_VALID;
- slot->mbuf->m_pkthdr.csum_data = 0xffff;
+ m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
+ m->m_pkthdr.csum_flags |= CSUM_IP_VALID;
+ m->m_pkthdr.csum_data = 0xffff;
}
}
@@ -1661,15 +1676,21 @@ cpsw_rx_dequeue(struct cpsw_softc *sc)
}
/* Add mbuf to packet list to be returned. */
- if (mb_tail) {
- mb_tail->m_nextpkt = slot->mbuf;
+ if (mb_tail != NULL && (bd.flags & CPDMA_BD_SOP)) {
+ mb_tail->m_nextpkt = m;
+ } else if (mb_tail != NULL) {
+ mb_tail->m_next = m;
+ } else if (mb_tail == NULL && (bd.flags & CPDMA_BD_SOP) == 0) {
+ if (bootverbose)
+ printf(
+ "%s: %s: discanding fragment packet w/o header\n",
+ __func__, psc->ifp->if_xname);
+ m_freem(m);
+ continue;
} else {
- mb_head = slot->mbuf;
+ mb_head = m;
}
- mb_tail = slot->mbuf;
- slot->mbuf = NULL;
- if (sc->rx_batch > 0 && sc->rx_batch == removed)
- break;
+ mb_tail = m;
}
if (removed != 0) {
@@ -1960,7 +1981,8 @@ cpsw_tx_dequeue(struct cpsw_softc *sc)
sc->tx.teardown = 1;
}
- if ((flags & CPDMA_BD_OWNER) != 0 && sc->tx.teardown == 0)
+ if ((flags & (CPDMA_BD_SOP | CPDMA_BD_OWNER)) ==
+ (CPDMA_BD_SOP | CPDMA_BD_OWNER) && sc->tx.teardown == 0)
break; /* Hardware is still using this packet. */
bus_dmamap_sync(sc->mbuf_dtag, slot->dmamap, BUS_DMASYNC_POSTWRITE);
@@ -2686,9 +2708,6 @@ cpsw_add_sysctls(struct cpsw_softc *sc)
SYSCTL_ADD_INT(ctx, parent, OID_AUTO, "debug",
CTLFLAG_RW, &sc->debug, 0, "Enable switch debug messages");
- SYSCTL_ADD_INT(ctx, parent, OID_AUTO, "rx_batch",
- CTLFLAG_RW, &sc->rx_batch, 0, "Set the rx batch size");
-
SYSCTL_ADD_PROC(ctx, parent, OID_AUTO, "attachedSecs",
CTLTYPE_UINT | CTLFLAG_RD, sc, 0, cpsw_stat_attached, "IU",
"Time since driver attach");
Modified: projects/clang400-import/sys/arm/ti/cpsw/if_cpswvar.h
==============================================================================
--- projects/clang400-import/sys/arm/ti/cpsw/if_cpswvar.h Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/sys/arm/ti/cpsw/if_cpswvar.h Tue Jan 24 19:59:25 2017 (r312720)
@@ -89,7 +89,6 @@ struct cpsw_softc {
int active_slave;
int debug;
int dualemac;
- int rx_batch;
phandle_t node;
struct bintime attach_uptime; /* system uptime when attach happened. */
struct cpsw_port port[2];
Modified: projects/clang400-import/sys/arm64/arm64/mp_machdep.c
==============================================================================
--- projects/clang400-import/sys/arm64/arm64/mp_machdep.c Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/sys/arm64/arm64/mp_machdep.c Tue Jan 24 19:59:25 2017 (r312720)
@@ -105,8 +105,6 @@ static void ipi_preempt(void *);
static void ipi_rendezvous(void *);
static void ipi_stop(void *);
-static int ipi_handler(void *arg);
-
struct mtx ap_boot_mtx;
struct pcb stoppcbs[MAXCPU];
Modified: projects/clang400-import/sys/boot/fdt/dts/arm/beaglebone-black.dts
==============================================================================
--- projects/clang400-import/sys/boot/fdt/dts/arm/beaglebone-black.dts Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/sys/boot/fdt/dts/arm/beaglebone-black.dts Tue Jan 24 19:59:25 2017 (r312720)
@@ -50,13 +50,7 @@
};
&i2c0 {
- tda998x: hdmi-encoder {
- compatible = "nxp,tda998x";
- reg = <0x70>;
-
- pinctrl-names = "default", "off";
- pinctrl-0 = <&nxp_hdmi_bonelt_pins>;
- pinctrl-1 = <&nxp_hdmi_bonelt_off_pins>;
+ tda998x: tda19988 {
status = "okay";
};
};
Modified: projects/clang400-import/sys/cam/ctl/ctl_backend_ramdisk.c
==============================================================================
--- projects/clang400-import/sys/cam/ctl/ctl_backend_ramdisk.c Tue Jan 24 19:56:22 2017 (r312719)
+++ projects/clang400-import/sys/cam/ctl/ctl_backend_ramdisk.c Tue Jan 24 19:59:25 2017 (r312720)
@@ -1,7 +1,7 @@
/*-
* Copyright (c) 2003, 2008 Silicon Graphics International Corp.
* Copyright (c) 2012 The FreeBSD Foundation
- * Copyright (c) 2014-2015 Alexander Motin <mav at FreeBSD.org>
+ * Copyright (c) 2014-2017 Alexander Motin <mav at FreeBSD.org>
* All rights reserved.
*
* Portions of this software were developed by Edward Tomasz Napierala
@@ -35,7 +35,7 @@
* $Id: //depot/users/kenm/FreeBSD-test2/sys/cam/ctl/ctl_backend_ramdisk.c#3 $
*/
/*
- * CAM Target Layer backend for a "fake" ramdisk.
+ * CAM Target Layer black hole and RAM disk backend.
*
* Author: Ken Merry <ken at FreeBSD.org>
*/
@@ -48,9 +48,11 @@ __FBSDID("$FreeBSD$");
#include <sys/kernel.h>
#include <sys/condvar.h>
#include <sys/types.h>
+#include <sys/limits.h>
#include <sys/lock.h>
#include <sys/mutex.h>
#include <sys/malloc.h>
+#include <sys/sx.h>
#include <sys/taskqueue.h>
#include <sys/time.h>
#include <sys/queue.h>
@@ -71,6 +73,29 @@ __FBSDID("$FreeBSD$");
#include <cam/ctl/ctl_private.h>
#include <cam/ctl/ctl_error.h>
+#define PRIV(io) \
+ ((struct ctl_ptr_len_flags *)&(io)->io_hdr.ctl_private[CTL_PRIV_BACKEND])
+#define ARGS(io) \
+ ((struct ctl_lba_len_flags *)&(io)->io_hdr.ctl_private[CTL_PRIV_LBA_LEN])
+
+#define PPP (PAGE_SIZE / sizeof(uint8_t **))
+#ifdef __LP64__
+#define PPPS (PAGE_SHIFT - 3)
+#else
+#define PPPS (PAGE_SHIFT - 2)
+#endif
+#define SGPP (PAGE_SIZE / sizeof(struct ctl_sg_entry))
+
+#define P_UNMAPPED NULL /* Page is unmapped. */
+#define P_ANCHORED ((void *)(uintptr_t)1) /* Page is anchored. */
+
+typedef enum {
+ GP_READ, /* Return data page or zero page. */
+ GP_WRITE, /* Return data page, try allocate if none. */
+ GP_ANCHOR, /* Return data page, try anchor if none. */
+ GP_OTHER, /* Return what present, do not allocate/anchor. */
+} getpage_op_t;
+
typedef enum {
CTL_BE_RAMDISK_LUN_UNCONFIGURED = 0x01,
CTL_BE_RAMDISK_LUN_CONFIG_ERR = 0x02,
@@ -79,28 +104,29 @@ typedef enum {
struct ctl_be_ramdisk_lun {
struct ctl_lun_create_params params;
- char lunname[32];
- uint64_t size_bytes;
- uint64_t size_blocks;
+ char lunname[32];
+ int indir;
+ uint8_t **pages;
+ uint8_t *zero_page;
+ struct sx page_lock;
+ u_int pblocksize;
+ u_int pblockmul;
+ uint64_t size_bytes;
+ uint64_t size_blocks;
+ uint64_t cap_bytes;
+ uint64_t cap_used;
struct ctl_be_ramdisk_softc *softc;
ctl_be_ramdisk_lun_flags flags;
STAILQ_ENTRY(ctl_be_ramdisk_lun) links;
- struct ctl_be_lun cbe_lun;
- struct taskqueue *io_taskqueue;
- struct task io_task;
+ struct ctl_be_lun cbe_lun;
+ struct taskqueue *io_taskqueue;
+ struct task io_task;
STAILQ_HEAD(, ctl_io_hdr) cont_queue;
- struct mtx_padalign queue_lock;
+ struct mtx_padalign queue_lock;
};
struct ctl_be_ramdisk_softc {
struct mtx lock;
- int rd_size;
-#ifdef CTL_RAMDISK_PAGES
- uint8_t **ramdisk_pages;
- int num_pages;
-#else
- uint8_t *ramdisk_buffer;
-#endif
int num_luns;
STAILQ_HEAD(, ctl_be_ramdisk_lun) lun_list;
};
@@ -111,8 +137,13 @@ extern struct ctl_softc *control_softc;
static int ctl_backend_ramdisk_init(void);
static int ctl_backend_ramdisk_shutdown(void);
static int ctl_backend_ramdisk_move_done(union ctl_io *io);
+static void ctl_backend_ramdisk_compare(union ctl_io *io);
+static void ctl_backend_ramdisk_rw(union ctl_io *io);
static int ctl_backend_ramdisk_submit(union ctl_io *io);
-static void ctl_backend_ramdisk_continue(union ctl_io *io);
+static void ctl_backend_ramdisk_worker(void *context, int pending);
+static int ctl_backend_ramdisk_config_read(union ctl_io *io);
+static int ctl_backend_ramdisk_config_write(union ctl_io *io);
+static uint64_t ctl_backend_ramdisk_lun_attr(void *be_lun, const char *attrname);
static int ctl_backend_ramdisk_ioctl(struct cdev *dev, u_long cmd,
caddr_t addr, int flag, struct thread *td);
static int ctl_backend_ramdisk_rm(struct ctl_be_ramdisk_softc *softc,
@@ -121,12 +152,9 @@ static int ctl_backend_ramdisk_create(st
struct ctl_lun_req *req);
static int ctl_backend_ramdisk_modify(struct ctl_be_ramdisk_softc *softc,
struct ctl_lun_req *req);
-static void ctl_backend_ramdisk_worker(void *context, int pending);
static void ctl_backend_ramdisk_lun_shutdown(void *be_lun);
static void ctl_backend_ramdisk_lun_config_status(void *be_lun,
ctl_lun_config_status status);
-static int ctl_backend_ramdisk_config_write(union ctl_io *io);
-static int ctl_backend_ramdisk_config_read(union ctl_io *io);
static struct ctl_backend_driver ctl_be_ramdisk_driver =
{
@@ -138,36 +166,21 @@ static struct ctl_backend_driver ctl_be_
.data_move_done = ctl_backend_ramdisk_move_done,
.config_read = ctl_backend_ramdisk_config_read,
.config_write = ctl_backend_ramdisk_config_write,
- .ioctl = ctl_backend_ramdisk_ioctl
+ .ioctl = ctl_backend_ramdisk_ioctl,
+ .lun_attr = ctl_backend_ramdisk_lun_attr,
};
MALLOC_DEFINE(M_RAMDISK, "ramdisk", "Memory used for CTL RAMdisk");
CTL_BACKEND_DECLARE(cbr, ctl_be_ramdisk_driver);
-int
+static int
ctl_backend_ramdisk_init(void)
{
struct ctl_be_ramdisk_softc *softc = &rd_softc;
-#ifdef CTL_RAMDISK_PAGES
- int i;
-#endif
memset(softc, 0, sizeof(*softc));
mtx_init(&softc->lock, "ctlramdisk", NULL, MTX_DEF);
STAILQ_INIT(&softc->lun_list);
- softc->rd_size = 1024 * 1024;
-#ifdef CTL_RAMDISK_PAGES
- softc->num_pages = softc->rd_size / PAGE_SIZE;
- softc->ramdisk_pages = (uint8_t **)malloc(sizeof(uint8_t *) *
- softc->num_pages, M_RAMDISK,
- M_WAITOK);
- for (i = 0; i < softc->num_pages; i++)
- softc->ramdisk_pages[i] = malloc(PAGE_SIZE, M_RAMDISK,M_WAITOK);
-#else
- softc->ramdisk_buffer = (uint8_t *)malloc(softc->rd_size, M_RAMDISK,
- M_WAITOK);
-#endif
-
return (0);
}
@@ -176,9 +189,6 @@ ctl_backend_ramdisk_shutdown(void)
{
struct ctl_be_ramdisk_softc *softc = &rd_softc;
struct ctl_be_ramdisk_lun *lun, *next_lun;
-#ifdef CTL_RAMDISK_PAGES
- int i;
-#endif
mtx_lock(&softc->lock);
STAILQ_FOREACH_SAFE(lun, &softc->lun_list, links, next_lun) {
@@ -193,30 +203,210 @@ ctl_backend_ramdisk_shutdown(void)
mtx_lock(&softc->lock);
}
mtx_unlock(&softc->lock);
-
-#ifdef CTL_RAMDISK_PAGES
- for (i = 0; i < softc->num_pages; i++)
- free(softc->ramdisk_pages[i], M_RAMDISK);
- free(softc->ramdisk_pages, M_RAMDISK);
-#else
- free(softc->ramdisk_buffer, M_RAMDISK);
-#endif
mtx_destroy(&softc->lock);
return (0);
}
+static uint8_t *
+ctl_backend_ramdisk_getpage(struct ctl_be_ramdisk_lun *be_lun, off_t pn,
+ getpage_op_t op)
+{
+ uint8_t **p, ***pp;
+ off_t i;
+ int s;
+
+ if (be_lun->cap_bytes == 0) {
+ switch (op) {
+ case GP_READ:
+ return (be_lun->zero_page);
+ case GP_WRITE:
+ return ((uint8_t *)be_lun->pages);
+ case GP_ANCHOR:
+ return (P_ANCHORED);
+ default:
+ return (P_UNMAPPED);
+ }
+ }
+ if (op == GP_WRITE || op == GP_ANCHOR) {
+ sx_xlock(&be_lun->page_lock);
+ pp = &be_lun->pages;
+ for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) {
+ if (*pp == NULL) {
+ *pp = malloc(PAGE_SIZE, M_RAMDISK,
+ M_WAITOK|M_ZERO);
+ }
+ i = pn >> s;
+ pp = (uint8_t ***)&(*pp)[i];
+ pn -= i << s;
+ }
+ if (*pp == P_UNMAPPED && be_lun->cap_used < be_lun->cap_bytes) {
+ if (op == GP_WRITE) {
+ *pp = malloc(be_lun->pblocksize, M_RAMDISK,
+ M_WAITOK|M_ZERO);
+ } else
+ *pp = P_ANCHORED;
+ be_lun->cap_used += be_lun->pblocksize;
+ } else if (*pp == P_ANCHORED && op == GP_WRITE) {
+ *pp = malloc(be_lun->pblocksize, M_RAMDISK,
+ M_WAITOK|M_ZERO);
+ }
+ sx_xunlock(&be_lun->page_lock);
+ return ((uint8_t *)*pp);
+ } else {
+ sx_slock(&be_lun->page_lock);
+ p = be_lun->pages;
+ for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) {
+ if (p == NULL)
+ break;
+ i = pn >> s;
+ p = (uint8_t **)p[i];
+ pn -= i << s;
+ }
+ sx_sunlock(&be_lun->page_lock);
+ if ((p == P_UNMAPPED || p == P_ANCHORED) && op == GP_READ)
+ return (be_lun->zero_page);
+ return ((uint8_t *)p);
+ }
+};
+
+static void
+ctl_backend_ramdisk_unmappage(struct ctl_be_ramdisk_lun *be_lun, off_t pn)
+{
+ uint8_t ***pp;
+ off_t i;
+ int s;
+
+ if (be_lun->cap_bytes == 0)
+ return;
+ sx_xlock(&be_lun->page_lock);
+ pp = &be_lun->pages;
+ for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) {
+ if (*pp == NULL)
+ goto noindir;
+ i = pn >> s;
+ pp = (uint8_t ***)&(*pp)[i];
+ pn -= i << s;
+ }
+ if (*pp == P_ANCHORED) {
+ be_lun->cap_used -= be_lun->pblocksize;
+ *pp = P_UNMAPPED;
+ } else if (*pp != P_UNMAPPED) {
+ free(*pp, M_RAMDISK);
+ be_lun->cap_used -= be_lun->pblocksize;
+ *pp = P_UNMAPPED;
+ }
+noindir:
+ sx_xunlock(&be_lun->page_lock);
+};
+
+static void
+ctl_backend_ramdisk_anchorpage(struct ctl_be_ramdisk_lun *be_lun, off_t pn)
+{
+ uint8_t ***pp;
+ off_t i;
+ int s;
+
+ if (be_lun->cap_bytes == 0)
+ return;
+ sx_xlock(&be_lun->page_lock);
+ pp = &be_lun->pages;
+ for (s = (be_lun->indir - 1) * PPPS; s >= 0; s -= PPPS) {
+ if (*pp == NULL)
+ goto noindir;
+ i = pn >> s;
+ pp = (uint8_t ***)&(*pp)[i];
+ pn -= i << s;
+ }
+ if (*pp == P_UNMAPPED && be_lun->cap_used < be_lun->cap_bytes) {
+ be_lun->cap_used += be_lun->pblocksize;
+ *pp = P_ANCHORED;
+ } else if (*pp != P_ANCHORED) {
+ free(*pp, M_RAMDISK);
+ *pp = P_ANCHORED;
+ }
+noindir:
+ sx_xunlock(&be_lun->page_lock);
+};
+
+static void
+ctl_backend_ramdisk_freeallpages(uint8_t **p, int indir)
+{
+ int i;
+
+ if (p == NULL)
+ return;
+ if (indir == 0) {
+ free(p, M_RAMDISK);
+ return;
+ }
+ for (i = 0; i < PPP; i++) {
+ if (p[i] == NULL)
+ continue;
+ ctl_backend_ramdisk_freeallpages((uint8_t **)p[i], indir - 1);
+ }
+ free(p, M_RAMDISK);
+};
+
+static size_t
+cmp(uint8_t *a, uint8_t *b, size_t size)
+{
+ size_t i;
+
+ for (i = 0; i < size; i++) {
+ if (a[i] != b[i])
+ break;
+ }
+ return (i);
+}
+
+static int
+ctl_backend_ramdisk_cmp(union ctl_io *io)
+{
+ struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io);
+ struct ctl_be_ramdisk_lun *be_lun = cbe_lun->be_lun;
+ uint8_t *page;
+ uint8_t info[8];
+ uint64_t lba;
+ u_int lbaoff, lbas, res, off;
+
+ lbas = io->scsiio.kern_data_len / cbe_lun->blocksize;
+ lba = ARGS(io)->lba + PRIV(io)->len - lbas;
+ off = 0;
+ for (; lbas > 0; lbas--, lba++) {
+ page = ctl_backend_ramdisk_getpage(be_lun,
+ lba >> cbe_lun->pblockexp, GP_READ);
+ lbaoff = lba & ~(UINT_MAX << cbe_lun->pblockexp);
+ page += lbaoff * cbe_lun->blocksize;
+ res = cmp(io->scsiio.kern_data_ptr + off, page,
+ cbe_lun->blocksize);
+ off += res;
+ if (res < cbe_lun->blocksize)
+ break;
+ }
+ if (lbas > 0) {
+ off += io->scsiio.kern_rel_offset - io->scsiio.kern_data_len;
+ scsi_u64to8b(off, info);
+ ctl_set_sense(&io->scsiio, /*current_error*/ 1,
+ /*sense_key*/ SSD_KEY_MISCOMPARE,
+ /*asc*/ 0x1D, /*ascq*/ 0x00,
+ /*type*/ SSD_ELEM_INFO,
+ /*size*/ sizeof(info), /*data*/ &info,
+ /*type*/ SSD_ELEM_NONE);
+ return (1);
+ }
+ return (0);
+}
+
static int
ctl_backend_ramdisk_move_done(union ctl_io *io)
{
- struct ctl_be_lun *cbe_lun;
- struct ctl_be_ramdisk_lun *be_lun;
+ struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io);
+ struct ctl_be_ramdisk_lun *be_lun = cbe_lun->be_lun;
#ifdef CTL_TIME_IO
struct bintime cur_bt;
#endif
CTL_DEBUG_PRINT(("ctl_backend_ramdisk_move_done\n"));
- cbe_lun = CTL_BACKEND_LUN(io);
- be_lun = (struct ctl_be_ramdisk_lun *)cbe_lun->be_lun;
#ifdef CTL_TIME_IO
getbinuptime(&cur_bt);
bintime_sub(&cur_bt, &io->io_hdr.dma_start_bt);
@@ -240,7 +430,12 @@ ctl_backend_ramdisk_move_done(union ctl_
ctl_set_invalid_field_ciu(&io->scsiio);
} else if ((io->io_hdr.port_status == 0) &&
((io->io_hdr.status & CTL_STATUS_MASK) == CTL_STATUS_NONE)) {
- if (io->io_hdr.ctl_private[CTL_PRIV_BACKEND].integer > 0) {
+ if (ARGS(io)->flags & CTL_LLF_COMPARE) {
+ /* We have data block ready for comparison. */
+ if (ctl_backend_ramdisk_cmp(io))
+ goto done;
+ }
+ if (ARGS(io)->len > PRIV(io)->len) {
mtx_lock(&be_lun->queue_lock);
STAILQ_INSERT_TAIL(&be_lun->cont_queue,
&io->io_hdr, links);
@@ -251,75 +446,109 @@ ctl_backend_ramdisk_move_done(union ctl_
}
ctl_set_success(&io->scsiio);
}
+done:
ctl_data_submit_done(io);
return(0);
}
-static int
-ctl_backend_ramdisk_submit(union ctl_io *io)
+static void
+ctl_backend_ramdisk_compare(union ctl_io *io)
{
- struct ctl_be_lun *cbe_lun;
- struct ctl_lba_len_flags *lbalen;
+ struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io);
+ u_int lbas, len;
- cbe_lun = CTL_BACKEND_LUN(io);
- lbalen = (struct ctl_lba_len_flags *)&io->io_hdr.ctl_private[CTL_PRIV_LBA_LEN];
- if (lbalen->flags & CTL_LLF_VERIFY) {
- ctl_set_success(&io->scsiio);
- ctl_data_submit_done(io);
- return (CTL_RETVAL_COMPLETE);
- }
- io->io_hdr.ctl_private[CTL_PRIV_BACKEND].integer =
- lbalen->len * cbe_lun->blocksize;
- ctl_backend_ramdisk_continue(io);
- return (CTL_RETVAL_COMPLETE);
+ lbas = ARGS(io)->len - PRIV(io)->len;
+ lbas = MIN(lbas, 131072 / cbe_lun->blocksize);
+ len = lbas * cbe_lun->blocksize;
+
+ io->scsiio.be_move_done = ctl_backend_ramdisk_move_done;
+ io->scsiio.kern_data_ptr = malloc(len, M_RAMDISK, M_WAITOK);
+ io->scsiio.kern_data_len = len;
+ io->scsiio.kern_sg_entries = 0;
+ io->io_hdr.flags |= CTL_FLAG_ALLOCATED;
+ PRIV(io)->len += lbas;
+#ifdef CTL_TIME_IO
+ getbinuptime(&io->io_hdr.dma_start_bt);
+#endif
+ ctl_datamove(io);
}
static void
-ctl_backend_ramdisk_continue(union ctl_io *io)
+ctl_backend_ramdisk_rw(union ctl_io *io)
{
- struct ctl_be_ramdisk_softc *softc;
- int len, len_filled, sg_filled;
-#ifdef CTL_RAMDISK_PAGES
+ struct ctl_be_lun *cbe_lun = CTL_BACKEND_LUN(io);
+ struct ctl_be_ramdisk_lun *be_lun = cbe_lun->be_lun;
struct ctl_sg_entry *sg_entries;
- int i;
-#endif
-
- softc = &rd_softc;
- len = io->io_hdr.ctl_private[CTL_PRIV_BACKEND].integer;
-#ifdef CTL_RAMDISK_PAGES
- sg_filled = min(btoc(len), softc->num_pages);
- if (sg_filled > 1) {
+ uint8_t *page;
+ uint64_t lba;
+ u_int i, len, lbaoff, lbas, sgs, off;
+ getpage_op_t op;
+
+ lba = ARGS(io)->lba + PRIV(io)->len;
+ lbaoff = lba & ~(UINT_MAX << cbe_lun->pblockexp);
+ lbas = ARGS(io)->len - PRIV(io)->len;
+ lbas = MIN(lbas, (SGPP << cbe_lun->pblockexp) - lbaoff);
+ sgs = (lbas + lbaoff + be_lun->pblockmul - 1) >> cbe_lun->pblockexp;
+ off = lbaoff * cbe_lun->blocksize;
+ op = (ARGS(io)->flags & CTL_LLF_WRITE) ? GP_WRITE : GP_READ;
+ if (sgs > 1) {
io->scsiio.kern_data_ptr = malloc(sizeof(struct ctl_sg_entry) *
- sg_filled, M_RAMDISK,
- M_WAITOK);
+ sgs, M_RAMDISK, M_WAITOK);
sg_entries = (struct ctl_sg_entry *)io->scsiio.kern_data_ptr;
- for (i = 0, len_filled = 0; i < sg_filled; i++) {
- sg_entries[i].addr = softc->ramdisk_pages[i];
- sg_entries[i].len = MIN(PAGE_SIZE, len - len_filled);
- len_filled += sg_entries[i].len;
+ len = lbas * cbe_lun->blocksize;
+ for (i = 0; i < sgs; i++) {
+ page = ctl_backend_ramdisk_getpage(be_lun,
+ (lba >> cbe_lun->pblockexp) + i, op);
+ if (page == P_UNMAPPED || page == P_ANCHORED) {
+ free(io->scsiio.kern_data_ptr, M_RAMDISK);
+nospc:
+ ctl_set_space_alloc_fail(&io->scsiio);
+ ctl_data_submit_done(io);
+ return;
+ }
+ sg_entries[i].addr = page + off;
+ sg_entries[i].len = MIN(len, be_lun->pblocksize - off);
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-projects
mailing list