Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'for-linus-5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml

Pull UML updates from Richard Weinberger:

- Devicetree support (for testing)

- Various cleanups and fixes: UBD, port_user, uml_mconsole

- Maintainer update

* tag 'for-linus-5.18-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml:
um: run_helper: Write error message to kernel log on exec failure on host
um: port_user: Improve error handling when port-helper is not found
um: port_user: Allow setting path to port-helper using UML_PORT_HELPER envvar
um: port_user: Search for in.telnetd in PATH
um: clang: Strip out -mno-global-merge from USER_CFLAGS
docs: UML: Mention telnetd for port channel
um: Remove unused timeval_to_ns() function
um: Fix uml_mconsole stop/go
um: Cleanup syscall_handler_t definition/cast, fix warning
uml: net: vector: fix const issue
um: Fix WRITE_ZEROES in the UBD Driver
um: Migrate vector drivers to NAPI
um: Fix order of dtb unflatten/early init
um: fix and optimize xor select template for CONFIG64 and timetravel mode
um: Document dtb command line option
lib/logic_iomem: correct fallback config references
um: Remove duplicated include in syscalls_64.c
MAINTAINERS: Update UserModeLinux entry

+131 -80
+20
Documentation/virt/uml/user_mode_linux_howto_v2.rst
··· 1193 1193 which ensures that the userspace function close does not clash 1194 1194 with similarly named function(s) in the kernel part. 1195 1195 1196 + Using UML as a Test Platform 1197 + ============================ 1198 + 1199 + UML is an excellent test platform for device driver development. As 1200 + with most things UML, "some user assembly may be required". It is 1201 + up to the user to build their emulation environment. UML at present 1202 + provides only the kernel infrastructure. 1203 + 1204 + Part of this infrastructure is the ability to load and parse fdt 1205 + device tree blobs as used in Arm or Open Firmware platforms. These 1206 + are supplied as an optional extra argument to the kernel command 1207 + line:: 1208 + 1209 + dtb=filename 1210 + 1211 + The device tree is loaded and parsed at boottime and is accessible by 1212 + drivers which query it. At this moment in time this facility is 1213 + intended solely for development purposes. UML's own devices do not 1214 + query the device tree. 1215 + 1196 1216 Security Considerations 1197 1217 ----------------------- 1198 1218
+3 -2
MAINTAINERS
··· 20539 20539 F: drivers/media/usb/zr364xx/ 20540 20540 20541 20541 USER-MODE LINUX (UML) 20542 - M: Jeff Dike <jdike@addtoit.com> 20543 20542 M: Richard Weinberger <richard@nod.at> 20544 20543 M: Anton Ivanov <anton.ivanov@cambridgegreys.com> 20544 + M: Johannes Berg <johannes@sipsolutions.net> 20545 20545 L: linux-um@lists.infradead.org 20546 20546 S: Maintained 20547 20547 W: http://user-mode-linux.sourceforge.net 20548 20548 Q: https://patchwork.ozlabs.org/project/linux-um/list/ 20549 - T: git git://git.kernel.org/pub/scm/linux/kernel/git/rw/uml.git 20549 + T: git git://git.kernel.org/pub/scm/linux/kernel/git/uml/linux.git next 20550 + T: git git://git.kernel.org/pub/scm/linux/kernel/git/uml/linux.git fixes 20550 20551 F: Documentation/virt/uml/ 20551 20552 F: arch/um/ 20552 20553 F: arch/x86/um/
+4
arch/um/Makefile
··· 75 75 -D_FILE_OFFSET_BITS=64 -idirafter $(srctree)/include \ 76 76 -idirafter $(objtree)/include -D__KERNEL__ -D__UM_HOST__ 77 77 78 + ifdef CONFIG_CC_IS_CLANG 79 + USER_CFLAGS := $(patsubst -mno-global-merge,,$(USER_CFLAGS)) 80 + endif 81 + 78 82 #This will adjust *FLAGS accordingly to the platform. 79 83 include $(srctree)/$(ARCH_DIR)/Makefile-os-$(OS) 80 84
+2 -1
arch/um/drivers/mconsole_kern.c
··· 224 224 225 225 void mconsole_stop(struct mc_request *req) 226 226 { 227 - deactivate_fd(req->originating_fd, MCONSOLE_IRQ); 227 + block_signals(); 228 228 os_set_fd_block(req->originating_fd, 1); 229 229 mconsole_reply(req, "stopped", 0, 0); 230 230 for (;;) { ··· 247 247 } 248 248 os_set_fd_block(req->originating_fd, 0); 249 249 mconsole_reply(req, "", 0, 0); 250 + unblock_signals(); 250 251 } 251 252 252 253 static DEFINE_SPINLOCK(mc_devices_lock);
+17 -1
arch/um/drivers/port_user.c
··· 5 5 6 6 #include <stdio.h> 7 7 #include <stdlib.h> 8 + #include <string.h> 8 9 #include <errno.h> 9 10 #include <termios.h> 10 11 #include <unistd.h> ··· 168 167 int port_connection(int fd, int *socket, int *pid_out) 169 168 { 170 169 int new, err; 171 - char *argv[] = { "/usr/sbin/in.telnetd", "-L", 170 + char *env; 171 + char *argv[] = { "in.telnetd", "-L", 172 172 OS_LIB_PATH "/uml/port-helper", NULL }; 173 173 struct port_pre_exec_data data; 174 + 175 + if ((env = getenv("UML_PORT_HELPER"))) 176 + argv[2] = env; 174 177 175 178 new = accept(fd, NULL, 0); 176 179 if (new < 0) 177 180 return -errno; 181 + 182 + err = os_access(argv[2], X_OK); 183 + if (err < 0) { 184 + printk(UM_KERN_ERR "port_connection : error accessing port-helper " 185 + "executable at %s: %s\n", argv[2], strerror(-err)); 186 + if (env == NULL) 187 + printk(UM_KERN_ERR "Set UML_PORT_HELPER environment " 188 + "variable to path to uml-utilities port-helper " 189 + "binary\n"); 190 + goto out_close; 191 + } 178 192 179 193 err = os_pipe(socket, 0, 0); 180 194 if (err < 0)
+7 -1
arch/um/drivers/ubd_kern.c
··· 1526 1526 } 1527 1527 break; 1528 1528 case REQ_OP_DISCARD: 1529 - case REQ_OP_WRITE_ZEROES: 1530 1529 n = os_falloc_punch(req->fds[bit], off, len); 1530 + if (n) { 1531 + req->error = map_error(-n); 1532 + return; 1533 + } 1534 + break; 1535 + case REQ_OP_WRITE_ZEROES: 1536 + n = os_falloc_zeroes(req->fds[bit], off, len); 1531 1537 if (n) { 1532 1538 req->error = map_error(-n); 1533 1539 return;
+49 -56
arch/um/drivers/vector_kern.c
··· 67 67 static int driver_registered; 68 68 69 69 static void vector_eth_configure(int n, struct arglist *def); 70 + static int vector_mmsg_rx(struct vector_private *vp, int budget); 70 71 71 72 /* Argument accessors to set variables (and/or set default values) 72 73 * mtu, buffer sizing, default headroom, etc ··· 78 77 #define DEFAULT_VECTOR_SIZE 64 79 78 #define TX_SMALL_PACKET 128 80 79 #define MAX_IOV_SIZE (MAX_SKB_FRAGS + 1) 81 - #define MAX_ITERATIONS 64 82 80 83 81 static const struct { 84 82 const char string[ETH_GSTRING_LEN]; ··· 458 458 vp->estats.tx_queue_running_average = 459 459 (vp->estats.tx_queue_running_average + result) >> 1; 460 460 } 461 - netif_trans_update(qi->dev); 462 461 netif_wake_queue(qi->dev); 463 462 /* if TX is busy, break out of the send loop, 464 463 * poll write IRQ will reschedule xmit for us ··· 469 470 } 470 471 } 471 472 spin_unlock(&qi->head_lock); 472 - } else { 473 - tasklet_schedule(&vp->tx_poll); 474 473 } 475 474 return queue_depth; 476 475 } ··· 605 608 606 609 /* 607 610 * We do not use the RX queue as a proper wraparound queue for now 608 - * This is not necessary because the consumption via netif_rx() 611 + * This is not necessary because the consumption via napi_gro_receive() 609 612 * happens in-line. While we can try using the return code of 610 613 * netif_rx() for flow control there are no drivers doing this today. 611 614 * For this RX specific use we ignore the tail/head locks and ··· 893 896 skb->protocol = eth_type_trans(skb, skb->dev); 894 897 vp->dev->stats.rx_bytes += skb->len; 895 898 vp->dev->stats.rx_packets++; 896 - netif_rx(skb); 899 + napi_gro_receive(&vp->napi, skb); 897 900 } else { 898 901 dev_kfree_skb_irq(skb); 899 902 } ··· 952 955 * mmsg vector matched to an skb vector which we prepared earlier. 953 956 */ 954 957 955 - static int vector_mmsg_rx(struct vector_private *vp) 958 + static int vector_mmsg_rx(struct vector_private *vp, int budget) 956 959 { 957 960 int packet_count, i; 958 961 struct vector_queue *qi = vp->rx_queue; ··· 968 971 prep_queue_for_rx(qi); 969 972 970 973 /* Fire the Lazy Gun - get as many packets as we can in one go. */ 974 + 975 + if (budget > qi->max_depth) 976 + budget = qi->max_depth; 971 977 972 978 packet_count = uml_vector_recvmmsg( 973 979 vp->fds->rx_fd, qi->mmsg_vector, qi->max_depth, 0); ··· 1021 1021 */ 1022 1022 vp->dev->stats.rx_bytes += skb->len; 1023 1023 vp->dev->stats.rx_packets++; 1024 - netif_rx(skb); 1024 + napi_gro_receive(&vp->napi, skb); 1025 1025 } else { 1026 1026 /* Overlay header too short to do anything - discard. 1027 1027 * We can actually keep this skb and reuse it, ··· 1042 1042 (vp->estats.rx_queue_running_average + packet_count) >> 1; 1043 1043 } 1044 1044 return packet_count; 1045 - } 1046 - 1047 - static void vector_rx(struct vector_private *vp) 1048 - { 1049 - int err; 1050 - int iter = 0; 1051 - 1052 - if ((vp->options & VECTOR_RX) > 0) 1053 - while (((err = vector_mmsg_rx(vp)) > 0) && (iter < MAX_ITERATIONS)) 1054 - iter++; 1055 - else 1056 - while (((err = vector_legacy_rx(vp)) > 0) && (iter < MAX_ITERATIONS)) 1057 - iter++; 1058 - if ((err != 0) && net_ratelimit()) 1059 - netdev_err(vp->dev, "vector_rx: error(%d)\n", err); 1060 - if (iter == MAX_ITERATIONS) 1061 - netdev_err(vp->dev, "vector_rx: device stuck, remote end may have closed the connection\n"); 1062 1045 } 1063 1046 1064 1047 static int vector_net_start_xmit(struct sk_buff *skb, struct net_device *dev) ··· 1068 1085 netdev_sent_queue(vp->dev, skb->len); 1069 1086 queue_depth = vector_enqueue(vp->tx_queue, skb); 1070 1087 1071 - /* if the device queue is full, stop the upper layers and 1072 - * flush it. 1073 - */ 1074 - 1075 - if (queue_depth >= vp->tx_queue->max_depth - 1) { 1076 - vp->estats.tx_kicks++; 1077 - netif_stop_queue(dev); 1078 - vector_send(vp->tx_queue); 1079 - return NETDEV_TX_OK; 1080 - } 1081 - if (netdev_xmit_more()) { 1088 + if (queue_depth < vp->tx_queue->max_depth && netdev_xmit_more()) { 1082 1089 mod_timer(&vp->tl, vp->coalesce); 1083 1090 return NETDEV_TX_OK; 1091 + } else { 1092 + queue_depth = vector_send(vp->tx_queue); 1093 + if (queue_depth > 0) 1094 + napi_schedule(&vp->napi); 1084 1095 } 1085 - if (skb->len < TX_SMALL_PACKET) { 1086 - vp->estats.tx_kicks++; 1087 - vector_send(vp->tx_queue); 1088 - } else 1089 - tasklet_schedule(&vp->tx_poll); 1096 + 1090 1097 return NETDEV_TX_OK; 1091 1098 } 1092 1099 ··· 1087 1114 1088 1115 if (!netif_running(dev)) 1089 1116 return IRQ_NONE; 1090 - vector_rx(vp); 1117 + napi_schedule(&vp->napi); 1091 1118 return IRQ_HANDLED; 1092 1119 1093 1120 } ··· 1106 1133 * tweaking the IRQ mask less costly 1107 1134 */ 1108 1135 1109 - if (vp->in_write_poll) 1110 - tasklet_schedule(&vp->tx_poll); 1136 + napi_schedule(&vp->napi); 1111 1137 return IRQ_HANDLED; 1112 1138 1113 1139 } ··· 1133 1161 um_free_irq(vp->tx_irq, dev); 1134 1162 vp->tx_irq = 0; 1135 1163 } 1136 - tasklet_kill(&vp->tx_poll); 1164 + napi_disable(&vp->napi); 1165 + netif_napi_del(&vp->napi); 1137 1166 if (vp->fds->rx_fd > 0) { 1138 1167 if (vp->bpf) 1139 1168 uml_vector_detach_bpf(vp->fds->rx_fd, vp->bpf); ··· 1166 1193 return 0; 1167 1194 } 1168 1195 1169 - /* TX tasklet */ 1170 - 1171 - static void vector_tx_poll(struct tasklet_struct *t) 1196 + static int vector_poll(struct napi_struct *napi, int budget) 1172 1197 { 1173 - struct vector_private *vp = from_tasklet(vp, t, tx_poll); 1198 + struct vector_private *vp = container_of(napi, struct vector_private, napi); 1199 + int work_done = 0; 1200 + int err; 1201 + bool tx_enqueued = false; 1174 1202 1175 - vp->estats.tx_kicks++; 1176 - vector_send(vp->tx_queue); 1203 + if ((vp->options & VECTOR_TX) != 0) 1204 + tx_enqueued = (vector_send(vp->tx_queue) > 0); 1205 + if ((vp->options & VECTOR_RX) > 0) 1206 + err = vector_mmsg_rx(vp, budget); 1207 + else { 1208 + err = vector_legacy_rx(vp); 1209 + if (err > 0) 1210 + err = 1; 1211 + } 1212 + if (err > 0) 1213 + work_done += err; 1214 + 1215 + if (tx_enqueued || err > 0) 1216 + napi_schedule(napi); 1217 + if (work_done < budget) 1218 + napi_complete_done(napi, work_done); 1219 + return work_done; 1177 1220 } 1221 + 1178 1222 static void vector_reset_tx(struct work_struct *work) 1179 1223 { 1180 1224 struct vector_private *vp = ··· 1255 1265 goto out_close; 1256 1266 } 1257 1267 1268 + netif_napi_add(vp->dev, &vp->napi, vector_poll, get_depth(vp->parsed)); 1269 + napi_enable(&vp->napi); 1270 + 1258 1271 /* READ IRQ */ 1259 1272 err = um_request_irq( 1260 1273 irq_rr + VECTOR_BASE_IRQ, vp->fds->rx_fd, ··· 1299 1306 uml_vector_attach_bpf(vp->fds->rx_fd, vp->bpf); 1300 1307 1301 1308 netif_start_queue(dev); 1309 + vector_reset_stats(vp); 1302 1310 1303 1311 /* clear buffer - it can happen that the host side of the interface 1304 1312 * is full when we get here. In this case, new data is never queued, 1305 1313 * SIGIOs never arrive, and the net never works. 1306 1314 */ 1307 1315 1308 - vector_rx(vp); 1316 + napi_schedule(&vp->napi); 1309 1317 1310 - vector_reset_stats(vp); 1311 1318 vdevice = find_device(vp->unit); 1312 1319 vdevice->opened = 1; 1313 1320 ··· 1536 1543 #endif 1537 1544 }; 1538 1545 1539 - 1540 1546 static void vector_timer_expire(struct timer_list *t) 1541 1547 { 1542 1548 struct vector_private *vp = from_timer(vp, t, tl); 1543 1549 1544 1550 vp->estats.tx_kicks++; 1545 - vector_send(vp->tx_queue); 1551 + napi_schedule(&vp->napi); 1546 1552 } 1553 + 1554 + 1547 1555 1548 1556 static void vector_eth_configure( 1549 1557 int n, ··· 1628 1634 }); 1629 1635 1630 1636 dev->features = dev->hw_features = (NETIF_F_SG | NETIF_F_FRAGLIST); 1631 - tasklet_setup(&vp->tx_poll, vector_tx_poll); 1632 1637 INIT_WORK(&vp->reset_tx, vector_reset_tx); 1633 1638 1634 1639 timer_setup(&vp->tl, vector_timer_expire, 0);
+2 -1
arch/um/drivers/vector_kern.h
··· 14 14 #include <linux/ctype.h> 15 15 #include <linux/workqueue.h> 16 16 #include <linux/interrupt.h> 17 + 17 18 #include "vector_user.h" 18 19 19 20 /* Queue structure specially adapted for multiple enqueue/dequeue ··· 73 72 struct list_head list; 74 73 spinlock_t lock; 75 74 struct net_device *dev; 75 + struct napi_struct napi ____cacheline_aligned; 76 76 77 77 int unit; 78 78 ··· 117 115 118 116 spinlock_t stats_lock; 119 117 120 - struct tasklet_struct tx_poll; 121 118 bool rexmit_scheduled; 122 119 bool opened; 123 120 bool in_write_poll;
+1 -1
arch/um/drivers/vector_user.c
··· 771 771 printk(KERN_ERR BPF_DETACH_FAIL, prog->len, prog->filter, fd, -errno); 772 772 return err; 773 773 } 774 - void *uml_vector_default_bpf(void *mac) 774 + void *uml_vector_default_bpf(const void *mac) 775 775 { 776 776 struct sock_filter *bpf; 777 777 uint32_t *mac1 = (uint32_t *)(mac + 2);
+1 -1
arch/um/drivers/vector_user.h
··· 97 97 unsigned int vlen, 98 98 unsigned int flags 99 99 ); 100 - extern void *uml_vector_default_bpf(void *mac); 100 + extern void *uml_vector_default_bpf(const void *mac); 101 101 extern void *uml_vector_user_bpf(char *filename); 102 102 extern int uml_vector_attach_bpf(int fd, void *bpf); 103 103 extern int uml_vector_detach_bpf(int fd, void *bpf);
+3 -1
arch/um/include/asm/xor.h
··· 4 4 5 5 #ifdef CONFIG_64BIT 6 6 #undef CONFIG_X86_32 7 + #define TT_CPU_INF_XOR_DEFAULT (AVX_SELECT(&xor_block_sse_pf64)) 7 8 #else 8 9 #define CONFIG_X86_32 1 10 + #define TT_CPU_INF_XOR_DEFAULT (AVX_SELECT(&xor_block_8regs)) 9 11 #endif 10 12 11 13 #include <asm/cpufeature.h> ··· 18 16 #undef XOR_SELECT_TEMPLATE 19 17 /* pick an arbitrary one - measuring isn't possible with inf-cpu */ 20 18 #define XOR_SELECT_TEMPLATE(x) \ 21 - (time_travel_mode == TT_MODE_INFCPU ? &xor_block_8regs : NULL) 19 + (time_travel_mode == TT_MODE_INFCPU ? TT_CPU_INF_XOR_DEFAULT : x)) 22 20 #endif 23 21 24 22 #endif
+1
arch/um/include/shared/os.h
··· 168 168 extern unsigned os_minor(unsigned long long dev); 169 169 extern unsigned long long os_makedev(unsigned major, unsigned minor); 170 170 extern int os_falloc_punch(int fd, unsigned long long offset, int count); 171 + extern int os_falloc_zeroes(int fd, unsigned long long offset, int count); 171 172 extern int os_eventfd(unsigned int initval, int flags); 172 173 extern int os_sendmsg_fds(int fd, const void *buf, unsigned int len, 173 174 const int *fds, unsigned int fds_num);
+1 -1
arch/um/kernel/dtb.c
··· 25 25 return; 26 26 } 27 27 28 - unflatten_device_tree(); 29 28 early_init_fdt_scan_reserved_mem(); 29 + unflatten_device_tree(); 30 30 } 31 31 32 32 static int __init uml_dtb_setup(char *line, int *add)
+9
arch/um/os-Linux/file.c
··· 625 625 return n; 626 626 } 627 627 628 + int os_falloc_zeroes(int fd, unsigned long long offset, int len) 629 + { 630 + int n = fallocate(fd, FALLOC_FL_ZERO_RANGE|FALLOC_FL_KEEP_SIZE, offset, len); 631 + 632 + if (n < 0) 633 + return -errno; 634 + return n; 635 + } 636 + 628 637 int os_eventfd(unsigned int initval, int flags) 629 638 { 630 639 int fd = eventfd(initval, flags);
+5
arch/um/os-Linux/helper.c
··· 4 4 */ 5 5 6 6 #include <stdlib.h> 7 + #include <string.h> 7 8 #include <unistd.h> 8 9 #include <errno.h> 9 10 #include <sched.h> ··· 99 98 } 100 99 CATCH_EINTR(waitpid(pid, NULL, __WALL)); 101 100 } 101 + 102 + if (ret < 0) 103 + printk(UM_KERN_ERR "run_helper : failed to exec %s on host: %s\n", 104 + argv[0], strerror(-ret)); 102 105 103 106 out_free2: 104 107 kfree(data.buf);
-6
arch/um/os-Linux/time.c
··· 18 18 19 19 static timer_t event_high_res_timer = 0; 20 20 21 - static inline long long timeval_to_ns(const struct timeval *tv) 22 - { 23 - return ((long long) tv->tv_sec * UM_NSEC_PER_SEC) + 24 - tv->tv_usec * UM_NSEC_PER_USEC; 25 - } 26 - 27 21 static inline long long timespec_to_ns(const struct timespec *ts) 28 22 { 29 23 return ((long long) ts->tv_sec * UM_NSEC_PER_SEC) + ts->tv_nsec;
+2 -3
arch/x86/um/shared/sysdep/syscalls_64.h
··· 10 10 #include <linux/msg.h> 11 11 #include <linux/shm.h> 12 12 13 - typedef long syscall_handler_t(void); 13 + typedef long syscall_handler_t(long, long, long, long, long, long); 14 14 15 15 extern syscall_handler_t *sys_call_table[]; 16 16 17 17 #define EXECUTE_SYSCALL(syscall, regs) \ 18 - (((long (*)(long, long, long, long, long, long)) \ 19 - (*sys_call_table[syscall]))(UPT_SYSCALL_ARG1(&regs->regs), \ 18 + (((*sys_call_table[syscall]))(UPT_SYSCALL_ARG1(&regs->regs), \ 20 19 UPT_SYSCALL_ARG2(&regs->regs), \ 21 20 UPT_SYSCALL_ARG3(&regs->regs), \ 22 21 UPT_SYSCALL_ARG4(&regs->regs), \
-1
arch/x86/um/syscalls_64.c
··· 12 12 #include <asm/prctl.h> /* XXX This should get the constants from libc */ 13 13 #include <registers.h> 14 14 #include <os.h> 15 - #include <registers.h> 16 15 17 16 long arch_prctl(struct task_struct *task, int option, 18 17 unsigned long __user *arg2)
+4 -4
lib/logic_iomem.c
··· 68 68 } 69 69 EXPORT_SYMBOL(logic_iomem_add_region); 70 70 71 - #ifndef CONFIG_LOGIC_IOMEM_FALLBACK 71 + #ifndef CONFIG_INDIRECT_IOMEM_FALLBACK 72 72 static void __iomem *real_ioremap(phys_addr_t offset, size_t size) 73 73 { 74 74 WARN(1, "invalid ioremap(0x%llx, 0x%zx)\n", ··· 81 81 WARN(1, "invalid iounmap for addr 0x%llx\n", 82 82 (unsigned long long)(uintptr_t __force)addr); 83 83 } 84 - #endif /* CONFIG_LOGIC_IOMEM_FALLBACK */ 84 + #endif /* CONFIG_INDIRECT_IOMEM_FALLBACK */ 85 85 86 86 void __iomem *ioremap(phys_addr_t offset, size_t size) 87 87 { ··· 168 168 } 169 169 EXPORT_SYMBOL(iounmap); 170 170 171 - #ifndef CONFIG_LOGIC_IOMEM_FALLBACK 171 + #ifndef CONFIG_INDIRECT_IOMEM_FALLBACK 172 172 #define MAKE_FALLBACK(op, sz) \ 173 173 static u##sz real_raw_read ## op(const volatile void __iomem *addr) \ 174 174 { \ ··· 213 213 WARN(1, "Invalid memcpy_toio at address 0x%llx\n", 214 214 (unsigned long long)(uintptr_t __force)addr); 215 215 } 216 - #endif /* CONFIG_LOGIC_IOMEM_FALLBACK */ 216 + #endif /* CONFIG_INDIRECT_IOMEM_FALLBACK */ 217 217 218 218 #define MAKE_OP(op, sz) \ 219 219 u##sz __raw_read ## op(const volatile void __iomem *addr) \