Magellan Linux

Contents of /trunk/kernel-alx/patches-4.4/0152-4.4.53-all-fixes.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2888 - (show annotations) (download)
Mon Mar 27 13:49:25 2017 UTC (7 years, 1 month ago) by niro
File size: 233641 byte(s)
linux-4.4.53
1 diff --git a/Documentation/Makefile b/Documentation/Makefile
2 index bc0548201755..fc759598c4c9 100644
3 --- a/Documentation/Makefile
4 +++ b/Documentation/Makefile
5 @@ -1,4 +1,4 @@
6 subdir-y := accounting auxdisplay blackfin connector \
7 - filesystems filesystems ia64 laptops mic misc-devices \
8 + filesystems filesystems ia64 laptops misc-devices \
9 networking pcmcia prctl ptp spi timers vDSO video4linux \
10 watchdog
11 diff --git a/Documentation/mic/Makefile b/Documentation/mic/Makefile
12 deleted file mode 100644
13 index a191d453badf..000000000000
14 --- a/Documentation/mic/Makefile
15 +++ /dev/null
16 @@ -1 +0,0 @@
17 -subdir-y := mpssd
18 diff --git a/Documentation/mic/mpssd/.gitignore b/Documentation/mic/mpssd/.gitignore
19 deleted file mode 100644
20 index 8b7c72f07c92..000000000000
21 --- a/Documentation/mic/mpssd/.gitignore
22 +++ /dev/null
23 @@ -1 +0,0 @@
24 -mpssd
25 diff --git a/Documentation/mic/mpssd/Makefile b/Documentation/mic/mpssd/Makefile
26 deleted file mode 100644
27 index 06871b0c08a6..000000000000
28 --- a/Documentation/mic/mpssd/Makefile
29 +++ /dev/null
30 @@ -1,21 +0,0 @@
31 -ifndef CROSS_COMPILE
32 -# List of programs to build
33 -hostprogs-$(CONFIG_X86_64) := mpssd
34 -
35 -mpssd-objs := mpssd.o sysfs.o
36 -
37 -# Tell kbuild to always build the programs
38 -always := $(hostprogs-y)
39 -
40 -HOSTCFLAGS += -I$(objtree)/usr/include -I$(srctree)/tools/include
41 -
42 -ifdef DEBUG
43 -HOSTCFLAGS += -DDEBUG=$(DEBUG)
44 -endif
45 -
46 -HOSTLOADLIBES_mpssd := -lpthread
47 -
48 -install:
49 - install mpssd /usr/sbin/mpssd
50 - install micctrl /usr/sbin/micctrl
51 -endif
52 diff --git a/Documentation/mic/mpssd/micctrl b/Documentation/mic/mpssd/micctrl
53 deleted file mode 100755
54 index 8f2629b41c5f..000000000000
55 --- a/Documentation/mic/mpssd/micctrl
56 +++ /dev/null
57 @@ -1,173 +0,0 @@
58 -#!/bin/bash
59 -# Intel MIC Platform Software Stack (MPSS)
60 -#
61 -# Copyright(c) 2013 Intel Corporation.
62 -#
63 -# This program is free software; you can redistribute it and/or modify
64 -# it under the terms of the GNU General Public License, version 2, as
65 -# published by the Free Software Foundation.
66 -#
67 -# This program is distributed in the hope that it will be useful, but
68 -# WITHOUT ANY WARRANTY; without even the implied warranty of
69 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
70 -# General Public License for more details.
71 -#
72 -# The full GNU General Public License is included in this distribution in
73 -# the file called "COPYING".
74 -#
75 -# Intel MIC User Space Tools.
76 -#
77 -# micctrl - Controls MIC boot/start/stop.
78 -#
79 -# chkconfig: 2345 95 05
80 -# description: start MPSS stack processing.
81 -#
82 -### BEGIN INIT INFO
83 -# Provides: micctrl
84 -### END INIT INFO
85 -
86 -# Source function library.
87 -. /etc/init.d/functions
88 -
89 -sysfs="/sys/class/mic"
90 -
91 -_status()
92 -{
93 - f=$sysfs/$1
94 - echo -e $1 state: "`cat $f/state`" shutdown_status: "`cat $f/shutdown_status`"
95 -}
96 -
97 -status()
98 -{
99 - if [ "`echo $1 | head -c3`" == "mic" ]; then
100 - _status $1
101 - return $?
102 - fi
103 - for f in $sysfs/*
104 - do
105 - _status `basename $f`
106 - RETVAL=$?
107 - [ $RETVAL -ne 0 ] && return $RETVAL
108 - done
109 - return 0
110 -}
111 -
112 -_reset()
113 -{
114 - f=$sysfs/$1
115 - echo reset > $f/state
116 -}
117 -
118 -reset()
119 -{
120 - if [ "`echo $1 | head -c3`" == "mic" ]; then
121 - _reset $1
122 - return $?
123 - fi
124 - for f in $sysfs/*
125 - do
126 - _reset `basename $f`
127 - RETVAL=$?
128 - [ $RETVAL -ne 0 ] && return $RETVAL
129 - done
130 - return 0
131 -}
132 -
133 -_boot()
134 -{
135 - f=$sysfs/$1
136 - echo "linux" > $f/bootmode
137 - echo "mic/uos.img" > $f/firmware
138 - echo "mic/$1.image" > $f/ramdisk
139 - echo "boot" > $f/state
140 -}
141 -
142 -boot()
143 -{
144 - if [ "`echo $1 | head -c3`" == "mic" ]; then
145 - _boot $1
146 - return $?
147 - fi
148 - for f in $sysfs/*
149 - do
150 - _boot `basename $f`
151 - RETVAL=$?
152 - [ $RETVAL -ne 0 ] && return $RETVAL
153 - done
154 - return 0
155 -}
156 -
157 -_shutdown()
158 -{
159 - f=$sysfs/$1
160 - echo shutdown > $f/state
161 -}
162 -
163 -shutdown()
164 -{
165 - if [ "`echo $1 | head -c3`" == "mic" ]; then
166 - _shutdown $1
167 - return $?
168 - fi
169 - for f in $sysfs/*
170 - do
171 - _shutdown `basename $f`
172 - RETVAL=$?
173 - [ $RETVAL -ne 0 ] && return $RETVAL
174 - done
175 - return 0
176 -}
177 -
178 -_wait()
179 -{
180 - f=$sysfs/$1
181 - while [ "`cat $f/state`" != "offline" -a "`cat $f/state`" != "online" ]
182 - do
183 - sleep 1
184 - echo -e "Waiting for $1 to go offline"
185 - done
186 -}
187 -
188 -wait()
189 -{
190 - if [ "`echo $1 | head -c3`" == "mic" ]; then
191 - _wait $1
192 - return $?
193 - fi
194 - # Wait for the cards to go offline
195 - for f in $sysfs/*
196 - do
197 - _wait `basename $f`
198 - RETVAL=$?
199 - [ $RETVAL -ne 0 ] && return $RETVAL
200 - done
201 - return 0
202 -}
203 -
204 -if [ ! -d "$sysfs" ]; then
205 - echo -e $"Module unloaded "
206 - exit 3
207 -fi
208 -
209 -case $1 in
210 - -s)
211 - status $2
212 - ;;
213 - -r)
214 - reset $2
215 - ;;
216 - -b)
217 - boot $2
218 - ;;
219 - -S)
220 - shutdown $2
221 - ;;
222 - -w)
223 - wait $2
224 - ;;
225 - *)
226 - echo $"Usage: $0 {-s (status) |-r (reset) |-b (boot) |-S (shutdown) |-w (wait)}"
227 - exit 2
228 -esac
229 -
230 -exit $?
231 diff --git a/Documentation/mic/mpssd/mpss b/Documentation/mic/mpssd/mpss
232 deleted file mode 100755
233 index 09ea90931649..000000000000
234 --- a/Documentation/mic/mpssd/mpss
235 +++ /dev/null
236 @@ -1,200 +0,0 @@
237 -#!/bin/bash
238 -# Intel MIC Platform Software Stack (MPSS)
239 -#
240 -# Copyright(c) 2013 Intel Corporation.
241 -#
242 -# This program is free software; you can redistribute it and/or modify
243 -# it under the terms of the GNU General Public License, version 2, as
244 -# published by the Free Software Foundation.
245 -#
246 -# This program is distributed in the hope that it will be useful, but
247 -# WITHOUT ANY WARRANTY; without even the implied warranty of
248 -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
249 -# General Public License for more details.
250 -#
251 -# The full GNU General Public License is included in this distribution in
252 -# the file called "COPYING".
253 -#
254 -# Intel MIC User Space Tools.
255 -#
256 -# mpss Start mpssd.
257 -#
258 -# chkconfig: 2345 95 05
259 -# description: start MPSS stack processing.
260 -#
261 -### BEGIN INIT INFO
262 -# Provides: mpss
263 -# Required-Start:
264 -# Required-Stop:
265 -# Short-Description: MPSS stack control
266 -# Description: MPSS stack control
267 -### END INIT INFO
268 -
269 -# Source function library.
270 -. /etc/init.d/functions
271 -
272 -exec=/usr/sbin/mpssd
273 -sysfs="/sys/class/mic"
274 -mic_modules="mic_host mic_x100_dma scif"
275 -
276 -start()
277 -{
278 - [ -x $exec ] || exit 5
279 -
280 - if [ "`ps -e | awk '{print $4}' | grep mpssd | head -1`" = "mpssd" ]; then
281 - echo -e $"MPSSD already running! "
282 - success
283 - echo
284 - return 0
285 - fi
286 -
287 - echo -e $"Starting MPSS Stack"
288 - echo -e $"Loading MIC drivers:" $mic_modules
289 -
290 - modprobe -a $mic_modules
291 - RETVAL=$?
292 - if [ $RETVAL -ne 0 ]; then
293 - failure
294 - echo
295 - return $RETVAL
296 - fi
297 -
298 - # Start the daemon
299 - echo -n $"Starting MPSSD "
300 - $exec
301 - RETVAL=$?
302 - if [ $RETVAL -ne 0 ]; then
303 - failure
304 - echo
305 - return $RETVAL
306 - fi
307 - success
308 - echo
309 -
310 - sleep 5
311 -
312 - # Boot the cards
313 - micctrl -b
314 -
315 - # Wait till ping works
316 - for f in $sysfs/*
317 - do
318 - count=100
319 - ipaddr=`cat $f/cmdline`
320 - ipaddr=${ipaddr#*address,}
321 - ipaddr=`echo $ipaddr | cut -d, -f1 | cut -d\; -f1`
322 - while [ $count -ge 0 ]
323 - do
324 - echo -e "Pinging "`basename $f`" "
325 - ping -c 1 $ipaddr &> /dev/null
326 - RETVAL=$?
327 - if [ $RETVAL -eq 0 ]; then
328 - success
329 - break
330 - fi
331 - sleep 1
332 - count=`expr $count - 1`
333 - done
334 - [ $RETVAL -ne 0 ] && failure || success
335 - echo
336 - done
337 - return $RETVAL
338 -}
339 -
340 -stop()
341 -{
342 - echo -e $"Shutting down MPSS Stack: "
343 -
344 - # Bail out if module is unloaded
345 - if [ ! -d "$sysfs" ]; then
346 - echo -n $"Module unloaded "
347 - success
348 - echo
349 - return 0
350 - fi
351 -
352 - # Shut down the cards.
353 - micctrl -S
354 -
355 - # Wait for the cards to go offline
356 - for f in $sysfs/*
357 - do
358 - while [ "`cat $f/state`" != "ready" ]
359 - do
360 - sleep 1
361 - echo -e "Waiting for "`basename $f`" to become ready"
362 - done
363 - done
364 -
365 - # Display the status of the cards
366 - micctrl -s
367 -
368 - # Kill MPSSD now
369 - echo -n $"Killing MPSSD"
370 - killall -9 mpssd 2>/dev/null
371 - RETVAL=$?
372 - [ $RETVAL -ne 0 ] && failure || success
373 - echo
374 - return $RETVAL
375 -}
376 -
377 -restart()
378 -{
379 - stop
380 - sleep 5
381 - start
382 -}
383 -
384 -status()
385 -{
386 - micctrl -s
387 - if [ "`ps -e | awk '{print $4}' | grep mpssd | head -n 1`" = "mpssd" ]; then
388 - echo "mpssd is running"
389 - else
390 - echo "mpssd is stopped"
391 - fi
392 - return 0
393 -}
394 -
395 -unload()
396 -{
397 - if [ ! -d "$sysfs" ]; then
398 - echo -n $"No MIC_HOST Module: "
399 - success
400 - echo
401 - return
402 - fi
403 -
404 - stop
405 -
406 - sleep 5
407 - echo -n $"Removing MIC drivers:" $mic_modules
408 - modprobe -r $mic_modules
409 - RETVAL=$?
410 - [ $RETVAL -ne 0 ] && failure || success
411 - echo
412 - return $RETVAL
413 -}
414 -
415 -case $1 in
416 - start)
417 - start
418 - ;;
419 - stop)
420 - stop
421 - ;;
422 - restart)
423 - restart
424 - ;;
425 - status)
426 - status
427 - ;;
428 - unload)
429 - unload
430 - ;;
431 - *)
432 - echo $"Usage: $0 {start|stop|restart|status|unload}"
433 - exit 2
434 -esac
435 -
436 -exit $?
437 diff --git a/Documentation/mic/mpssd/mpssd.c b/Documentation/mic/mpssd/mpssd.c
438 deleted file mode 100644
439 index c99a75968c01..000000000000
440 --- a/Documentation/mic/mpssd/mpssd.c
441 +++ /dev/null
442 @@ -1,1826 +0,0 @@
443 -/*
444 - * Intel MIC Platform Software Stack (MPSS)
445 - *
446 - * Copyright(c) 2013 Intel Corporation.
447 - *
448 - * This program is free software; you can redistribute it and/or modify
449 - * it under the terms of the GNU General Public License, version 2, as
450 - * published by the Free Software Foundation.
451 - *
452 - * This program is distributed in the hope that it will be useful, but
453 - * WITHOUT ANY WARRANTY; without even the implied warranty of
454 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
455 - * General Public License for more details.
456 - *
457 - * The full GNU General Public License is included in this distribution in
458 - * the file called "COPYING".
459 - *
460 - * Intel MIC User Space Tools.
461 - */
462 -
463 -#define _GNU_SOURCE
464 -
465 -#include <stdlib.h>
466 -#include <fcntl.h>
467 -#include <getopt.h>
468 -#include <assert.h>
469 -#include <unistd.h>
470 -#include <stdbool.h>
471 -#include <signal.h>
472 -#include <poll.h>
473 -#include <features.h>
474 -#include <sys/types.h>
475 -#include <sys/stat.h>
476 -#include <sys/mman.h>
477 -#include <sys/socket.h>
478 -#include <linux/virtio_ring.h>
479 -#include <linux/virtio_net.h>
480 -#include <linux/virtio_console.h>
481 -#include <linux/virtio_blk.h>
482 -#include <linux/version.h>
483 -#include "mpssd.h"
484 -#include <linux/mic_ioctl.h>
485 -#include <linux/mic_common.h>
486 -#include <tools/endian.h>
487 -
488 -static void *init_mic(void *arg);
489 -
490 -static FILE *logfp;
491 -static struct mic_info mic_list;
492 -
493 -#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
494 -
495 -#define min_t(type, x, y) ({ \
496 - type __min1 = (x); \
497 - type __min2 = (y); \
498 - __min1 < __min2 ? __min1 : __min2; })
499 -
500 -/* align addr on a size boundary - adjust address up/down if needed */
501 -#define _ALIGN_DOWN(addr, size) ((addr)&(~((size)-1)))
502 -#define _ALIGN_UP(addr, size) _ALIGN_DOWN(addr + size - 1, size)
503 -
504 -/* align addr on a size boundary - adjust address up if needed */
505 -#define _ALIGN(addr, size) _ALIGN_UP(addr, size)
506 -
507 -/* to align the pointer to the (next) page boundary */
508 -#define PAGE_ALIGN(addr) _ALIGN(addr, PAGE_SIZE)
509 -
510 -#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
511 -
512 -#define GSO_ENABLED 1
513 -#define MAX_GSO_SIZE (64 * 1024)
514 -#define ETH_H_LEN 14
515 -#define MAX_NET_PKT_SIZE (_ALIGN_UP(MAX_GSO_SIZE + ETH_H_LEN, 64))
516 -#define MIC_DEVICE_PAGE_END 0x1000
517 -
518 -#ifndef VIRTIO_NET_HDR_F_DATA_VALID
519 -#define VIRTIO_NET_HDR_F_DATA_VALID 2 /* Csum is valid */
520 -#endif
521 -
522 -static struct {
523 - struct mic_device_desc dd;
524 - struct mic_vqconfig vqconfig[2];
525 - __u32 host_features, guest_acknowledgements;
526 - struct virtio_console_config cons_config;
527 -} virtcons_dev_page = {
528 - .dd = {
529 - .type = VIRTIO_ID_CONSOLE,
530 - .num_vq = ARRAY_SIZE(virtcons_dev_page.vqconfig),
531 - .feature_len = sizeof(virtcons_dev_page.host_features),
532 - .config_len = sizeof(virtcons_dev_page.cons_config),
533 - },
534 - .vqconfig[0] = {
535 - .num = htole16(MIC_VRING_ENTRIES),
536 - },
537 - .vqconfig[1] = {
538 - .num = htole16(MIC_VRING_ENTRIES),
539 - },
540 -};
541 -
542 -static struct {
543 - struct mic_device_desc dd;
544 - struct mic_vqconfig vqconfig[2];
545 - __u32 host_features, guest_acknowledgements;
546 - struct virtio_net_config net_config;
547 -} virtnet_dev_page = {
548 - .dd = {
549 - .type = VIRTIO_ID_NET,
550 - .num_vq = ARRAY_SIZE(virtnet_dev_page.vqconfig),
551 - .feature_len = sizeof(virtnet_dev_page.host_features),
552 - .config_len = sizeof(virtnet_dev_page.net_config),
553 - },
554 - .vqconfig[0] = {
555 - .num = htole16(MIC_VRING_ENTRIES),
556 - },
557 - .vqconfig[1] = {
558 - .num = htole16(MIC_VRING_ENTRIES),
559 - },
560 -#if GSO_ENABLED
561 - .host_features = htole32(
562 - 1 << VIRTIO_NET_F_CSUM |
563 - 1 << VIRTIO_NET_F_GSO |
564 - 1 << VIRTIO_NET_F_GUEST_TSO4 |
565 - 1 << VIRTIO_NET_F_GUEST_TSO6 |
566 - 1 << VIRTIO_NET_F_GUEST_ECN),
567 -#else
568 - .host_features = 0,
569 -#endif
570 -};
571 -
572 -static const char *mic_config_dir = "/etc/mpss";
573 -static const char *virtblk_backend = "VIRTBLK_BACKEND";
574 -static struct {
575 - struct mic_device_desc dd;
576 - struct mic_vqconfig vqconfig[1];
577 - __u32 host_features, guest_acknowledgements;
578 - struct virtio_blk_config blk_config;
579 -} virtblk_dev_page = {
580 - .dd = {
581 - .type = VIRTIO_ID_BLOCK,
582 - .num_vq = ARRAY_SIZE(virtblk_dev_page.vqconfig),
583 - .feature_len = sizeof(virtblk_dev_page.host_features),
584 - .config_len = sizeof(virtblk_dev_page.blk_config),
585 - },
586 - .vqconfig[0] = {
587 - .num = htole16(MIC_VRING_ENTRIES),
588 - },
589 - .host_features =
590 - htole32(1<<VIRTIO_BLK_F_SEG_MAX),
591 - .blk_config = {
592 - .seg_max = htole32(MIC_VRING_ENTRIES - 2),
593 - .capacity = htole64(0),
594 - }
595 -};
596 -
597 -static char *myname;
598 -
599 -static int
600 -tap_configure(struct mic_info *mic, char *dev)
601 -{
602 - pid_t pid;
603 - char *ifargv[7];
604 - char ipaddr[IFNAMSIZ];
605 - int ret = 0;
606 -
607 - pid = fork();
608 - if (pid == 0) {
609 - ifargv[0] = "ip";
610 - ifargv[1] = "link";
611 - ifargv[2] = "set";
612 - ifargv[3] = dev;
613 - ifargv[4] = "up";
614 - ifargv[5] = NULL;
615 - mpsslog("Configuring %s\n", dev);
616 - ret = execvp("ip", ifargv);
617 - if (ret < 0) {
618 - mpsslog("%s execvp failed errno %s\n",
619 - mic->name, strerror(errno));
620 - return ret;
621 - }
622 - }
623 - if (pid < 0) {
624 - mpsslog("%s fork failed errno %s\n",
625 - mic->name, strerror(errno));
626 - return ret;
627 - }
628 -
629 - ret = waitpid(pid, NULL, 0);
630 - if (ret < 0) {
631 - mpsslog("%s waitpid failed errno %s\n",
632 - mic->name, strerror(errno));
633 - return ret;
634 - }
635 -
636 - snprintf(ipaddr, IFNAMSIZ, "172.31.%d.254/24", mic->id + 1);
637 -
638 - pid = fork();
639 - if (pid == 0) {
640 - ifargv[0] = "ip";
641 - ifargv[1] = "addr";
642 - ifargv[2] = "add";
643 - ifargv[3] = ipaddr;
644 - ifargv[4] = "dev";
645 - ifargv[5] = dev;
646 - ifargv[6] = NULL;
647 - mpsslog("Configuring %s ipaddr %s\n", dev, ipaddr);
648 - ret = execvp("ip", ifargv);
649 - if (ret < 0) {
650 - mpsslog("%s execvp failed errno %s\n",
651 - mic->name, strerror(errno));
652 - return ret;
653 - }
654 - }
655 - if (pid < 0) {
656 - mpsslog("%s fork failed errno %s\n",
657 - mic->name, strerror(errno));
658 - return ret;
659 - }
660 -
661 - ret = waitpid(pid, NULL, 0);
662 - if (ret < 0) {
663 - mpsslog("%s waitpid failed errno %s\n",
664 - mic->name, strerror(errno));
665 - return ret;
666 - }
667 - mpsslog("MIC name %s %s %d DONE!\n",
668 - mic->name, __func__, __LINE__);
669 - return 0;
670 -}
671 -
672 -static int tun_alloc(struct mic_info *mic, char *dev)
673 -{
674 - struct ifreq ifr;
675 - int fd, err;
676 -#if GSO_ENABLED
677 - unsigned offload;
678 -#endif
679 - fd = open("/dev/net/tun", O_RDWR);
680 - if (fd < 0) {
681 - mpsslog("Could not open /dev/net/tun %s\n", strerror(errno));
682 - goto done;
683 - }
684 -
685 - memset(&ifr, 0, sizeof(ifr));
686 -
687 - ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_VNET_HDR;
688 - if (*dev)
689 - strncpy(ifr.ifr_name, dev, IFNAMSIZ);
690 -
691 - err = ioctl(fd, TUNSETIFF, (void *)&ifr);
692 - if (err < 0) {
693 - mpsslog("%s %s %d TUNSETIFF failed %s\n",
694 - mic->name, __func__, __LINE__, strerror(errno));
695 - close(fd);
696 - return err;
697 - }
698 -#if GSO_ENABLED
699 - offload = TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | TUN_F_TSO_ECN;
700 -
701 - err = ioctl(fd, TUNSETOFFLOAD, offload);
702 - if (err < 0) {
703 - mpsslog("%s %s %d TUNSETOFFLOAD failed %s\n",
704 - mic->name, __func__, __LINE__, strerror(errno));
705 - close(fd);
706 - return err;
707 - }
708 -#endif
709 - strcpy(dev, ifr.ifr_name);
710 - mpsslog("Created TAP %s\n", dev);
711 -done:
712 - return fd;
713 -}
714 -
715 -#define NET_FD_VIRTIO_NET 0
716 -#define NET_FD_TUN 1
717 -#define MAX_NET_FD 2
718 -
719 -static void set_dp(struct mic_info *mic, int type, void *dp)
720 -{
721 - switch (type) {
722 - case VIRTIO_ID_CONSOLE:
723 - mic->mic_console.console_dp = dp;
724 - return;
725 - case VIRTIO_ID_NET:
726 - mic->mic_net.net_dp = dp;
727 - return;
728 - case VIRTIO_ID_BLOCK:
729 - mic->mic_virtblk.block_dp = dp;
730 - return;
731 - }
732 - mpsslog("%s %s %d not found\n", mic->name, __func__, type);
733 - assert(0);
734 -}
735 -
736 -static void *get_dp(struct mic_info *mic, int type)
737 -{
738 - switch (type) {
739 - case VIRTIO_ID_CONSOLE:
740 - return mic->mic_console.console_dp;
741 - case VIRTIO_ID_NET:
742 - return mic->mic_net.net_dp;
743 - case VIRTIO_ID_BLOCK:
744 - return mic->mic_virtblk.block_dp;
745 - }
746 - mpsslog("%s %s %d not found\n", mic->name, __func__, type);
747 - assert(0);
748 - return NULL;
749 -}
750 -
751 -static struct mic_device_desc *get_device_desc(struct mic_info *mic, int type)
752 -{
753 - struct mic_device_desc *d;
754 - int i;
755 - void *dp = get_dp(mic, type);
756 -
757 - for (i = sizeof(struct mic_bootparam); i < PAGE_SIZE;
758 - i += mic_total_desc_size(d)) {
759 - d = dp + i;
760 -
761 - /* End of list */
762 - if (d->type == 0)
763 - break;
764 -
765 - if (d->type == -1)
766 - continue;
767 -
768 - mpsslog("%s %s d-> type %d d %p\n",
769 - mic->name, __func__, d->type, d);
770 -
771 - if (d->type == (__u8)type)
772 - return d;
773 - }
774 - mpsslog("%s %s %d not found\n", mic->name, __func__, type);
775 - return NULL;
776 -}
777 -
778 -/* See comments in vhost.c for explanation of next_desc() */
779 -static unsigned next_desc(struct vring_desc *desc)
780 -{
781 - unsigned int next;
782 -
783 - if (!(le16toh(desc->flags) & VRING_DESC_F_NEXT))
784 - return -1U;
785 - next = le16toh(desc->next);
786 - return next;
787 -}
788 -
789 -/* Sum up all the IOVEC length */
790 -static ssize_t
791 -sum_iovec_len(struct mic_copy_desc *copy)
792 -{
793 - ssize_t sum = 0;
794 - int i;
795 -
796 - for (i = 0; i < copy->iovcnt; i++)
797 - sum += copy->iov[i].iov_len;
798 - return sum;
799 -}
800 -
801 -static inline void verify_out_len(struct mic_info *mic,
802 - struct mic_copy_desc *copy)
803 -{
804 - if (copy->out_len != sum_iovec_len(copy)) {
805 - mpsslog("%s %s %d BUG copy->out_len 0x%x len 0x%zx\n",
806 - mic->name, __func__, __LINE__,
807 - copy->out_len, sum_iovec_len(copy));
808 - assert(copy->out_len == sum_iovec_len(copy));
809 - }
810 -}
811 -
812 -/* Display an iovec */
813 -static void
814 -disp_iovec(struct mic_info *mic, struct mic_copy_desc *copy,
815 - const char *s, int line)
816 -{
817 - int i;
818 -
819 - for (i = 0; i < copy->iovcnt; i++)
820 - mpsslog("%s %s %d copy->iov[%d] addr %p len 0x%zx\n",
821 - mic->name, s, line, i,
822 - copy->iov[i].iov_base, copy->iov[i].iov_len);
823 -}
824 -
825 -static inline __u16 read_avail_idx(struct mic_vring *vr)
826 -{
827 - return ACCESS_ONCE(vr->info->avail_idx);
828 -}
829 -
830 -static inline void txrx_prepare(int type, bool tx, struct mic_vring *vr,
831 - struct mic_copy_desc *copy, ssize_t len)
832 -{
833 - copy->vr_idx = tx ? 0 : 1;
834 - copy->update_used = true;
835 - if (type == VIRTIO_ID_NET)
836 - copy->iov[1].iov_len = len - sizeof(struct virtio_net_hdr);
837 - else
838 - copy->iov[0].iov_len = len;
839 -}
840 -
841 -/* Central API which triggers the copies */
842 -static int
843 -mic_virtio_copy(struct mic_info *mic, int fd,
844 - struct mic_vring *vr, struct mic_copy_desc *copy)
845 -{
846 - int ret;
847 -
848 - ret = ioctl(fd, MIC_VIRTIO_COPY_DESC, copy);
849 - if (ret) {
850 - mpsslog("%s %s %d errno %s ret %d\n",
851 - mic->name, __func__, __LINE__,
852 - strerror(errno), ret);
853 - }
854 - return ret;
855 -}
856 -
857 -static inline unsigned _vring_size(unsigned int num, unsigned long align)
858 -{
859 - return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (3 + num)
860 - + align - 1) & ~(align - 1))
861 - + sizeof(__u16) * 3 + sizeof(struct vring_used_elem) * num;
862 -}
863 -
864 -/*
865 - * This initialization routine requires at least one
866 - * vring i.e. vr0. vr1 is optional.
867 - */
868 -static void *
869 -init_vr(struct mic_info *mic, int fd, int type,
870 - struct mic_vring *vr0, struct mic_vring *vr1, int num_vq)
871 -{
872 - int vr_size;
873 - char *va;
874 -
875 - vr_size = PAGE_ALIGN(_vring_size(MIC_VRING_ENTRIES,
876 - MIC_VIRTIO_RING_ALIGN) +
877 - sizeof(struct _mic_vring_info));
878 - va = mmap(NULL, MIC_DEVICE_PAGE_END + vr_size * num_vq,
879 - PROT_READ, MAP_SHARED, fd, 0);
880 - if (MAP_FAILED == va) {
881 - mpsslog("%s %s %d mmap failed errno %s\n",
882 - mic->name, __func__, __LINE__,
883 - strerror(errno));
884 - goto done;
885 - }
886 - set_dp(mic, type, va);
887 - vr0->va = (struct mic_vring *)&va[MIC_DEVICE_PAGE_END];
888 - vr0->info = vr0->va +
889 - _vring_size(MIC_VRING_ENTRIES, MIC_VIRTIO_RING_ALIGN);
890 - vring_init(&vr0->vr,
891 - MIC_VRING_ENTRIES, vr0->va, MIC_VIRTIO_RING_ALIGN);
892 - mpsslog("%s %s vr0 %p vr0->info %p vr_size 0x%x vring 0x%x ",
893 - __func__, mic->name, vr0->va, vr0->info, vr_size,
894 - _vring_size(MIC_VRING_ENTRIES, MIC_VIRTIO_RING_ALIGN));
895 - mpsslog("magic 0x%x expected 0x%x\n",
896 - le32toh(vr0->info->magic), MIC_MAGIC + type);
897 - assert(le32toh(vr0->info->magic) == MIC_MAGIC + type);
898 - if (vr1) {
899 - vr1->va = (struct mic_vring *)
900 - &va[MIC_DEVICE_PAGE_END + vr_size];
901 - vr1->info = vr1->va + _vring_size(MIC_VRING_ENTRIES,
902 - MIC_VIRTIO_RING_ALIGN);
903 - vring_init(&vr1->vr,
904 - MIC_VRING_ENTRIES, vr1->va, MIC_VIRTIO_RING_ALIGN);
905 - mpsslog("%s %s vr1 %p vr1->info %p vr_size 0x%x vring 0x%x ",
906 - __func__, mic->name, vr1->va, vr1->info, vr_size,
907 - _vring_size(MIC_VRING_ENTRIES, MIC_VIRTIO_RING_ALIGN));
908 - mpsslog("magic 0x%x expected 0x%x\n",
909 - le32toh(vr1->info->magic), MIC_MAGIC + type + 1);
910 - assert(le32toh(vr1->info->magic) == MIC_MAGIC + type + 1);
911 - }
912 -done:
913 - return va;
914 -}
915 -
916 -static int
917 -wait_for_card_driver(struct mic_info *mic, int fd, int type)
918 -{
919 - struct pollfd pollfd;
920 - int err;
921 - struct mic_device_desc *desc = get_device_desc(mic, type);
922 - __u8 prev_status;
923 -
924 - if (!desc)
925 - return -ENODEV;
926 - prev_status = desc->status;
927 - pollfd.fd = fd;
928 - mpsslog("%s %s Waiting .... desc-> type %d status 0x%x\n",
929 - mic->name, __func__, type, desc->status);
930 -
931 - while (1) {
932 - pollfd.events = POLLIN;
933 - pollfd.revents = 0;
934 - err = poll(&pollfd, 1, -1);
935 - if (err < 0) {
936 - mpsslog("%s %s poll failed %s\n",
937 - mic->name, __func__, strerror(errno));
938 - continue;
939 - }
940 -
941 - if (pollfd.revents) {
942 - if (desc->status != prev_status) {
943 - mpsslog("%s %s Waiting... desc-> type %d "
944 - "status 0x%x\n",
945 - mic->name, __func__, type,
946 - desc->status);
947 - prev_status = desc->status;
948 - }
949 - if (desc->status & VIRTIO_CONFIG_S_DRIVER_OK) {
950 - mpsslog("%s %s poll.revents %d\n",
951 - mic->name, __func__, pollfd.revents);
952 - mpsslog("%s %s desc-> type %d status 0x%x\n",
953 - mic->name, __func__, type,
954 - desc->status);
955 - break;
956 - }
957 - }
958 - }
959 - return 0;
960 -}
961 -
962 -/* Spin till we have some descriptors */
963 -static void
964 -spin_for_descriptors(struct mic_info *mic, struct mic_vring *vr)
965 -{
966 - __u16 avail_idx = read_avail_idx(vr);
967 -
968 - while (avail_idx == le16toh(ACCESS_ONCE(vr->vr.avail->idx))) {
969 -#ifdef DEBUG
970 - mpsslog("%s %s waiting for desc avail %d info_avail %d\n",
971 - mic->name, __func__,
972 - le16toh(vr->vr.avail->idx), vr->info->avail_idx);
973 -#endif
974 - sched_yield();
975 - }
976 -}
977 -
978 -static void *
979 -virtio_net(void *arg)
980 -{
981 - static __u8 vnet_hdr[2][sizeof(struct virtio_net_hdr)];
982 - static __u8 vnet_buf[2][MAX_NET_PKT_SIZE] __attribute__ ((aligned(64)));
983 - struct iovec vnet_iov[2][2] = {
984 - { { .iov_base = vnet_hdr[0], .iov_len = sizeof(vnet_hdr[0]) },
985 - { .iov_base = vnet_buf[0], .iov_len = sizeof(vnet_buf[0]) } },
986 - { { .iov_base = vnet_hdr[1], .iov_len = sizeof(vnet_hdr[1]) },
987 - { .iov_base = vnet_buf[1], .iov_len = sizeof(vnet_buf[1]) } },
988 - };
989 - struct iovec *iov0 = vnet_iov[0], *iov1 = vnet_iov[1];
990 - struct mic_info *mic = (struct mic_info *)arg;
991 - char if_name[IFNAMSIZ];
992 - struct pollfd net_poll[MAX_NET_FD];
993 - struct mic_vring tx_vr, rx_vr;
994 - struct mic_copy_desc copy;
995 - struct mic_device_desc *desc;
996 - int err;
997 -
998 - snprintf(if_name, IFNAMSIZ, "mic%d", mic->id);
999 - mic->mic_net.tap_fd = tun_alloc(mic, if_name);
1000 - if (mic->mic_net.tap_fd < 0)
1001 - goto done;
1002 -
1003 - if (tap_configure(mic, if_name))
1004 - goto done;
1005 - mpsslog("MIC name %s id %d\n", mic->name, mic->id);
1006 -
1007 - net_poll[NET_FD_VIRTIO_NET].fd = mic->mic_net.virtio_net_fd;
1008 - net_poll[NET_FD_VIRTIO_NET].events = POLLIN;
1009 - net_poll[NET_FD_TUN].fd = mic->mic_net.tap_fd;
1010 - net_poll[NET_FD_TUN].events = POLLIN;
1011 -
1012 - if (MAP_FAILED == init_vr(mic, mic->mic_net.virtio_net_fd,
1013 - VIRTIO_ID_NET, &tx_vr, &rx_vr,
1014 - virtnet_dev_page.dd.num_vq)) {
1015 - mpsslog("%s init_vr failed %s\n",
1016 - mic->name, strerror(errno));
1017 - goto done;
1018 - }
1019 -
1020 - copy.iovcnt = 2;
1021 - desc = get_device_desc(mic, VIRTIO_ID_NET);
1022 -
1023 - while (1) {
1024 - ssize_t len;
1025 -
1026 - net_poll[NET_FD_VIRTIO_NET].revents = 0;
1027 - net_poll[NET_FD_TUN].revents = 0;
1028 -
1029 - /* Start polling for data from tap and virtio net */
1030 - err = poll(net_poll, 2, -1);
1031 - if (err < 0) {
1032 - mpsslog("%s poll failed %s\n",
1033 - __func__, strerror(errno));
1034 - continue;
1035 - }
1036 - if (!(desc->status & VIRTIO_CONFIG_S_DRIVER_OK)) {
1037 - err = wait_for_card_driver(mic,
1038 - mic->mic_net.virtio_net_fd,
1039 - VIRTIO_ID_NET);
1040 - if (err) {
1041 - mpsslog("%s %s %d Exiting...\n",
1042 - mic->name, __func__, __LINE__);
1043 - break;
1044 - }
1045 - }
1046 - /*
1047 - * Check if there is data to be read from TUN and write to
1048 - * virtio net fd if there is.
1049 - */
1050 - if (net_poll[NET_FD_TUN].revents & POLLIN) {
1051 - copy.iov = iov0;
1052 - len = readv(net_poll[NET_FD_TUN].fd,
1053 - copy.iov, copy.iovcnt);
1054 - if (len > 0) {
1055 - struct virtio_net_hdr *hdr
1056 - = (struct virtio_net_hdr *)vnet_hdr[0];
1057 -
1058 - /* Disable checksums on the card since we are on
1059 - a reliable PCIe link */
1060 - hdr->flags |= VIRTIO_NET_HDR_F_DATA_VALID;
1061 -#ifdef DEBUG
1062 - mpsslog("%s %s %d hdr->flags 0x%x ", mic->name,
1063 - __func__, __LINE__, hdr->flags);
1064 - mpsslog("copy.out_len %d hdr->gso_type 0x%x\n",
1065 - copy.out_len, hdr->gso_type);
1066 -#endif
1067 -#ifdef DEBUG
1068 - disp_iovec(mic, copy, __func__, __LINE__);
1069 - mpsslog("%s %s %d read from tap 0x%lx\n",
1070 - mic->name, __func__, __LINE__,
1071 - len);
1072 -#endif
1073 - spin_for_descriptors(mic, &tx_vr);
1074 - txrx_prepare(VIRTIO_ID_NET, 1, &tx_vr, &copy,
1075 - len);
1076 -
1077 - err = mic_virtio_copy(mic,
1078 - mic->mic_net.virtio_net_fd, &tx_vr,
1079 - &copy);
1080 - if (err < 0) {
1081 - mpsslog("%s %s %d mic_virtio_copy %s\n",
1082 - mic->name, __func__, __LINE__,
1083 - strerror(errno));
1084 - }
1085 - if (!err)
1086 - verify_out_len(mic, &copy);
1087 -#ifdef DEBUG
1088 - disp_iovec(mic, copy, __func__, __LINE__);
1089 - mpsslog("%s %s %d wrote to net 0x%lx\n",
1090 - mic->name, __func__, __LINE__,
1091 - sum_iovec_len(&copy));
1092 -#endif
1093 - /* Reinitialize IOV for next run */
1094 - iov0[1].iov_len = MAX_NET_PKT_SIZE;
1095 - } else if (len < 0) {
1096 - disp_iovec(mic, &copy, __func__, __LINE__);
1097 - mpsslog("%s %s %d read failed %s ", mic->name,
1098 - __func__, __LINE__, strerror(errno));
1099 - mpsslog("cnt %d sum %zd\n",
1100 - copy.iovcnt, sum_iovec_len(&copy));
1101 - }
1102 - }
1103 -
1104 - /*
1105 - * Check if there is data to be read from virtio net and
1106 - * write to TUN if there is.
1107 - */
1108 - if (net_poll[NET_FD_VIRTIO_NET].revents & POLLIN) {
1109 - while (rx_vr.info->avail_idx !=
1110 - le16toh(rx_vr.vr.avail->idx)) {
1111 - copy.iov = iov1;
1112 - txrx_prepare(VIRTIO_ID_NET, 0, &rx_vr, &copy,
1113 - MAX_NET_PKT_SIZE
1114 - + sizeof(struct virtio_net_hdr));
1115 -
1116 - err = mic_virtio_copy(mic,
1117 - mic->mic_net.virtio_net_fd, &rx_vr,
1118 - &copy);
1119 - if (!err) {
1120 -#ifdef DEBUG
1121 - struct virtio_net_hdr *hdr
1122 - = (struct virtio_net_hdr *)
1123 - vnet_hdr[1];
1124 -
1125 - mpsslog("%s %s %d hdr->flags 0x%x, ",
1126 - mic->name, __func__, __LINE__,
1127 - hdr->flags);
1128 - mpsslog("out_len %d gso_type 0x%x\n",
1129 - copy.out_len,
1130 - hdr->gso_type);
1131 -#endif
1132 - /* Set the correct output iov_len */
1133 - iov1[1].iov_len = copy.out_len -
1134 - sizeof(struct virtio_net_hdr);
1135 - verify_out_len(mic, &copy);
1136 -#ifdef DEBUG
1137 - disp_iovec(mic, copy, __func__,
1138 - __LINE__);
1139 - mpsslog("%s %s %d ",
1140 - mic->name, __func__, __LINE__);
1141 - mpsslog("read from net 0x%lx\n",
1142 - sum_iovec_len(copy));
1143 -#endif
1144 - len = writev(net_poll[NET_FD_TUN].fd,
1145 - copy.iov, copy.iovcnt);
1146 - if (len != sum_iovec_len(&copy)) {
1147 - mpsslog("Tun write failed %s ",
1148 - strerror(errno));
1149 - mpsslog("len 0x%zx ", len);
1150 - mpsslog("read_len 0x%zx\n",
1151 - sum_iovec_len(&copy));
1152 - } else {
1153 -#ifdef DEBUG
1154 - disp_iovec(mic, &copy, __func__,
1155 - __LINE__);
1156 - mpsslog("%s %s %d ",
1157 - mic->name, __func__,
1158 - __LINE__);
1159 - mpsslog("wrote to tap 0x%lx\n",
1160 - len);
1161 -#endif
1162 - }
1163 - } else {
1164 - mpsslog("%s %s %d mic_virtio_copy %s\n",
1165 - mic->name, __func__, __LINE__,
1166 - strerror(errno));
1167 - break;
1168 - }
1169 - }
1170 - }
1171 - if (net_poll[NET_FD_VIRTIO_NET].revents & POLLERR)
1172 - mpsslog("%s: %s: POLLERR\n", __func__, mic->name);
1173 - }
1174 -done:
1175 - pthread_exit(NULL);
1176 -}
1177 -
1178 -/* virtio_console */
1179 -#define VIRTIO_CONSOLE_FD 0
1180 -#define MONITOR_FD (VIRTIO_CONSOLE_FD + 1)
1181 -#define MAX_CONSOLE_FD (MONITOR_FD + 1) /* must be the last one + 1 */
1182 -#define MAX_BUFFER_SIZE PAGE_SIZE
1183 -
1184 -static void *
1185 -virtio_console(void *arg)
1186 -{
1187 - static __u8 vcons_buf[2][PAGE_SIZE];
1188 - struct iovec vcons_iov[2] = {
1189 - { .iov_base = vcons_buf[0], .iov_len = sizeof(vcons_buf[0]) },
1190 - { .iov_base = vcons_buf[1], .iov_len = sizeof(vcons_buf[1]) },
1191 - };
1192 - struct iovec *iov0 = &vcons_iov[0], *iov1 = &vcons_iov[1];
1193 - struct mic_info *mic = (struct mic_info *)arg;
1194 - int err;
1195 - struct pollfd console_poll[MAX_CONSOLE_FD];
1196 - int pty_fd;
1197 - char *pts_name;
1198 - ssize_t len;
1199 - struct mic_vring tx_vr, rx_vr;
1200 - struct mic_copy_desc copy;
1201 - struct mic_device_desc *desc;
1202 -
1203 - pty_fd = posix_openpt(O_RDWR);
1204 - if (pty_fd < 0) {
1205 - mpsslog("can't open a pseudoterminal master device: %s\n",
1206 - strerror(errno));
1207 - goto _return;
1208 - }
1209 - pts_name = ptsname(pty_fd);
1210 - if (pts_name == NULL) {
1211 - mpsslog("can't get pts name\n");
1212 - goto _close_pty;
1213 - }
1214 - printf("%s console message goes to %s\n", mic->name, pts_name);
1215 - mpsslog("%s console message goes to %s\n", mic->name, pts_name);
1216 - err = grantpt(pty_fd);
1217 - if (err < 0) {
1218 - mpsslog("can't grant access: %s %s\n",
1219 - pts_name, strerror(errno));
1220 - goto _close_pty;
1221 - }
1222 - err = unlockpt(pty_fd);
1223 - if (err < 0) {
1224 - mpsslog("can't unlock a pseudoterminal: %s %s\n",
1225 - pts_name, strerror(errno));
1226 - goto _close_pty;
1227 - }
1228 - console_poll[MONITOR_FD].fd = pty_fd;
1229 - console_poll[MONITOR_FD].events = POLLIN;
1230 -
1231 - console_poll[VIRTIO_CONSOLE_FD].fd = mic->mic_console.virtio_console_fd;
1232 - console_poll[VIRTIO_CONSOLE_FD].events = POLLIN;
1233 -
1234 - if (MAP_FAILED == init_vr(mic, mic->mic_console.virtio_console_fd,
1235 - VIRTIO_ID_CONSOLE, &tx_vr, &rx_vr,
1236 - virtcons_dev_page.dd.num_vq)) {
1237 - mpsslog("%s init_vr failed %s\n",
1238 - mic->name, strerror(errno));
1239 - goto _close_pty;
1240 - }
1241 -
1242 - copy.iovcnt = 1;
1243 - desc = get_device_desc(mic, VIRTIO_ID_CONSOLE);
1244 -
1245 - for (;;) {
1246 - console_poll[MONITOR_FD].revents = 0;
1247 - console_poll[VIRTIO_CONSOLE_FD].revents = 0;
1248 - err = poll(console_poll, MAX_CONSOLE_FD, -1);
1249 - if (err < 0) {
1250 - mpsslog("%s %d: poll failed: %s\n", __func__, __LINE__,
1251 - strerror(errno));
1252 - continue;
1253 - }
1254 - if (!(desc->status & VIRTIO_CONFIG_S_DRIVER_OK)) {
1255 - err = wait_for_card_driver(mic,
1256 - mic->mic_console.virtio_console_fd,
1257 - VIRTIO_ID_CONSOLE);
1258 - if (err) {
1259 - mpsslog("%s %s %d Exiting...\n",
1260 - mic->name, __func__, __LINE__);
1261 - break;
1262 - }
1263 - }
1264 -
1265 - if (console_poll[MONITOR_FD].revents & POLLIN) {
1266 - copy.iov = iov0;
1267 - len = readv(pty_fd, copy.iov, copy.iovcnt);
1268 - if (len > 0) {
1269 -#ifdef DEBUG
1270 - disp_iovec(mic, copy, __func__, __LINE__);
1271 - mpsslog("%s %s %d read from tap 0x%lx\n",
1272 - mic->name, __func__, __LINE__,
1273 - len);
1274 -#endif
1275 - spin_for_descriptors(mic, &tx_vr);
1276 - txrx_prepare(VIRTIO_ID_CONSOLE, 1, &tx_vr,
1277 - &copy, len);
1278 -
1279 - err = mic_virtio_copy(mic,
1280 - mic->mic_console.virtio_console_fd,
1281 - &tx_vr, &copy);
1282 - if (err < 0) {
1283 - mpsslog("%s %s %d mic_virtio_copy %s\n",
1284 - mic->name, __func__, __LINE__,
1285 - strerror(errno));
1286 - }
1287 - if (!err)
1288 - verify_out_len(mic, &copy);
1289 -#ifdef DEBUG
1290 - disp_iovec(mic, copy, __func__, __LINE__);
1291 - mpsslog("%s %s %d wrote to net 0x%lx\n",
1292 - mic->name, __func__, __LINE__,
1293 - sum_iovec_len(copy));
1294 -#endif
1295 - /* Reinitialize IOV for next run */
1296 - iov0->iov_len = PAGE_SIZE;
1297 - } else if (len < 0) {
1298 - disp_iovec(mic, &copy, __func__, __LINE__);
1299 - mpsslog("%s %s %d read failed %s ",
1300 - mic->name, __func__, __LINE__,
1301 - strerror(errno));
1302 - mpsslog("cnt %d sum %zd\n",
1303 - copy.iovcnt, sum_iovec_len(&copy));
1304 - }
1305 - }
1306 -
1307 - if (console_poll[VIRTIO_CONSOLE_FD].revents & POLLIN) {
1308 - while (rx_vr.info->avail_idx !=
1309 - le16toh(rx_vr.vr.avail->idx)) {
1310 - copy.iov = iov1;
1311 - txrx_prepare(VIRTIO_ID_CONSOLE, 0, &rx_vr,
1312 - &copy, PAGE_SIZE);
1313 -
1314 - err = mic_virtio_copy(mic,
1315 - mic->mic_console.virtio_console_fd,
1316 - &rx_vr, &copy);
1317 - if (!err) {
1318 - /* Set the correct output iov_len */
1319 - iov1->iov_len = copy.out_len;
1320 - verify_out_len(mic, &copy);
1321 -#ifdef DEBUG
1322 - disp_iovec(mic, copy, __func__,
1323 - __LINE__);
1324 - mpsslog("%s %s %d ",
1325 - mic->name, __func__, __LINE__);
1326 - mpsslog("read from net 0x%lx\n",
1327 - sum_iovec_len(copy));
1328 -#endif
1329 - len = writev(pty_fd,
1330 - copy.iov, copy.iovcnt);
1331 - if (len != sum_iovec_len(&copy)) {
1332 - mpsslog("Tun write failed %s ",
1333 - strerror(errno));
1334 - mpsslog("len 0x%zx ", len);
1335 - mpsslog("read_len 0x%zx\n",
1336 - sum_iovec_len(&copy));
1337 - } else {
1338 -#ifdef DEBUG
1339 - disp_iovec(mic, copy, __func__,
1340 - __LINE__);
1341 - mpsslog("%s %s %d ",
1342 - mic->name, __func__,
1343 - __LINE__);
1344 - mpsslog("wrote to tap 0x%lx\n",
1345 - len);
1346 -#endif
1347 - }
1348 - } else {
1349 - mpsslog("%s %s %d mic_virtio_copy %s\n",
1350 - mic->name, __func__, __LINE__,
1351 - strerror(errno));
1352 - break;
1353 - }
1354 - }
1355 - }
1356 - if (console_poll[NET_FD_VIRTIO_NET].revents & POLLERR)
1357 - mpsslog("%s: %s: POLLERR\n", __func__, mic->name);
1358 - }
1359 -_close_pty:
1360 - close(pty_fd);
1361 -_return:
1362 - pthread_exit(NULL);
1363 -}
1364 -
1365 -static void
1366 -add_virtio_device(struct mic_info *mic, struct mic_device_desc *dd)
1367 -{
1368 - char path[PATH_MAX];
1369 - int fd, err;
1370 -
1371 - snprintf(path, PATH_MAX, "/dev/mic%d", mic->id);
1372 - fd = open(path, O_RDWR);
1373 - if (fd < 0) {
1374 - mpsslog("Could not open %s %s\n", path, strerror(errno));
1375 - return;
1376 - }
1377 -
1378 - err = ioctl(fd, MIC_VIRTIO_ADD_DEVICE, dd);
1379 - if (err < 0) {
1380 - mpsslog("Could not add %d %s\n", dd->type, strerror(errno));
1381 - close(fd);
1382 - return;
1383 - }
1384 - switch (dd->type) {
1385 - case VIRTIO_ID_NET:
1386 - mic->mic_net.virtio_net_fd = fd;
1387 - mpsslog("Added VIRTIO_ID_NET for %s\n", mic->name);
1388 - break;
1389 - case VIRTIO_ID_CONSOLE:
1390 - mic->mic_console.virtio_console_fd = fd;
1391 - mpsslog("Added VIRTIO_ID_CONSOLE for %s\n", mic->name);
1392 - break;
1393 - case VIRTIO_ID_BLOCK:
1394 - mic->mic_virtblk.virtio_block_fd = fd;
1395 - mpsslog("Added VIRTIO_ID_BLOCK for %s\n", mic->name);
1396 - break;
1397 - }
1398 -}
1399 -
1400 -static bool
1401 -set_backend_file(struct mic_info *mic)
1402 -{
1403 - FILE *config;
1404 - char buff[PATH_MAX], *line, *evv, *p;
1405 -
1406 - snprintf(buff, PATH_MAX, "%s/mpssd%03d.conf", mic_config_dir, mic->id);
1407 - config = fopen(buff, "r");
1408 - if (config == NULL)
1409 - return false;
1410 - do { /* look for "virtblk_backend=XXXX" */
1411 - line = fgets(buff, PATH_MAX, config);
1412 - if (line == NULL)
1413 - break;
1414 - if (*line == '#')
1415 - continue;
1416 - p = strchr(line, '\n');
1417 - if (p)
1418 - *p = '\0';
1419 - } while (strncmp(line, virtblk_backend, strlen(virtblk_backend)) != 0);
1420 - fclose(config);
1421 - if (line == NULL)
1422 - return false;
1423 - evv = strchr(line, '=');
1424 - if (evv == NULL)
1425 - return false;
1426 - mic->mic_virtblk.backend_file = malloc(strlen(evv) + 1);
1427 - if (mic->mic_virtblk.backend_file == NULL) {
1428 - mpsslog("%s %d can't allocate memory\n", mic->name, mic->id);
1429 - return false;
1430 - }
1431 - strcpy(mic->mic_virtblk.backend_file, evv + 1);
1432 - return true;
1433 -}
1434 -
1435 -#define SECTOR_SIZE 512
1436 -static bool
1437 -set_backend_size(struct mic_info *mic)
1438 -{
1439 - mic->mic_virtblk.backend_size = lseek(mic->mic_virtblk.backend, 0,
1440 - SEEK_END);
1441 - if (mic->mic_virtblk.backend_size < 0) {
1442 - mpsslog("%s: can't seek: %s\n",
1443 - mic->name, mic->mic_virtblk.backend_file);
1444 - return false;
1445 - }
1446 - virtblk_dev_page.blk_config.capacity =
1447 - mic->mic_virtblk.backend_size / SECTOR_SIZE;
1448 - if ((mic->mic_virtblk.backend_size % SECTOR_SIZE) != 0)
1449 - virtblk_dev_page.blk_config.capacity++;
1450 -
1451 - virtblk_dev_page.blk_config.capacity =
1452 - htole64(virtblk_dev_page.blk_config.capacity);
1453 -
1454 - return true;
1455 -}
1456 -
1457 -static bool
1458 -open_backend(struct mic_info *mic)
1459 -{
1460 - if (!set_backend_file(mic))
1461 - goto _error_exit;
1462 - mic->mic_virtblk.backend = open(mic->mic_virtblk.backend_file, O_RDWR);
1463 - if (mic->mic_virtblk.backend < 0) {
1464 - mpsslog("%s: can't open: %s\n", mic->name,
1465 - mic->mic_virtblk.backend_file);
1466 - goto _error_free;
1467 - }
1468 - if (!set_backend_size(mic))
1469 - goto _error_close;
1470 - mic->mic_virtblk.backend_addr = mmap(NULL,
1471 - mic->mic_virtblk.backend_size,
1472 - PROT_READ|PROT_WRITE, MAP_SHARED,
1473 - mic->mic_virtblk.backend, 0L);
1474 - if (mic->mic_virtblk.backend_addr == MAP_FAILED) {
1475 - mpsslog("%s: can't map: %s %s\n",
1476 - mic->name, mic->mic_virtblk.backend_file,
1477 - strerror(errno));
1478 - goto _error_close;
1479 - }
1480 - return true;
1481 -
1482 - _error_close:
1483 - close(mic->mic_virtblk.backend);
1484 - _error_free:
1485 - free(mic->mic_virtblk.backend_file);
1486 - _error_exit:
1487 - return false;
1488 -}
1489 -
1490 -static void
1491 -close_backend(struct mic_info *mic)
1492 -{
1493 - munmap(mic->mic_virtblk.backend_addr, mic->mic_virtblk.backend_size);
1494 - close(mic->mic_virtblk.backend);
1495 - free(mic->mic_virtblk.backend_file);
1496 -}
1497 -
1498 -static bool
1499 -start_virtblk(struct mic_info *mic, struct mic_vring *vring)
1500 -{
1501 - if (((unsigned long)&virtblk_dev_page.blk_config % 8) != 0) {
1502 - mpsslog("%s: blk_config is not 8 byte aligned.\n",
1503 - mic->name);
1504 - return false;
1505 - }
1506 - add_virtio_device(mic, &virtblk_dev_page.dd);
1507 - if (MAP_FAILED == init_vr(mic, mic->mic_virtblk.virtio_block_fd,
1508 - VIRTIO_ID_BLOCK, vring, NULL,
1509 - virtblk_dev_page.dd.num_vq)) {
1510 - mpsslog("%s init_vr failed %s\n",
1511 - mic->name, strerror(errno));
1512 - return false;
1513 - }
1514 - return true;
1515 -}
1516 -
1517 -static void
1518 -stop_virtblk(struct mic_info *mic)
1519 -{
1520 - int vr_size, ret;
1521 -
1522 - vr_size = PAGE_ALIGN(_vring_size(MIC_VRING_ENTRIES,
1523 - MIC_VIRTIO_RING_ALIGN) +
1524 - sizeof(struct _mic_vring_info));
1525 - ret = munmap(mic->mic_virtblk.block_dp,
1526 - MIC_DEVICE_PAGE_END + vr_size * virtblk_dev_page.dd.num_vq);
1527 - if (ret < 0)
1528 - mpsslog("%s munmap errno %d\n", mic->name, errno);
1529 - close(mic->mic_virtblk.virtio_block_fd);
1530 -}
1531 -
1532 -static __u8
1533 -header_error_check(struct vring_desc *desc)
1534 -{
1535 - if (le32toh(desc->len) != sizeof(struct virtio_blk_outhdr)) {
1536 - mpsslog("%s() %d: length is not sizeof(virtio_blk_outhd)\n",
1537 - __func__, __LINE__);
1538 - return -EIO;
1539 - }
1540 - if (!(le16toh(desc->flags) & VRING_DESC_F_NEXT)) {
1541 - mpsslog("%s() %d: alone\n",
1542 - __func__, __LINE__);
1543 - return -EIO;
1544 - }
1545 - if (le16toh(desc->flags) & VRING_DESC_F_WRITE) {
1546 - mpsslog("%s() %d: not read\n",
1547 - __func__, __LINE__);
1548 - return -EIO;
1549 - }
1550 - return 0;
1551 -}
1552 -
1553 -static int
1554 -read_header(int fd, struct virtio_blk_outhdr *hdr, __u32 desc_idx)
1555 -{
1556 - struct iovec iovec;
1557 - struct mic_copy_desc copy;
1558 -
1559 - iovec.iov_len = sizeof(*hdr);
1560 - iovec.iov_base = hdr;
1561 - copy.iov = &iovec;
1562 - copy.iovcnt = 1;
1563 - copy.vr_idx = 0; /* only one vring on virtio_block */
1564 - copy.update_used = false; /* do not update used index */
1565 - return ioctl(fd, MIC_VIRTIO_COPY_DESC, &copy);
1566 -}
1567 -
1568 -static int
1569 -transfer_blocks(int fd, struct iovec *iovec, __u32 iovcnt)
1570 -{
1571 - struct mic_copy_desc copy;
1572 -
1573 - copy.iov = iovec;
1574 - copy.iovcnt = iovcnt;
1575 - copy.vr_idx = 0; /* only one vring on virtio_block */
1576 - copy.update_used = false; /* do not update used index */
1577 - return ioctl(fd, MIC_VIRTIO_COPY_DESC, &copy);
1578 -}
1579 -
1580 -static __u8
1581 -status_error_check(struct vring_desc *desc)
1582 -{
1583 - if (le32toh(desc->len) != sizeof(__u8)) {
1584 - mpsslog("%s() %d: length is not sizeof(status)\n",
1585 - __func__, __LINE__);
1586 - return -EIO;
1587 - }
1588 - return 0;
1589 -}
1590 -
1591 -static int
1592 -write_status(int fd, __u8 *status)
1593 -{
1594 - struct iovec iovec;
1595 - struct mic_copy_desc copy;
1596 -
1597 - iovec.iov_base = status;
1598 - iovec.iov_len = sizeof(*status);
1599 - copy.iov = &iovec;
1600 - copy.iovcnt = 1;
1601 - copy.vr_idx = 0; /* only one vring on virtio_block */
1602 - copy.update_used = true; /* Update used index */
1603 - return ioctl(fd, MIC_VIRTIO_COPY_DESC, &copy);
1604 -}
1605 -
1606 -#ifndef VIRTIO_BLK_T_GET_ID
1607 -#define VIRTIO_BLK_T_GET_ID 8
1608 -#endif
1609 -
1610 -static void *
1611 -virtio_block(void *arg)
1612 -{
1613 - struct mic_info *mic = (struct mic_info *)arg;
1614 - int ret;
1615 - struct pollfd block_poll;
1616 - struct mic_vring vring;
1617 - __u16 avail_idx;
1618 - __u32 desc_idx;
1619 - struct vring_desc *desc;
1620 - struct iovec *iovec, *piov;
1621 - __u8 status;
1622 - __u32 buffer_desc_idx;
1623 - struct virtio_blk_outhdr hdr;
1624 - void *fos;
1625 -
1626 - for (;;) { /* forever */
1627 - if (!open_backend(mic)) { /* No virtblk */
1628 - for (mic->mic_virtblk.signaled = 0;
1629 - !mic->mic_virtblk.signaled;)
1630 - sleep(1);
1631 - continue;
1632 - }
1633 -
1634 - /* backend file is specified. */
1635 - if (!start_virtblk(mic, &vring))
1636 - goto _close_backend;
1637 - iovec = malloc(sizeof(*iovec) *
1638 - le32toh(virtblk_dev_page.blk_config.seg_max));
1639 - if (!iovec) {
1640 - mpsslog("%s: can't alloc iovec: %s\n",
1641 - mic->name, strerror(ENOMEM));
1642 - goto _stop_virtblk;
1643 - }
1644 -
1645 - block_poll.fd = mic->mic_virtblk.virtio_block_fd;
1646 - block_poll.events = POLLIN;
1647 - for (mic->mic_virtblk.signaled = 0;
1648 - !mic->mic_virtblk.signaled;) {
1649 - block_poll.revents = 0;
1650 - /* timeout in 1 sec to see signaled */
1651 - ret = poll(&block_poll, 1, 1000);
1652 - if (ret < 0) {
1653 - mpsslog("%s %d: poll failed: %s\n",
1654 - __func__, __LINE__,
1655 - strerror(errno));
1656 - continue;
1657 - }
1658 -
1659 - if (!(block_poll.revents & POLLIN)) {
1660 -#ifdef DEBUG
1661 - mpsslog("%s %d: block_poll.revents=0x%x\n",
1662 - __func__, __LINE__, block_poll.revents);
1663 -#endif
1664 - continue;
1665 - }
1666 -
1667 - /* POLLIN */
1668 - while (vring.info->avail_idx !=
1669 - le16toh(vring.vr.avail->idx)) {
1670 - /* read header element */
1671 - avail_idx =
1672 - vring.info->avail_idx &
1673 - (vring.vr.num - 1);
1674 - desc_idx = le16toh(
1675 - vring.vr.avail->ring[avail_idx]);
1676 - desc = &vring.vr.desc[desc_idx];
1677 -#ifdef DEBUG
1678 - mpsslog("%s() %d: avail_idx=%d ",
1679 - __func__, __LINE__,
1680 - vring.info->avail_idx);
1681 - mpsslog("vring.vr.num=%d desc=%p\n",
1682 - vring.vr.num, desc);
1683 -#endif
1684 - status = header_error_check(desc);
1685 - ret = read_header(
1686 - mic->mic_virtblk.virtio_block_fd,
1687 - &hdr, desc_idx);
1688 - if (ret < 0) {
1689 - mpsslog("%s() %d %s: ret=%d %s\n",
1690 - __func__, __LINE__,
1691 - mic->name, ret,
1692 - strerror(errno));
1693 - break;
1694 - }
1695 - /* buffer element */
1696 - piov = iovec;
1697 - status = 0;
1698 - fos = mic->mic_virtblk.backend_addr +
1699 - (hdr.sector * SECTOR_SIZE);
1700 - buffer_desc_idx = next_desc(desc);
1701 - desc_idx = buffer_desc_idx;
1702 - for (desc = &vring.vr.desc[buffer_desc_idx];
1703 - desc->flags & VRING_DESC_F_NEXT;
1704 - desc_idx = next_desc(desc),
1705 - desc = &vring.vr.desc[desc_idx]) {
1706 - piov->iov_len = desc->len;
1707 - piov->iov_base = fos;
1708 - piov++;
1709 - fos += desc->len;
1710 - }
1711 - /* Returning NULLs for VIRTIO_BLK_T_GET_ID. */
1712 - if (hdr.type & ~(VIRTIO_BLK_T_OUT |
1713 - VIRTIO_BLK_T_GET_ID)) {
1714 - /*
1715 - VIRTIO_BLK_T_IN - does not do
1716 - anything. Probably for documenting.
1717 - VIRTIO_BLK_T_SCSI_CMD - for
1718 - virtio_scsi.
1719 - VIRTIO_BLK_T_FLUSH - turned off in
1720 - config space.
1721 - VIRTIO_BLK_T_BARRIER - defined but not
1722 - used in anywhere.
1723 - */
1724 - mpsslog("%s() %d: type %x ",
1725 - __func__, __LINE__,
1726 - hdr.type);
1727 - mpsslog("is not supported\n");
1728 - status = -ENOTSUP;
1729 -
1730 - } else {
1731 - ret = transfer_blocks(
1732 - mic->mic_virtblk.virtio_block_fd,
1733 - iovec,
1734 - piov - iovec);
1735 - if (ret < 0 &&
1736 - status != 0)
1737 - status = ret;
1738 - }
1739 - /* write status and update used pointer */
1740 - if (status != 0)
1741 - status = status_error_check(desc);
1742 - ret = write_status(
1743 - mic->mic_virtblk.virtio_block_fd,
1744 - &status);
1745 -#ifdef DEBUG
1746 - mpsslog("%s() %d: write status=%d on desc=%p\n",
1747 - __func__, __LINE__,
1748 - status, desc);
1749 -#endif
1750 - }
1751 - }
1752 - free(iovec);
1753 -_stop_virtblk:
1754 - stop_virtblk(mic);
1755 -_close_backend:
1756 - close_backend(mic);
1757 - } /* forever */
1758 -
1759 - pthread_exit(NULL);
1760 -}
1761 -
1762 -static void
1763 -reset(struct mic_info *mic)
1764 -{
1765 -#define RESET_TIMEOUT 120
1766 - int i = RESET_TIMEOUT;
1767 - setsysfs(mic->name, "state", "reset");
1768 - while (i) {
1769 - char *state;
1770 - state = readsysfs(mic->name, "state");
1771 - if (!state)
1772 - goto retry;
1773 - mpsslog("%s: %s %d state %s\n",
1774 - mic->name, __func__, __LINE__, state);
1775 -
1776 - if (!strcmp(state, "ready")) {
1777 - free(state);
1778 - break;
1779 - }
1780 - free(state);
1781 -retry:
1782 - sleep(1);
1783 - i--;
1784 - }
1785 -}
1786 -
1787 -static int
1788 -get_mic_shutdown_status(struct mic_info *mic, char *shutdown_status)
1789 -{
1790 - if (!strcmp(shutdown_status, "nop"))
1791 - return MIC_NOP;
1792 - if (!strcmp(shutdown_status, "crashed"))
1793 - return MIC_CRASHED;
1794 - if (!strcmp(shutdown_status, "halted"))
1795 - return MIC_HALTED;
1796 - if (!strcmp(shutdown_status, "poweroff"))
1797 - return MIC_POWER_OFF;
1798 - if (!strcmp(shutdown_status, "restart"))
1799 - return MIC_RESTART;
1800 - mpsslog("%s: BUG invalid status %s\n", mic->name, shutdown_status);
1801 - /* Invalid state */
1802 - assert(0);
1803 -};
1804 -
1805 -static int get_mic_state(struct mic_info *mic)
1806 -{
1807 - char *state = NULL;
1808 - enum mic_states mic_state;
1809 -
1810 - while (!state) {
1811 - state = readsysfs(mic->name, "state");
1812 - sleep(1);
1813 - }
1814 - mpsslog("%s: %s %d state %s\n",
1815 - mic->name, __func__, __LINE__, state);
1816 -
1817 - if (!strcmp(state, "ready")) {
1818 - mic_state = MIC_READY;
1819 - } else if (!strcmp(state, "booting")) {
1820 - mic_state = MIC_BOOTING;
1821 - } else if (!strcmp(state, "online")) {
1822 - mic_state = MIC_ONLINE;
1823 - } else if (!strcmp(state, "shutting_down")) {
1824 - mic_state = MIC_SHUTTING_DOWN;
1825 - } else if (!strcmp(state, "reset_failed")) {
1826 - mic_state = MIC_RESET_FAILED;
1827 - } else if (!strcmp(state, "resetting")) {
1828 - mic_state = MIC_RESETTING;
1829 - } else {
1830 - mpsslog("%s: BUG invalid state %s\n", mic->name, state);
1831 - assert(0);
1832 - }
1833 -
1834 - free(state);
1835 - return mic_state;
1836 -};
1837 -
1838 -static void mic_handle_shutdown(struct mic_info *mic)
1839 -{
1840 -#define SHUTDOWN_TIMEOUT 60
1841 - int i = SHUTDOWN_TIMEOUT;
1842 - char *shutdown_status;
1843 - while (i) {
1844 - shutdown_status = readsysfs(mic->name, "shutdown_status");
1845 - if (!shutdown_status) {
1846 - sleep(1);
1847 - continue;
1848 - }
1849 - mpsslog("%s: %s %d shutdown_status %s\n",
1850 - mic->name, __func__, __LINE__, shutdown_status);
1851 - switch (get_mic_shutdown_status(mic, shutdown_status)) {
1852 - case MIC_RESTART:
1853 - mic->restart = 1;
1854 - case MIC_HALTED:
1855 - case MIC_POWER_OFF:
1856 - case MIC_CRASHED:
1857 - free(shutdown_status);
1858 - goto reset;
1859 - default:
1860 - break;
1861 - }
1862 - free(shutdown_status);
1863 - sleep(1);
1864 - i--;
1865 - }
1866 -reset:
1867 - if (!i)
1868 - mpsslog("%s: %s %d timing out waiting for shutdown_status %s\n",
1869 - mic->name, __func__, __LINE__, shutdown_status);
1870 - reset(mic);
1871 -}
1872 -
1873 -static int open_state_fd(struct mic_info *mic)
1874 -{
1875 - char pathname[PATH_MAX];
1876 - int fd;
1877 -
1878 - snprintf(pathname, PATH_MAX - 1, "%s/%s/%s",
1879 - MICSYSFSDIR, mic->name, "state");
1880 -
1881 - fd = open(pathname, O_RDONLY);
1882 - if (fd < 0)
1883 - mpsslog("%s: opening file %s failed %s\n",
1884 - mic->name, pathname, strerror(errno));
1885 - return fd;
1886 -}
1887 -
1888 -static int block_till_state_change(int fd, struct mic_info *mic)
1889 -{
1890 - struct pollfd ufds[1];
1891 - char value[PAGE_SIZE];
1892 - int ret;
1893 -
1894 - ufds[0].fd = fd;
1895 - ufds[0].events = POLLERR | POLLPRI;
1896 - ret = poll(ufds, 1, -1);
1897 - if (ret < 0) {
1898 - mpsslog("%s: %s %d poll failed %s\n",
1899 - mic->name, __func__, __LINE__, strerror(errno));
1900 - return ret;
1901 - }
1902 -
1903 - ret = lseek(fd, 0, SEEK_SET);
1904 - if (ret < 0) {
1905 - mpsslog("%s: %s %d Failed to seek to 0: %s\n",
1906 - mic->name, __func__, __LINE__, strerror(errno));
1907 - return ret;
1908 - }
1909 -
1910 - ret = read(fd, value, sizeof(value));
1911 - if (ret < 0) {
1912 - mpsslog("%s: %s %d Failed to read sysfs entry: %s\n",
1913 - mic->name, __func__, __LINE__, strerror(errno));
1914 - return ret;
1915 - }
1916 -
1917 - return 0;
1918 -}
1919 -
1920 -static void *
1921 -mic_config(void *arg)
1922 -{
1923 - struct mic_info *mic = (struct mic_info *)arg;
1924 - int fd, ret, stat = 0;
1925 -
1926 - fd = open_state_fd(mic);
1927 - if (fd < 0) {
1928 - mpsslog("%s: %s %d open state fd failed %s\n",
1929 - mic->name, __func__, __LINE__, strerror(errno));
1930 - goto exit;
1931 - }
1932 -
1933 - do {
1934 - ret = block_till_state_change(fd, mic);
1935 - if (ret < 0) {
1936 - mpsslog("%s: %s %d block_till_state_change error %s\n",
1937 - mic->name, __func__, __LINE__, strerror(errno));
1938 - goto close_exit;
1939 - }
1940 -
1941 - switch (get_mic_state(mic)) {
1942 - case MIC_SHUTTING_DOWN:
1943 - mic_handle_shutdown(mic);
1944 - break;
1945 - case MIC_READY:
1946 - case MIC_RESET_FAILED:
1947 - ret = kill(mic->pid, SIGTERM);
1948 - mpsslog("%s: %s %d kill pid %d ret %d\n",
1949 - mic->name, __func__, __LINE__,
1950 - mic->pid, ret);
1951 - if (!ret) {
1952 - ret = waitpid(mic->pid, &stat,
1953 - WIFSIGNALED(stat));
1954 - mpsslog("%s: %s %d waitpid ret %d pid %d\n",
1955 - mic->name, __func__, __LINE__,
1956 - ret, mic->pid);
1957 - }
1958 - if (mic->boot_on_resume) {
1959 - setsysfs(mic->name, "state", "boot");
1960 - mic->boot_on_resume = 0;
1961 - }
1962 - goto close_exit;
1963 - default:
1964 - break;
1965 - }
1966 - } while (1);
1967 -
1968 -close_exit:
1969 - close(fd);
1970 -exit:
1971 - init_mic(mic);
1972 - pthread_exit(NULL);
1973 -}
1974 -
1975 -static void
1976 -set_cmdline(struct mic_info *mic)
1977 -{
1978 - char buffer[PATH_MAX];
1979 - int len;
1980 -
1981 - len = snprintf(buffer, PATH_MAX,
1982 - "clocksource=tsc highres=off nohz=off ");
1983 - len += snprintf(buffer + len, PATH_MAX - len,
1984 - "cpufreq_on;corec6_off;pc3_off;pc6_off ");
1985 - len += snprintf(buffer + len, PATH_MAX - len,
1986 - "ifcfg=static;address,172.31.%d.1;netmask,255.255.255.0",
1987 - mic->id + 1);
1988 -
1989 - setsysfs(mic->name, "cmdline", buffer);
1990 - mpsslog("%s: Command line: \"%s\"\n", mic->name, buffer);
1991 - snprintf(buffer, PATH_MAX, "172.31.%d.1", mic->id + 1);
1992 - mpsslog("%s: IPADDR: \"%s\"\n", mic->name, buffer);
1993 -}
1994 -
1995 -static void
1996 -set_log_buf_info(struct mic_info *mic)
1997 -{
1998 - int fd;
1999 - off_t len;
2000 - char system_map[] = "/lib/firmware/mic/System.map";
2001 - char *map, *temp, log_buf[17] = {'\0'};
2002 -
2003 - fd = open(system_map, O_RDONLY);
2004 - if (fd < 0) {
2005 - mpsslog("%s: Opening System.map failed: %d\n",
2006 - mic->name, errno);
2007 - return;
2008 - }
2009 - len = lseek(fd, 0, SEEK_END);
2010 - if (len < 0) {
2011 - mpsslog("%s: Reading System.map size failed: %d\n",
2012 - mic->name, errno);
2013 - close(fd);
2014 - return;
2015 - }
2016 - map = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
2017 - if (map == MAP_FAILED) {
2018 - mpsslog("%s: mmap of System.map failed: %d\n",
2019 - mic->name, errno);
2020 - close(fd);
2021 - return;
2022 - }
2023 - temp = strstr(map, "__log_buf");
2024 - if (!temp) {
2025 - mpsslog("%s: __log_buf not found: %d\n", mic->name, errno);
2026 - munmap(map, len);
2027 - close(fd);
2028 - return;
2029 - }
2030 - strncpy(log_buf, temp - 19, 16);
2031 - setsysfs(mic->name, "log_buf_addr", log_buf);
2032 - mpsslog("%s: log_buf_addr: %s\n", mic->name, log_buf);
2033 - temp = strstr(map, "log_buf_len");
2034 - if (!temp) {
2035 - mpsslog("%s: log_buf_len not found: %d\n", mic->name, errno);
2036 - munmap(map, len);
2037 - close(fd);
2038 - return;
2039 - }
2040 - strncpy(log_buf, temp - 19, 16);
2041 - setsysfs(mic->name, "log_buf_len", log_buf);
2042 - mpsslog("%s: log_buf_len: %s\n", mic->name, log_buf);
2043 - munmap(map, len);
2044 - close(fd);
2045 -}
2046 -
2047 -static void
2048 -change_virtblk_backend(int x, siginfo_t *siginfo, void *p)
2049 -{
2050 - struct mic_info *mic;
2051 -
2052 - for (mic = mic_list.next; mic != NULL; mic = mic->next)
2053 - mic->mic_virtblk.signaled = 1/* true */;
2054 -}
2055 -
2056 -static void
2057 -set_mic_boot_params(struct mic_info *mic)
2058 -{
2059 - set_log_buf_info(mic);
2060 - set_cmdline(mic);
2061 -}
2062 -
2063 -static void *
2064 -init_mic(void *arg)
2065 -{
2066 - struct mic_info *mic = (struct mic_info *)arg;
2067 - struct sigaction ignore = {
2068 - .sa_flags = 0,
2069 - .sa_handler = SIG_IGN
2070 - };
2071 - struct sigaction act = {
2072 - .sa_flags = SA_SIGINFO,
2073 - .sa_sigaction = change_virtblk_backend,
2074 - };
2075 - char buffer[PATH_MAX];
2076 - int err, fd;
2077 -
2078 - /*
2079 - * Currently, one virtio block device is supported for each MIC card
2080 - * at a time. Any user (or test) can send a SIGUSR1 to the MIC daemon.
2081 - * The signal informs the virtio block backend about a change in the
2082 - * configuration file which specifies the virtio backend file name on
2083 - * the host. Virtio block backend then re-reads the configuration file
2084 - * and switches to the new block device. This signalling mechanism may
2085 - * not be required once multiple virtio block devices are supported by
2086 - * the MIC daemon.
2087 - */
2088 - sigaction(SIGUSR1, &ignore, NULL);
2089 -retry:
2090 - fd = open_state_fd(mic);
2091 - if (fd < 0) {
2092 - mpsslog("%s: %s %d open state fd failed %s\n",
2093 - mic->name, __func__, __LINE__, strerror(errno));
2094 - sleep(2);
2095 - goto retry;
2096 - }
2097 -
2098 - if (mic->restart) {
2099 - snprintf(buffer, PATH_MAX, "boot");
2100 - setsysfs(mic->name, "state", buffer);
2101 - mpsslog("%s restarting mic %d\n",
2102 - mic->name, mic->restart);
2103 - mic->restart = 0;
2104 - }
2105 -
2106 - while (1) {
2107 - while (block_till_state_change(fd, mic)) {
2108 - mpsslog("%s: %s %d block_till_state_change error %s\n",
2109 - mic->name, __func__, __LINE__, strerror(errno));
2110 - sleep(2);
2111 - continue;
2112 - }
2113 -
2114 - if (get_mic_state(mic) == MIC_BOOTING)
2115 - break;
2116 - }
2117 -
2118 - mic->pid = fork();
2119 - switch (mic->pid) {
2120 - case 0:
2121 - add_virtio_device(mic, &virtcons_dev_page.dd);
2122 - add_virtio_device(mic, &virtnet_dev_page.dd);
2123 - err = pthread_create(&mic->mic_console.console_thread, NULL,
2124 - virtio_console, mic);
2125 - if (err)
2126 - mpsslog("%s virtcons pthread_create failed %s\n",
2127 - mic->name, strerror(err));
2128 - err = pthread_create(&mic->mic_net.net_thread, NULL,
2129 - virtio_net, mic);
2130 - if (err)
2131 - mpsslog("%s virtnet pthread_create failed %s\n",
2132 - mic->name, strerror(err));
2133 - err = pthread_create(&mic->mic_virtblk.block_thread, NULL,
2134 - virtio_block, mic);
2135 - if (err)
2136 - mpsslog("%s virtblk pthread_create failed %s\n",
2137 - mic->name, strerror(err));
2138 - sigemptyset(&act.sa_mask);
2139 - err = sigaction(SIGUSR1, &act, NULL);
2140 - if (err)
2141 - mpsslog("%s sigaction SIGUSR1 failed %s\n",
2142 - mic->name, strerror(errno));
2143 - while (1)
2144 - sleep(60);
2145 - case -1:
2146 - mpsslog("fork failed MIC name %s id %d errno %d\n",
2147 - mic->name, mic->id, errno);
2148 - break;
2149 - default:
2150 - err = pthread_create(&mic->config_thread, NULL,
2151 - mic_config, mic);
2152 - if (err)
2153 - mpsslog("%s mic_config pthread_create failed %s\n",
2154 - mic->name, strerror(err));
2155 - }
2156 -
2157 - return NULL;
2158 -}
2159 -
2160 -static void
2161 -start_daemon(void)
2162 -{
2163 - struct mic_info *mic;
2164 - int err;
2165 -
2166 - for (mic = mic_list.next; mic; mic = mic->next) {
2167 - set_mic_boot_params(mic);
2168 - err = pthread_create(&mic->init_thread, NULL, init_mic, mic);
2169 - if (err)
2170 - mpsslog("%s init_mic pthread_create failed %s\n",
2171 - mic->name, strerror(err));
2172 - }
2173 -
2174 - while (1)
2175 - sleep(60);
2176 -}
2177 -
2178 -static int
2179 -init_mic_list(void)
2180 -{
2181 - struct mic_info *mic = &mic_list;
2182 - struct dirent *file;
2183 - DIR *dp;
2184 - int cnt = 0;
2185 -
2186 - dp = opendir(MICSYSFSDIR);
2187 - if (!dp)
2188 - return 0;
2189 -
2190 - while ((file = readdir(dp)) != NULL) {
2191 - if (!strncmp(file->d_name, "mic", 3)) {
2192 - mic->next = calloc(1, sizeof(struct mic_info));
2193 - if (mic->next) {
2194 - mic = mic->next;
2195 - mic->id = atoi(&file->d_name[3]);
2196 - mic->name = malloc(strlen(file->d_name) + 16);
2197 - if (mic->name)
2198 - strcpy(mic->name, file->d_name);
2199 - mpsslog("MIC name %s id %d\n", mic->name,
2200 - mic->id);
2201 - cnt++;
2202 - }
2203 - }
2204 - }
2205 -
2206 - closedir(dp);
2207 - return cnt;
2208 -}
2209 -
2210 -void
2211 -mpsslog(char *format, ...)
2212 -{
2213 - va_list args;
2214 - char buffer[4096];
2215 - char ts[52], *ts1;
2216 - time_t t;
2217 -
2218 - if (logfp == NULL)
2219 - return;
2220 -
2221 - va_start(args, format);
2222 - vsprintf(buffer, format, args);
2223 - va_end(args);
2224 -
2225 - time(&t);
2226 - ts1 = ctime_r(&t, ts);
2227 - ts1[strlen(ts1) - 1] = '\0';
2228 - fprintf(logfp, "%s: %s", ts1, buffer);
2229 -
2230 - fflush(logfp);
2231 -}
2232 -
2233 -int
2234 -main(int argc, char *argv[])
2235 -{
2236 - int cnt;
2237 - pid_t pid;
2238 -
2239 - myname = argv[0];
2240 -
2241 - logfp = fopen(LOGFILE_NAME, "a+");
2242 - if (!logfp) {
2243 - fprintf(stderr, "cannot open logfile '%s'\n", LOGFILE_NAME);
2244 - exit(1);
2245 - }
2246 - pid = fork();
2247 - switch (pid) {
2248 - case 0:
2249 - break;
2250 - case -1:
2251 - exit(2);
2252 - default:
2253 - exit(0);
2254 - }
2255 -
2256 - mpsslog("MIC Daemon start\n");
2257 -
2258 - cnt = init_mic_list();
2259 - if (cnt == 0) {
2260 - mpsslog("MIC module not loaded\n");
2261 - exit(3);
2262 - }
2263 - mpsslog("MIC found %d devices\n", cnt);
2264 -
2265 - start_daemon();
2266 -
2267 - exit(0);
2268 -}
2269 diff --git a/Documentation/mic/mpssd/mpssd.h b/Documentation/mic/mpssd/mpssd.h
2270 deleted file mode 100644
2271 index 8bd64944aacc..000000000000
2272 --- a/Documentation/mic/mpssd/mpssd.h
2273 +++ /dev/null
2274 @@ -1,103 +0,0 @@
2275 -/*
2276 - * Intel MIC Platform Software Stack (MPSS)
2277 - *
2278 - * Copyright(c) 2013 Intel Corporation.
2279 - *
2280 - * This program is free software; you can redistribute it and/or modify
2281 - * it under the terms of the GNU General Public License, version 2, as
2282 - * published by the Free Software Foundation.
2283 - *
2284 - * This program is distributed in the hope that it will be useful, but
2285 - * WITHOUT ANY WARRANTY; without even the implied warranty of
2286 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2287 - * General Public License for more details.
2288 - *
2289 - * The full GNU General Public License is included in this distribution in
2290 - * the file called "COPYING".
2291 - *
2292 - * Intel MIC User Space Tools.
2293 - */
2294 -#ifndef _MPSSD_H_
2295 -#define _MPSSD_H_
2296 -
2297 -#include <stdio.h>
2298 -#include <stdlib.h>
2299 -#include <string.h>
2300 -#include <fcntl.h>
2301 -#include <unistd.h>
2302 -#include <dirent.h>
2303 -#include <libgen.h>
2304 -#include <pthread.h>
2305 -#include <stdarg.h>
2306 -#include <time.h>
2307 -#include <errno.h>
2308 -#include <sys/dir.h>
2309 -#include <sys/ioctl.h>
2310 -#include <sys/poll.h>
2311 -#include <sys/types.h>
2312 -#include <sys/socket.h>
2313 -#include <sys/stat.h>
2314 -#include <sys/types.h>
2315 -#include <sys/mman.h>
2316 -#include <sys/utsname.h>
2317 -#include <sys/wait.h>
2318 -#include <netinet/in.h>
2319 -#include <arpa/inet.h>
2320 -#include <netdb.h>
2321 -#include <pthread.h>
2322 -#include <signal.h>
2323 -#include <limits.h>
2324 -#include <syslog.h>
2325 -#include <getopt.h>
2326 -#include <net/if.h>
2327 -#include <linux/if_tun.h>
2328 -#include <linux/if_tun.h>
2329 -#include <linux/virtio_ids.h>
2330 -
2331 -#define MICSYSFSDIR "/sys/class/mic"
2332 -#define LOGFILE_NAME "/var/log/mpssd"
2333 -#define PAGE_SIZE 4096
2334 -
2335 -struct mic_console_info {
2336 - pthread_t console_thread;
2337 - int virtio_console_fd;
2338 - void *console_dp;
2339 -};
2340 -
2341 -struct mic_net_info {
2342 - pthread_t net_thread;
2343 - int virtio_net_fd;
2344 - int tap_fd;
2345 - void *net_dp;
2346 -};
2347 -
2348 -struct mic_virtblk_info {
2349 - pthread_t block_thread;
2350 - int virtio_block_fd;
2351 - void *block_dp;
2352 - volatile sig_atomic_t signaled;
2353 - char *backend_file;
2354 - int backend;
2355 - void *backend_addr;
2356 - long backend_size;
2357 -};
2358 -
2359 -struct mic_info {
2360 - int id;
2361 - char *name;
2362 - pthread_t config_thread;
2363 - pthread_t init_thread;
2364 - pid_t pid;
2365 - struct mic_console_info mic_console;
2366 - struct mic_net_info mic_net;
2367 - struct mic_virtblk_info mic_virtblk;
2368 - int restart;
2369 - int boot_on_resume;
2370 - struct mic_info *next;
2371 -};
2372 -
2373 -__attribute__((format(printf, 1, 2)))
2374 -void mpsslog(char *format, ...);
2375 -char *readsysfs(char *dir, char *entry);
2376 -int setsysfs(char *dir, char *entry, char *value);
2377 -#endif
2378 diff --git a/Documentation/mic/mpssd/sysfs.c b/Documentation/mic/mpssd/sysfs.c
2379 deleted file mode 100644
2380 index 8dd326936083..000000000000
2381 --- a/Documentation/mic/mpssd/sysfs.c
2382 +++ /dev/null
2383 @@ -1,102 +0,0 @@
2384 -/*
2385 - * Intel MIC Platform Software Stack (MPSS)
2386 - *
2387 - * Copyright(c) 2013 Intel Corporation.
2388 - *
2389 - * This program is free software; you can redistribute it and/or modify
2390 - * it under the terms of the GNU General Public License, version 2, as
2391 - * published by the Free Software Foundation.
2392 - *
2393 - * This program is distributed in the hope that it will be useful, but
2394 - * WITHOUT ANY WARRANTY; without even the implied warranty of
2395 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
2396 - * General Public License for more details.
2397 - *
2398 - * The full GNU General Public License is included in this distribution in
2399 - * the file called "COPYING".
2400 - *
2401 - * Intel MIC User Space Tools.
2402 - */
2403 -
2404 -#include "mpssd.h"
2405 -
2406 -#define PAGE_SIZE 4096
2407 -
2408 -char *
2409 -readsysfs(char *dir, char *entry)
2410 -{
2411 - char filename[PATH_MAX];
2412 - char value[PAGE_SIZE];
2413 - char *string = NULL;
2414 - int fd;
2415 - int len;
2416 -
2417 - if (dir == NULL)
2418 - snprintf(filename, PATH_MAX, "%s/%s", MICSYSFSDIR, entry);
2419 - else
2420 - snprintf(filename, PATH_MAX,
2421 - "%s/%s/%s", MICSYSFSDIR, dir, entry);
2422 -
2423 - fd = open(filename, O_RDONLY);
2424 - if (fd < 0) {
2425 - mpsslog("Failed to open sysfs entry '%s': %s\n",
2426 - filename, strerror(errno));
2427 - return NULL;
2428 - }
2429 -
2430 - len = read(fd, value, sizeof(value));
2431 - if (len < 0) {
2432 - mpsslog("Failed to read sysfs entry '%s': %s\n",
2433 - filename, strerror(errno));
2434 - goto readsys_ret;
2435 - }
2436 - if (len == 0)
2437 - goto readsys_ret;
2438 -
2439 - value[len - 1] = '\0';
2440 -
2441 - string = malloc(strlen(value) + 1);
2442 - if (string)
2443 - strcpy(string, value);
2444 -
2445 -readsys_ret:
2446 - close(fd);
2447 - return string;
2448 -}
2449 -
2450 -int
2451 -setsysfs(char *dir, char *entry, char *value)
2452 -{
2453 - char filename[PATH_MAX];
2454 - char *oldvalue;
2455 - int fd, ret = 0;
2456 -
2457 - if (dir == NULL)
2458 - snprintf(filename, PATH_MAX, "%s/%s", MICSYSFSDIR, entry);
2459 - else
2460 - snprintf(filename, PATH_MAX, "%s/%s/%s",
2461 - MICSYSFSDIR, dir, entry);
2462 -
2463 - oldvalue = readsysfs(dir, entry);
2464 -
2465 - fd = open(filename, O_RDWR);
2466 - if (fd < 0) {
2467 - ret = errno;
2468 - mpsslog("Failed to open sysfs entry '%s': %s\n",
2469 - filename, strerror(errno));
2470 - goto done;
2471 - }
2472 -
2473 - if (!oldvalue || strcmp(value, oldvalue)) {
2474 - if (write(fd, value, strlen(value)) < 0) {
2475 - ret = errno;
2476 - mpsslog("Failed to write new sysfs entry '%s': %s\n",
2477 - filename, strerror(errno));
2478 - }
2479 - }
2480 - close(fd);
2481 -done:
2482 - if (oldvalue)
2483 - free(oldvalue);
2484 - return ret;
2485 -}
2486 diff --git a/Makefile b/Makefile
2487 index 671e183bd507..10aec937e9e4 100644
2488 --- a/Makefile
2489 +++ b/Makefile
2490 @@ -1,6 +1,6 @@
2491 VERSION = 4
2492 PATCHLEVEL = 4
2493 -SUBLEVEL = 52
2494 +SUBLEVEL = 53
2495 EXTRAVERSION =
2496 NAME = Blurry Fish Butt
2497
2498 diff --git a/arch/arm/boot/dts/at91-sama5d2_xplained.dts b/arch/arm/boot/dts/at91-sama5d2_xplained.dts
2499 index e74df327cdd3..20618a897c99 100644
2500 --- a/arch/arm/boot/dts/at91-sama5d2_xplained.dts
2501 +++ b/arch/arm/boot/dts/at91-sama5d2_xplained.dts
2502 @@ -122,6 +122,8 @@
2503 uart1: serial@f8020000 {
2504 pinctrl-names = "default";
2505 pinctrl-0 = <&pinctrl_uart1_default>;
2506 + atmel,use-dma-rx;
2507 + atmel,use-dma-tx;
2508 status = "okay";
2509 };
2510
2511 diff --git a/arch/arm/boot/dts/at91-sama5d4_xplained.dts b/arch/arm/boot/dts/at91-sama5d4_xplained.dts
2512 index da84e65b56ef..e27024cdf48b 100644
2513 --- a/arch/arm/boot/dts/at91-sama5d4_xplained.dts
2514 +++ b/arch/arm/boot/dts/at91-sama5d4_xplained.dts
2515 @@ -110,6 +110,8 @@
2516 };
2517
2518 usart3: serial@fc00c000 {
2519 + atmel,use-dma-rx;
2520 + atmel,use-dma-tx;
2521 status = "okay";
2522 };
2523
2524 diff --git a/arch/arm/include/asm/kvm_mmu.h b/arch/arm/include/asm/kvm_mmu.h
2525 index 405aa1883307..23d5cad56ddc 100644
2526 --- a/arch/arm/include/asm/kvm_mmu.h
2527 +++ b/arch/arm/include/asm/kvm_mmu.h
2528 @@ -204,18 +204,12 @@ static inline void __coherent_cache_guest_page(struct kvm_vcpu *vcpu, pfn_t pfn,
2529 * and iterate over the range.
2530 */
2531
2532 - bool need_flush = !vcpu_has_cache_enabled(vcpu) || ipa_uncached;
2533 -
2534 VM_BUG_ON(size & ~PAGE_MASK);
2535
2536 - if (!need_flush && !icache_is_pipt())
2537 - goto vipt_cache;
2538 -
2539 while (size) {
2540 void *va = kmap_atomic_pfn(pfn);
2541
2542 - if (need_flush)
2543 - kvm_flush_dcache_to_poc(va, PAGE_SIZE);
2544 + kvm_flush_dcache_to_poc(va, PAGE_SIZE);
2545
2546 if (icache_is_pipt())
2547 __cpuc_coherent_user_range((unsigned long)va,
2548 @@ -227,7 +221,6 @@ static inline void __coherent_cache_guest_page(struct kvm_vcpu *vcpu, pfn_t pfn,
2549 kunmap_atomic(va);
2550 }
2551
2552 -vipt_cache:
2553 if (!icache_is_pipt() && !icache_is_vivt_asid_tagged()) {
2554 /* any kind of VIPT cache */
2555 __flush_icache_all();
2556 diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h
2557 index 61505676d085..819b21a9851c 100644
2558 --- a/arch/arm64/include/asm/kvm_mmu.h
2559 +++ b/arch/arm64/include/asm/kvm_mmu.h
2560 @@ -236,8 +236,7 @@ static inline void __coherent_cache_guest_page(struct kvm_vcpu *vcpu, pfn_t pfn,
2561 {
2562 void *va = page_address(pfn_to_page(pfn));
2563
2564 - if (!vcpu_has_cache_enabled(vcpu) || ipa_uncached)
2565 - kvm_flush_dcache_to_poc(va, size);
2566 + kvm_flush_dcache_to_poc(va, size);
2567
2568 if (!icache_is_aliasing()) { /* PIPT */
2569 flush_icache_range((unsigned long)va,
2570 diff --git a/arch/mips/bcm47xx/buttons.c b/arch/mips/bcm47xx/buttons.c
2571 index 52caa75bfe4e..e2f50d690624 100644
2572 --- a/arch/mips/bcm47xx/buttons.c
2573 +++ b/arch/mips/bcm47xx/buttons.c
2574 @@ -17,6 +17,12 @@
2575 .active_low = 1, \
2576 }
2577
2578 +#define BCM47XX_GPIO_KEY_H(_gpio, _code) \
2579 + { \
2580 + .code = _code, \
2581 + .gpio = _gpio, \
2582 + }
2583 +
2584 /* Asus */
2585
2586 static const struct gpio_keys_button
2587 @@ -79,8 +85,8 @@ bcm47xx_buttons_asus_wl500gpv2[] __initconst = {
2588
2589 static const struct gpio_keys_button
2590 bcm47xx_buttons_asus_wl500w[] __initconst = {
2591 - BCM47XX_GPIO_KEY(6, KEY_RESTART),
2592 - BCM47XX_GPIO_KEY(7, KEY_WPS_BUTTON),
2593 + BCM47XX_GPIO_KEY_H(6, KEY_RESTART),
2594 + BCM47XX_GPIO_KEY_H(7, KEY_WPS_BUTTON),
2595 };
2596
2597 static const struct gpio_keys_button
2598 diff --git a/arch/mips/cavium-octeon/octeon-memcpy.S b/arch/mips/cavium-octeon/octeon-memcpy.S
2599 index 64e08df51d65..8b7004132491 100644
2600 --- a/arch/mips/cavium-octeon/octeon-memcpy.S
2601 +++ b/arch/mips/cavium-octeon/octeon-memcpy.S
2602 @@ -208,18 +208,18 @@ EXC( STORE t2, UNIT(6)(dst), s_exc_p10u)
2603 ADD src, src, 16*NBYTES
2604 EXC( STORE t3, UNIT(7)(dst), s_exc_p9u)
2605 ADD dst, dst, 16*NBYTES
2606 -EXC( LOAD t0, UNIT(-8)(src), l_exc_copy)
2607 -EXC( LOAD t1, UNIT(-7)(src), l_exc_copy)
2608 -EXC( LOAD t2, UNIT(-6)(src), l_exc_copy)
2609 -EXC( LOAD t3, UNIT(-5)(src), l_exc_copy)
2610 +EXC( LOAD t0, UNIT(-8)(src), l_exc_copy_rewind16)
2611 +EXC( LOAD t1, UNIT(-7)(src), l_exc_copy_rewind16)
2612 +EXC( LOAD t2, UNIT(-6)(src), l_exc_copy_rewind16)
2613 +EXC( LOAD t3, UNIT(-5)(src), l_exc_copy_rewind16)
2614 EXC( STORE t0, UNIT(-8)(dst), s_exc_p8u)
2615 EXC( STORE t1, UNIT(-7)(dst), s_exc_p7u)
2616 EXC( STORE t2, UNIT(-6)(dst), s_exc_p6u)
2617 EXC( STORE t3, UNIT(-5)(dst), s_exc_p5u)
2618 -EXC( LOAD t0, UNIT(-4)(src), l_exc_copy)
2619 -EXC( LOAD t1, UNIT(-3)(src), l_exc_copy)
2620 -EXC( LOAD t2, UNIT(-2)(src), l_exc_copy)
2621 -EXC( LOAD t3, UNIT(-1)(src), l_exc_copy)
2622 +EXC( LOAD t0, UNIT(-4)(src), l_exc_copy_rewind16)
2623 +EXC( LOAD t1, UNIT(-3)(src), l_exc_copy_rewind16)
2624 +EXC( LOAD t2, UNIT(-2)(src), l_exc_copy_rewind16)
2625 +EXC( LOAD t3, UNIT(-1)(src), l_exc_copy_rewind16)
2626 EXC( STORE t0, UNIT(-4)(dst), s_exc_p4u)
2627 EXC( STORE t1, UNIT(-3)(dst), s_exc_p3u)
2628 EXC( STORE t2, UNIT(-2)(dst), s_exc_p2u)
2629 @@ -383,6 +383,10 @@ done:
2630 nop
2631 END(memcpy)
2632
2633 +l_exc_copy_rewind16:
2634 + /* Rewind src and dst by 16*NBYTES for l_exc_copy */
2635 + SUB src, src, 16*NBYTES
2636 + SUB dst, dst, 16*NBYTES
2637 l_exc_copy:
2638 /*
2639 * Copy bytes from src until faulting load address (or until a
2640 diff --git a/arch/mips/include/asm/checksum.h b/arch/mips/include/asm/checksum.h
2641 index 3ceacde5eb6e..17f89f9670b2 100644
2642 --- a/arch/mips/include/asm/checksum.h
2643 +++ b/arch/mips/include/asm/checksum.h
2644 @@ -186,7 +186,9 @@ static inline __wsum csum_tcpudp_nofold(__be32 saddr,
2645 " daddu %0, %4 \n"
2646 " dsll32 $1, %0, 0 \n"
2647 " daddu %0, $1 \n"
2648 + " sltu $1, %0, $1 \n"
2649 " dsra32 %0, %0, 0 \n"
2650 + " addu %0, $1 \n"
2651 #endif
2652 " .set pop"
2653 : "=r" (sum)
2654 diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
2655 index 44a6f25e902e..fc537d1b649d 100644
2656 --- a/arch/mips/kernel/process.c
2657 +++ b/arch/mips/kernel/process.c
2658 @@ -191,11 +191,9 @@ struct mips_frame_info {
2659 #define J_TARGET(pc,target) \
2660 (((unsigned long)(pc) & 0xf0000000) | ((target) << 2))
2661
2662 -static inline int is_ra_save_ins(union mips_instruction *ip)
2663 +static inline int is_ra_save_ins(union mips_instruction *ip, int *poff)
2664 {
2665 #ifdef CONFIG_CPU_MICROMIPS
2666 - union mips_instruction mmi;
2667 -
2668 /*
2669 * swsp ra,offset
2670 * swm16 reglist,offset(sp)
2671 @@ -205,29 +203,71 @@ static inline int is_ra_save_ins(union mips_instruction *ip)
2672 *
2673 * microMIPS is way more fun...
2674 */
2675 - if (mm_insn_16bit(ip->halfword[0])) {
2676 - mmi.word = (ip->halfword[0] << 16);
2677 - return (mmi.mm16_r5_format.opcode == mm_swsp16_op &&
2678 - mmi.mm16_r5_format.rt == 31) ||
2679 - (mmi.mm16_m_format.opcode == mm_pool16c_op &&
2680 - mmi.mm16_m_format.func == mm_swm16_op);
2681 + if (mm_insn_16bit(ip->halfword[1])) {
2682 + switch (ip->mm16_r5_format.opcode) {
2683 + case mm_swsp16_op:
2684 + if (ip->mm16_r5_format.rt != 31)
2685 + return 0;
2686 +
2687 + *poff = ip->mm16_r5_format.simmediate;
2688 + *poff = (*poff << 2) / sizeof(ulong);
2689 + return 1;
2690 +
2691 + case mm_pool16c_op:
2692 + switch (ip->mm16_m_format.func) {
2693 + case mm_swm16_op:
2694 + *poff = ip->mm16_m_format.imm;
2695 + *poff += 1 + ip->mm16_m_format.rlist;
2696 + *poff = (*poff << 2) / sizeof(ulong);
2697 + return 1;
2698 +
2699 + default:
2700 + return 0;
2701 + }
2702 +
2703 + default:
2704 + return 0;
2705 + }
2706 }
2707 - else {
2708 - mmi.halfword[0] = ip->halfword[1];
2709 - mmi.halfword[1] = ip->halfword[0];
2710 - return (mmi.mm_m_format.opcode == mm_pool32b_op &&
2711 - mmi.mm_m_format.rd > 9 &&
2712 - mmi.mm_m_format.base == 29 &&
2713 - mmi.mm_m_format.func == mm_swm32_func) ||
2714 - (mmi.i_format.opcode == mm_sw32_op &&
2715 - mmi.i_format.rs == 29 &&
2716 - mmi.i_format.rt == 31);
2717 +
2718 + switch (ip->i_format.opcode) {
2719 + case mm_sw32_op:
2720 + if (ip->i_format.rs != 29)
2721 + return 0;
2722 + if (ip->i_format.rt != 31)
2723 + return 0;
2724 +
2725 + *poff = ip->i_format.simmediate / sizeof(ulong);
2726 + return 1;
2727 +
2728 + case mm_pool32b_op:
2729 + switch (ip->mm_m_format.func) {
2730 + case mm_swm32_func:
2731 + if (ip->mm_m_format.rd < 0x10)
2732 + return 0;
2733 + if (ip->mm_m_format.base != 29)
2734 + return 0;
2735 +
2736 + *poff = ip->mm_m_format.simmediate;
2737 + *poff += (ip->mm_m_format.rd & 0xf) * sizeof(u32);
2738 + *poff /= sizeof(ulong);
2739 + return 1;
2740 + default:
2741 + return 0;
2742 + }
2743 +
2744 + default:
2745 + return 0;
2746 }
2747 #else
2748 /* sw / sd $ra, offset($sp) */
2749 - return (ip->i_format.opcode == sw_op || ip->i_format.opcode == sd_op) &&
2750 - ip->i_format.rs == 29 &&
2751 - ip->i_format.rt == 31;
2752 + if ((ip->i_format.opcode == sw_op || ip->i_format.opcode == sd_op) &&
2753 + ip->i_format.rs == 29 && ip->i_format.rt == 31) {
2754 + *poff = ip->i_format.simmediate / sizeof(ulong);
2755 + return 1;
2756 + }
2757 +
2758 + return 0;
2759 #endif
2760 }
2761
2762 @@ -242,13 +282,16 @@ static inline int is_jump_ins(union mips_instruction *ip)
2763 *
2764 * microMIPS is kind of more fun...
2765 */
2766 - union mips_instruction mmi;
2767 -
2768 - mmi.word = (ip->halfword[0] << 16);
2769 + if (mm_insn_16bit(ip->halfword[1])) {
2770 + if ((ip->mm16_r5_format.opcode == mm_pool16c_op &&
2771 + (ip->mm16_r5_format.rt & mm_jr16_op) == mm_jr16_op))
2772 + return 1;
2773 + return 0;
2774 + }
2775
2776 - if ((mmi.mm16_r5_format.opcode == mm_pool16c_op &&
2777 - (mmi.mm16_r5_format.rt & mm_jr16_op) == mm_jr16_op) ||
2778 - ip->j_format.opcode == mm_jal32_op)
2779 + if (ip->j_format.opcode == mm_j32_op)
2780 + return 1;
2781 + if (ip->j_format.opcode == mm_jal32_op)
2782 return 1;
2783 if (ip->r_format.opcode != mm_pool32a_op ||
2784 ip->r_format.func != mm_pool32axf_op)
2785 @@ -276,15 +319,13 @@ static inline int is_sp_move_ins(union mips_instruction *ip)
2786 *
2787 * microMIPS is not more fun...
2788 */
2789 - if (mm_insn_16bit(ip->halfword[0])) {
2790 - union mips_instruction mmi;
2791 -
2792 - mmi.word = (ip->halfword[0] << 16);
2793 - return (mmi.mm16_r3_format.opcode == mm_pool16d_op &&
2794 - mmi.mm16_r3_format.simmediate && mm_addiusp_func) ||
2795 - (mmi.mm16_r5_format.opcode == mm_pool16d_op &&
2796 - mmi.mm16_r5_format.rt == 29);
2797 + if (mm_insn_16bit(ip->halfword[1])) {
2798 + return (ip->mm16_r3_format.opcode == mm_pool16d_op &&
2799 + ip->mm16_r3_format.simmediate && mm_addiusp_func) ||
2800 + (ip->mm16_r5_format.opcode == mm_pool16d_op &&
2801 + ip->mm16_r5_format.rt == 29);
2802 }
2803 +
2804 return ip->mm_i_format.opcode == mm_addiu32_op &&
2805 ip->mm_i_format.rt == 29 && ip->mm_i_format.rs == 29;
2806 #else
2807 @@ -299,30 +340,36 @@ static inline int is_sp_move_ins(union mips_instruction *ip)
2808
2809 static int get_frame_info(struct mips_frame_info *info)
2810 {
2811 -#ifdef CONFIG_CPU_MICROMIPS
2812 - union mips_instruction *ip = (void *) (((char *) info->func) - 1);
2813 -#else
2814 - union mips_instruction *ip = info->func;
2815 -#endif
2816 - unsigned max_insns = info->func_size / sizeof(union mips_instruction);
2817 - unsigned i;
2818 + bool is_mmips = IS_ENABLED(CONFIG_CPU_MICROMIPS);
2819 + union mips_instruction insn, *ip, *ip_end;
2820 + const unsigned int max_insns = 128;
2821 + unsigned int i;
2822
2823 info->pc_offset = -1;
2824 info->frame_size = 0;
2825
2826 + ip = (void *)msk_isa16_mode((ulong)info->func);
2827 if (!ip)
2828 goto err;
2829
2830 - if (max_insns == 0)
2831 - max_insns = 128U; /* unknown function size */
2832 - max_insns = min(128U, max_insns);
2833 + ip_end = (void *)ip + info->func_size;
2834
2835 - for (i = 0; i < max_insns; i++, ip++) {
2836 + for (i = 0; i < max_insns && ip < ip_end; i++, ip++) {
2837 + if (is_mmips && mm_insn_16bit(ip->halfword[0])) {
2838 + insn.halfword[0] = 0;
2839 + insn.halfword[1] = ip->halfword[0];
2840 + } else if (is_mmips) {
2841 + insn.halfword[0] = ip->halfword[1];
2842 + insn.halfword[1] = ip->halfword[0];
2843 + } else {
2844 + insn.word = ip->word;
2845 + }
2846
2847 - if (is_jump_ins(ip))
2848 + if (is_jump_ins(&insn))
2849 break;
2850 +
2851 if (!info->frame_size) {
2852 - if (is_sp_move_ins(ip))
2853 + if (is_sp_move_ins(&insn))
2854 {
2855 #ifdef CONFIG_CPU_MICROMIPS
2856 if (mm_insn_16bit(ip->halfword[0]))
2857 @@ -345,11 +392,9 @@ static int get_frame_info(struct mips_frame_info *info)
2858 }
2859 continue;
2860 }
2861 - if (info->pc_offset == -1 && is_ra_save_ins(ip)) {
2862 - info->pc_offset =
2863 - ip->i_format.simmediate / sizeof(long);
2864 + if (info->pc_offset == -1 &&
2865 + is_ra_save_ins(&insn, &info->pc_offset))
2866 break;
2867 - }
2868 }
2869 if (info->frame_size && info->pc_offset >= 0) /* nested */
2870 return 0;
2871 diff --git a/arch/mips/lantiq/xway/sysctrl.c b/arch/mips/lantiq/xway/sysctrl.c
2872 index 80554e8f6037..3e390a4e3897 100644
2873 --- a/arch/mips/lantiq/xway/sysctrl.c
2874 +++ b/arch/mips/lantiq/xway/sysctrl.c
2875 @@ -545,7 +545,7 @@ void __init ltq_soc_init(void)
2876 clkdev_add_pmu("1a800000.pcie", "msi", 1, 1, PMU1_PCIE2_MSI);
2877 clkdev_add_pmu("1a800000.pcie", "pdi", 1, 1, PMU1_PCIE2_PDI);
2878 clkdev_add_pmu("1a800000.pcie", "ctl", 1, 1, PMU1_PCIE2_CTL);
2879 - clkdev_add_pmu("1e108000.eth", NULL, 1, 0, PMU_SWITCH | PMU_PPE_DP);
2880 + clkdev_add_pmu("1e108000.eth", NULL, 0, 0, PMU_SWITCH | PMU_PPE_DP);
2881 clkdev_add_pmu("1da00000.usif", "NULL", 1, 0, PMU_USIF);
2882 clkdev_add_pmu("1e103100.deu", NULL, 1, 0, PMU_DEU);
2883 } else if (of_machine_is_compatible("lantiq,ar10")) {
2884 @@ -553,7 +553,7 @@ void __init ltq_soc_init(void)
2885 ltq_ar10_fpi_hz(), ltq_ar10_pp32_hz());
2886 clkdev_add_pmu("1e101000.usb", "ctl", 1, 0, PMU_USB0);
2887 clkdev_add_pmu("1e106000.usb", "ctl", 1, 0, PMU_USB1);
2888 - clkdev_add_pmu("1e108000.eth", NULL, 1, 0, PMU_SWITCH |
2889 + clkdev_add_pmu("1e108000.eth", NULL, 0, 0, PMU_SWITCH |
2890 PMU_PPE_DP | PMU_PPE_TC);
2891 clkdev_add_pmu("1da00000.usif", "NULL", 1, 0, PMU_USIF);
2892 clkdev_add_pmu("1f203000.rcu", "gphy", 1, 0, PMU_GPHY);
2893 @@ -575,11 +575,11 @@ void __init ltq_soc_init(void)
2894 clkdev_add_pmu(NULL, "ahb", 1, 0, PMU_AHBM | PMU_AHBS);
2895
2896 clkdev_add_pmu("1da00000.usif", "NULL", 1, 0, PMU_USIF);
2897 - clkdev_add_pmu("1e108000.eth", NULL, 1, 0,
2898 + clkdev_add_pmu("1e108000.eth", NULL, 0, 0,
2899 PMU_SWITCH | PMU_PPE_DPLUS | PMU_PPE_DPLUM |
2900 PMU_PPE_EMA | PMU_PPE_TC | PMU_PPE_SLL01 |
2901 PMU_PPE_QSB | PMU_PPE_TOP);
2902 - clkdev_add_pmu("1f203000.rcu", "gphy", 1, 0, PMU_GPHY);
2903 + clkdev_add_pmu("1f203000.rcu", "gphy", 0, 0, PMU_GPHY);
2904 clkdev_add_pmu("1e103000.sdio", NULL, 1, 0, PMU_SDIO);
2905 clkdev_add_pmu("1e103100.deu", NULL, 1, 0, PMU_DEU);
2906 clkdev_add_pmu("1e116000.mei", "dfe", 1, 0, PMU_DFE);
2907 diff --git a/arch/mips/mm/sc-ip22.c b/arch/mips/mm/sc-ip22.c
2908 index dc7c5a5214a9..efaf364fe581 100644
2909 --- a/arch/mips/mm/sc-ip22.c
2910 +++ b/arch/mips/mm/sc-ip22.c
2911 @@ -31,26 +31,40 @@ static inline void indy_sc_wipe(unsigned long first, unsigned long last)
2912 unsigned long tmp;
2913
2914 __asm__ __volatile__(
2915 - ".set\tpush\t\t\t# indy_sc_wipe\n\t"
2916 - ".set\tnoreorder\n\t"
2917 - ".set\tmips3\n\t"
2918 - ".set\tnoat\n\t"
2919 - "mfc0\t%2, $12\n\t"
2920 - "li\t$1, 0x80\t\t\t# Go 64 bit\n\t"
2921 - "mtc0\t$1, $12\n\t"
2922 -
2923 - "dli\t$1, 0x9000000080000000\n\t"
2924 - "or\t%0, $1\t\t\t# first line to flush\n\t"
2925 - "or\t%1, $1\t\t\t# last line to flush\n\t"
2926 - ".set\tat\n\t"
2927 -
2928 - "1:\tsw\t$0, 0(%0)\n\t"
2929 - "bne\t%0, %1, 1b\n\t"
2930 - " daddu\t%0, 32\n\t"
2931 -
2932 - "mtc0\t%2, $12\t\t\t# Back to 32 bit\n\t"
2933 - "nop; nop; nop; nop;\n\t"
2934 - ".set\tpop"
2935 + " .set push # indy_sc_wipe \n"
2936 + " .set noreorder \n"
2937 + " .set mips3 \n"
2938 + " .set noat \n"
2939 + " mfc0 %2, $12 \n"
2940 + " li $1, 0x80 # Go 64 bit \n"
2941 + " mtc0 $1, $12 \n"
2942 + " \n"
2943 + " # \n"
2944 + " # Open code a dli $1, 0x9000000080000000 \n"
2945 + " # \n"
2946 + " # Required because binutils 2.25 will happily accept \n"
2947 + " # 64 bit instructions in .set mips3 mode but puke on \n"
2948 + " # 64 bit constants when generating 32 bit ELF \n"
2949 + " # \n"
2950 + " lui $1,0x9000 \n"
2951 + " dsll $1,$1,0x10 \n"
2952 + " ori $1,$1,0x8000 \n"
2953 + " dsll $1,$1,0x10 \n"
2954 + " \n"
2955 + " or %0, $1 # first line to flush \n"
2956 + " or %1, $1 # last line to flush \n"
2957 + " .set at \n"
2958 + " \n"
2959 + "1: sw $0, 0(%0) \n"
2960 + " bne %0, %1, 1b \n"
2961 + " daddu %0, 32 \n"
2962 + " \n"
2963 + " mtc0 %2, $12 # Back to 32 bit \n"
2964 + " nop # pipeline hazard \n"
2965 + " nop \n"
2966 + " nop \n"
2967 + " nop \n"
2968 + " .set pop \n"
2969 : "=r" (first), "=r" (last), "=&r" (tmp)
2970 : "0" (first), "1" (last));
2971 }
2972 diff --git a/arch/powerpc/kernel/hw_breakpoint.c b/arch/powerpc/kernel/hw_breakpoint.c
2973 index 05e804cdecaa..fdf48785d3e9 100644
2974 --- a/arch/powerpc/kernel/hw_breakpoint.c
2975 +++ b/arch/powerpc/kernel/hw_breakpoint.c
2976 @@ -227,8 +227,10 @@ int __kprobes hw_breakpoint_handler(struct die_args *args)
2977 rcu_read_lock();
2978
2979 bp = __this_cpu_read(bp_per_reg);
2980 - if (!bp)
2981 + if (!bp) {
2982 + rc = NOTIFY_DONE;
2983 goto out;
2984 + }
2985 info = counter_arch_bp(bp);
2986
2987 /*
2988 diff --git a/crypto/testmgr.h b/crypto/testmgr.h
2989 index da0a8fd765f4..0e02c60a57b6 100644
2990 --- a/crypto/testmgr.h
2991 +++ b/crypto/testmgr.h
2992 @@ -21778,7 +21778,7 @@ static struct aead_testvec aes_ccm_enc_tv_template[] = {
2993 "\x09\x75\x9a\x9b\x3c\x9b\x27\x39",
2994 .klen = 32,
2995 .iv = "\x03\xf9\xd9\x4e\x63\xb5\x3d\x9d"
2996 - "\x43\xf6\x1e\x50",
2997 + "\x43\xf6\x1e\x50\0\0\0\0",
2998 .assoc = "\x57\xf5\x6b\x8b\x57\x5c\x3d\x3b"
2999 "\x13\x02\x01\x0c\x83\x4c\x96\x35"
3000 "\x8e\xd6\x39\xcf\x7d\x14\x9b\x94"
3001 diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
3002 index 59d8d0d14824..327f9e374b44 100644
3003 --- a/drivers/bcma/main.c
3004 +++ b/drivers/bcma/main.c
3005 @@ -640,8 +640,11 @@ static int bcma_device_probe(struct device *dev)
3006 drv);
3007 int err = 0;
3008
3009 + get_device(dev);
3010 if (adrv->probe)
3011 err = adrv->probe(core);
3012 + if (err)
3013 + put_device(dev);
3014
3015 return err;
3016 }
3017 @@ -654,6 +657,7 @@ static int bcma_device_remove(struct device *dev)
3018
3019 if (adrv->remove)
3020 adrv->remove(core);
3021 + put_device(dev);
3022
3023 return 0;
3024 }
3025 diff --git a/drivers/block/loop.c b/drivers/block/loop.c
3026 index ab0b2dd3f629..cec36d5c24f5 100644
3027 --- a/drivers/block/loop.c
3028 +++ b/drivers/block/loop.c
3029 @@ -1108,9 +1108,12 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
3030 if ((unsigned int) info->lo_encrypt_key_size > LO_KEY_SIZE)
3031 return -EINVAL;
3032
3033 + /* I/O need to be drained during transfer transition */
3034 + blk_mq_freeze_queue(lo->lo_queue);
3035 +
3036 err = loop_release_xfer(lo);
3037 if (err)
3038 - return err;
3039 + goto exit;
3040
3041 if (info->lo_encrypt_type) {
3042 unsigned int type = info->lo_encrypt_type;
3043 @@ -1125,12 +1128,14 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
3044
3045 err = loop_init_xfer(lo, xfer, info);
3046 if (err)
3047 - return err;
3048 + goto exit;
3049
3050 if (lo->lo_offset != info->lo_offset ||
3051 lo->lo_sizelimit != info->lo_sizelimit)
3052 - if (figure_loop_size(lo, info->lo_offset, info->lo_sizelimit))
3053 - return -EFBIG;
3054 + if (figure_loop_size(lo, info->lo_offset, info->lo_sizelimit)) {
3055 + err = -EFBIG;
3056 + goto exit;
3057 + }
3058
3059 loop_config_discard(lo);
3060
3061 @@ -1148,13 +1153,6 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
3062 (info->lo_flags & LO_FLAGS_AUTOCLEAR))
3063 lo->lo_flags ^= LO_FLAGS_AUTOCLEAR;
3064
3065 - if ((info->lo_flags & LO_FLAGS_PARTSCAN) &&
3066 - !(lo->lo_flags & LO_FLAGS_PARTSCAN)) {
3067 - lo->lo_flags |= LO_FLAGS_PARTSCAN;
3068 - lo->lo_disk->flags &= ~GENHD_FL_NO_PART_SCAN;
3069 - loop_reread_partitions(lo, lo->lo_device);
3070 - }
3071 -
3072 lo->lo_encrypt_key_size = info->lo_encrypt_key_size;
3073 lo->lo_init[0] = info->lo_init[0];
3074 lo->lo_init[1] = info->lo_init[1];
3075 @@ -1167,7 +1165,17 @@ loop_set_status(struct loop_device *lo, const struct loop_info64 *info)
3076 /* update dio if lo_offset or transfer is changed */
3077 __loop_update_dio(lo, lo->use_dio);
3078
3079 - return 0;
3080 + exit:
3081 + blk_mq_unfreeze_queue(lo->lo_queue);
3082 +
3083 + if (!err && (info->lo_flags & LO_FLAGS_PARTSCAN) &&
3084 + !(lo->lo_flags & LO_FLAGS_PARTSCAN)) {
3085 + lo->lo_flags |= LO_FLAGS_PARTSCAN;
3086 + lo->lo_disk->flags &= ~GENHD_FL_NO_PART_SCAN;
3087 + loop_reread_partitions(lo, lo->lo_device);
3088 + }
3089 +
3090 + return err;
3091 }
3092
3093 static int
3094 diff --git a/drivers/dma/ipu/ipu_irq.c b/drivers/dma/ipu/ipu_irq.c
3095 index dd184b50e5b4..284627806b88 100644
3096 --- a/drivers/dma/ipu/ipu_irq.c
3097 +++ b/drivers/dma/ipu/ipu_irq.c
3098 @@ -272,7 +272,7 @@ static void ipu_irq_handler(struct irq_desc *desc)
3099 u32 status;
3100 int i, line;
3101
3102 - for (i = IPU_IRQ_NR_FN_BANKS; i < IPU_IRQ_NR_BANKS; i++) {
3103 + for (i = 0; i < IPU_IRQ_NR_BANKS; i++) {
3104 struct ipu_irq_bank *bank = irq_bank + i;
3105
3106 raw_spin_lock(&bank_lock);
3107 diff --git a/drivers/hv/hv.c b/drivers/hv/hv.c
3108 index 63194a9a7189..89fd0113aa5c 100644
3109 --- a/drivers/hv/hv.c
3110 +++ b/drivers/hv/hv.c
3111 @@ -422,7 +422,7 @@ int hv_synic_alloc(void)
3112 goto err;
3113 }
3114
3115 - for_each_online_cpu(cpu) {
3116 + for_each_present_cpu(cpu) {
3117 hv_context.event_dpc[cpu] = kmalloc(size, GFP_ATOMIC);
3118 if (hv_context.event_dpc[cpu] == NULL) {
3119 pr_err("Unable to allocate event dpc\n");
3120 @@ -461,6 +461,8 @@ int hv_synic_alloc(void)
3121 pr_err("Unable to allocate post msg page\n");
3122 goto err;
3123 }
3124 +
3125 + INIT_LIST_HEAD(&hv_context.percpu_list[cpu]);
3126 }
3127
3128 return 0;
3129 @@ -485,7 +487,7 @@ void hv_synic_free(void)
3130 int cpu;
3131
3132 kfree(hv_context.hv_numa_map);
3133 - for_each_online_cpu(cpu)
3134 + for_each_present_cpu(cpu)
3135 hv_synic_free_cpu(cpu);
3136 }
3137
3138 @@ -555,8 +557,6 @@ void hv_synic_init(void *arg)
3139 rdmsrl(HV_X64_MSR_VP_INDEX, vp_index);
3140 hv_context.vp_index[cpu] = (u32)vp_index;
3141
3142 - INIT_LIST_HEAD(&hv_context.percpu_list[cpu]);
3143 -
3144 /*
3145 * Register the per-cpu clockevent source.
3146 */
3147 diff --git a/drivers/hv/hv_fcopy.c b/drivers/hv/hv_fcopy.c
3148 index c37a71e13de0..1fb02dcbc500 100644
3149 --- a/drivers/hv/hv_fcopy.c
3150 +++ b/drivers/hv/hv_fcopy.c
3151 @@ -61,6 +61,7 @@ static DECLARE_WORK(fcopy_send_work, fcopy_send_data);
3152 static const char fcopy_devname[] = "vmbus/hv_fcopy";
3153 static u8 *recv_buffer;
3154 static struct hvutil_transport *hvt;
3155 +static struct completion release_event;
3156 /*
3157 * This state maintains the version number registered by the daemon.
3158 */
3159 @@ -312,12 +313,14 @@ static void fcopy_on_reset(void)
3160
3161 if (cancel_delayed_work_sync(&fcopy_timeout_work))
3162 fcopy_respond_to_host(HV_E_FAIL);
3163 + complete(&release_event);
3164 }
3165
3166 int hv_fcopy_init(struct hv_util_service *srv)
3167 {
3168 recv_buffer = srv->recv_buffer;
3169
3170 + init_completion(&release_event);
3171 /*
3172 * When this driver loads, the user level daemon that
3173 * processes the host requests may not yet be running.
3174 @@ -339,4 +342,5 @@ void hv_fcopy_deinit(void)
3175 fcopy_transaction.state = HVUTIL_DEVICE_DYING;
3176 cancel_delayed_work_sync(&fcopy_timeout_work);
3177 hvutil_transport_destroy(hvt);
3178 + wait_for_completion(&release_event);
3179 }
3180 diff --git a/drivers/hv/hv_kvp.c b/drivers/hv/hv_kvp.c
3181 index 2a3420c4ca59..ce4d3a935491 100644
3182 --- a/drivers/hv/hv_kvp.c
3183 +++ b/drivers/hv/hv_kvp.c
3184 @@ -86,6 +86,7 @@ static DECLARE_WORK(kvp_sendkey_work, kvp_send_key);
3185 static const char kvp_devname[] = "vmbus/hv_kvp";
3186 static u8 *recv_buffer;
3187 static struct hvutil_transport *hvt;
3188 +static struct completion release_event;
3189 /*
3190 * Register the kernel component with the user-level daemon.
3191 * As part of this registration, pass the LIC version number.
3192 @@ -682,6 +683,7 @@ static void kvp_on_reset(void)
3193 if (cancel_delayed_work_sync(&kvp_timeout_work))
3194 kvp_respond_to_host(NULL, HV_E_FAIL);
3195 kvp_transaction.state = HVUTIL_DEVICE_INIT;
3196 + complete(&release_event);
3197 }
3198
3199 int
3200 @@ -689,6 +691,7 @@ hv_kvp_init(struct hv_util_service *srv)
3201 {
3202 recv_buffer = srv->recv_buffer;
3203
3204 + init_completion(&release_event);
3205 /*
3206 * When this driver loads, the user level daemon that
3207 * processes the host requests may not yet be running.
3208 @@ -711,4 +714,5 @@ void hv_kvp_deinit(void)
3209 cancel_delayed_work_sync(&kvp_timeout_work);
3210 cancel_work_sync(&kvp_sendkey_work);
3211 hvutil_transport_destroy(hvt);
3212 + wait_for_completion(&release_event);
3213 }
3214 diff --git a/drivers/hv/hv_snapshot.c b/drivers/hv/hv_snapshot.c
3215 index 81882d4848bd..faad79ae318a 100644
3216 --- a/drivers/hv/hv_snapshot.c
3217 +++ b/drivers/hv/hv_snapshot.c
3218 @@ -66,6 +66,7 @@ static int dm_reg_value;
3219 static const char vss_devname[] = "vmbus/hv_vss";
3220 static __u8 *recv_buffer;
3221 static struct hvutil_transport *hvt;
3222 +static struct completion release_event;
3223
3224 static void vss_send_op(struct work_struct *dummy);
3225 static void vss_timeout_func(struct work_struct *dummy);
3226 @@ -326,11 +327,13 @@ static void vss_on_reset(void)
3227 if (cancel_delayed_work_sync(&vss_timeout_work))
3228 vss_respond_to_host(HV_E_FAIL);
3229 vss_transaction.state = HVUTIL_DEVICE_INIT;
3230 + complete(&release_event);
3231 }
3232
3233 int
3234 hv_vss_init(struct hv_util_service *srv)
3235 {
3236 + init_completion(&release_event);
3237 if (vmbus_proto_version < VERSION_WIN8_1) {
3238 pr_warn("Integration service 'Backup (volume snapshot)'"
3239 " not supported on this host version.\n");
3240 @@ -360,4 +363,5 @@ void hv_vss_deinit(void)
3241 cancel_delayed_work_sync(&vss_timeout_work);
3242 cancel_work_sync(&vss_send_op_work);
3243 hvutil_transport_destroy(hvt);
3244 + wait_for_completion(&release_event);
3245 }
3246 diff --git a/drivers/iio/pressure/mpl115.c b/drivers/iio/pressure/mpl115.c
3247 index a0d7deeac62f..3f90985d545e 100644
3248 --- a/drivers/iio/pressure/mpl115.c
3249 +++ b/drivers/iio/pressure/mpl115.c
3250 @@ -136,6 +136,7 @@ static const struct iio_chan_spec mpl115_channels[] = {
3251 {
3252 .type = IIO_TEMP,
3253 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
3254 + .info_mask_shared_by_type =
3255 BIT(IIO_CHAN_INFO_OFFSET) | BIT(IIO_CHAN_INFO_SCALE),
3256 },
3257 };
3258 diff --git a/drivers/iio/pressure/mpl3115.c b/drivers/iio/pressure/mpl3115.c
3259 index 01b2e0b18878..0f5b8767ec2e 100644
3260 --- a/drivers/iio/pressure/mpl3115.c
3261 +++ b/drivers/iio/pressure/mpl3115.c
3262 @@ -182,7 +182,7 @@ static const struct iio_chan_spec mpl3115_channels[] = {
3263 {
3264 .type = IIO_PRESSURE,
3265 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
3266 - BIT(IIO_CHAN_INFO_SCALE),
3267 + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
3268 .scan_index = 0,
3269 .scan_type = {
3270 .sign = 'u',
3271 @@ -195,7 +195,7 @@ static const struct iio_chan_spec mpl3115_channels[] = {
3272 {
3273 .type = IIO_TEMP,
3274 .info_mask_separate = BIT(IIO_CHAN_INFO_RAW),
3275 - BIT(IIO_CHAN_INFO_SCALE),
3276 + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE),
3277 .scan_index = 1,
3278 .scan_type = {
3279 .sign = 's',
3280 diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
3281 index c9dcad6a53bf..3f5741a3e728 100644
3282 --- a/drivers/infiniband/core/cma.c
3283 +++ b/drivers/infiniband/core/cma.c
3284 @@ -3349,6 +3349,9 @@ static int cma_accept_iw(struct rdma_id_private *id_priv,
3285 struct iw_cm_conn_param iw_param;
3286 int ret;
3287
3288 + if (!conn_param)
3289 + return -EINVAL;
3290 +
3291 ret = cma_modify_qp_rtr(id_priv, conn_param);
3292 if (ret)
3293 return ret;
3294 diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
3295 index 9413b0726237..f0fc6f7b5d98 100644
3296 --- a/drivers/iommu/intel-iommu.c
3297 +++ b/drivers/iommu/intel-iommu.c
3298 @@ -3238,13 +3238,14 @@ static int __init init_dmars(void)
3299 iommu_identity_mapping |= IDENTMAP_GFX;
3300 #endif
3301
3302 + check_tylersburg_isoch();
3303 +
3304 if (iommu_identity_mapping) {
3305 ret = si_domain_init(hw_pass_through);
3306 if (ret)
3307 goto free_iommu;
3308 }
3309
3310 - check_tylersburg_isoch();
3311
3312 /*
3313 * If we copied translations from a previous kernel in the kdump
3314 diff --git a/drivers/md/dm-cache-target.c b/drivers/md/dm-cache-target.c
3315 index 515f83e7d9ab..b59615ddf6ba 100644
3316 --- a/drivers/md/dm-cache-target.c
3317 +++ b/drivers/md/dm-cache-target.c
3318 @@ -251,7 +251,7 @@ struct cache {
3319 /*
3320 * Fields for converting from sectors to blocks.
3321 */
3322 - uint32_t sectors_per_block;
3323 + sector_t sectors_per_block;
3324 int sectors_per_block_shift;
3325
3326 spinlock_t lock;
3327 @@ -3547,11 +3547,11 @@ static void cache_status(struct dm_target *ti, status_type_t type,
3328
3329 residency = policy_residency(cache->policy);
3330
3331 - DMEMIT("%u %llu/%llu %u %llu/%llu %u %u %u %u %u %u %lu ",
3332 + DMEMIT("%u %llu/%llu %llu %llu/%llu %u %u %u %u %u %u %lu ",
3333 (unsigned)DM_CACHE_METADATA_BLOCK_SIZE,
3334 (unsigned long long)(nr_blocks_metadata - nr_free_blocks_metadata),
3335 (unsigned long long)nr_blocks_metadata,
3336 - cache->sectors_per_block,
3337 + (unsigned long long)cache->sectors_per_block,
3338 (unsigned long long) from_cblock(residency),
3339 (unsigned long long) from_cblock(cache->cache_size),
3340 (unsigned) atomic_read(&cache->stats.read_hit),
3341 diff --git a/drivers/md/dm-stats.c b/drivers/md/dm-stats.c
3342 index 8289804ccd99..d5ea9f28ae70 100644
3343 --- a/drivers/md/dm-stats.c
3344 +++ b/drivers/md/dm-stats.c
3345 @@ -175,6 +175,7 @@ static void dm_stat_free(struct rcu_head *head)
3346 int cpu;
3347 struct dm_stat *s = container_of(head, struct dm_stat, rcu_head);
3348
3349 + kfree(s->histogram_boundaries);
3350 kfree(s->program_id);
3351 kfree(s->aux_data);
3352 for_each_possible_cpu(cpu) {
3353 diff --git a/drivers/md/linear.c b/drivers/md/linear.c
3354 index b7fe7e9fc777..6ba3227e29b2 100644
3355 --- a/drivers/md/linear.c
3356 +++ b/drivers/md/linear.c
3357 @@ -52,18 +52,26 @@ static inline struct dev_info *which_dev(struct mddev *mddev, sector_t sector)
3358 return conf->disks + lo;
3359 }
3360
3361 +/*
3362 + * In linear_congested() conf->raid_disks is used as a copy of
3363 + * mddev->raid_disks to iterate conf->disks[], because conf->raid_disks
3364 + * and conf->disks[] are created in linear_conf(), they are always
3365 + * consitent with each other, but mddev->raid_disks does not.
3366 + */
3367 static int linear_congested(struct mddev *mddev, int bits)
3368 {
3369 struct linear_conf *conf;
3370 int i, ret = 0;
3371
3372 - conf = mddev->private;
3373 + rcu_read_lock();
3374 + conf = rcu_dereference(mddev->private);
3375
3376 - for (i = 0; i < mddev->raid_disks && !ret ; i++) {
3377 + for (i = 0; i < conf->raid_disks && !ret ; i++) {
3378 struct request_queue *q = bdev_get_queue(conf->disks[i].rdev->bdev);
3379 ret |= bdi_congested(&q->backing_dev_info, bits);
3380 }
3381
3382 + rcu_read_unlock();
3383 return ret;
3384 }
3385
3386 @@ -143,6 +151,19 @@ static struct linear_conf *linear_conf(struct mddev *mddev, int raid_disks)
3387 conf->disks[i-1].end_sector +
3388 conf->disks[i].rdev->sectors;
3389
3390 + /*
3391 + * conf->raid_disks is copy of mddev->raid_disks. The reason to
3392 + * keep a copy of mddev->raid_disks in struct linear_conf is,
3393 + * mddev->raid_disks may not be consistent with pointers number of
3394 + * conf->disks[] when it is updated in linear_add() and used to
3395 + * iterate old conf->disks[] earray in linear_congested().
3396 + * Here conf->raid_disks is always consitent with number of
3397 + * pointers in conf->disks[] array, and mddev->private is updated
3398 + * with rcu_assign_pointer() in linear_addr(), such race can be
3399 + * avoided.
3400 + */
3401 + conf->raid_disks = raid_disks;
3402 +
3403 return conf;
3404
3405 out:
3406 @@ -195,15 +216,23 @@ static int linear_add(struct mddev *mddev, struct md_rdev *rdev)
3407 if (!newconf)
3408 return -ENOMEM;
3409
3410 + /* newconf->raid_disks already keeps a copy of * the increased
3411 + * value of mddev->raid_disks, WARN_ONCE() is just used to make
3412 + * sure of this. It is possible that oldconf is still referenced
3413 + * in linear_congested(), therefore kfree_rcu() is used to free
3414 + * oldconf until no one uses it anymore.
3415 + */
3416 mddev_suspend(mddev);
3417 - oldconf = mddev->private;
3418 + oldconf = rcu_dereference(mddev->private);
3419 mddev->raid_disks++;
3420 - mddev->private = newconf;
3421 + WARN_ONCE(mddev->raid_disks != newconf->raid_disks,
3422 + "copied raid_disks doesn't match mddev->raid_disks");
3423 + rcu_assign_pointer(mddev->private, newconf);
3424 md_set_array_sectors(mddev, linear_size(mddev, 0, 0));
3425 set_capacity(mddev->gendisk, mddev->array_sectors);
3426 mddev_resume(mddev);
3427 revalidate_disk(mddev->gendisk);
3428 - kfree(oldconf);
3429 + kfree_rcu(oldconf, rcu);
3430 return 0;
3431 }
3432
3433 diff --git a/drivers/md/linear.h b/drivers/md/linear.h
3434 index b685ddd7d7f7..8d392e6098b3 100644
3435 --- a/drivers/md/linear.h
3436 +++ b/drivers/md/linear.h
3437 @@ -10,6 +10,7 @@ struct linear_conf
3438 {
3439 struct rcu_head rcu;
3440 sector_t array_sectors;
3441 + int raid_disks; /* a copy of mddev->raid_disks */
3442 struct dev_info disks[0];
3443 };
3444 #endif
3445 diff --git a/drivers/media/pci/dm1105/Kconfig b/drivers/media/pci/dm1105/Kconfig
3446 index 173daf0c0847..14fa7e40f2a6 100644
3447 --- a/drivers/media/pci/dm1105/Kconfig
3448 +++ b/drivers/media/pci/dm1105/Kconfig
3449 @@ -1,6 +1,6 @@
3450 config DVB_DM1105
3451 tristate "SDMC DM1105 based PCI cards"
3452 - depends on DVB_CORE && PCI && I2C
3453 + depends on DVB_CORE && PCI && I2C && I2C_ALGOBIT
3454 select DVB_PLL if MEDIA_SUBDRV_AUTOSELECT
3455 select DVB_STV0299 if MEDIA_SUBDRV_AUTOSELECT
3456 select DVB_STV0288 if MEDIA_SUBDRV_AUTOSELECT
3457 diff --git a/drivers/media/platform/am437x/am437x-vpfe.c b/drivers/media/platform/am437x/am437x-vpfe.c
3458 index ba780c45f645..572bc043b62d 100644
3459 --- a/drivers/media/platform/am437x/am437x-vpfe.c
3460 +++ b/drivers/media/platform/am437x/am437x-vpfe.c
3461 @@ -1576,7 +1576,7 @@ static int vpfe_s_fmt(struct file *file, void *priv,
3462 return -EBUSY;
3463 }
3464
3465 - ret = vpfe_try_fmt(file, priv, &format);
3466 + ret = __vpfe_get_format(vpfe, &format, &bpp);
3467 if (ret)
3468 return ret;
3469
3470 diff --git a/drivers/media/usb/uvc/uvc_queue.c b/drivers/media/usb/uvc/uvc_queue.c
3471 index cfb868a48b5f..ff6feff21e94 100644
3472 --- a/drivers/media/usb/uvc/uvc_queue.c
3473 +++ b/drivers/media/usb/uvc/uvc_queue.c
3474 @@ -416,7 +416,7 @@ struct uvc_buffer *uvc_queue_next_buffer(struct uvc_video_queue *queue,
3475 nextbuf = NULL;
3476 spin_unlock_irqrestore(&queue->irqlock, flags);
3477
3478 - buf->state = buf->error ? VB2_BUF_STATE_ERROR : UVC_BUF_STATE_DONE;
3479 + buf->state = buf->error ? UVC_BUF_STATE_ERROR : UVC_BUF_STATE_DONE;
3480 vb2_set_plane_payload(&buf->buf.vb2_buf, 0, buf->bytesused);
3481 vb2_buffer_done(&buf->buf.vb2_buf, VB2_BUF_STATE_DONE);
3482
3483 diff --git a/drivers/net/can/usb/usb_8dev.c b/drivers/net/can/usb/usb_8dev.c
3484 index a731720f1d13..449b2a47f9a8 100644
3485 --- a/drivers/net/can/usb/usb_8dev.c
3486 +++ b/drivers/net/can/usb/usb_8dev.c
3487 @@ -954,8 +954,8 @@ static int usb_8dev_probe(struct usb_interface *intf,
3488 for (i = 0; i < MAX_TX_URBS; i++)
3489 priv->tx_contexts[i].echo_index = MAX_TX_URBS;
3490
3491 - priv->cmd_msg_buffer = kzalloc(sizeof(struct usb_8dev_cmd_msg),
3492 - GFP_KERNEL);
3493 + priv->cmd_msg_buffer = devm_kzalloc(&intf->dev, sizeof(struct usb_8dev_cmd_msg),
3494 + GFP_KERNEL);
3495 if (!priv->cmd_msg_buffer)
3496 goto cleanup_candev;
3497
3498 @@ -969,7 +969,7 @@ static int usb_8dev_probe(struct usb_interface *intf,
3499 if (err) {
3500 netdev_err(netdev,
3501 "couldn't register CAN device: %d\n", err);
3502 - goto cleanup_cmd_msg_buffer;
3503 + goto cleanup_candev;
3504 }
3505
3506 err = usb_8dev_cmd_version(priv, &version);
3507 @@ -990,9 +990,6 @@ static int usb_8dev_probe(struct usb_interface *intf,
3508 cleanup_unregister_candev:
3509 unregister_netdev(priv->netdev);
3510
3511 -cleanup_cmd_msg_buffer:
3512 - kfree(priv->cmd_msg_buffer);
3513 -
3514 cleanup_candev:
3515 free_candev(netdev);
3516
3517 diff --git a/drivers/net/wireless/ath/ath5k/mac80211-ops.c b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
3518 index dc44cfef7517..16e052d02c94 100644
3519 --- a/drivers/net/wireless/ath/ath5k/mac80211-ops.c
3520 +++ b/drivers/net/wireless/ath/ath5k/mac80211-ops.c
3521 @@ -502,8 +502,7 @@ ath5k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3522 break;
3523 return -EOPNOTSUPP;
3524 default:
3525 - WARN_ON(1);
3526 - return -EINVAL;
3527 + return -EOPNOTSUPP;
3528 }
3529
3530 mutex_lock(&ah->lock);
3531 diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
3532 index 694ca2e680e5..74670e08e6da 100644
3533 --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
3534 +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
3535 @@ -73,13 +73,13 @@
3536 #define AR9300_OTP_BASE \
3537 ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x30000 : 0x14000)
3538 #define AR9300_OTP_STATUS \
3539 - ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x30018 : 0x15f18)
3540 + ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x31018 : 0x15f18)
3541 #define AR9300_OTP_STATUS_TYPE 0x7
3542 #define AR9300_OTP_STATUS_VALID 0x4
3543 #define AR9300_OTP_STATUS_ACCESS_BUSY 0x2
3544 #define AR9300_OTP_STATUS_SM_BUSY 0x1
3545 #define AR9300_OTP_READ_DATA \
3546 - ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x3001c : 0x15f1c)
3547 + ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x3101c : 0x15f1c)
3548
3549 enum targetPowerHTRates {
3550 HT_TARGET_RATE_0_8_16,
3551 diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
3552 index b42f4a963ef4..a660e40f2df1 100644
3553 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
3554 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
3555 @@ -959,6 +959,7 @@ struct ath_softc {
3556 struct survey_info *cur_survey;
3557 struct survey_info survey[ATH9K_NUM_CHANNELS];
3558
3559 + spinlock_t intr_lock;
3560 struct tasklet_struct intr_tq;
3561 struct tasklet_struct bcon_tasklet;
3562 struct ath_hw *sc_ah;
3563 diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
3564 index bc70ce62bc03..0f5672f5c9ba 100644
3565 --- a/drivers/net/wireless/ath/ath9k/init.c
3566 +++ b/drivers/net/wireless/ath/ath9k/init.c
3567 @@ -619,6 +619,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
3568 common->bt_ant_diversity = 1;
3569
3570 spin_lock_init(&common->cc_lock);
3571 + spin_lock_init(&sc->intr_lock);
3572 spin_lock_init(&sc->sc_serial_rw);
3573 spin_lock_init(&sc->sc_pm_lock);
3574 spin_lock_init(&sc->chan_lock);
3575 diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c
3576 index bba85d1a6cd1..d937c39b3a0b 100644
3577 --- a/drivers/net/wireless/ath/ath9k/mac.c
3578 +++ b/drivers/net/wireless/ath/ath9k/mac.c
3579 @@ -805,21 +805,12 @@ void ath9k_hw_disable_interrupts(struct ath_hw *ah)
3580 }
3581 EXPORT_SYMBOL(ath9k_hw_disable_interrupts);
3582
3583 -void ath9k_hw_enable_interrupts(struct ath_hw *ah)
3584 +static void __ath9k_hw_enable_interrupts(struct ath_hw *ah)
3585 {
3586 struct ath_common *common = ath9k_hw_common(ah);
3587 u32 sync_default = AR_INTR_SYNC_DEFAULT;
3588 u32 async_mask;
3589
3590 - if (!(ah->imask & ATH9K_INT_GLOBAL))
3591 - return;
3592 -
3593 - if (!atomic_inc_and_test(&ah->intr_ref_cnt)) {
3594 - ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n",
3595 - atomic_read(&ah->intr_ref_cnt));
3596 - return;
3597 - }
3598 -
3599 if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah) ||
3600 AR_SREV_9561(ah))
3601 sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;
3602 @@ -841,6 +832,39 @@ void ath9k_hw_enable_interrupts(struct ath_hw *ah)
3603 ath_dbg(common, INTERRUPT, "AR_IMR 0x%x IER 0x%x\n",
3604 REG_READ(ah, AR_IMR), REG_READ(ah, AR_IER));
3605 }
3606 +
3607 +void ath9k_hw_resume_interrupts(struct ath_hw *ah)
3608 +{
3609 + struct ath_common *common = ath9k_hw_common(ah);
3610 +
3611 + if (!(ah->imask & ATH9K_INT_GLOBAL))
3612 + return;
3613 +
3614 + if (atomic_read(&ah->intr_ref_cnt) != 0) {
3615 + ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n",
3616 + atomic_read(&ah->intr_ref_cnt));
3617 + return;
3618 + }
3619 +
3620 + __ath9k_hw_enable_interrupts(ah);
3621 +}
3622 +EXPORT_SYMBOL(ath9k_hw_resume_interrupts);
3623 +
3624 +void ath9k_hw_enable_interrupts(struct ath_hw *ah)
3625 +{
3626 + struct ath_common *common = ath9k_hw_common(ah);
3627 +
3628 + if (!(ah->imask & ATH9K_INT_GLOBAL))
3629 + return;
3630 +
3631 + if (!atomic_inc_and_test(&ah->intr_ref_cnt)) {
3632 + ath_dbg(common, INTERRUPT, "Do not enable IER ref count %d\n",
3633 + atomic_read(&ah->intr_ref_cnt));
3634 + return;
3635 + }
3636 +
3637 + __ath9k_hw_enable_interrupts(ah);
3638 +}
3639 EXPORT_SYMBOL(ath9k_hw_enable_interrupts);
3640
3641 void ath9k_hw_set_interrupts(struct ath_hw *ah)
3642 diff --git a/drivers/net/wireless/ath/ath9k/mac.h b/drivers/net/wireless/ath/ath9k/mac.h
3643 index 7fbf7f965f61..1b63d26f30ce 100644
3644 --- a/drivers/net/wireless/ath/ath9k/mac.h
3645 +++ b/drivers/net/wireless/ath/ath9k/mac.h
3646 @@ -748,6 +748,7 @@ void ath9k_hw_set_interrupts(struct ath_hw *ah);
3647 void ath9k_hw_enable_interrupts(struct ath_hw *ah);
3648 void ath9k_hw_disable_interrupts(struct ath_hw *ah);
3649 void ath9k_hw_kill_interrupts(struct ath_hw *ah);
3650 +void ath9k_hw_resume_interrupts(struct ath_hw *ah);
3651
3652 void ar9002_hw_attach_mac_ops(struct ath_hw *ah);
3653
3654 diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
3655 index 8c5d2cf9c979..b114e57a823f 100644
3656 --- a/drivers/net/wireless/ath/ath9k/main.c
3657 +++ b/drivers/net/wireless/ath/ath9k/main.c
3658 @@ -373,21 +373,20 @@ void ath9k_tasklet(unsigned long data)
3659 struct ath_common *common = ath9k_hw_common(ah);
3660 enum ath_reset_type type;
3661 unsigned long flags;
3662 - u32 status = sc->intrstatus;
3663 + u32 status;
3664 u32 rxmask;
3665
3666 + spin_lock_irqsave(&sc->intr_lock, flags);
3667 + status = sc->intrstatus;
3668 + sc->intrstatus = 0;
3669 + spin_unlock_irqrestore(&sc->intr_lock, flags);
3670 +
3671 ath9k_ps_wakeup(sc);
3672 spin_lock(&sc->sc_pcu_lock);
3673
3674 if (status & ATH9K_INT_FATAL) {
3675 type = RESET_TYPE_FATAL_INT;
3676 ath9k_queue_reset(sc, type);
3677 -
3678 - /*
3679 - * Increment the ref. counter here so that
3680 - * interrupts are enabled in the reset routine.
3681 - */
3682 - atomic_inc(&ah->intr_ref_cnt);
3683 ath_dbg(common, RESET, "FATAL: Skipping interrupts\n");
3684 goto out;
3685 }
3686 @@ -403,11 +402,6 @@ void ath9k_tasklet(unsigned long data)
3687 type = RESET_TYPE_BB_WATCHDOG;
3688 ath9k_queue_reset(sc, type);
3689
3690 - /*
3691 - * Increment the ref. counter here so that
3692 - * interrupts are enabled in the reset routine.
3693 - */
3694 - atomic_inc(&ah->intr_ref_cnt);
3695 ath_dbg(common, RESET,
3696 "BB_WATCHDOG: Skipping interrupts\n");
3697 goto out;
3698 @@ -420,7 +414,6 @@ void ath9k_tasklet(unsigned long data)
3699 if ((sc->gtt_cnt >= MAX_GTT_CNT) && !ath9k_hw_check_alive(ah)) {
3700 type = RESET_TYPE_TX_GTT;
3701 ath9k_queue_reset(sc, type);
3702 - atomic_inc(&ah->intr_ref_cnt);
3703 ath_dbg(common, RESET,
3704 "GTT: Skipping interrupts\n");
3705 goto out;
3706 @@ -477,7 +470,7 @@ void ath9k_tasklet(unsigned long data)
3707 ath9k_btcoex_handle_interrupt(sc, status);
3708
3709 /* re-enable hardware interrupt */
3710 - ath9k_hw_enable_interrupts(ah);
3711 + ath9k_hw_resume_interrupts(ah);
3712 out:
3713 spin_unlock(&sc->sc_pcu_lock);
3714 ath9k_ps_restore(sc);
3715 @@ -541,7 +534,9 @@ irqreturn_t ath_isr(int irq, void *dev)
3716 return IRQ_NONE;
3717
3718 /* Cache the status */
3719 - sc->intrstatus = status;
3720 + spin_lock(&sc->intr_lock);
3721 + sc->intrstatus |= status;
3722 + spin_unlock(&sc->intr_lock);
3723
3724 if (status & SCHED_INTR)
3725 sched = true;
3726 @@ -587,7 +582,7 @@ chip_reset:
3727
3728 if (sched) {
3729 /* turn off every interrupt */
3730 - ath9k_hw_disable_interrupts(ah);
3731 + ath9k_hw_kill_interrupts(ah);
3732 tasklet_schedule(&sc->intr_tq);
3733 }
3734
3735 diff --git a/drivers/net/wireless/realtek/rtlwifi/pci.h b/drivers/net/wireless/realtek/rtlwifi/pci.h
3736 index 5da6703942d9..672f81ea02d0 100644
3737 --- a/drivers/net/wireless/realtek/rtlwifi/pci.h
3738 +++ b/drivers/net/wireless/realtek/rtlwifi/pci.h
3739 @@ -275,10 +275,10 @@ struct mp_adapter {
3740 };
3741
3742 struct rtl_pci_priv {
3743 + struct bt_coexist_info bt_coexist;
3744 + struct rtl_led_ctl ledctl;
3745 struct rtl_pci dev;
3746 struct mp_adapter ndis_adapter;
3747 - struct rtl_led_ctl ledctl;
3748 - struct bt_coexist_info bt_coexist;
3749 };
3750
3751 #define rtl_pcipriv(hw) (((struct rtl_pci_priv *)(rtl_priv(hw))->priv))
3752 diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c
3753 index 5f14308e8eb3..b1601441991d 100644
3754 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c
3755 +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/hw.c
3756 @@ -1003,7 +1003,7 @@ static void _rtl92ee_hw_configure(struct ieee80211_hw *hw)
3757 rtl_write_word(rtlpriv, REG_SIFS_TRX, 0x100a);
3758
3759 /* Note Data sheet don't define */
3760 - rtl_write_word(rtlpriv, 0x4C7, 0x80);
3761 + rtl_write_byte(rtlpriv, 0x4C7, 0x80);
3762
3763 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20);
3764
3765 diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c
3766 index bbb789f8990b..c2103e7a8132 100644
3767 --- a/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c
3768 +++ b/drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c
3769 @@ -1127,7 +1127,7 @@ static u8 _rtl8821ae_dbi_read(struct rtl_priv *rtlpriv, u16 addr)
3770 }
3771 if (0 == tmp) {
3772 read_addr = REG_DBI_RDATA + addr % 4;
3773 - ret = rtl_read_word(rtlpriv, read_addr);
3774 + ret = rtl_read_byte(rtlpriv, read_addr);
3775 }
3776 return ret;
3777 }
3778 diff --git a/drivers/net/wireless/realtek/rtlwifi/usb.h b/drivers/net/wireless/realtek/rtlwifi/usb.h
3779 index 685273ca9561..441c4412130c 100644
3780 --- a/drivers/net/wireless/realtek/rtlwifi/usb.h
3781 +++ b/drivers/net/wireless/realtek/rtlwifi/usb.h
3782 @@ -150,8 +150,9 @@ struct rtl_usb {
3783 };
3784
3785 struct rtl_usb_priv {
3786 - struct rtl_usb dev;
3787 + struct bt_coexist_info bt_coexist;
3788 struct rtl_led_ctl ledctl;
3789 + struct rtl_usb dev;
3790 };
3791
3792 #define rtl_usbpriv(hw) (((struct rtl_usb_priv *)(rtl_priv(hw))->priv))
3793 diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
3794 index 732ac71b82cd..88dbbeb8569b 100644
3795 --- a/drivers/regulator/core.c
3796 +++ b/drivers/regulator/core.c
3797 @@ -4273,12 +4273,13 @@ static void regulator_summary_show_subtree(struct seq_file *s,
3798 seq_puts(s, "\n");
3799
3800 list_for_each_entry(consumer, &rdev->consumer_list, list) {
3801 - if (consumer->dev->class == &regulator_class)
3802 + if (consumer->dev && consumer->dev->class == &regulator_class)
3803 continue;
3804
3805 seq_printf(s, "%*s%-*s ",
3806 (level + 1) * 3 + 1, "",
3807 - 30 - (level + 1) * 3, dev_name(consumer->dev));
3808 + 30 - (level + 1) * 3,
3809 + consumer->dev ? dev_name(consumer->dev) : "deviceless");
3810
3811 switch (rdev->desc->type) {
3812 case REGULATOR_VOLTAGE:
3813 diff --git a/drivers/rtc/rtc-sun6i.c b/drivers/rtc/rtc-sun6i.c
3814 index c169a2cd4727..e29cc9fca0bf 100644
3815 --- a/drivers/rtc/rtc-sun6i.c
3816 +++ b/drivers/rtc/rtc-sun6i.c
3817 @@ -37,9 +37,11 @@
3818
3819 /* Control register */
3820 #define SUN6I_LOSC_CTRL 0x0000
3821 +#define SUN6I_LOSC_CTRL_KEY (0x16aa << 16)
3822 #define SUN6I_LOSC_CTRL_ALM_DHMS_ACC BIT(9)
3823 #define SUN6I_LOSC_CTRL_RTC_HMS_ACC BIT(8)
3824 #define SUN6I_LOSC_CTRL_RTC_YMD_ACC BIT(7)
3825 +#define SUN6I_LOSC_CTRL_EXT_OSC BIT(0)
3826 #define SUN6I_LOSC_CTRL_ACC_MASK GENMASK(9, 7)
3827
3828 /* RTC */
3829 @@ -114,13 +116,17 @@ struct sun6i_rtc_dev {
3830 void __iomem *base;
3831 int irq;
3832 unsigned long alarm;
3833 +
3834 + spinlock_t lock;
3835 };
3836
3837 static irqreturn_t sun6i_rtc_alarmirq(int irq, void *id)
3838 {
3839 struct sun6i_rtc_dev *chip = (struct sun6i_rtc_dev *) id;
3840 + irqreturn_t ret = IRQ_NONE;
3841 u32 val;
3842
3843 + spin_lock(&chip->lock);
3844 val = readl(chip->base + SUN6I_ALRM_IRQ_STA);
3845
3846 if (val & SUN6I_ALRM_IRQ_STA_CNT_IRQ_PEND) {
3847 @@ -129,10 +135,11 @@ static irqreturn_t sun6i_rtc_alarmirq(int irq, void *id)
3848
3849 rtc_update_irq(chip->rtc, 1, RTC_AF | RTC_IRQF);
3850
3851 - return IRQ_HANDLED;
3852 + ret = IRQ_HANDLED;
3853 }
3854 + spin_unlock(&chip->lock);
3855
3856 - return IRQ_NONE;
3857 + return ret;
3858 }
3859
3860 static void sun6i_rtc_setaie(int to, struct sun6i_rtc_dev *chip)
3861 @@ -140,6 +147,7 @@ static void sun6i_rtc_setaie(int to, struct sun6i_rtc_dev *chip)
3862 u32 alrm_val = 0;
3863 u32 alrm_irq_val = 0;
3864 u32 alrm_wake_val = 0;
3865 + unsigned long flags;
3866
3867 if (to) {
3868 alrm_val = SUN6I_ALRM_EN_CNT_EN;
3869 @@ -150,9 +158,11 @@ static void sun6i_rtc_setaie(int to, struct sun6i_rtc_dev *chip)
3870 chip->base + SUN6I_ALRM_IRQ_STA);
3871 }
3872
3873 + spin_lock_irqsave(&chip->lock, flags);
3874 writel(alrm_val, chip->base + SUN6I_ALRM_EN);
3875 writel(alrm_irq_val, chip->base + SUN6I_ALRM_IRQ_EN);
3876 writel(alrm_wake_val, chip->base + SUN6I_ALARM_CONFIG);
3877 + spin_unlock_irqrestore(&chip->lock, flags);
3878 }
3879
3880 static int sun6i_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
3881 @@ -191,11 +201,15 @@ static int sun6i_rtc_gettime(struct device *dev, struct rtc_time *rtc_tm)
3882 static int sun6i_rtc_getalarm(struct device *dev, struct rtc_wkalrm *wkalrm)
3883 {
3884 struct sun6i_rtc_dev *chip = dev_get_drvdata(dev);
3885 + unsigned long flags;
3886 u32 alrm_st;
3887 u32 alrm_en;
3888
3889 + spin_lock_irqsave(&chip->lock, flags);
3890 alrm_en = readl(chip->base + SUN6I_ALRM_IRQ_EN);
3891 alrm_st = readl(chip->base + SUN6I_ALRM_IRQ_STA);
3892 + spin_unlock_irqrestore(&chip->lock, flags);
3893 +
3894 wkalrm->enabled = !!(alrm_en & SUN6I_ALRM_EN_CNT_EN);
3895 wkalrm->pending = !!(alrm_st & SUN6I_ALRM_EN_CNT_EN);
3896 rtc_time_to_tm(chip->alarm, &wkalrm->time);
3897 @@ -356,6 +370,7 @@ static int sun6i_rtc_probe(struct platform_device *pdev)
3898 chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL);
3899 if (!chip)
3900 return -ENOMEM;
3901 + spin_lock_init(&chip->lock);
3902
3903 platform_set_drvdata(pdev, chip);
3904 chip->dev = &pdev->dev;
3905 @@ -404,6 +419,10 @@ static int sun6i_rtc_probe(struct platform_device *pdev)
3906 /* disable alarm wakeup */
3907 writel(0, chip->base + SUN6I_ALARM_CONFIG);
3908
3909 + /* switch to the external, more precise, oscillator */
3910 + writel(SUN6I_LOSC_CTRL_KEY | SUN6I_LOSC_CTRL_EXT_OSC,
3911 + chip->base + SUN6I_LOSC_CTRL);
3912 +
3913 chip->rtc = rtc_device_register("rtc-sun6i", &pdev->dev,
3914 &sun6i_rtc_ops, THIS_MODULE);
3915 if (IS_ERR(chip->rtc)) {
3916 diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
3917 index bc0203f3d243..e415e1c58eb5 100644
3918 --- a/drivers/scsi/aacraid/src.c
3919 +++ b/drivers/scsi/aacraid/src.c
3920 @@ -413,16 +413,23 @@ static int aac_src_check_health(struct aac_dev *dev)
3921 u32 status = src_readl(dev, MUnit.OMR);
3922
3923 /*
3924 + * Check to see if the board panic'd.
3925 + */
3926 + if (unlikely(status & KERNEL_PANIC))
3927 + goto err_blink;
3928 +
3929 + /*
3930 * Check to see if the board failed any self tests.
3931 */
3932 if (unlikely(status & SELF_TEST_FAILED))
3933 - return -1;
3934 + goto err_out;
3935
3936 /*
3937 - * Check to see if the board panic'd.
3938 + * Check to see if the board failed any self tests.
3939 */
3940 - if (unlikely(status & KERNEL_PANIC))
3941 - return (status >> 16) & 0xFF;
3942 + if (unlikely(status & MONITOR_PANIC))
3943 + goto err_out;
3944 +
3945 /*
3946 * Wait for the adapter to be up and running.
3947 */
3948 @@ -432,6 +439,12 @@ static int aac_src_check_health(struct aac_dev *dev)
3949 * Everything is OK
3950 */
3951 return 0;
3952 +
3953 +err_out:
3954 + return -1;
3955 +
3956 +err_blink:
3957 + return (status > 16) & 0xFF;
3958 }
3959
3960 /**
3961 diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h
3962 index 33ec4fa39ccb..f224cdb2fce4 100644
3963 --- a/drivers/scsi/lpfc/lpfc_hw4.h
3964 +++ b/drivers/scsi/lpfc/lpfc_hw4.h
3965 @@ -1182,6 +1182,7 @@ struct lpfc_mbx_wq_create {
3966 #define lpfc_mbx_wq_create_page_size_SHIFT 0
3967 #define lpfc_mbx_wq_create_page_size_MASK 0x000000FF
3968 #define lpfc_mbx_wq_create_page_size_WORD word1
3969 +#define LPFC_WQ_PAGE_SIZE_4096 0x1
3970 #define lpfc_mbx_wq_create_wqe_size_SHIFT 8
3971 #define lpfc_mbx_wq_create_wqe_size_MASK 0x0000000F
3972 #define lpfc_mbx_wq_create_wqe_size_WORD word1
3973 @@ -1253,6 +1254,7 @@ struct rq_context {
3974 #define lpfc_rq_context_page_size_SHIFT 0 /* Version 1 Only */
3975 #define lpfc_rq_context_page_size_MASK 0x000000FF
3976 #define lpfc_rq_context_page_size_WORD word0
3977 +#define LPFC_RQ_PAGE_SIZE_4096 0x1
3978 uint32_t reserved1;
3979 uint32_t word2;
3980 #define lpfc_rq_context_cq_id_SHIFT 16
3981 diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
3982 index 92dfd6a5178c..f5aeda8f014f 100644
3983 --- a/drivers/scsi/lpfc/lpfc_sli.c
3984 +++ b/drivers/scsi/lpfc/lpfc_sli.c
3985 @@ -13475,7 +13475,7 @@ lpfc_wq_create(struct lpfc_hba *phba, struct lpfc_queue *wq,
3986 LPFC_WQ_WQE_SIZE_128);
3987 bf_set(lpfc_mbx_wq_create_page_size,
3988 &wq_create->u.request_1,
3989 - (PAGE_SIZE/SLI4_PAGE_SIZE));
3990 + LPFC_WQ_PAGE_SIZE_4096);
3991 page = wq_create->u.request_1.page;
3992 break;
3993 }
3994 @@ -13501,8 +13501,9 @@ lpfc_wq_create(struct lpfc_hba *phba, struct lpfc_queue *wq,
3995 LPFC_WQ_WQE_SIZE_128);
3996 break;
3997 }
3998 - bf_set(lpfc_mbx_wq_create_page_size, &wq_create->u.request_1,
3999 - (PAGE_SIZE/SLI4_PAGE_SIZE));
4000 + bf_set(lpfc_mbx_wq_create_page_size,
4001 + &wq_create->u.request_1,
4002 + LPFC_WQ_PAGE_SIZE_4096);
4003 page = wq_create->u.request_1.page;
4004 break;
4005 default:
4006 @@ -13688,7 +13689,7 @@ lpfc_rq_create(struct lpfc_hba *phba, struct lpfc_queue *hrq,
4007 LPFC_RQE_SIZE_8);
4008 bf_set(lpfc_rq_context_page_size,
4009 &rq_create->u.request.context,
4010 - (PAGE_SIZE/SLI4_PAGE_SIZE));
4011 + LPFC_RQ_PAGE_SIZE_4096);
4012 } else {
4013 switch (hrq->entry_count) {
4014 default:
4015 diff --git a/drivers/scsi/scsi_dh.c b/drivers/scsi/scsi_dh.c
4016 index e7649ed3f667..4d655b568269 100644
4017 --- a/drivers/scsi/scsi_dh.c
4018 +++ b/drivers/scsi/scsi_dh.c
4019 @@ -289,20 +289,6 @@ int scsi_unregister_device_handler(struct scsi_device_handler *scsi_dh)
4020 }
4021 EXPORT_SYMBOL_GPL(scsi_unregister_device_handler);
4022
4023 -static struct scsi_device *get_sdev_from_queue(struct request_queue *q)
4024 -{
4025 - struct scsi_device *sdev;
4026 - unsigned long flags;
4027 -
4028 - spin_lock_irqsave(q->queue_lock, flags);
4029 - sdev = q->queuedata;
4030 - if (!sdev || !get_device(&sdev->sdev_gendev))
4031 - sdev = NULL;
4032 - spin_unlock_irqrestore(q->queue_lock, flags);
4033 -
4034 - return sdev;
4035 -}
4036 -
4037 /*
4038 * scsi_dh_activate - activate the path associated with the scsi_device
4039 * corresponding to the given request queue.
4040 @@ -321,7 +307,7 @@ int scsi_dh_activate(struct request_queue *q, activate_complete fn, void *data)
4041 struct scsi_device *sdev;
4042 int err = SCSI_DH_NOSYS;
4043
4044 - sdev = get_sdev_from_queue(q);
4045 + sdev = scsi_device_from_queue(q);
4046 if (!sdev) {
4047 if (fn)
4048 fn(data, err);
4049 @@ -368,7 +354,7 @@ int scsi_dh_set_params(struct request_queue *q, const char *params)
4050 struct scsi_device *sdev;
4051 int err = -SCSI_DH_NOSYS;
4052
4053 - sdev = get_sdev_from_queue(q);
4054 + sdev = scsi_device_from_queue(q);
4055 if (!sdev)
4056 return err;
4057
4058 @@ -391,7 +377,7 @@ int scsi_dh_attach(struct request_queue *q, const char *name)
4059 struct scsi_device_handler *scsi_dh;
4060 int err = 0;
4061
4062 - sdev = get_sdev_from_queue(q);
4063 + sdev = scsi_device_from_queue(q);
4064 if (!sdev)
4065 return -ENODEV;
4066
4067 @@ -429,7 +415,7 @@ const char *scsi_dh_attached_handler_name(struct request_queue *q, gfp_t gfp)
4068 struct scsi_device *sdev;
4069 const char *handler_name = NULL;
4070
4071 - sdev = get_sdev_from_queue(q);
4072 + sdev = scsi_device_from_queue(q);
4073 if (!sdev)
4074 return NULL;
4075
4076 diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
4077 index 8558e3886960..887045ae5d10 100644
4078 --- a/drivers/scsi/scsi_lib.c
4079 +++ b/drivers/scsi/scsi_lib.c
4080 @@ -2215,6 +2215,29 @@ void scsi_mq_destroy_tags(struct Scsi_Host *shost)
4081 blk_mq_free_tag_set(&shost->tag_set);
4082 }
4083
4084 +/**
4085 + * scsi_device_from_queue - return sdev associated with a request_queue
4086 + * @q: The request queue to return the sdev from
4087 + *
4088 + * Return the sdev associated with a request queue or NULL if the
4089 + * request_queue does not reference a SCSI device.
4090 + */
4091 +struct scsi_device *scsi_device_from_queue(struct request_queue *q)
4092 +{
4093 + struct scsi_device *sdev = NULL;
4094 +
4095 + if (q->mq_ops) {
4096 + if (q->mq_ops == &scsi_mq_ops)
4097 + sdev = q->queuedata;
4098 + } else if (q->request_fn == scsi_request_fn)
4099 + sdev = q->queuedata;
4100 + if (!sdev || !get_device(&sdev->sdev_gendev))
4101 + sdev = NULL;
4102 +
4103 + return sdev;
4104 +}
4105 +EXPORT_SYMBOL_GPL(scsi_device_from_queue);
4106 +
4107 /*
4108 * Function: scsi_block_requests()
4109 *
4110 diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
4111 index 6ee50742f6a5..78430ef28ea4 100644
4112 --- a/drivers/scsi/sd.c
4113 +++ b/drivers/scsi/sd.c
4114 @@ -1398,11 +1398,15 @@ static int media_not_present(struct scsi_disk *sdkp,
4115 **/
4116 static unsigned int sd_check_events(struct gendisk *disk, unsigned int clearing)
4117 {
4118 - struct scsi_disk *sdkp = scsi_disk(disk);
4119 - struct scsi_device *sdp = sdkp->device;
4120 + struct scsi_disk *sdkp = scsi_disk_get(disk);
4121 + struct scsi_device *sdp;
4122 struct scsi_sense_hdr *sshdr = NULL;
4123 int retval;
4124
4125 + if (!sdkp)
4126 + return 0;
4127 +
4128 + sdp = sdkp->device;
4129 SCSI_LOG_HLQUEUE(3, sd_printk(KERN_INFO, sdkp, "sd_check_events\n"));
4130
4131 /*
4132 @@ -1459,6 +1463,7 @@ out:
4133 kfree(sshdr);
4134 retval = sdp->changed ? DISK_EVENT_MEDIA_CHANGE : 0;
4135 sdp->changed = 0;
4136 + scsi_disk_put(sdkp);
4137 return retval;
4138 }
4139
4140 diff --git a/drivers/scsi/storvsc_drv.c b/drivers/scsi/storvsc_drv.c
4141 index 0f636cc4c809..cd5c1c060481 100644
4142 --- a/drivers/scsi/storvsc_drv.c
4143 +++ b/drivers/scsi/storvsc_drv.c
4144 @@ -135,6 +135,8 @@ struct hv_fc_wwn_packet {
4145 #define SRB_FLAGS_PORT_DRIVER_RESERVED 0x0F000000
4146 #define SRB_FLAGS_CLASS_DRIVER_RESERVED 0xF0000000
4147
4148 +#define SP_UNTAGGED ((unsigned char) ~0)
4149 +#define SRB_SIMPLE_TAG_REQUEST 0x20
4150
4151 /*
4152 * Platform neutral description of a scsi request -
4153 @@ -354,6 +356,7 @@ enum storvsc_request_type {
4154 #define SRB_STATUS_SUCCESS 0x01
4155 #define SRB_STATUS_ABORTED 0x02
4156 #define SRB_STATUS_ERROR 0x04
4157 +#define SRB_STATUS_DATA_OVERRUN 0x12
4158
4159 #define SRB_STATUS(status) \
4160 (status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN))
4161 @@ -864,6 +867,13 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb,
4162 switch (SRB_STATUS(vm_srb->srb_status)) {
4163 case SRB_STATUS_ERROR:
4164 /*
4165 + * Let upper layer deal with error when
4166 + * sense message is present.
4167 + */
4168 +
4169 + if (vm_srb->srb_status & SRB_STATUS_AUTOSENSE_VALID)
4170 + break;
4171 + /*
4172 * If there is an error; offline the device since all
4173 * error recovery strategies would have already been
4174 * deployed on the host side. However, if the command
4175 @@ -927,6 +937,7 @@ static void storvsc_command_completion(struct storvsc_cmd_request *cmd_request)
4176 struct hv_host_device *host_dev = shost_priv(scmnd->device->host);
4177 struct scsi_sense_hdr sense_hdr;
4178 struct vmscsi_request *vm_srb;
4179 + u32 data_transfer_length;
4180 struct Scsi_Host *host;
4181 struct storvsc_device *stor_dev;
4182 struct hv_device *dev = host_dev->dev;
4183 @@ -937,6 +948,7 @@ static void storvsc_command_completion(struct storvsc_cmd_request *cmd_request)
4184 host = stor_dev->host;
4185
4186 vm_srb = &cmd_request->vstor_packet.vm_srb;
4187 + data_transfer_length = vm_srb->data_transfer_length;
4188
4189 scmnd->result = vm_srb->scsi_status;
4190
4191 @@ -947,13 +959,20 @@ static void storvsc_command_completion(struct storvsc_cmd_request *cmd_request)
4192 &sense_hdr);
4193 }
4194
4195 - if (vm_srb->srb_status != SRB_STATUS_SUCCESS)
4196 + if (vm_srb->srb_status != SRB_STATUS_SUCCESS) {
4197 storvsc_handle_error(vm_srb, scmnd, host, sense_hdr.asc,
4198 sense_hdr.ascq);
4199 + /*
4200 + * The Windows driver set data_transfer_length on
4201 + * SRB_STATUS_DATA_OVERRUN. On other errors, this value
4202 + * is untouched. In these cases we set it to 0.
4203 + */
4204 + if (vm_srb->srb_status != SRB_STATUS_DATA_OVERRUN)
4205 + data_transfer_length = 0;
4206 + }
4207
4208 scsi_set_resid(scmnd,
4209 - cmd_request->payload->range.len -
4210 - vm_srb->data_transfer_length);
4211 + cmd_request->payload->range.len - data_transfer_length);
4212
4213 scmnd->scsi_done(scmnd);
4214
4215 @@ -1409,6 +1428,13 @@ static int storvsc_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *scmnd)
4216 vm_srb->win8_extension.srb_flags |=
4217 SRB_FLAGS_DISABLE_SYNCH_TRANSFER;
4218
4219 + if (scmnd->device->tagged_supported) {
4220 + vm_srb->win8_extension.srb_flags |=
4221 + (SRB_FLAGS_QUEUE_ACTION_ENABLE | SRB_FLAGS_NO_QUEUE_FREEZE);
4222 + vm_srb->win8_extension.queue_tag = SP_UNTAGGED;
4223 + vm_srb->win8_extension.queue_action = SRB_SIMPLE_TAG_REQUEST;
4224 + }
4225 +
4226 /* Build the SRB */
4227 switch (scmnd->sc_data_direction) {
4228 case DMA_TO_DEVICE:
4229 diff --git a/drivers/staging/rtl8188eu/core/rtw_recv.c b/drivers/staging/rtl8188eu/core/rtw_recv.c
4230 index 110b8c0b6cd7..0f2fe34e14c2 100644
4231 --- a/drivers/staging/rtl8188eu/core/rtw_recv.c
4232 +++ b/drivers/staging/rtl8188eu/core/rtw_recv.c
4233 @@ -1405,6 +1405,9 @@ static int wlanhdr_to_ethhdr(struct recv_frame *precvframe)
4234 ptr = recvframe_pull(precvframe, (rmv_len-sizeof(struct ethhdr) + (bsnaphdr ? 2 : 0)));
4235 }
4236
4237 + if (!ptr)
4238 + return _FAIL;
4239 +
4240 memcpy(ptr, pattrib->dst, ETH_ALEN);
4241 memcpy(ptr+ETH_ALEN, pattrib->src, ETH_ALEN);
4242
4243 diff --git a/drivers/staging/rtl8712/rtl871x_recv.c b/drivers/staging/rtl8712/rtl871x_recv.c
4244 index 4ff530155187..04ac23cc47a8 100644
4245 --- a/drivers/staging/rtl8712/rtl871x_recv.c
4246 +++ b/drivers/staging/rtl8712/rtl871x_recv.c
4247 @@ -641,11 +641,16 @@ sint r8712_wlanhdr_to_ethhdr(union recv_frame *precvframe)
4248 /* append rx status for mp test packets */
4249 ptr = recvframe_pull(precvframe, (rmv_len -
4250 sizeof(struct ethhdr) + 2) - 24);
4251 + if (!ptr)
4252 + return _FAIL;
4253 memcpy(ptr, get_rxmem(precvframe), 24);
4254 ptr += 24;
4255 - } else
4256 + } else {
4257 ptr = recvframe_pull(precvframe, (rmv_len -
4258 sizeof(struct ethhdr) + (bsnaphdr ? 2 : 0)));
4259 + if (!ptr)
4260 + return _FAIL;
4261 + }
4262
4263 memcpy(ptr, pattrib->dst, ETH_ALEN);
4264 memcpy(ptr + ETH_ALEN, pattrib->src, ETH_ALEN);
4265 diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
4266 index bd810c109277..6ed80b05d674 100644
4267 --- a/drivers/target/iscsi/iscsi_target.c
4268 +++ b/drivers/target/iscsi/iscsi_target.c
4269 @@ -3436,7 +3436,7 @@ iscsit_build_sendtargets_response(struct iscsi_cmd *cmd,
4270
4271 if ((tpg->tpg_attrib.generate_node_acls == 0) &&
4272 (tpg->tpg_attrib.demo_mode_discovery == 0) &&
4273 - (!core_tpg_get_initiator_node_acl(&tpg->tpg_se_tpg,
4274 + (!target_tpg_has_node_acl(&tpg->tpg_se_tpg,
4275 cmd->conn->sess->sess_ops->InitiatorName))) {
4276 continue;
4277 }
4278 diff --git a/drivers/target/target_core_tpg.c b/drivers/target/target_core_tpg.c
4279 index 5fb9dd7f08bb..028854cda97b 100644
4280 --- a/drivers/target/target_core_tpg.c
4281 +++ b/drivers/target/target_core_tpg.c
4282 @@ -75,9 +75,21 @@ struct se_node_acl *core_tpg_get_initiator_node_acl(
4283 unsigned char *initiatorname)
4284 {
4285 struct se_node_acl *acl;
4286 -
4287 + /*
4288 + * Obtain se_node_acl->acl_kref using fabric driver provided
4289 + * initiatorname[] during node acl endpoint lookup driven by
4290 + * new se_session login.
4291 + *
4292 + * The reference is held until se_session shutdown -> release
4293 + * occurs via fabric driver invoked transport_deregister_session()
4294 + * or transport_free_session() code.
4295 + */
4296 mutex_lock(&tpg->acl_node_mutex);
4297 acl = __core_tpg_get_initiator_node_acl(tpg, initiatorname);
4298 + if (acl) {
4299 + if (!kref_get_unless_zero(&acl->acl_kref))
4300 + acl = NULL;
4301 + }
4302 mutex_unlock(&tpg->acl_node_mutex);
4303
4304 return acl;
4305 @@ -232,6 +244,25 @@ static void target_add_node_acl(struct se_node_acl *acl)
4306 acl->initiatorname);
4307 }
4308
4309 +bool target_tpg_has_node_acl(struct se_portal_group *tpg,
4310 + const char *initiatorname)
4311 +{
4312 + struct se_node_acl *acl;
4313 + bool found = false;
4314 +
4315 + mutex_lock(&tpg->acl_node_mutex);
4316 + list_for_each_entry(acl, &tpg->acl_node_list, acl_list) {
4317 + if (!strcmp(acl->initiatorname, initiatorname)) {
4318 + found = true;
4319 + break;
4320 + }
4321 + }
4322 + mutex_unlock(&tpg->acl_node_mutex);
4323 +
4324 + return found;
4325 +}
4326 +EXPORT_SYMBOL(target_tpg_has_node_acl);
4327 +
4328 struct se_node_acl *core_tpg_check_initiator_node_acl(
4329 struct se_portal_group *tpg,
4330 unsigned char *initiatorname)
4331 @@ -248,6 +279,15 @@ struct se_node_acl *core_tpg_check_initiator_node_acl(
4332 acl = target_alloc_node_acl(tpg, initiatorname);
4333 if (!acl)
4334 return NULL;
4335 + /*
4336 + * When allocating a dynamically generated node_acl, go ahead
4337 + * and take the extra kref now before returning to the fabric
4338 + * driver caller.
4339 + *
4340 + * Note this reference will be released at session shutdown
4341 + * time within transport_free_session() code.
4342 + */
4343 + kref_get(&acl->acl_kref);
4344 acl->dynamic_node_acl = 1;
4345
4346 /*
4347 diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
4348 index aa517c4fadb9..befe22744802 100644
4349 --- a/drivers/target/target_core_transport.c
4350 +++ b/drivers/target/target_core_transport.c
4351 @@ -341,7 +341,6 @@ void __transport_register_session(
4352 &buf[0], PR_REG_ISID_LEN);
4353 se_sess->sess_bin_isid = get_unaligned_be64(&buf[0]);
4354 }
4355 - kref_get(&se_nacl->acl_kref);
4356
4357 spin_lock_irq(&se_nacl->nacl_sess_lock);
4358 /*
4359 @@ -424,14 +423,27 @@ static void target_complete_nacl(struct kref *kref)
4360 {
4361 struct se_node_acl *nacl = container_of(kref,
4362 struct se_node_acl, acl_kref);
4363 + struct se_portal_group *se_tpg = nacl->se_tpg;
4364
4365 - complete(&nacl->acl_free_comp);
4366 + if (!nacl->dynamic_stop) {
4367 + complete(&nacl->acl_free_comp);
4368 + return;
4369 + }
4370 +
4371 + mutex_lock(&se_tpg->acl_node_mutex);
4372 + list_del(&nacl->acl_list);
4373 + mutex_unlock(&se_tpg->acl_node_mutex);
4374 +
4375 + core_tpg_wait_for_nacl_pr_ref(nacl);
4376 + core_free_device_list_for_node(nacl, se_tpg);
4377 + kfree(nacl);
4378 }
4379
4380 void target_put_nacl(struct se_node_acl *nacl)
4381 {
4382 kref_put(&nacl->acl_kref, target_complete_nacl);
4383 }
4384 +EXPORT_SYMBOL(target_put_nacl);
4385
4386 void transport_deregister_session_configfs(struct se_session *se_sess)
4387 {
4388 @@ -464,6 +476,42 @@ EXPORT_SYMBOL(transport_deregister_session_configfs);
4389
4390 void transport_free_session(struct se_session *se_sess)
4391 {
4392 + struct se_node_acl *se_nacl = se_sess->se_node_acl;
4393 +
4394 + /*
4395 + * Drop the se_node_acl->nacl_kref obtained from within
4396 + * core_tpg_get_initiator_node_acl().
4397 + */
4398 + if (se_nacl) {
4399 + struct se_portal_group *se_tpg = se_nacl->se_tpg;
4400 + const struct target_core_fabric_ops *se_tfo = se_tpg->se_tpg_tfo;
4401 + unsigned long flags;
4402 +
4403 + se_sess->se_node_acl = NULL;
4404 +
4405 + /*
4406 + * Also determine if we need to drop the extra ->cmd_kref if
4407 + * it had been previously dynamically generated, and
4408 + * the endpoint is not caching dynamic ACLs.
4409 + */
4410 + mutex_lock(&se_tpg->acl_node_mutex);
4411 + if (se_nacl->dynamic_node_acl &&
4412 + !se_tfo->tpg_check_demo_mode_cache(se_tpg)) {
4413 + spin_lock_irqsave(&se_nacl->nacl_sess_lock, flags);
4414 + if (list_empty(&se_nacl->acl_sess_list))
4415 + se_nacl->dynamic_stop = true;
4416 + spin_unlock_irqrestore(&se_nacl->nacl_sess_lock, flags);
4417 +
4418 + if (se_nacl->dynamic_stop)
4419 + list_del(&se_nacl->acl_list);
4420 + }
4421 + mutex_unlock(&se_tpg->acl_node_mutex);
4422 +
4423 + if (se_nacl->dynamic_stop)
4424 + target_put_nacl(se_nacl);
4425 +
4426 + target_put_nacl(se_nacl);
4427 + }
4428 if (se_sess->sess_cmd_map) {
4429 percpu_ida_destroy(&se_sess->sess_tag_pool);
4430 kvfree(se_sess->sess_cmd_map);
4431 @@ -475,16 +523,12 @@ EXPORT_SYMBOL(transport_free_session);
4432 void transport_deregister_session(struct se_session *se_sess)
4433 {
4434 struct se_portal_group *se_tpg = se_sess->se_tpg;
4435 - const struct target_core_fabric_ops *se_tfo;
4436 - struct se_node_acl *se_nacl;
4437 unsigned long flags;
4438 - bool comp_nacl = true, drop_nacl = false;
4439
4440 if (!se_tpg) {
4441 transport_free_session(se_sess);
4442 return;
4443 }
4444 - se_tfo = se_tpg->se_tpg_tfo;
4445
4446 spin_lock_irqsave(&se_tpg->session_lock, flags);
4447 list_del(&se_sess->sess_list);
4448 @@ -492,37 +536,16 @@ void transport_deregister_session(struct se_session *se_sess)
4449 se_sess->fabric_sess_ptr = NULL;
4450 spin_unlock_irqrestore(&se_tpg->session_lock, flags);
4451
4452 - /*
4453 - * Determine if we need to do extra work for this initiator node's
4454 - * struct se_node_acl if it had been previously dynamically generated.
4455 - */
4456 - se_nacl = se_sess->se_node_acl;
4457 -
4458 - mutex_lock(&se_tpg->acl_node_mutex);
4459 - if (se_nacl && se_nacl->dynamic_node_acl) {
4460 - if (!se_tfo->tpg_check_demo_mode_cache(se_tpg)) {
4461 - list_del(&se_nacl->acl_list);
4462 - se_tpg->num_node_acls--;
4463 - drop_nacl = true;
4464 - }
4465 - }
4466 - mutex_unlock(&se_tpg->acl_node_mutex);
4467 -
4468 - if (drop_nacl) {
4469 - core_tpg_wait_for_nacl_pr_ref(se_nacl);
4470 - core_free_device_list_for_node(se_nacl, se_tpg);
4471 - kfree(se_nacl);
4472 - comp_nacl = false;
4473 - }
4474 pr_debug("TARGET_CORE[%s]: Deregistered fabric_sess\n",
4475 se_tpg->se_tpg_tfo->get_fabric_name());
4476 /*
4477 * If last kref is dropping now for an explicit NodeACL, awake sleeping
4478 * ->acl_free_comp caller to wakeup configfs se_node_acl->acl_group
4479 - * removal context.
4480 + * removal context from within transport_free_session() code.
4481 + *
4482 + * For dynamic ACL, target_put_nacl() uses target_complete_nacl()
4483 + * to release all remaining generate_node_acl=1 created ACL resources.
4484 */
4485 - if (se_nacl && comp_nacl)
4486 - target_put_nacl(se_nacl);
4487
4488 transport_free_session(se_sess);
4489 }
4490 diff --git a/drivers/usb/gadget/udc/fsl_udc_core.c b/drivers/usb/gadget/udc/fsl_udc_core.c
4491 index aab5221d6c2e..aac0ce8aeb0b 100644
4492 --- a/drivers/usb/gadget/udc/fsl_udc_core.c
4493 +++ b/drivers/usb/gadget/udc/fsl_udc_core.c
4494 @@ -1249,6 +1249,12 @@ static const struct usb_gadget_ops fsl_gadget_ops = {
4495 .udc_stop = fsl_udc_stop,
4496 };
4497
4498 +/*
4499 + * Empty complete function used by this driver to fill in the req->complete
4500 + * field when creating a request since the complete field is mandatory.
4501 + */
4502 +static void fsl_noop_complete(struct usb_ep *ep, struct usb_request *req) { }
4503 +
4504 /* Set protocol stall on ep0, protocol stall will automatically be cleared
4505 on new transaction */
4506 static void ep0stall(struct fsl_udc *udc)
4507 @@ -1283,7 +1289,7 @@ static int ep0_prime_status(struct fsl_udc *udc, int direction)
4508 req->req.length = 0;
4509 req->req.status = -EINPROGRESS;
4510 req->req.actual = 0;
4511 - req->req.complete = NULL;
4512 + req->req.complete = fsl_noop_complete;
4513 req->dtd_count = 0;
4514
4515 ret = usb_gadget_map_request(&ep->udc->gadget, &req->req, ep_is_in(ep));
4516 @@ -1366,7 +1372,7 @@ static void ch9getstatus(struct fsl_udc *udc, u8 request_type, u16 value,
4517 req->req.length = 2;
4518 req->req.status = -EINPROGRESS;
4519 req->req.actual = 0;
4520 - req->req.complete = NULL;
4521 + req->req.complete = fsl_noop_complete;
4522 req->dtd_count = 0;
4523
4524 ret = usb_gadget_map_request(&ep->udc->gadget, &req->req, ep_is_in(ep));
4525 diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c
4526 index 4fe7c9b56bc0..19cb32a65161 100644
4527 --- a/drivers/usb/host/xhci-plat.c
4528 +++ b/drivers/usb/host/xhci-plat.c
4529 @@ -162,9 +162,6 @@ static int xhci_plat_probe(struct platform_device *pdev)
4530 (pdata && pdata->usb3_lpm_capable))
4531 xhci->quirks |= XHCI_LPM_SUPPORT;
4532
4533 - if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
4534 - xhci->shared_hcd->can_do_streams = 1;
4535 -
4536 hcd->usb_phy = devm_usb_get_phy_by_phandle(&pdev->dev, "usb-phy", 0);
4537 if (IS_ERR(hcd->usb_phy)) {
4538 ret = PTR_ERR(hcd->usb_phy);
4539 @@ -181,6 +178,9 @@ static int xhci_plat_probe(struct platform_device *pdev)
4540 if (ret)
4541 goto disable_usb_phy;
4542
4543 + if (HCC_MAX_PSA(xhci->hcc_params) >= 4)
4544 + xhci->shared_hcd->can_do_streams = 1;
4545 +
4546 ret = usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
4547 if (ret)
4548 goto dealloc_usb2_hcd;
4549 diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c
4550 index b03d3b867fca..9a9c82a4d35d 100644
4551 --- a/drivers/usb/musb/da8xx.c
4552 +++ b/drivers/usb/musb/da8xx.c
4553 @@ -458,15 +458,11 @@ static int da8xx_musb_exit(struct musb *musb)
4554 }
4555
4556 static const struct musb_platform_ops da8xx_ops = {
4557 - .quirks = MUSB_DMA_CPPI | MUSB_INDEXED_EP,
4558 + .quirks = MUSB_INDEXED_EP,
4559 .init = da8xx_musb_init,
4560 .exit = da8xx_musb_exit,
4561
4562 .fifo_mode = 2,
4563 -#ifdef CONFIG_USB_TI_CPPI_DMA
4564 - .dma_init = cppi_dma_controller_create,
4565 - .dma_exit = cppi_dma_controller_destroy,
4566 -#endif
4567 .enable = da8xx_musb_enable,
4568 .disable = da8xx_musb_disable,
4569
4570 diff --git a/drivers/w1/masters/ds2490.c b/drivers/w1/masters/ds2490.c
4571 index 049a884a756f..59d74d1b47a8 100644
4572 --- a/drivers/w1/masters/ds2490.c
4573 +++ b/drivers/w1/masters/ds2490.c
4574 @@ -153,6 +153,9 @@ struct ds_device
4575 */
4576 u16 spu_bit;
4577
4578 + u8 st_buf[ST_SIZE];
4579 + u8 byte_buf;
4580 +
4581 struct w1_bus_master master;
4582 };
4583
4584 @@ -174,7 +177,6 @@ struct ds_status
4585 u8 data_in_buffer_status;
4586 u8 reserved1;
4587 u8 reserved2;
4588 -
4589 };
4590
4591 static struct usb_device_id ds_id_table [] = {
4592 @@ -244,28 +246,6 @@ static int ds_send_control(struct ds_device *dev, u16 value, u16 index)
4593 return err;
4594 }
4595
4596 -static int ds_recv_status_nodump(struct ds_device *dev, struct ds_status *st,
4597 - unsigned char *buf, int size)
4598 -{
4599 - int count, err;
4600 -
4601 - memset(st, 0, sizeof(*st));
4602 -
4603 - count = 0;
4604 - err = usb_interrupt_msg(dev->udev, usb_rcvintpipe(dev->udev,
4605 - dev->ep[EP_STATUS]), buf, size, &count, 1000);
4606 - if (err < 0) {
4607 - pr_err("Failed to read 1-wire data from 0x%x: err=%d.\n",
4608 - dev->ep[EP_STATUS], err);
4609 - return err;
4610 - }
4611 -
4612 - if (count >= sizeof(*st))
4613 - memcpy(st, buf, sizeof(*st));
4614 -
4615 - return count;
4616 -}
4617 -
4618 static inline void ds_print_msg(unsigned char *buf, unsigned char *str, int off)
4619 {
4620 pr_info("%45s: %8x\n", str, buf[off]);
4621 @@ -324,6 +304,35 @@ static void ds_dump_status(struct ds_device *dev, unsigned char *buf, int count)
4622 }
4623 }
4624
4625 +static int ds_recv_status(struct ds_device *dev, struct ds_status *st,
4626 + bool dump)
4627 +{
4628 + int count, err;
4629 +
4630 + if (st)
4631 + memset(st, 0, sizeof(*st));
4632 +
4633 + count = 0;
4634 + err = usb_interrupt_msg(dev->udev,
4635 + usb_rcvintpipe(dev->udev,
4636 + dev->ep[EP_STATUS]),
4637 + dev->st_buf, sizeof(dev->st_buf),
4638 + &count, 1000);
4639 + if (err < 0) {
4640 + pr_err("Failed to read 1-wire data from 0x%x: err=%d.\n",
4641 + dev->ep[EP_STATUS], err);
4642 + return err;
4643 + }
4644 +
4645 + if (dump)
4646 + ds_dump_status(dev, dev->st_buf, count);
4647 +
4648 + if (st && count >= sizeof(*st))
4649 + memcpy(st, dev->st_buf, sizeof(*st));
4650 +
4651 + return count;
4652 +}
4653 +
4654 static void ds_reset_device(struct ds_device *dev)
4655 {
4656 ds_send_control_cmd(dev, CTL_RESET_DEVICE, 0);
4657 @@ -344,7 +353,6 @@ static void ds_reset_device(struct ds_device *dev)
4658 static int ds_recv_data(struct ds_device *dev, unsigned char *buf, int size)
4659 {
4660 int count, err;
4661 - struct ds_status st;
4662
4663 /* Careful on size. If size is less than what is available in
4664 * the input buffer, the device fails the bulk transfer and
4665 @@ -359,14 +367,9 @@ static int ds_recv_data(struct ds_device *dev, unsigned char *buf, int size)
4666 err = usb_bulk_msg(dev->udev, usb_rcvbulkpipe(dev->udev, dev->ep[EP_DATA_IN]),
4667 buf, size, &count, 1000);
4668 if (err < 0) {
4669 - u8 buf[ST_SIZE];
4670 - int count;
4671 -
4672 pr_info("Clearing ep0x%x.\n", dev->ep[EP_DATA_IN]);
4673 usb_clear_halt(dev->udev, usb_rcvbulkpipe(dev->udev, dev->ep[EP_DATA_IN]));
4674 -
4675 - count = ds_recv_status_nodump(dev, &st, buf, sizeof(buf));
4676 - ds_dump_status(dev, buf, count);
4677 + ds_recv_status(dev, NULL, true);
4678 return err;
4679 }
4680
4681 @@ -404,7 +407,6 @@ int ds_stop_pulse(struct ds_device *dev, int limit)
4682 {
4683 struct ds_status st;
4684 int count = 0, err = 0;
4685 - u8 buf[ST_SIZE];
4686
4687 do {
4688 err = ds_send_control(dev, CTL_HALT_EXE_IDLE, 0);
4689 @@ -413,7 +415,7 @@ int ds_stop_pulse(struct ds_device *dev, int limit)
4690 err = ds_send_control(dev, CTL_RESUME_EXE, 0);
4691 if (err)
4692 break;
4693 - err = ds_recv_status_nodump(dev, &st, buf, sizeof(buf));
4694 + err = ds_recv_status(dev, &st, false);
4695 if (err)
4696 break;
4697
4698 @@ -456,18 +458,17 @@ int ds_detect(struct ds_device *dev, struct ds_status *st)
4699
4700 static int ds_wait_status(struct ds_device *dev, struct ds_status *st)
4701 {
4702 - u8 buf[ST_SIZE];
4703 int err, count = 0;
4704
4705 do {
4706 st->status = 0;
4707 - err = ds_recv_status_nodump(dev, st, buf, sizeof(buf));
4708 + err = ds_recv_status(dev, st, false);
4709 #if 0
4710 if (err >= 0) {
4711 int i;
4712 printk("0x%x: count=%d, status: ", dev->ep[EP_STATUS], err);
4713 for (i=0; i<err; ++i)
4714 - printk("%02x ", buf[i]);
4715 + printk("%02x ", dev->st_buf[i]);
4716 printk("\n");
4717 }
4718 #endif
4719 @@ -485,7 +486,7 @@ static int ds_wait_status(struct ds_device *dev, struct ds_status *st)
4720 * can do something with it).
4721 */
4722 if (err > 16 || count >= 100 || err < 0)
4723 - ds_dump_status(dev, buf, err);
4724 + ds_dump_status(dev, dev->st_buf, err);
4725
4726 /* Extended data isn't an error. Well, a short is, but the dump
4727 * would have already told the user that and we can't do anything
4728 @@ -608,7 +609,6 @@ static int ds_write_byte(struct ds_device *dev, u8 byte)
4729 {
4730 int err;
4731 struct ds_status st;
4732 - u8 rbyte;
4733
4734 err = ds_send_control(dev, COMM_BYTE_IO | COMM_IM | dev->spu_bit, byte);
4735 if (err)
4736 @@ -621,11 +621,11 @@ static int ds_write_byte(struct ds_device *dev, u8 byte)
4737 if (err)
4738 return err;
4739
4740 - err = ds_recv_data(dev, &rbyte, sizeof(rbyte));
4741 + err = ds_recv_data(dev, &dev->byte_buf, 1);
4742 if (err < 0)
4743 return err;
4744
4745 - return !(byte == rbyte);
4746 + return !(byte == dev->byte_buf);
4747 }
4748
4749 static int ds_read_byte(struct ds_device *dev, u8 *byte)
4750 @@ -712,7 +712,6 @@ static void ds9490r_search(void *data, struct w1_master *master,
4751 int err;
4752 u16 value, index;
4753 struct ds_status st;
4754 - u8 st_buf[ST_SIZE];
4755 int search_limit;
4756 int found = 0;
4757 int i;
4758 @@ -724,7 +723,12 @@ static void ds9490r_search(void *data, struct w1_master *master,
4759 /* FIFO 128 bytes, bulk packet size 64, read a multiple of the
4760 * packet size.
4761 */
4762 - u64 buf[2*64/8];
4763 + const size_t bufsize = 2 * 64;
4764 + u64 *buf;
4765 +
4766 + buf = kmalloc(bufsize, GFP_KERNEL);
4767 + if (!buf)
4768 + return;
4769
4770 mutex_lock(&master->bus_mutex);
4771
4772 @@ -745,10 +749,9 @@ static void ds9490r_search(void *data, struct w1_master *master,
4773 do {
4774 schedule_timeout(jtime);
4775
4776 - if (ds_recv_status_nodump(dev, &st, st_buf, sizeof(st_buf)) <
4777 - sizeof(st)) {
4778 + err = ds_recv_status(dev, &st, false);
4779 + if (err < 0 || err < sizeof(st))
4780 break;
4781 - }
4782
4783 if (st.data_in_buffer_status) {
4784 /* Bulk in can receive partial ids, but when it does
4785 @@ -758,7 +761,7 @@ static void ds9490r_search(void *data, struct w1_master *master,
4786 * bulk without first checking if status says there
4787 * is data to read.
4788 */
4789 - err = ds_recv_data(dev, (u8 *)buf, sizeof(buf));
4790 + err = ds_recv_data(dev, (u8 *)buf, bufsize);
4791 if (err < 0)
4792 break;
4793 for (i = 0; i < err/8; ++i) {
4794 @@ -794,9 +797,14 @@ static void ds9490r_search(void *data, struct w1_master *master,
4795 }
4796 search_out:
4797 mutex_unlock(&master->bus_mutex);
4798 + kfree(buf);
4799 }
4800
4801 #if 0
4802 +/*
4803 + * FIXME: if this disabled code is ever used in the future all ds_send_data()
4804 + * calls must be changed to use a DMAable buffer.
4805 + */
4806 static int ds_match_access(struct ds_device *dev, u64 init)
4807 {
4808 int err;
4809 @@ -845,13 +853,12 @@ static int ds_set_path(struct ds_device *dev, u64 init)
4810
4811 static u8 ds9490r_touch_bit(void *data, u8 bit)
4812 {
4813 - u8 ret;
4814 struct ds_device *dev = data;
4815
4816 - if (ds_touch_bit(dev, bit, &ret))
4817 + if (ds_touch_bit(dev, bit, &dev->byte_buf))
4818 return 0;
4819
4820 - return ret;
4821 + return dev->byte_buf;
4822 }
4823
4824 #if 0
4825 @@ -866,13 +873,12 @@ static u8 ds9490r_read_bit(void *data)
4826 {
4827 struct ds_device *dev = data;
4828 int err;
4829 - u8 bit = 0;
4830
4831 - err = ds_touch_bit(dev, 1, &bit);
4832 + err = ds_touch_bit(dev, 1, &dev->byte_buf);
4833 if (err)
4834 return 0;
4835
4836 - return bit & 1;
4837 + return dev->byte_buf & 1;
4838 }
4839 #endif
4840
4841 @@ -887,32 +893,52 @@ static u8 ds9490r_read_byte(void *data)
4842 {
4843 struct ds_device *dev = data;
4844 int err;
4845 - u8 byte = 0;
4846
4847 - err = ds_read_byte(dev, &byte);
4848 + err = ds_read_byte(dev, &dev->byte_buf);
4849 if (err)
4850 return 0;
4851
4852 - return byte;
4853 + return dev->byte_buf;
4854 }
4855
4856 static void ds9490r_write_block(void *data, const u8 *buf, int len)
4857 {
4858 struct ds_device *dev = data;
4859 + u8 *tbuf;
4860 +
4861 + if (len <= 0)
4862 + return;
4863 +
4864 + tbuf = kmalloc(len, GFP_KERNEL);
4865 + if (!tbuf)
4866 + return;
4867
4868 - ds_write_block(dev, (u8 *)buf, len);
4869 + memcpy(tbuf, buf, len);
4870 + ds_write_block(dev, tbuf, len);
4871 +
4872 + kfree(tbuf);
4873 }
4874
4875 static u8 ds9490r_read_block(void *data, u8 *buf, int len)
4876 {
4877 struct ds_device *dev = data;
4878 int err;
4879 + u8 *tbuf;
4880
4881 - err = ds_read_block(dev, buf, len);
4882 - if (err < 0)
4883 + if (len <= 0)
4884 + return 0;
4885 +
4886 + tbuf = kmalloc(len, GFP_KERNEL);
4887 + if (!tbuf)
4888 return 0;
4889
4890 - return len;
4891 + err = ds_read_block(dev, tbuf, len);
4892 + if (err >= 0)
4893 + memcpy(buf, tbuf, len);
4894 +
4895 + kfree(tbuf);
4896 +
4897 + return err >= 0 ? len : 0;
4898 }
4899
4900 static u8 ds9490r_reset(void *data)
4901 diff --git a/drivers/w1/w1.c b/drivers/w1/w1.c
4902 index c9a7ff67d395..39886edfa222 100644
4903 --- a/drivers/w1/w1.c
4904 +++ b/drivers/w1/w1.c
4905 @@ -763,6 +763,7 @@ int w1_attach_slave_device(struct w1_master *dev, struct w1_reg_num *rn)
4906 dev_err(&dev->dev, "%s: Attaching %s failed.\n", __func__,
4907 sl->name);
4908 w1_family_put(sl->family);
4909 + atomic_dec(&sl->master->refcnt);
4910 kfree(sl);
4911 return err;
4912 }
4913 diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
4914 index 9da42ace762a..8a456f9b8a44 100644
4915 --- a/fs/ext4/extents.c
4916 +++ b/fs/ext4/extents.c
4917 @@ -5362,7 +5362,8 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle,
4918 ext4_lblk_t stop, *iterator, ex_start, ex_end;
4919
4920 /* Let path point to the last extent */
4921 - path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL, 0);
4922 + path = ext4_find_extent(inode, EXT_MAX_BLOCKS - 1, NULL,
4923 + EXT4_EX_NOCACHE);
4924 if (IS_ERR(path))
4925 return PTR_ERR(path);
4926
4927 @@ -5371,15 +5372,15 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle,
4928 if (!extent)
4929 goto out;
4930
4931 - stop = le32_to_cpu(extent->ee_block) +
4932 - ext4_ext_get_actual_len(extent);
4933 + stop = le32_to_cpu(extent->ee_block);
4934
4935 /*
4936 * In case of left shift, Don't start shifting extents until we make
4937 * sure the hole is big enough to accommodate the shift.
4938 */
4939 if (SHIFT == SHIFT_LEFT) {
4940 - path = ext4_find_extent(inode, start - 1, &path, 0);
4941 + path = ext4_find_extent(inode, start - 1, &path,
4942 + EXT4_EX_NOCACHE);
4943 if (IS_ERR(path))
4944 return PTR_ERR(path);
4945 depth = path->p_depth;
4946 @@ -5411,9 +5412,14 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle,
4947 else
4948 iterator = &stop;
4949
4950 - /* Its safe to start updating extents */
4951 - while (start < stop) {
4952 - path = ext4_find_extent(inode, *iterator, &path, 0);
4953 + /*
4954 + * Its safe to start updating extents. Start and stop are unsigned, so
4955 + * in case of right shift if extent with 0 block is reached, iterator
4956 + * becomes NULL to indicate the end of the loop.
4957 + */
4958 + while (iterator && start <= stop) {
4959 + path = ext4_find_extent(inode, *iterator, &path,
4960 + EXT4_EX_NOCACHE);
4961 if (IS_ERR(path))
4962 return PTR_ERR(path);
4963 depth = path->p_depth;
4964 @@ -5440,8 +5446,11 @@ ext4_ext_shift_extents(struct inode *inode, handle_t *handle,
4965 ext4_ext_get_actual_len(extent);
4966 } else {
4967 extent = EXT_FIRST_EXTENT(path[depth].p_hdr);
4968 - *iterator = le32_to_cpu(extent->ee_block) > 0 ?
4969 - le32_to_cpu(extent->ee_block) - 1 : 0;
4970 + if (le32_to_cpu(extent->ee_block) > 0)
4971 + *iterator = le32_to_cpu(extent->ee_block) - 1;
4972 + else
4973 + /* Beginning is reached, end of the loop */
4974 + iterator = NULL;
4975 /* Update path extent in case we need to stop */
4976 while (le32_to_cpu(extent->ee_block) < start)
4977 extent++;
4978 diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
4979 index 8968a93e2150..d4be4e23bc21 100644
4980 --- a/fs/ext4/inline.c
4981 +++ b/fs/ext4/inline.c
4982 @@ -933,8 +933,15 @@ int ext4_da_write_inline_data_end(struct inode *inode, loff_t pos,
4983 struct page *page)
4984 {
4985 int i_size_changed = 0;
4986 + int ret;
4987
4988 - copied = ext4_write_inline_data_end(inode, pos, len, copied, page);
4989 + ret = ext4_write_inline_data_end(inode, pos, len, copied, page);
4990 + if (ret < 0) {
4991 + unlock_page(page);
4992 + put_page(page);
4993 + return ret;
4994 + }
4995 + copied = ret;
4996
4997 /*
4998 * No need to use i_size_read() here, the i_size
4999 diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
5000 index 10690e5ba2eb..e0f862146793 100644
5001 --- a/fs/ext4/inode.c
5002 +++ b/fs/ext4/inode.c
5003 @@ -1165,8 +1165,11 @@ static int ext4_write_end(struct file *file,
5004 if (ext4_has_inline_data(inode)) {
5005 ret = ext4_write_inline_data_end(inode, pos, len,
5006 copied, page);
5007 - if (ret < 0)
5008 + if (ret < 0) {
5009 + unlock_page(page);
5010 + put_page(page);
5011 goto errout;
5012 + }
5013 copied = ret;
5014 } else
5015 copied = block_write_end(file, mapping, pos,
5016 @@ -1220,7 +1223,9 @@ errout:
5017 * set the buffer to be dirty, since in data=journalled mode we need
5018 * to call ext4_handle_dirty_metadata() instead.
5019 */
5020 -static void zero_new_buffers(struct page *page, unsigned from, unsigned to)
5021 +static void ext4_journalled_zero_new_buffers(handle_t *handle,
5022 + struct page *page,
5023 + unsigned from, unsigned to)
5024 {
5025 unsigned int block_start = 0, block_end;
5026 struct buffer_head *head, *bh;
5027 @@ -1237,7 +1242,7 @@ static void zero_new_buffers(struct page *page, unsigned from, unsigned to)
5028 size = min(to, block_end) - start;
5029
5030 zero_user(page, start, size);
5031 - set_buffer_uptodate(bh);
5032 + write_end_fn(handle, bh);
5033 }
5034 clear_buffer_new(bh);
5035 }
5036 @@ -1266,18 +1271,25 @@ static int ext4_journalled_write_end(struct file *file,
5037
5038 BUG_ON(!ext4_handle_valid(handle));
5039
5040 - if (ext4_has_inline_data(inode))
5041 - copied = ext4_write_inline_data_end(inode, pos, len,
5042 - copied, page);
5043 - else {
5044 - if (copied < len) {
5045 - if (!PageUptodate(page))
5046 - copied = 0;
5047 - zero_new_buffers(page, from+copied, to);
5048 + if (ext4_has_inline_data(inode)) {
5049 + ret = ext4_write_inline_data_end(inode, pos, len,
5050 + copied, page);
5051 + if (ret < 0) {
5052 + unlock_page(page);
5053 + put_page(page);
5054 + goto errout;
5055 }
5056 -
5057 + copied = ret;
5058 + } else if (unlikely(copied < len) && !PageUptodate(page)) {
5059 + copied = 0;
5060 + ext4_journalled_zero_new_buffers(handle, page, from, to);
5061 + } else {
5062 + if (unlikely(copied < len))
5063 + ext4_journalled_zero_new_buffers(handle, page,
5064 + from + copied, to);
5065 ret = ext4_walk_page_buffers(handle, page_buffers(page), from,
5066 - to, &partial, write_end_fn);
5067 + from + copied, &partial,
5068 + write_end_fn);
5069 if (!partial)
5070 SetPageUptodate(page);
5071 }
5072 @@ -1303,6 +1315,7 @@ static int ext4_journalled_write_end(struct file *file,
5073 */
5074 ext4_orphan_add(handle, inode);
5075
5076 +errout:
5077 ret2 = ext4_journal_stop(handle);
5078 if (!ret)
5079 ret = ret2;
5080 diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
5081 index b7a3957a9dca..84cd77663e1f 100644
5082 --- a/fs/ext4/mballoc.c
5083 +++ b/fs/ext4/mballoc.c
5084 @@ -3120,6 +3120,13 @@ ext4_mb_normalize_request(struct ext4_allocation_context *ac,
5085 if (ar->pright && start + size - 1 >= ar->lright)
5086 size -= start + size - ar->lright;
5087
5088 + /*
5089 + * Trim allocation request for filesystems with artificially small
5090 + * groups.
5091 + */
5092 + if (size > EXT4_BLOCKS_PER_GROUP(ac->ac_sb))
5093 + size = EXT4_BLOCKS_PER_GROUP(ac->ac_sb);
5094 +
5095 end = start + size;
5096
5097 /* check we don't cross already preallocated blocks */
5098 diff --git a/fs/ext4/super.c b/fs/ext4/super.c
5099 index b405a7b74ce0..6fe8e30eeb99 100644
5100 --- a/fs/ext4/super.c
5101 +++ b/fs/ext4/super.c
5102 @@ -793,6 +793,7 @@ static void ext4_put_super(struct super_block *sb)
5103 {
5104 struct ext4_sb_info *sbi = EXT4_SB(sb);
5105 struct ext4_super_block *es = sbi->s_es;
5106 + int aborted = 0;
5107 int i, err;
5108
5109 ext4_unregister_li_request(sb);
5110 @@ -802,9 +803,10 @@ static void ext4_put_super(struct super_block *sb)
5111 destroy_workqueue(sbi->rsv_conversion_wq);
5112
5113 if (sbi->s_journal) {
5114 + aborted = is_journal_aborted(sbi->s_journal);
5115 err = jbd2_journal_destroy(sbi->s_journal);
5116 sbi->s_journal = NULL;
5117 - if (err < 0)
5118 + if ((err < 0) && !aborted)
5119 ext4_abort(sb, "Couldn't clean up the journal");
5120 }
5121
5122 @@ -816,7 +818,7 @@ static void ext4_put_super(struct super_block *sb)
5123 ext4_ext_release(sb);
5124 ext4_xattr_put_super(sb);
5125
5126 - if (!(sb->s_flags & MS_RDONLY)) {
5127 + if (!(sb->s_flags & MS_RDONLY) && !aborted) {
5128 ext4_clear_feature_journal_needs_recovery(sb);
5129 es->s_state = cpu_to_le16(sbi->s_mount_state);
5130 }
5131 @@ -3746,7 +3748,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
5132 * root first: it may be modified in the journal!
5133 */
5134 if (!test_opt(sb, NOLOAD) && ext4_has_feature_journal(sb)) {
5135 - if (ext4_load_journal(sb, es, journal_devnum))
5136 + err = ext4_load_journal(sb, es, journal_devnum);
5137 + if (err)
5138 goto failed_mount3a;
5139 } else if (test_opt(sb, NOLOAD) && !(sb->s_flags & MS_RDONLY) &&
5140 ext4_has_feature_journal_needs_recovery(sb)) {
5141 diff --git a/fs/fuse/file.c b/fs/fuse/file.c
5142 index 8821c380a71a..11538a8be9f0 100644
5143 --- a/fs/fuse/file.c
5144 +++ b/fs/fuse/file.c
5145 @@ -100,6 +100,7 @@ static void fuse_file_put(struct fuse_file *ff, bool sync)
5146 iput(req->misc.release.inode);
5147 fuse_put_request(ff->fc, req);
5148 } else if (sync) {
5149 + __set_bit(FR_FORCE, &req->flags);
5150 __clear_bit(FR_BACKGROUND, &req->flags);
5151 fuse_request_send(ff->fc, req);
5152 iput(req->misc.release.inode);
5153 diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
5154 index 32e74710b1aa..9cd8c92b953d 100644
5155 --- a/fs/gfs2/glock.c
5156 +++ b/fs/gfs2/glock.c
5157 @@ -651,9 +651,11 @@ int gfs2_glock_get(struct gfs2_sbd *sdp, u64 number,
5158 struct kmem_cache *cachep;
5159 int ret, tries = 0;
5160
5161 + rcu_read_lock();
5162 gl = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms);
5163 if (gl && !lockref_get_not_dead(&gl->gl_lockref))
5164 gl = NULL;
5165 + rcu_read_unlock();
5166
5167 *glp = gl;
5168 if (gl)
5169 @@ -721,15 +723,18 @@ again:
5170
5171 if (ret == -EEXIST) {
5172 ret = 0;
5173 + rcu_read_lock();
5174 tmp = rhashtable_lookup_fast(&gl_hash_table, &name, ht_parms);
5175 if (tmp == NULL || !lockref_get_not_dead(&tmp->gl_lockref)) {
5176 if (++tries < 100) {
5177 + rcu_read_unlock();
5178 cond_resched();
5179 goto again;
5180 }
5181 tmp = NULL;
5182 ret = -ENOMEM;
5183 }
5184 + rcu_read_unlock();
5185 } else {
5186 WARN_ON_ONCE(ret);
5187 }
5188 diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
5189 index fa1b8e0dcacf..a2e724053919 100644
5190 --- a/fs/jbd2/transaction.c
5191 +++ b/fs/jbd2/transaction.c
5192 @@ -1876,7 +1876,9 @@ static void __jbd2_journal_temp_unlink_buffer(struct journal_head *jh)
5193
5194 __blist_del_buffer(list, jh);
5195 jh->b_jlist = BJ_None;
5196 - if (test_clear_buffer_jbddirty(bh))
5197 + if (transaction && is_journal_aborted(transaction->t_journal))
5198 + clear_buffer_jbddirty(bh);
5199 + else if (test_clear_buffer_jbddirty(bh))
5200 mark_buffer_dirty(bh); /* Expose it to the VM */
5201 }
5202
5203 diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
5204 index 9a524e763c3e..4e3679b25b9b 100644
5205 --- a/fs/nfs/nfs4proc.c
5206 +++ b/fs/nfs/nfs4proc.c
5207 @@ -2452,6 +2452,7 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
5208 ret = PTR_ERR(state);
5209 if (IS_ERR(state))
5210 goto out;
5211 + ctx->state = state;
5212 if (server->caps & NFS_CAP_POSIX_LOCK)
5213 set_bit(NFS_STATE_POSIX_LOCKS, &state->flags);
5214
5215 @@ -2474,7 +2475,6 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
5216 if (ret != 0)
5217 goto out;
5218
5219 - ctx->state = state;
5220 if (d_inode(dentry) == state->inode) {
5221 nfs_inode_attach_open_context(ctx);
5222 if (read_seqcount_retry(&sp->so_reclaim_seqcount, seq))
5223 @@ -4711,7 +4711,7 @@ out:
5224 */
5225 static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t buflen)
5226 {
5227 - struct page *pages[NFS4ACL_MAXPAGES] = {NULL, };
5228 + struct page *pages[NFS4ACL_MAXPAGES + 1] = {NULL, };
5229 struct nfs_getaclargs args = {
5230 .fh = NFS_FH(inode),
5231 .acl_pages = pages,
5232 @@ -4725,13 +4725,9 @@ static ssize_t __nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bu
5233 .rpc_argp = &args,
5234 .rpc_resp = &res,
5235 };
5236 - unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE);
5237 + unsigned int npages = DIV_ROUND_UP(buflen, PAGE_SIZE) + 1;
5238 int ret = -ENOMEM, i;
5239
5240 - /* As long as we're doing a round trip to the server anyway,
5241 - * let's be prepared for a page of acl data. */
5242 - if (npages == 0)
5243 - npages = 1;
5244 if (npages > ARRAY_SIZE(pages))
5245 return -ERANGE;
5246
5247 diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
5248 index 4e4441216804..1cb50bb898b0 100644
5249 --- a/fs/nfs/nfs4xdr.c
5250 +++ b/fs/nfs/nfs4xdr.c
5251 @@ -2487,7 +2487,7 @@ static void nfs4_xdr_enc_getacl(struct rpc_rqst *req, struct xdr_stream *xdr,
5252 encode_compound_hdr(xdr, req, &hdr);
5253 encode_sequence(xdr, &args->seq_args, &hdr);
5254 encode_putfh(xdr, args->fh, &hdr);
5255 - replen = hdr.replen + op_decode_hdr_maxsz + 1;
5256 + replen = hdr.replen + op_decode_hdr_maxsz;
5257 encode_getattr_two(xdr, FATTR4_WORD0_ACL, 0, &hdr);
5258
5259 xdr_inline_pages(&req->rq_rcv_buf, replen << 2,
5260 diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
5261 index 994d66fbb446..91e0c5429b4d 100644
5262 --- a/fs/nfsd/vfs.c
5263 +++ b/fs/nfsd/vfs.c
5264 @@ -369,7 +369,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
5265 __be32 err;
5266 int host_err;
5267 bool get_write_count;
5268 - int size_change = 0;
5269 + bool size_change = (iap->ia_valid & ATTR_SIZE);
5270
5271 if (iap->ia_valid & (ATTR_ATIME | ATTR_MTIME | ATTR_SIZE))
5272 accmode |= NFSD_MAY_WRITE|NFSD_MAY_OWNER_OVERRIDE;
5273 @@ -382,11 +382,11 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
5274 /* Get inode */
5275 err = fh_verify(rqstp, fhp, ftype, accmode);
5276 if (err)
5277 - goto out;
5278 + return err;
5279 if (get_write_count) {
5280 host_err = fh_want_write(fhp);
5281 if (host_err)
5282 - return nfserrno(host_err);
5283 + goto out;
5284 }
5285
5286 dentry = fhp->fh_dentry;
5287 @@ -397,20 +397,28 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
5288 iap->ia_valid &= ~ATTR_MODE;
5289
5290 if (!iap->ia_valid)
5291 - goto out;
5292 + return 0;
5293
5294 nfsd_sanitize_attrs(inode, iap);
5295
5296 + if (check_guard && guardtime != inode->i_ctime.tv_sec)
5297 + return nfserr_notsync;
5298 +
5299 /*
5300 * The size case is special, it changes the file in addition to the
5301 - * attributes.
5302 + * attributes, and file systems don't expect it to be mixed with
5303 + * "random" attribute changes. We thus split out the size change
5304 + * into a separate call to ->setattr, and do the rest as a separate
5305 + * setattr call.
5306 */
5307 - if (iap->ia_valid & ATTR_SIZE) {
5308 + if (size_change) {
5309 err = nfsd_get_write_access(rqstp, fhp, iap);
5310 if (err)
5311 - goto out;
5312 - size_change = 1;
5313 + return err;
5314 + }
5315
5316 + fh_lock(fhp);
5317 + if (size_change) {
5318 /*
5319 * RFC5661, Section 18.30.4:
5320 * Changing the size of a file with SETATTR indirectly
5321 @@ -418,29 +426,36 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, struct iattr *iap,
5322 *
5323 * (and similar for the older RFCs)
5324 */
5325 - if (iap->ia_size != i_size_read(inode))
5326 - iap->ia_valid |= ATTR_MTIME;
5327 - }
5328 + struct iattr size_attr = {
5329 + .ia_valid = ATTR_SIZE | ATTR_CTIME | ATTR_MTIME,
5330 + .ia_size = iap->ia_size,
5331 + };
5332
5333 - iap->ia_valid |= ATTR_CTIME;
5334 + host_err = notify_change(dentry, &size_attr, NULL);
5335 + if (host_err)
5336 + goto out_unlock;
5337 + iap->ia_valid &= ~ATTR_SIZE;
5338
5339 - if (check_guard && guardtime != inode->i_ctime.tv_sec) {
5340 - err = nfserr_notsync;
5341 - goto out_put_write_access;
5342 + /*
5343 + * Avoid the additional setattr call below if the only other
5344 + * attribute that the client sends is the mtime, as we update
5345 + * it as part of the size change above.
5346 + */
5347 + if ((iap->ia_valid & ~ATTR_MTIME) == 0)
5348 + goto out_unlock;
5349 }
5350
5351 - fh_lock(fhp);
5352 + iap->ia_valid |= ATTR_CTIME;
5353 host_err = notify_change(dentry, iap, NULL);
5354 - fh_unlock(fhp);
5355 - err = nfserrno(host_err);
5356
5357 -out_put_write_access:
5358 +out_unlock:
5359 + fh_unlock(fhp);
5360 if (size_change)
5361 put_write_access(inode);
5362 - if (!err)
5363 - err = nfserrno(commit_metadata(fhp));
5364 out:
5365 - return err;
5366 + if (!host_err)
5367 + host_err = commit_metadata(fhp);
5368 + return nfserrno(host_err);
5369 }
5370
5371 #if defined(CONFIG_NFSD_V4)
5372 diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h
5373 index d49e26c6cdc7..23e129ef6726 100644
5374 --- a/include/linux/intel-iommu.h
5375 +++ b/include/linux/intel-iommu.h
5376 @@ -153,8 +153,8 @@ static inline void dmar_writeq(void __iomem *addr, u64 val)
5377 #define DMA_TLB_GLOBAL_FLUSH (((u64)1) << 60)
5378 #define DMA_TLB_DSI_FLUSH (((u64)2) << 60)
5379 #define DMA_TLB_PSI_FLUSH (((u64)3) << 60)
5380 -#define DMA_TLB_IIRG(type) ((type >> 60) & 7)
5381 -#define DMA_TLB_IAIG(val) (((val) >> 57) & 7)
5382 +#define DMA_TLB_IIRG(type) ((type >> 60) & 3)
5383 +#define DMA_TLB_IAIG(val) (((val) >> 57) & 3)
5384 #define DMA_TLB_READ_DRAIN (((u64)1) << 49)
5385 #define DMA_TLB_WRITE_DRAIN (((u64)1) << 48)
5386 #define DMA_TLB_DID(id) (((u64)((id) & 0xffff)) << 32)
5387 @@ -164,9 +164,9 @@ static inline void dmar_writeq(void __iomem *addr, u64 val)
5388
5389 /* INVALID_DESC */
5390 #define DMA_CCMD_INVL_GRANU_OFFSET 61
5391 -#define DMA_ID_TLB_GLOBAL_FLUSH (((u64)1) << 3)
5392 -#define DMA_ID_TLB_DSI_FLUSH (((u64)2) << 3)
5393 -#define DMA_ID_TLB_PSI_FLUSH (((u64)3) << 3)
5394 +#define DMA_ID_TLB_GLOBAL_FLUSH (((u64)1) << 4)
5395 +#define DMA_ID_TLB_DSI_FLUSH (((u64)2) << 4)
5396 +#define DMA_ID_TLB_PSI_FLUSH (((u64)3) << 4)
5397 #define DMA_ID_TLB_READ_DRAIN (((u64)1) << 7)
5398 #define DMA_ID_TLB_WRITE_DRAIN (((u64)1) << 6)
5399 #define DMA_ID_TLB_DID(id) (((u64)((id & 0xffff) << 16)))
5400 @@ -316,8 +316,8 @@ enum {
5401 #define QI_DEV_EIOTLB_SIZE (((u64)1) << 11)
5402 #define QI_DEV_EIOTLB_GLOB(g) ((u64)g)
5403 #define QI_DEV_EIOTLB_PASID(p) (((u64)p) << 32)
5404 -#define QI_DEV_EIOTLB_SID(sid) ((u64)((sid) & 0xffff) << 32)
5405 -#define QI_DEV_EIOTLB_QDEP(qd) (((qd) & 0x1f) << 16)
5406 +#define QI_DEV_EIOTLB_SID(sid) ((u64)((sid) & 0xffff) << 16)
5407 +#define QI_DEV_EIOTLB_QDEP(qd) ((u64)((qd) & 0x1f) << 4)
5408 #define QI_DEV_EIOTLB_MAX_INVS 32
5409
5410 #define QI_PGRP_IDX(idx) (((u64)(idx)) << 55)
5411 diff --git a/include/rdma/ib_sa.h b/include/rdma/ib_sa.h
5412 index 301969552d0a..b43e64d69734 100644
5413 --- a/include/rdma/ib_sa.h
5414 +++ b/include/rdma/ib_sa.h
5415 @@ -138,12 +138,12 @@ struct ib_sa_path_rec {
5416 union ib_gid sgid;
5417 __be16 dlid;
5418 __be16 slid;
5419 - int raw_traffic;
5420 + u8 raw_traffic;
5421 /* reserved */
5422 __be32 flow_label;
5423 u8 hop_limit;
5424 u8 traffic_class;
5425 - int reversible;
5426 + u8 reversible;
5427 u8 numb_path;
5428 __be16 pkey;
5429 __be16 qos_class;
5430 @@ -204,7 +204,7 @@ struct ib_sa_mcmember_rec {
5431 u8 hop_limit;
5432 u8 scope;
5433 u8 join_state;
5434 - int proxy_join;
5435 + u8 proxy_join;
5436 };
5437
5438 /* Service Record Component Mask Sec 15.2.5.14 Ver 1.1 */
5439 diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
5440 index 4f6ba34cdee6..293b9a7f53bc 100644
5441 --- a/include/scsi/scsi_device.h
5442 +++ b/include/scsi/scsi_device.h
5443 @@ -307,6 +307,7 @@ extern void scsi_remove_device(struct scsi_device *);
5444 extern int scsi_unregister_device_handler(struct scsi_device_handler *scsi_dh);
5445 void scsi_attach_vpd(struct scsi_device *sdev);
5446
5447 +extern struct scsi_device *scsi_device_from_queue(struct request_queue *q);
5448 extern int scsi_device_get(struct scsi_device *);
5449 extern void scsi_device_put(struct scsi_device *);
5450 extern struct scsi_device *scsi_device_lookup(struct Scsi_Host *,
5451 diff --git a/include/soc/at91/at91sam9_ddrsdr.h b/include/soc/at91/at91sam9_ddrsdr.h
5452 index dc10c52e0e91..393362bdb860 100644
5453 --- a/include/soc/at91/at91sam9_ddrsdr.h
5454 +++ b/include/soc/at91/at91sam9_ddrsdr.h
5455 @@ -81,6 +81,7 @@
5456 #define AT91_DDRSDRC_LPCB_POWER_DOWN 2
5457 #define AT91_DDRSDRC_LPCB_DEEP_POWER_DOWN 3
5458 #define AT91_DDRSDRC_CLKFR (1 << 2) /* Clock Frozen */
5459 +#define AT91_DDRSDRC_LPDDR2_PWOFF (1 << 3) /* LPDDR Power Off */
5460 #define AT91_DDRSDRC_PASR (7 << 4) /* Partial Array Self Refresh */
5461 #define AT91_DDRSDRC_TCSR (3 << 8) /* Temperature Compensated Self Refresh */
5462 #define AT91_DDRSDRC_DS (3 << 10) /* Drive Strength */
5463 @@ -96,7 +97,9 @@
5464 #define AT91_DDRSDRC_MD_SDR 0
5465 #define AT91_DDRSDRC_MD_LOW_POWER_SDR 1
5466 #define AT91_DDRSDRC_MD_LOW_POWER_DDR 3
5467 +#define AT91_DDRSDRC_MD_LPDDR3 5
5468 #define AT91_DDRSDRC_MD_DDR2 6 /* [SAM9 Only] */
5469 +#define AT91_DDRSDRC_MD_LPDDR2 7
5470 #define AT91_DDRSDRC_DBW (1 << 4) /* Data Bus Width */
5471 #define AT91_DDRSDRC_DBW_32BITS (0 << 4)
5472 #define AT91_DDRSDRC_DBW_16BITS (1 << 4)
5473 diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h
5474 index 6afc6f388edf..800fe16cc36f 100644
5475 --- a/include/target/target_core_base.h
5476 +++ b/include/target/target_core_base.h
5477 @@ -544,6 +544,7 @@ struct se_node_acl {
5478 /* Used to signal demo mode created ACL, disabled by default */
5479 bool dynamic_node_acl;
5480 bool acl_stop:1;
5481 + bool dynamic_stop;
5482 u32 queue_depth;
5483 u32 acl_index;
5484 enum target_prot_type saved_prot_type;
5485 diff --git a/include/target/target_core_fabric.h b/include/target/target_core_fabric.h
5486 index ce9ea736f1d7..97069ecabe49 100644
5487 --- a/include/target/target_core_fabric.h
5488 +++ b/include/target/target_core_fabric.h
5489 @@ -168,6 +168,8 @@ void core_allocate_nexus_loss_ua(struct se_node_acl *acl);
5490
5491 struct se_node_acl *core_tpg_get_initiator_node_acl(struct se_portal_group *tpg,
5492 unsigned char *);
5493 +bool target_tpg_has_node_acl(struct se_portal_group *tpg,
5494 + const char *);
5495 struct se_node_acl *core_tpg_check_initiator_node_acl(struct se_portal_group *,
5496 unsigned char *);
5497 int core_tpg_set_initiator_node_queue_depth(struct se_portal_group *,
5498 diff --git a/ipc/shm.c b/ipc/shm.c
5499 index 3174634ca4e5..4982a4e7f009 100644
5500 --- a/ipc/shm.c
5501 +++ b/ipc/shm.c
5502 @@ -1083,8 +1083,8 @@ out_unlock1:
5503 * "raddr" thing points to kernel space, and there has to be a wrapper around
5504 * this.
5505 */
5506 -long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr,
5507 - unsigned long shmlba)
5508 +long do_shmat(int shmid, char __user *shmaddr, int shmflg,
5509 + ulong *raddr, unsigned long shmlba)
5510 {
5511 struct shmid_kernel *shp;
5512 unsigned long addr;
5513 @@ -1105,8 +1105,13 @@ long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr,
5514 goto out;
5515 else if ((addr = (ulong)shmaddr)) {
5516 if (addr & (shmlba - 1)) {
5517 - if (shmflg & SHM_RND)
5518 - addr &= ~(shmlba - 1); /* round down */
5519 + /*
5520 + * Round down to the nearest multiple of shmlba.
5521 + * For sane do_mmap_pgoff() parameters, avoid
5522 + * round downs that trigger nil-page and MAP_FIXED.
5523 + */
5524 + if ((shmflg & SHM_RND) && addr >= shmlba)
5525 + addr &= ~(shmlba - 1);
5526 else
5527 #ifndef __ARCH_FORCE_SHMLBA
5528 if (addr & ~PAGE_MASK)
5529 diff --git a/kernel/membarrier.c b/kernel/membarrier.c
5530 index 536c727a56e9..9f9284f37f8d 100644
5531 --- a/kernel/membarrier.c
5532 +++ b/kernel/membarrier.c
5533 @@ -16,6 +16,7 @@
5534
5535 #include <linux/syscalls.h>
5536 #include <linux/membarrier.h>
5537 +#include <linux/tick.h>
5538
5539 /*
5540 * Bitmask made from a "or" of all commands within enum membarrier_cmd,
5541 @@ -51,6 +52,9 @@
5542 */
5543 SYSCALL_DEFINE2(membarrier, int, cmd, int, flags)
5544 {
5545 + /* MEMBARRIER_CMD_SHARED is not compatible with nohz_full. */
5546 + if (tick_nohz_full_enabled())
5547 + return -ENOSYS;
5548 if (unlikely(flags))
5549 return -EINVAL;
5550 switch (cmd) {
5551 diff --git a/mm/filemap.c b/mm/filemap.c
5552 index c33c31d75a2b..69f75c77c098 100644
5553 --- a/mm/filemap.c
5554 +++ b/mm/filemap.c
5555 @@ -865,9 +865,12 @@ void page_endio(struct page *page, int rw, int err)
5556 unlock_page(page);
5557 } else { /* rw == WRITE */
5558 if (err) {
5559 + struct address_space *mapping;
5560 +
5561 SetPageError(page);
5562 - if (page->mapping)
5563 - mapping_set_error(page->mapping, err);
5564 + mapping = page_mapping(page);
5565 + if (mapping)
5566 + mapping_set_error(mapping, err);
5567 }
5568 end_page_writeback(page);
5569 }
5570 diff --git a/mm/page_alloc.c b/mm/page_alloc.c
5571 index 6a117213feb8..6f9005dcca2e 100644
5572 --- a/mm/page_alloc.c
5573 +++ b/mm/page_alloc.c
5574 @@ -2467,7 +2467,7 @@ static bool zone_local(struct zone *local_zone, struct zone *zone)
5575
5576 static bool zone_allows_reclaim(struct zone *local_zone, struct zone *zone)
5577 {
5578 - return node_distance(zone_to_nid(local_zone), zone_to_nid(zone)) <
5579 + return node_distance(zone_to_nid(local_zone), zone_to_nid(zone)) <=
5580 RECLAIM_DISTANCE;
5581 }
5582 #else /* CONFIG_NUMA */
5583 diff --git a/mm/vmpressure.c b/mm/vmpressure.c
5584 index c5afd573d7da..3fb15c25af87 100644
5585 --- a/mm/vmpressure.c
5586 +++ b/mm/vmpressure.c
5587 @@ -112,9 +112,16 @@ static enum vmpressure_levels vmpressure_calc_level(unsigned long scanned,
5588 unsigned long reclaimed)
5589 {
5590 unsigned long scale = scanned + reclaimed;
5591 - unsigned long pressure;
5592 + unsigned long pressure = 0;
5593
5594 /*
5595 + * reclaimed can be greater than scanned in cases
5596 + * like THP, where the scanned is 1 and reclaimed
5597 + * could be 512
5598 + */
5599 + if (reclaimed >= scanned)
5600 + goto out;
5601 + /*
5602 * We calculate the ratio (in percents) of how many pages were
5603 * scanned vs. reclaimed in a given time frame (window). Note that
5604 * time is in VM reclaimer's "ticks", i.e. number of pages
5605 @@ -124,6 +131,7 @@ static enum vmpressure_levels vmpressure_calc_level(unsigned long scanned,
5606 pressure = scale - (reclaimed * scale / scanned);
5607 pressure = pressure * 100 / scale;
5608
5609 +out:
5610 pr_debug("%s: %3lu (s: %lu r: %lu)\n", __func__, pressure,
5611 scanned, reclaimed);
5612
5613 diff --git a/samples/mic/mpssd/.gitignore b/samples/mic/mpssd/.gitignore
5614 new file mode 100644
5615 index 000000000000..8b7c72f07c92
5616 --- /dev/null
5617 +++ b/samples/mic/mpssd/.gitignore
5618 @@ -0,0 +1 @@
5619 +mpssd
5620 diff --git a/samples/mic/mpssd/Makefile b/samples/mic/mpssd/Makefile
5621 new file mode 100644
5622 index 000000000000..3e3ef91fed6b
5623 --- /dev/null
5624 +++ b/samples/mic/mpssd/Makefile
5625 @@ -0,0 +1,27 @@
5626 +ifndef CROSS_COMPILE
5627 +uname_M := $(shell uname -m 2>/dev/null || echo not)
5628 +ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/)
5629 +
5630 +ifeq ($(ARCH),x86)
5631 +
5632 +PROGS := mpssd
5633 +CC = $(CROSS_COMPILE)gcc
5634 +CFLAGS := -I../../../usr/include -I../../../tools/include
5635 +
5636 +ifdef DEBUG
5637 +CFLAGS += -DDEBUG=$(DEBUG)
5638 +endif
5639 +
5640 +all: $(PROGS)
5641 +mpssd: mpssd.c sysfs.c
5642 + $(CC) $(CFLAGS) mpssd.c sysfs.c -o mpssd -lpthread
5643 +
5644 +install:
5645 + install mpssd /usr/sbin/mpssd
5646 + install micctrl /usr/sbin/micctrl
5647 +
5648 +clean:
5649 + rm -fr $(PROGS)
5650 +
5651 +endif
5652 +endif
5653 diff --git a/samples/mic/mpssd/micctrl b/samples/mic/mpssd/micctrl
5654 new file mode 100644
5655 index 000000000000..8f2629b41c5f
5656 --- /dev/null
5657 +++ b/samples/mic/mpssd/micctrl
5658 @@ -0,0 +1,173 @@
5659 +#!/bin/bash
5660 +# Intel MIC Platform Software Stack (MPSS)
5661 +#
5662 +# Copyright(c) 2013 Intel Corporation.
5663 +#
5664 +# This program is free software; you can redistribute it and/or modify
5665 +# it under the terms of the GNU General Public License, version 2, as
5666 +# published by the Free Software Foundation.
5667 +#
5668 +# This program is distributed in the hope that it will be useful, but
5669 +# WITHOUT ANY WARRANTY; without even the implied warranty of
5670 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5671 +# General Public License for more details.
5672 +#
5673 +# The full GNU General Public License is included in this distribution in
5674 +# the file called "COPYING".
5675 +#
5676 +# Intel MIC User Space Tools.
5677 +#
5678 +# micctrl - Controls MIC boot/start/stop.
5679 +#
5680 +# chkconfig: 2345 95 05
5681 +# description: start MPSS stack processing.
5682 +#
5683 +### BEGIN INIT INFO
5684 +# Provides: micctrl
5685 +### END INIT INFO
5686 +
5687 +# Source function library.
5688 +. /etc/init.d/functions
5689 +
5690 +sysfs="/sys/class/mic"
5691 +
5692 +_status()
5693 +{
5694 + f=$sysfs/$1
5695 + echo -e $1 state: "`cat $f/state`" shutdown_status: "`cat $f/shutdown_status`"
5696 +}
5697 +
5698 +status()
5699 +{
5700 + if [ "`echo $1 | head -c3`" == "mic" ]; then
5701 + _status $1
5702 + return $?
5703 + fi
5704 + for f in $sysfs/*
5705 + do
5706 + _status `basename $f`
5707 + RETVAL=$?
5708 + [ $RETVAL -ne 0 ] && return $RETVAL
5709 + done
5710 + return 0
5711 +}
5712 +
5713 +_reset()
5714 +{
5715 + f=$sysfs/$1
5716 + echo reset > $f/state
5717 +}
5718 +
5719 +reset()
5720 +{
5721 + if [ "`echo $1 | head -c3`" == "mic" ]; then
5722 + _reset $1
5723 + return $?
5724 + fi
5725 + for f in $sysfs/*
5726 + do
5727 + _reset `basename $f`
5728 + RETVAL=$?
5729 + [ $RETVAL -ne 0 ] && return $RETVAL
5730 + done
5731 + return 0
5732 +}
5733 +
5734 +_boot()
5735 +{
5736 + f=$sysfs/$1
5737 + echo "linux" > $f/bootmode
5738 + echo "mic/uos.img" > $f/firmware
5739 + echo "mic/$1.image" > $f/ramdisk
5740 + echo "boot" > $f/state
5741 +}
5742 +
5743 +boot()
5744 +{
5745 + if [ "`echo $1 | head -c3`" == "mic" ]; then
5746 + _boot $1
5747 + return $?
5748 + fi
5749 + for f in $sysfs/*
5750 + do
5751 + _boot `basename $f`
5752 + RETVAL=$?
5753 + [ $RETVAL -ne 0 ] && return $RETVAL
5754 + done
5755 + return 0
5756 +}
5757 +
5758 +_shutdown()
5759 +{
5760 + f=$sysfs/$1
5761 + echo shutdown > $f/state
5762 +}
5763 +
5764 +shutdown()
5765 +{
5766 + if [ "`echo $1 | head -c3`" == "mic" ]; then
5767 + _shutdown $1
5768 + return $?
5769 + fi
5770 + for f in $sysfs/*
5771 + do
5772 + _shutdown `basename $f`
5773 + RETVAL=$?
5774 + [ $RETVAL -ne 0 ] && return $RETVAL
5775 + done
5776 + return 0
5777 +}
5778 +
5779 +_wait()
5780 +{
5781 + f=$sysfs/$1
5782 + while [ "`cat $f/state`" != "offline" -a "`cat $f/state`" != "online" ]
5783 + do
5784 + sleep 1
5785 + echo -e "Waiting for $1 to go offline"
5786 + done
5787 +}
5788 +
5789 +wait()
5790 +{
5791 + if [ "`echo $1 | head -c3`" == "mic" ]; then
5792 + _wait $1
5793 + return $?
5794 + fi
5795 + # Wait for the cards to go offline
5796 + for f in $sysfs/*
5797 + do
5798 + _wait `basename $f`
5799 + RETVAL=$?
5800 + [ $RETVAL -ne 0 ] && return $RETVAL
5801 + done
5802 + return 0
5803 +}
5804 +
5805 +if [ ! -d "$sysfs" ]; then
5806 + echo -e $"Module unloaded "
5807 + exit 3
5808 +fi
5809 +
5810 +case $1 in
5811 + -s)
5812 + status $2
5813 + ;;
5814 + -r)
5815 + reset $2
5816 + ;;
5817 + -b)
5818 + boot $2
5819 + ;;
5820 + -S)
5821 + shutdown $2
5822 + ;;
5823 + -w)
5824 + wait $2
5825 + ;;
5826 + *)
5827 + echo $"Usage: $0 {-s (status) |-r (reset) |-b (boot) |-S (shutdown) |-w (wait)}"
5828 + exit 2
5829 +esac
5830 +
5831 +exit $?
5832 diff --git a/samples/mic/mpssd/mpss b/samples/mic/mpssd/mpss
5833 new file mode 100644
5834 index 000000000000..09ea90931649
5835 --- /dev/null
5836 +++ b/samples/mic/mpssd/mpss
5837 @@ -0,0 +1,200 @@
5838 +#!/bin/bash
5839 +# Intel MIC Platform Software Stack (MPSS)
5840 +#
5841 +# Copyright(c) 2013 Intel Corporation.
5842 +#
5843 +# This program is free software; you can redistribute it and/or modify
5844 +# it under the terms of the GNU General Public License, version 2, as
5845 +# published by the Free Software Foundation.
5846 +#
5847 +# This program is distributed in the hope that it will be useful, but
5848 +# WITHOUT ANY WARRANTY; without even the implied warranty of
5849 +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
5850 +# General Public License for more details.
5851 +#
5852 +# The full GNU General Public License is included in this distribution in
5853 +# the file called "COPYING".
5854 +#
5855 +# Intel MIC User Space Tools.
5856 +#
5857 +# mpss Start mpssd.
5858 +#
5859 +# chkconfig: 2345 95 05
5860 +# description: start MPSS stack processing.
5861 +#
5862 +### BEGIN INIT INFO
5863 +# Provides: mpss
5864 +# Required-Start:
5865 +# Required-Stop:
5866 +# Short-Description: MPSS stack control
5867 +# Description: MPSS stack control
5868 +### END INIT INFO
5869 +
5870 +# Source function library.
5871 +. /etc/init.d/functions
5872 +
5873 +exec=/usr/sbin/mpssd
5874 +sysfs="/sys/class/mic"
5875 +mic_modules="mic_host mic_x100_dma scif"
5876 +
5877 +start()
5878 +{
5879 + [ -x $exec ] || exit 5
5880 +
5881 + if [ "`ps -e | awk '{print $4}' | grep mpssd | head -1`" = "mpssd" ]; then
5882 + echo -e $"MPSSD already running! "
5883 + success
5884 + echo
5885 + return 0
5886 + fi
5887 +
5888 + echo -e $"Starting MPSS Stack"
5889 + echo -e $"Loading MIC drivers:" $mic_modules
5890 +
5891 + modprobe -a $mic_modules
5892 + RETVAL=$?
5893 + if [ $RETVAL -ne 0 ]; then
5894 + failure
5895 + echo
5896 + return $RETVAL
5897 + fi
5898 +
5899 + # Start the daemon
5900 + echo -n $"Starting MPSSD "
5901 + $exec
5902 + RETVAL=$?
5903 + if [ $RETVAL -ne 0 ]; then
5904 + failure
5905 + echo
5906 + return $RETVAL
5907 + fi
5908 + success
5909 + echo
5910 +
5911 + sleep 5
5912 +
5913 + # Boot the cards
5914 + micctrl -b
5915 +
5916 + # Wait till ping works
5917 + for f in $sysfs/*
5918 + do
5919 + count=100
5920 + ipaddr=`cat $f/cmdline`
5921 + ipaddr=${ipaddr#*address,}
5922 + ipaddr=`echo $ipaddr | cut -d, -f1 | cut -d\; -f1`
5923 + while [ $count -ge 0 ]
5924 + do
5925 + echo -e "Pinging "`basename $f`" "
5926 + ping -c 1 $ipaddr &> /dev/null
5927 + RETVAL=$?
5928 + if [ $RETVAL -eq 0 ]; then
5929 + success
5930 + break
5931 + fi
5932 + sleep 1
5933 + count=`expr $count - 1`
5934 + done
5935 + [ $RETVAL -ne 0 ] && failure || success
5936 + echo
5937 + done
5938 + return $RETVAL
5939 +}
5940 +
5941 +stop()
5942 +{
5943 + echo -e $"Shutting down MPSS Stack: "
5944 +
5945 + # Bail out if module is unloaded
5946 + if [ ! -d "$sysfs" ]; then
5947 + echo -n $"Module unloaded "
5948 + success
5949 + echo
5950 + return 0
5951 + fi
5952 +
5953 + # Shut down the cards.
5954 + micctrl -S
5955 +
5956 + # Wait for the cards to go offline
5957 + for f in $sysfs/*
5958 + do
5959 + while [ "`cat $f/state`" != "ready" ]
5960 + do
5961 + sleep 1
5962 + echo -e "Waiting for "`basename $f`" to become ready"
5963 + done
5964 + done
5965 +
5966 + # Display the status of the cards
5967 + micctrl -s
5968 +
5969 + # Kill MPSSD now
5970 + echo -n $"Killing MPSSD"
5971 + killall -9 mpssd 2>/dev/null
5972 + RETVAL=$?
5973 + [ $RETVAL -ne 0 ] && failure || success
5974 + echo
5975 + return $RETVAL
5976 +}
5977 +
5978 +restart()
5979 +{
5980 + stop
5981 + sleep 5
5982 + start
5983 +}
5984 +
5985 +status()
5986 +{
5987 + micctrl -s
5988 + if [ "`ps -e | awk '{print $4}' | grep mpssd | head -n 1`" = "mpssd" ]; then
5989 + echo "mpssd is running"
5990 + else
5991 + echo "mpssd is stopped"
5992 + fi
5993 + return 0
5994 +}
5995 +
5996 +unload()
5997 +{
5998 + if [ ! -d "$sysfs" ]; then
5999 + echo -n $"No MIC_HOST Module: "
6000 + success
6001 + echo
6002 + return
6003 + fi
6004 +
6005 + stop
6006 +
6007 + sleep 5
6008 + echo -n $"Removing MIC drivers:" $mic_modules
6009 + modprobe -r $mic_modules
6010 + RETVAL=$?
6011 + [ $RETVAL -ne 0 ] && failure || success
6012 + echo
6013 + return $RETVAL
6014 +}
6015 +
6016 +case $1 in
6017 + start)
6018 + start
6019 + ;;
6020 + stop)
6021 + stop
6022 + ;;
6023 + restart)
6024 + restart
6025 + ;;
6026 + status)
6027 + status
6028 + ;;
6029 + unload)
6030 + unload
6031 + ;;
6032 + *)
6033 + echo $"Usage: $0 {start|stop|restart|status|unload}"
6034 + exit 2
6035 +esac
6036 +
6037 +exit $?
6038 diff --git a/samples/mic/mpssd/mpssd.c b/samples/mic/mpssd/mpssd.c
6039 new file mode 100644
6040 index 000000000000..c99a75968c01
6041 --- /dev/null
6042 +++ b/samples/mic/mpssd/mpssd.c
6043 @@ -0,0 +1,1826 @@
6044 +/*
6045 + * Intel MIC Platform Software Stack (MPSS)
6046 + *
6047 + * Copyright(c) 2013 Intel Corporation.
6048 + *
6049 + * This program is free software; you can redistribute it and/or modify
6050 + * it under the terms of the GNU General Public License, version 2, as
6051 + * published by the Free Software Foundation.
6052 + *
6053 + * This program is distributed in the hope that it will be useful, but
6054 + * WITHOUT ANY WARRANTY; without even the implied warranty of
6055 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
6056 + * General Public License for more details.
6057 + *
6058 + * The full GNU General Public License is included in this distribution in
6059 + * the file called "COPYING".
6060 + *
6061 + * Intel MIC User Space Tools.
6062 + */
6063 +
6064 +#define _GNU_SOURCE
6065 +
6066 +#include <stdlib.h>
6067 +#include <fcntl.h>
6068 +#include <getopt.h>
6069 +#include <assert.h>
6070 +#include <unistd.h>
6071 +#include <stdbool.h>
6072 +#include <signal.h>
6073 +#include <poll.h>
6074 +#include <features.h>
6075 +#include <sys/types.h>
6076 +#include <sys/stat.h>
6077 +#include <sys/mman.h>
6078 +#include <sys/socket.h>
6079 +#include <linux/virtio_ring.h>
6080 +#include <linux/virtio_net.h>
6081 +#include <linux/virtio_console.h>
6082 +#include <linux/virtio_blk.h>
6083 +#include <linux/version.h>
6084 +#include "mpssd.h"
6085 +#include <linux/mic_ioctl.h>
6086 +#include <linux/mic_common.h>
6087 +#include <tools/endian.h>
6088 +
6089 +static void *init_mic(void *arg);
6090 +
6091 +static FILE *logfp;
6092 +static struct mic_info mic_list;
6093 +
6094 +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
6095 +
6096 +#define min_t(type, x, y) ({ \
6097 + type __min1 = (x); \
6098 + type __min2 = (y); \
6099 + __min1 < __min2 ? __min1 : __min2; })
6100 +
6101 +/* align addr on a size boundary - adjust address up/down if needed */
6102 +#define _ALIGN_DOWN(addr, size) ((addr)&(~((size)-1)))
6103 +#define _ALIGN_UP(addr, size) _ALIGN_DOWN(addr + size - 1, size)
6104 +
6105 +/* align addr on a size boundary - adjust address up if needed */
6106 +#define _ALIGN(addr, size) _ALIGN_UP(addr, size)
6107 +
6108 +/* to align the pointer to the (next) page boundary */
6109 +#define PAGE_ALIGN(addr) _ALIGN(addr, PAGE_SIZE)
6110 +
6111 +#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
6112 +
6113 +#define GSO_ENABLED 1
6114 +#define MAX_GSO_SIZE (64 * 1024)
6115 +#define ETH_H_LEN 14
6116 +#define MAX_NET_PKT_SIZE (_ALIGN_UP(MAX_GSO_SIZE + ETH_H_LEN, 64))
6117 +#define MIC_DEVICE_PAGE_END 0x1000
6118 +
6119 +#ifndef VIRTIO_NET_HDR_F_DATA_VALID
6120 +#define VIRTIO_NET_HDR_F_DATA_VALID 2 /* Csum is valid */
6121 +#endif
6122 +
6123 +static struct {
6124 + struct mic_device_desc dd;
6125 + struct mic_vqconfig vqconfig[2];
6126 + __u32 host_features, guest_acknowledgements;
6127 + struct virtio_console_config cons_config;
6128 +} virtcons_dev_page = {
6129 + .dd = {
6130 + .type = VIRTIO_ID_CONSOLE,
6131 + .num_vq = ARRAY_SIZE(virtcons_dev_page.vqconfig),
6132 + .feature_len = sizeof(virtcons_dev_page.host_features),
6133 + .config_len = sizeof(virtcons_dev_page.cons_config),
6134 + },
6135 + .vqconfig[0] = {
6136 + .num = htole16(MIC_VRING_ENTRIES),
6137 + },
6138 + .vqconfig[1] = {
6139 + .num = htole16(MIC_VRING_ENTRIES),
6140 + },
6141 +};
6142 +
6143 +static struct {
6144 + struct mic_device_desc dd;
6145 + struct mic_vqconfig vqconfig[2];
6146 + __u32 host_features, guest_acknowledgements;
6147 + struct virtio_net_config net_config;
6148 +} virtnet_dev_page = {
6149 + .dd = {
6150 + .type = VIRTIO_ID_NET,
6151 + .num_vq = ARRAY_SIZE(virtnet_dev_page.vqconfig),
6152 + .feature_len = sizeof(virtnet_dev_page.host_features),
6153 + .config_len = sizeof(virtnet_dev_page.net_config),
6154 + },
6155 + .vqconfig[0] = {
6156 + .num = htole16(MIC_VRING_ENTRIES),
6157 + },
6158 + .vqconfig[1] = {
6159 + .num = htole16(MIC_VRING_ENTRIES),
6160 + },
6161 +#if GSO_ENABLED
6162 + .host_features = htole32(
6163 + 1 << VIRTIO_NET_F_CSUM |
6164 + 1 << VIRTIO_NET_F_GSO |
6165 + 1 << VIRTIO_NET_F_GUEST_TSO4 |
6166 + 1 << VIRTIO_NET_F_GUEST_TSO6 |
6167 + 1 << VIRTIO_NET_F_GUEST_ECN),
6168 +#else
6169 + .host_features = 0,
6170 +#endif
6171 +};
6172 +
6173 +static const char *mic_config_dir = "/etc/mpss";
6174 +static const char *virtblk_backend = "VIRTBLK_BACKEND";
6175 +static struct {
6176 + struct mic_device_desc dd;
6177 + struct mic_vqconfig vqconfig[1];
6178 + __u32 host_features, guest_acknowledgements;
6179 + struct virtio_blk_config blk_config;
6180 +} virtblk_dev_page = {
6181 + .dd = {
6182 + .type = VIRTIO_ID_BLOCK,
6183 + .num_vq = ARRAY_SIZE(virtblk_dev_page.vqconfig),
6184 + .feature_len = sizeof(virtblk_dev_page.host_features),
6185 + .config_len = sizeof(virtblk_dev_page.blk_config),
6186 + },
6187 + .vqconfig[0] = {
6188 + .num = htole16(MIC_VRING_ENTRIES),
6189 + },
6190 + .host_features =
6191 + htole32(1<<VIRTIO_BLK_F_SEG_MAX),
6192 + .blk_config = {
6193 + .seg_max = htole32(MIC_VRING_ENTRIES - 2),
6194 + .capacity = htole64(0),
6195 + }
6196 +};
6197 +
6198 +static char *myname;
6199 +
6200 +static int
6201 +tap_configure(struct mic_info *mic, char *dev)
6202 +{
6203 + pid_t pid;
6204 + char *ifargv[7];
6205 + char ipaddr[IFNAMSIZ];
6206 + int ret = 0;
6207 +
6208 + pid = fork();
6209 + if (pid == 0) {
6210 + ifargv[0] = "ip";
6211 + ifargv[1] = "link";
6212 + ifargv[2] = "set";
6213 + ifargv[3] = dev;
6214 + ifargv[4] = "up";
6215 + ifargv[5] = NULL;
6216 + mpsslog("Configuring %s\n", dev);
6217 + ret = execvp("ip", ifargv);
6218 + if (ret < 0) {
6219 + mpsslog("%s execvp failed errno %s\n",
6220 + mic->name, strerror(errno));
6221 + return ret;
6222 + }
6223 + }
6224 + if (pid < 0) {
6225 + mpsslog("%s fork failed errno %s\n",
6226 + mic->name, strerror(errno));
6227 + return ret;
6228 + }
6229 +
6230 + ret = waitpid(pid, NULL, 0);
6231 + if (ret < 0) {
6232 + mpsslog("%s waitpid failed errno %s\n",
6233 + mic->name, strerror(errno));
6234 + return ret;
6235 + }
6236 +
6237 + snprintf(ipaddr, IFNAMSIZ, "172.31.%d.254/24", mic->id + 1);
6238 +
6239 + pid = fork();
6240 + if (pid == 0) {
6241 + ifargv[0] = "ip";
6242 + ifargv[1] = "addr";
6243 + ifargv[2] = "add";
6244 + ifargv[3] = ipaddr;
6245 + ifargv[4] = "dev";
6246 + ifargv[5] = dev;
6247 + ifargv[6] = NULL;
6248 + mpsslog("Configuring %s ipaddr %s\n", dev, ipaddr);
6249 + ret = execvp("ip", ifargv);
6250 + if (ret < 0) {
6251 + mpsslog("%s execvp failed errno %s\n",
6252 + mic->name, strerror(errno));
6253 + return ret;
6254 + }
6255 + }
6256 + if (pid < 0) {
6257 + mpsslog("%s fork failed errno %s\n",
6258 + mic->name, strerror(errno));
6259 + return ret;
6260 + }
6261 +
6262 + ret = waitpid(pid, NULL, 0);
6263 + if (ret < 0) {
6264 + mpsslog("%s waitpid failed errno %s\n",
6265 + mic->name, strerror(errno));
6266 + return ret;
6267 + }
6268 + mpsslog("MIC name %s %s %d DONE!\n",
6269 + mic->name, __func__, __LINE__);
6270 + return 0;
6271 +}
6272 +
6273 +static int tun_alloc(struct mic_info *mic, char *dev)
6274 +{
6275 + struct ifreq ifr;
6276 + int fd, err;
6277 +#if GSO_ENABLED
6278 + unsigned offload;
6279 +#endif
6280 + fd = open("/dev/net/tun", O_RDWR);
6281 + if (fd < 0) {
6282 + mpsslog("Could not open /dev/net/tun %s\n", strerror(errno));
6283 + goto done;
6284 + }
6285 +
6286 + memset(&ifr, 0, sizeof(ifr));
6287 +
6288 + ifr.ifr_flags = IFF_TAP | IFF_NO_PI | IFF_VNET_HDR;
6289 + if (*dev)
6290 + strncpy(ifr.ifr_name, dev, IFNAMSIZ);
6291 +
6292 + err = ioctl(fd, TUNSETIFF, (void *)&ifr);
6293 + if (err < 0) {
6294 + mpsslog("%s %s %d TUNSETIFF failed %s\n",
6295 + mic->name, __func__, __LINE__, strerror(errno));
6296 + close(fd);
6297 + return err;
6298 + }
6299 +#if GSO_ENABLED
6300 + offload = TUN_F_CSUM | TUN_F_TSO4 | TUN_F_TSO6 | TUN_F_TSO_ECN;
6301 +
6302 + err = ioctl(fd, TUNSETOFFLOAD, offload);
6303 + if (err < 0) {
6304 + mpsslog("%s %s %d TUNSETOFFLOAD failed %s\n",
6305 + mic->name, __func__, __LINE__, strerror(errno));
6306 + close(fd);
6307 + return err;
6308 + }
6309 +#endif
6310 + strcpy(dev, ifr.ifr_name);
6311 + mpsslog("Created TAP %s\n", dev);
6312 +done:
6313 + return fd;
6314 +}
6315 +
6316 +#define NET_FD_VIRTIO_NET 0
6317 +#define NET_FD_TUN 1
6318 +#define MAX_NET_FD 2
6319 +
6320 +static void set_dp(struct mic_info *mic, int type, void *dp)
6321 +{
6322 + switch (type) {
6323 + case VIRTIO_ID_CONSOLE:
6324 + mic->mic_console.console_dp = dp;
6325 + return;
6326 + case VIRTIO_ID_NET:
6327 + mic->mic_net.net_dp = dp;
6328 + return;
6329 + case VIRTIO_ID_BLOCK:
6330 + mic->mic_virtblk.block_dp = dp;
6331 + return;
6332 + }
6333 + mpsslog("%s %s %d not found\n", mic->name, __func__, type);
6334 + assert(0);
6335 +}
6336 +
6337 +static void *get_dp(struct mic_info *mic, int type)
6338 +{
6339 + switch (type) {
6340 + case VIRTIO_ID_CONSOLE:
6341 + return mic->mic_console.console_dp;
6342 + case VIRTIO_ID_NET:
6343 + return mic->mic_net.net_dp;
6344 + case VIRTIO_ID_BLOCK:
6345 + return mic->mic_virtblk.block_dp;
6346 + }
6347 + mpsslog("%s %s %d not found\n", mic->name, __func__, type);
6348 + assert(0);
6349 + return NULL;
6350 +}
6351 +
6352 +static struct mic_device_desc *get_device_desc(struct mic_info *mic, int type)
6353 +{
6354 + struct mic_device_desc *d;
6355 + int i;
6356 + void *dp = get_dp(mic, type);
6357 +
6358 + for (i = sizeof(struct mic_bootparam); i < PAGE_SIZE;
6359 + i += mic_total_desc_size(d)) {
6360 + d = dp + i;
6361 +
6362 + /* End of list */
6363 + if (d->type == 0)
6364 + break;
6365 +
6366 + if (d->type == -1)
6367 + continue;
6368 +
6369 + mpsslog("%s %s d-> type %d d %p\n",
6370 + mic->name, __func__, d->type, d);
6371 +
6372 + if (d->type == (__u8)type)
6373 + return d;
6374 + }
6375 + mpsslog("%s %s %d not found\n", mic->name, __func__, type);
6376 + return NULL;
6377 +}
6378 +
6379 +/* See comments in vhost.c for explanation of next_desc() */
6380 +static unsigned next_desc(struct vring_desc *desc)
6381 +{
6382 + unsigned int next;
6383 +
6384 + if (!(le16toh(desc->flags) & VRING_DESC_F_NEXT))
6385 + return -1U;
6386 + next = le16toh(desc->next);
6387 + return next;
6388 +}
6389 +
6390 +/* Sum up all the IOVEC length */
6391 +static ssize_t
6392 +sum_iovec_len(struct mic_copy_desc *copy)
6393 +{
6394 + ssize_t sum = 0;
6395 + int i;
6396 +
6397 + for (i = 0; i < copy->iovcnt; i++)
6398 + sum += copy->iov[i].iov_len;
6399 + return sum;
6400 +}
6401 +
6402 +static inline void verify_out_len(struct mic_info *mic,
6403 + struct mic_copy_desc *copy)
6404 +{
6405 + if (copy->out_len != sum_iovec_len(copy)) {
6406 + mpsslog("%s %s %d BUG copy->out_len 0x%x len 0x%zx\n",
6407 + mic->name, __func__, __LINE__,
6408 + copy->out_len, sum_iovec_len(copy));
6409 + assert(copy->out_len == sum_iovec_len(copy));
6410 + }
6411 +}
6412 +
6413 +/* Display an iovec */
6414 +static void
6415 +disp_iovec(struct mic_info *mic, struct mic_copy_desc *copy,
6416 + const char *s, int line)
6417 +{
6418 + int i;
6419 +
6420 + for (i = 0; i < copy->iovcnt; i++)
6421 + mpsslog("%s %s %d copy->iov[%d] addr %p len 0x%zx\n",
6422 + mic->name, s, line, i,
6423 + copy->iov[i].iov_base, copy->iov[i].iov_len);
6424 +}
6425 +
6426 +static inline __u16 read_avail_idx(struct mic_vring *vr)
6427 +{
6428 + return ACCESS_ONCE(vr->info->avail_idx);
6429 +}
6430 +
6431 +static inline void txrx_prepare(int type, bool tx, struct mic_vring *vr,
6432 + struct mic_copy_desc *copy, ssize_t len)
6433 +{
6434 + copy->vr_idx = tx ? 0 : 1;
6435 + copy->update_used = true;
6436 + if (type == VIRTIO_ID_NET)
6437 + copy->iov[1].iov_len = len - sizeof(struct virtio_net_hdr);
6438 + else
6439 + copy->iov[0].iov_len = len;
6440 +}
6441 +
6442 +/* Central API which triggers the copies */
6443 +static int
6444 +mic_virtio_copy(struct mic_info *mic, int fd,
6445 + struct mic_vring *vr, struct mic_copy_desc *copy)
6446 +{
6447 + int ret;
6448 +
6449 + ret = ioctl(fd, MIC_VIRTIO_COPY_DESC, copy);
6450 + if (ret) {
6451 + mpsslog("%s %s %d errno %s ret %d\n",
6452 + mic->name, __func__, __LINE__,
6453 + strerror(errno), ret);
6454 + }
6455 + return ret;
6456 +}
6457 +
6458 +static inline unsigned _vring_size(unsigned int num, unsigned long align)
6459 +{
6460 + return ((sizeof(struct vring_desc) * num + sizeof(__u16) * (3 + num)
6461 + + align - 1) & ~(align - 1))
6462 + + sizeof(__u16) * 3 + sizeof(struct vring_used_elem) * num;
6463 +}
6464 +
6465 +/*
6466 + * This initialization routine requires at least one
6467 + * vring i.e. vr0. vr1 is optional.
6468 + */
6469 +static void *
6470 +init_vr(struct mic_info *mic, int fd, int type,
6471 + struct mic_vring *vr0, struct mic_vring *vr1, int num_vq)
6472 +{
6473 + int vr_size;
6474 + char *va;
6475 +
6476 + vr_size = PAGE_ALIGN(_vring_size(MIC_VRING_ENTRIES,
6477 + MIC_VIRTIO_RING_ALIGN) +
6478 + sizeof(struct _mic_vring_info));
6479 + va = mmap(NULL, MIC_DEVICE_PAGE_END + vr_size * num_vq,
6480 + PROT_READ, MAP_SHARED, fd, 0);
6481 + if (MAP_FAILED == va) {
6482 + mpsslog("%s %s %d mmap failed errno %s\n",
6483 + mic->name, __func__, __LINE__,
6484 + strerror(errno));
6485 + goto done;
6486 + }
6487 + set_dp(mic, type, va);
6488 + vr0->va = (struct mic_vring *)&va[MIC_DEVICE_PAGE_END];
6489 + vr0->info = vr0->va +
6490 + _vring_size(MIC_VRING_ENTRIES, MIC_VIRTIO_RING_ALIGN);
6491 + vring_init(&vr0->vr,
6492 + MIC_VRING_ENTRIES, vr0->va, MIC_VIRTIO_RING_ALIGN);
6493 + mpsslog("%s %s vr0 %p vr0->info %p vr_size 0x%x vring 0x%x ",
6494 + __func__, mic->name, vr0->va, vr0->info, vr_size,
6495 + _vring_size(MIC_VRING_ENTRIES, MIC_VIRTIO_RING_ALIGN));
6496 + mpsslog("magic 0x%x expected 0x%x\n",
6497 + le32toh(vr0->info->magic), MIC_MAGIC + type);
6498 + assert(le32toh(vr0->info->magic) == MIC_MAGIC + type);
6499 + if (vr1) {
6500 + vr1->va = (struct mic_vring *)
6501 + &va[MIC_DEVICE_PAGE_END + vr_size];
6502 + vr1->info = vr1->va + _vring_size(MIC_VRING_ENTRIES,
6503 + MIC_VIRTIO_RING_ALIGN);
6504 + vring_init(&vr1->vr,
6505 + MIC_VRING_ENTRIES, vr1->va, MIC_VIRTIO_RING_ALIGN);
6506 + mpsslog("%s %s vr1 %p vr1->info %p vr_size 0x%x vring 0x%x ",
6507 + __func__, mic->name, vr1->va, vr1->info, vr_size,
6508 + _vring_size(MIC_VRING_ENTRIES, MIC_VIRTIO_RING_ALIGN));
6509 + mpsslog("magic 0x%x expected 0x%x\n",
6510 + le32toh(vr1->info->magic), MIC_MAGIC + type + 1);
6511 + assert(le32toh(vr1->info->magic) == MIC_MAGIC + type + 1);
6512 + }
6513 +done:
6514 + return va;
6515 +}
6516 +
6517 +static int
6518 +wait_for_card_driver(struct mic_info *mic, int fd, int type)
6519 +{
6520 + struct pollfd pollfd;
6521 + int err;
6522 + struct mic_device_desc *desc = get_device_desc(mic, type);
6523 + __u8 prev_status;
6524 +
6525 + if (!desc)
6526 + return -ENODEV;
6527 + prev_status = desc->status;
6528 + pollfd.fd = fd;
6529 + mpsslog("%s %s Waiting .... desc-> type %d status 0x%x\n",
6530 + mic->name, __func__, type, desc->status);
6531 +
6532 + while (1) {
6533 + pollfd.events = POLLIN;
6534 + pollfd.revents = 0;
6535 + err = poll(&pollfd, 1, -1);
6536 + if (err < 0) {
6537 + mpsslog("%s %s poll failed %s\n",
6538 + mic->name, __func__, strerror(errno));
6539 + continue;
6540 + }
6541 +
6542 + if (pollfd.revents) {
6543 + if (desc->status != prev_status) {
6544 + mpsslog("%s %s Waiting... desc-> type %d "
6545 + "status 0x%x\n",
6546 + mic->name, __func__, type,
6547 + desc->status);
6548 + prev_status = desc->status;
6549 + }
6550 + if (desc->status & VIRTIO_CONFIG_S_DRIVER_OK) {
6551 + mpsslog("%s %s poll.revents %d\n",
6552 + mic->name, __func__, pollfd.revents);
6553 + mpsslog("%s %s desc-> type %d status 0x%x\n",
6554 + mic->name, __func__, type,
6555 + desc->status);
6556 + break;
6557 + }
6558 + }
6559 + }
6560 + return 0;
6561 +}
6562 +
6563 +/* Spin till we have some descriptors */
6564 +static void
6565 +spin_for_descriptors(struct mic_info *mic, struct mic_vring *vr)
6566 +{
6567 + __u16 avail_idx = read_avail_idx(vr);
6568 +
6569 + while (avail_idx == le16toh(ACCESS_ONCE(vr->vr.avail->idx))) {
6570 +#ifdef DEBUG
6571 + mpsslog("%s %s waiting for desc avail %d info_avail %d\n",
6572 + mic->name, __func__,
6573 + le16toh(vr->vr.avail->idx), vr->info->avail_idx);
6574 +#endif
6575 + sched_yield();
6576 + }
6577 +}
6578 +
6579 +static void *
6580 +virtio_net(void *arg)
6581 +{
6582 + static __u8 vnet_hdr[2][sizeof(struct virtio_net_hdr)];
6583 + static __u8 vnet_buf[2][MAX_NET_PKT_SIZE] __attribute__ ((aligned(64)));
6584 + struct iovec vnet_iov[2][2] = {
6585 + { { .iov_base = vnet_hdr[0], .iov_len = sizeof(vnet_hdr[0]) },
6586 + { .iov_base = vnet_buf[0], .iov_len = sizeof(vnet_buf[0]) } },
6587 + { { .iov_base = vnet_hdr[1], .iov_len = sizeof(vnet_hdr[1]) },
6588 + { .iov_base = vnet_buf[1], .iov_len = sizeof(vnet_buf[1]) } },
6589 + };
6590 + struct iovec *iov0 = vnet_iov[0], *iov1 = vnet_iov[1];
6591 + struct mic_info *mic = (struct mic_info *)arg;
6592 + char if_name[IFNAMSIZ];
6593 + struct pollfd net_poll[MAX_NET_FD];
6594 + struct mic_vring tx_vr, rx_vr;
6595 + struct mic_copy_desc copy;
6596 + struct mic_device_desc *desc;
6597 + int err;
6598 +
6599 + snprintf(if_name, IFNAMSIZ, "mic%d", mic->id);
6600 + mic->mic_net.tap_fd = tun_alloc(mic, if_name);
6601 + if (mic->mic_net.tap_fd < 0)
6602 + goto done;
6603 +
6604 + if (tap_configure(mic, if_name))
6605 + goto done;
6606 + mpsslog("MIC name %s id %d\n", mic->name, mic->id);
6607 +
6608 + net_poll[NET_FD_VIRTIO_NET].fd = mic->mic_net.virtio_net_fd;
6609 + net_poll[NET_FD_VIRTIO_NET].events = POLLIN;
6610 + net_poll[NET_FD_TUN].fd = mic->mic_net.tap_fd;
6611 + net_poll[NET_FD_TUN].events = POLLIN;
6612 +
6613 + if (MAP_FAILED == init_vr(mic, mic->mic_net.virtio_net_fd,
6614 + VIRTIO_ID_NET, &tx_vr, &rx_vr,
6615 + virtnet_dev_page.dd.num_vq)) {
6616 + mpsslog("%s init_vr failed %s\n",
6617 + mic->name, strerror(errno));
6618 + goto done;
6619 + }
6620 +
6621 + copy.iovcnt = 2;
6622 + desc = get_device_desc(mic, VIRTIO_ID_NET);
6623 +
6624 + while (1) {
6625 + ssize_t len;
6626 +
6627 + net_poll[NET_FD_VIRTIO_NET].revents = 0;
6628 + net_poll[NET_FD_TUN].revents = 0;
6629 +
6630 + /* Start polling for data from tap and virtio net */
6631 + err = poll(net_poll, 2, -1);
6632 + if (err < 0) {
6633 + mpsslog("%s poll failed %s\n",
6634 + __func__, strerror(errno));
6635 + continue;
6636 + }
6637 + if (!(desc->status & VIRTIO_CONFIG_S_DRIVER_OK)) {
6638 + err = wait_for_card_driver(mic,
6639 + mic->mic_net.virtio_net_fd,
6640 + VIRTIO_ID_NET);
6641 + if (err) {
6642 + mpsslog("%s %s %d Exiting...\n",
6643 + mic->name, __func__, __LINE__);
6644 + break;
6645 + }
6646 + }
6647 + /*
6648 + * Check if there is data to be read from TUN and write to
6649 + * virtio net fd if there is.
6650 + */
6651 + if (net_poll[NET_FD_TUN].revents & POLLIN) {
6652 + copy.iov = iov0;
6653 + len = readv(net_poll[NET_FD_TUN].fd,
6654 + copy.iov, copy.iovcnt);
6655 + if (len > 0) {
6656 + struct virtio_net_hdr *hdr
6657 + = (struct virtio_net_hdr *)vnet_hdr[0];
6658 +
6659 + /* Disable checksums on the card since we are on
6660 + a reliable PCIe link */
6661 + hdr->flags |= VIRTIO_NET_HDR_F_DATA_VALID;
6662 +#ifdef DEBUG
6663 + mpsslog("%s %s %d hdr->flags 0x%x ", mic->name,
6664 + __func__, __LINE__, hdr->flags);
6665 + mpsslog("copy.out_len %d hdr->gso_type 0x%x\n",
6666 + copy.out_len, hdr->gso_type);
6667 +#endif
6668 +#ifdef DEBUG
6669 + disp_iovec(mic, copy, __func__, __LINE__);
6670 + mpsslog("%s %s %d read from tap 0x%lx\n",
6671 + mic->name, __func__, __LINE__,
6672 + len);
6673 +#endif
6674 + spin_for_descriptors(mic, &tx_vr);
6675 + txrx_prepare(VIRTIO_ID_NET, 1, &tx_vr, &copy,
6676 + len);
6677 +
6678 + err = mic_virtio_copy(mic,
6679 + mic->mic_net.virtio_net_fd, &tx_vr,
6680 + &copy);
6681 + if (err < 0) {
6682 + mpsslog("%s %s %d mic_virtio_copy %s\n",
6683 + mic->name, __func__, __LINE__,
6684 + strerror(errno));
6685 + }
6686 + if (!err)
6687 + verify_out_len(mic, &copy);
6688 +#ifdef DEBUG
6689 + disp_iovec(mic, copy, __func__, __LINE__);
6690 + mpsslog("%s %s %d wrote to net 0x%lx\n",
6691 + mic->name, __func__, __LINE__,
6692 + sum_iovec_len(&copy));
6693 +#endif
6694 + /* Reinitialize IOV for next run */
6695 + iov0[1].iov_len = MAX_NET_PKT_SIZE;
6696 + } else if (len < 0) {
6697 + disp_iovec(mic, &copy, __func__, __LINE__);
6698 + mpsslog("%s %s %d read failed %s ", mic->name,
6699 + __func__, __LINE__, strerror(errno));
6700 + mpsslog("cnt %d sum %zd\n",
6701 + copy.iovcnt, sum_iovec_len(&copy));
6702 + }
6703 + }
6704 +
6705 + /*
6706 + * Check if there is data to be read from virtio net and
6707 + * write to TUN if there is.
6708 + */
6709 + if (net_poll[NET_FD_VIRTIO_NET].revents & POLLIN) {
6710 + while (rx_vr.info->avail_idx !=
6711 + le16toh(rx_vr.vr.avail->idx)) {
6712 + copy.iov = iov1;
6713 + txrx_prepare(VIRTIO_ID_NET, 0, &rx_vr, &copy,
6714 + MAX_NET_PKT_SIZE
6715 + + sizeof(struct virtio_net_hdr));
6716 +
6717 + err = mic_virtio_copy(mic,
6718 + mic->mic_net.virtio_net_fd, &rx_vr,
6719 + &copy);
6720 + if (!err) {
6721 +#ifdef DEBUG
6722 + struct virtio_net_hdr *hdr
6723 + = (struct virtio_net_hdr *)
6724 + vnet_hdr[1];
6725 +
6726 + mpsslog("%s %s %d hdr->flags 0x%x, ",
6727 + mic->name, __func__, __LINE__,
6728 + hdr->flags);
6729 + mpsslog("out_len %d gso_type 0x%x\n",
6730 + copy.out_len,
6731 + hdr->gso_type);
6732 +#endif
6733 + /* Set the correct output iov_len */
6734 + iov1[1].iov_len = copy.out_len -
6735 + sizeof(struct virtio_net_hdr);
6736 + verify_out_len(mic, &copy);
6737 +#ifdef DEBUG
6738 + disp_iovec(mic, copy, __func__,
6739 + __LINE__);
6740 + mpsslog("%s %s %d ",
6741 + mic->name, __func__, __LINE__);
6742 + mpsslog("read from net 0x%lx\n",
6743 + sum_iovec_len(copy));
6744 +#endif
6745 + len = writev(net_poll[NET_FD_TUN].fd,
6746 + copy.iov, copy.iovcnt);
6747 + if (len != sum_iovec_len(&copy)) {
6748 + mpsslog("Tun write failed %s ",
6749 + strerror(errno));
6750 + mpsslog("len 0x%zx ", len);
6751 + mpsslog("read_len 0x%zx\n",
6752 + sum_iovec_len(&copy));
6753 + } else {
6754 +#ifdef DEBUG
6755 + disp_iovec(mic, &copy, __func__,
6756 + __LINE__);
6757 + mpsslog("%s %s %d ",
6758 + mic->name, __func__,
6759 + __LINE__);
6760 + mpsslog("wrote to tap 0x%lx\n",
6761 + len);
6762 +#endif
6763 + }
6764 + } else {
6765 + mpsslog("%s %s %d mic_virtio_copy %s\n",
6766 + mic->name, __func__, __LINE__,
6767 + strerror(errno));
6768 + break;
6769 + }
6770 + }
6771 + }
6772 + if (net_poll[NET_FD_VIRTIO_NET].revents & POLLERR)
6773 + mpsslog("%s: %s: POLLERR\n", __func__, mic->name);
6774 + }
6775 +done:
6776 + pthread_exit(NULL);
6777 +}
6778 +
6779 +/* virtio_console */
6780 +#define VIRTIO_CONSOLE_FD 0
6781 +#define MONITOR_FD (VIRTIO_CONSOLE_FD + 1)
6782 +#define MAX_CONSOLE_FD (MONITOR_FD + 1) /* must be the last one + 1 */
6783 +#define MAX_BUFFER_SIZE PAGE_SIZE
6784 +
6785 +static void *
6786 +virtio_console(void *arg)
6787 +{
6788 + static __u8 vcons_buf[2][PAGE_SIZE];
6789 + struct iovec vcons_iov[2] = {
6790 + { .iov_base = vcons_buf[0], .iov_len = sizeof(vcons_buf[0]) },
6791 + { .iov_base = vcons_buf[1], .iov_len = sizeof(vcons_buf[1]) },
6792 + };
6793 + struct iovec *iov0 = &vcons_iov[0], *iov1 = &vcons_iov[1];
6794 + struct mic_info *mic = (struct mic_info *)arg;
6795 + int err;
6796 + struct pollfd console_poll[MAX_CONSOLE_FD];
6797 + int pty_fd;
6798 + char *pts_name;
6799 + ssize_t len;
6800 + struct mic_vring tx_vr, rx_vr;
6801 + struct mic_copy_desc copy;
6802 + struct mic_device_desc *desc;
6803 +
6804 + pty_fd = posix_openpt(O_RDWR);
6805 + if (pty_fd < 0) {
6806 + mpsslog("can't open a pseudoterminal master device: %s\n",
6807 + strerror(errno));
6808 + goto _return;
6809 + }
6810 + pts_name = ptsname(pty_fd);
6811 + if (pts_name == NULL) {
6812 + mpsslog("can't get pts name\n");
6813 + goto _close_pty;
6814 + }
6815 + printf("%s console message goes to %s\n", mic->name, pts_name);
6816 + mpsslog("%s console message goes to %s\n", mic->name, pts_name);
6817 + err = grantpt(pty_fd);
6818 + if (err < 0) {
6819 + mpsslog("can't grant access: %s %s\n",
6820 + pts_name, strerror(errno));
6821 + goto _close_pty;
6822 + }
6823 + err = unlockpt(pty_fd);
6824 + if (err < 0) {
6825 + mpsslog("can't unlock a pseudoterminal: %s %s\n",
6826 + pts_name, strerror(errno));
6827 + goto _close_pty;
6828 + }
6829 + console_poll[MONITOR_FD].fd = pty_fd;
6830 + console_poll[MONITOR_FD].events = POLLIN;
6831 +
6832 + console_poll[VIRTIO_CONSOLE_FD].fd = mic->mic_console.virtio_console_fd;
6833 + console_poll[VIRTIO_CONSOLE_FD].events = POLLIN;
6834 +
6835 + if (MAP_FAILED == init_vr(mic, mic->mic_console.virtio_console_fd,
6836 + VIRTIO_ID_CONSOLE, &tx_vr, &rx_vr,
6837 + virtcons_dev_page.dd.num_vq)) {
6838 + mpsslog("%s init_vr failed %s\n",
6839 + mic->name, strerror(errno));
6840 + goto _close_pty;
6841 + }
6842 +
6843 + copy.iovcnt = 1;
6844 + desc = get_device_desc(mic, VIRTIO_ID_CONSOLE);
6845 +
6846 + for (;;) {
6847 + console_poll[MONITOR_FD].revents = 0;
6848 + console_poll[VIRTIO_CONSOLE_FD].revents = 0;
6849 + err = poll(console_poll, MAX_CONSOLE_FD, -1);
6850 + if (err < 0) {
6851 + mpsslog("%s %d: poll failed: %s\n", __func__, __LINE__,
6852 + strerror(errno));
6853 + continue;
6854 + }
6855 + if (!(desc->status & VIRTIO_CONFIG_S_DRIVER_OK)) {
6856 + err = wait_for_card_driver(mic,
6857 + mic->mic_console.virtio_console_fd,
6858 + VIRTIO_ID_CONSOLE);
6859 + if (err) {
6860 + mpsslog("%s %s %d Exiting...\n",
6861 + mic->name, __func__, __LINE__);
6862 + break;
6863 + }
6864 + }
6865 +
6866 + if (console_poll[MONITOR_FD].revents & POLLIN) {
6867 + copy.iov = iov0;
6868 + len = readv(pty_fd, copy.iov, copy.iovcnt);
6869 + if (len > 0) {
6870 +#ifdef DEBUG
6871 + disp_iovec(mic, copy, __func__, __LINE__);
6872 + mpsslog("%s %s %d read from tap 0x%lx\n",
6873 + mic->name, __func__, __LINE__,
6874 + len);
6875 +#endif
6876 + spin_for_descriptors(mic, &tx_vr);
6877 + txrx_prepare(VIRTIO_ID_CONSOLE, 1, &tx_vr,
6878 + &copy, len);
6879 +
6880 + err = mic_virtio_copy(mic,
6881 + mic->mic_console.virtio_console_fd,
6882 + &tx_vr, &copy);
6883 + if (err < 0) {
6884 + mpsslog("%s %s %d mic_virtio_copy %s\n",
6885 + mic->name, __func__, __LINE__,
6886 + strerror(errno));
6887 + }
6888 + if (!err)
6889 + verify_out_len(mic, &copy);
6890 +#ifdef DEBUG
6891 + disp_iovec(mic, copy, __func__, __LINE__);
6892 + mpsslog("%s %s %d wrote to net 0x%lx\n",
6893 + mic->name, __func__, __LINE__,
6894 + sum_iovec_len(copy));
6895 +#endif
6896 + /* Reinitialize IOV for next run */
6897 + iov0->iov_len = PAGE_SIZE;
6898 + } else if (len < 0) {
6899 + disp_iovec(mic, &copy, __func__, __LINE__);
6900 + mpsslog("%s %s %d read failed %s ",
6901 + mic->name, __func__, __LINE__,
6902 + strerror(errno));
6903 + mpsslog("cnt %d sum %zd\n",
6904 + copy.iovcnt, sum_iovec_len(&copy));
6905 + }
6906 + }
6907 +
6908 + if (console_poll[VIRTIO_CONSOLE_FD].revents & POLLIN) {
6909 + while (rx_vr.info->avail_idx !=
6910 + le16toh(rx_vr.vr.avail->idx)) {
6911 + copy.iov = iov1;
6912 + txrx_prepare(VIRTIO_ID_CONSOLE, 0, &rx_vr,
6913 + &copy, PAGE_SIZE);
6914 +
6915 + err = mic_virtio_copy(mic,
6916 + mic->mic_console.virtio_console_fd,
6917 + &rx_vr, &copy);
6918 + if (!err) {
6919 + /* Set the correct output iov_len */
6920 + iov1->iov_len = copy.out_len;
6921 + verify_out_len(mic, &copy);
6922 +#ifdef DEBUG
6923 + disp_iovec(mic, copy, __func__,
6924 + __LINE__);
6925 + mpsslog("%s %s %d ",
6926 + mic->name, __func__, __LINE__);
6927 + mpsslog("read from net 0x%lx\n",
6928 + sum_iovec_len(copy));
6929 +#endif
6930 + len = writev(pty_fd,
6931 + copy.iov, copy.iovcnt);
6932 + if (len != sum_iovec_len(&copy)) {
6933 + mpsslog("Tun write failed %s ",
6934 + strerror(errno));
6935 + mpsslog("len 0x%zx ", len);
6936 + mpsslog("read_len 0x%zx\n",
6937 + sum_iovec_len(&copy));
6938 + } else {
6939 +#ifdef DEBUG
6940 + disp_iovec(mic, copy, __func__,
6941 + __LINE__);
6942 + mpsslog("%s %s %d ",
6943 + mic->name, __func__,
6944 + __LINE__);
6945 + mpsslog("wrote to tap 0x%lx\n",
6946 + len);
6947 +#endif
6948 + }
6949 + } else {
6950 + mpsslog("%s %s %d mic_virtio_copy %s\n",
6951 + mic->name, __func__, __LINE__,
6952 + strerror(errno));
6953 + break;
6954 + }
6955 + }
6956 + }
6957 + if (console_poll[NET_FD_VIRTIO_NET].revents & POLLERR)
6958 + mpsslog("%s: %s: POLLERR\n", __func__, mic->name);
6959 + }
6960 +_close_pty:
6961 + close(pty_fd);
6962 +_return:
6963 + pthread_exit(NULL);
6964 +}
6965 +
6966 +static void
6967 +add_virtio_device(struct mic_info *mic, struct mic_device_desc *dd)
6968 +{
6969 + char path[PATH_MAX];
6970 + int fd, err;
6971 +
6972 + snprintf(path, PATH_MAX, "/dev/mic%d", mic->id);
6973 + fd = open(path, O_RDWR);
6974 + if (fd < 0) {
6975 + mpsslog("Could not open %s %s\n", path, strerror(errno));
6976 + return;
6977 + }
6978 +
6979 + err = ioctl(fd, MIC_VIRTIO_ADD_DEVICE, dd);
6980 + if (err < 0) {
6981 + mpsslog("Could not add %d %s\n", dd->type, strerror(errno));
6982 + close(fd);
6983 + return;
6984 + }
6985 + switch (dd->type) {
6986 + case VIRTIO_ID_NET:
6987 + mic->mic_net.virtio_net_fd = fd;
6988 + mpsslog("Added VIRTIO_ID_NET for %s\n", mic->name);
6989 + break;
6990 + case VIRTIO_ID_CONSOLE:
6991 + mic->mic_console.virtio_console_fd = fd;
6992 + mpsslog("Added VIRTIO_ID_CONSOLE for %s\n", mic->name);
6993 + break;
6994 + case VIRTIO_ID_BLOCK:
6995 + mic->mic_virtblk.virtio_block_fd = fd;
6996 + mpsslog("Added VIRTIO_ID_BLOCK for %s\n", mic->name);
6997 + break;
6998 + }
6999 +}
7000 +
7001 +static bool
7002 +set_backend_file(struct mic_info *mic)
7003 +{
7004 + FILE *config;
7005 + char buff[PATH_MAX], *line, *evv, *p;
7006 +
7007 + snprintf(buff, PATH_MAX, "%s/mpssd%03d.conf", mic_config_dir, mic->id);
7008 + config = fopen(buff, "r");
7009 + if (config == NULL)
7010 + return false;
7011 + do { /* look for "virtblk_backend=XXXX" */
7012 + line = fgets(buff, PATH_MAX, config);
7013 + if (line == NULL)
7014 + break;
7015 + if (*line == '#')
7016 + continue;
7017 + p = strchr(line, '\n');
7018 + if (p)
7019 + *p = '\0';
7020 + } while (strncmp(line, virtblk_backend, strlen(virtblk_backend)) != 0);
7021 + fclose(config);
7022 + if (line == NULL)
7023 + return false;
7024 + evv = strchr(line, '=');
7025 + if (evv == NULL)
7026 + return false;
7027 + mic->mic_virtblk.backend_file = malloc(strlen(evv) + 1);
7028 + if (mic->mic_virtblk.backend_file == NULL) {
7029 + mpsslog("%s %d can't allocate memory\n", mic->name, mic->id);
7030 + return false;
7031 + }
7032 + strcpy(mic->mic_virtblk.backend_file, evv + 1);
7033 + return true;
7034 +}
7035 +
7036 +#define SECTOR_SIZE 512
7037 +static bool
7038 +set_backend_size(struct mic_info *mic)
7039 +{
7040 + mic->mic_virtblk.backend_size = lseek(mic->mic_virtblk.backend, 0,
7041 + SEEK_END);
7042 + if (mic->mic_virtblk.backend_size < 0) {
7043 + mpsslog("%s: can't seek: %s\n",
7044 + mic->name, mic->mic_virtblk.backend_file);
7045 + return false;
7046 + }
7047 + virtblk_dev_page.blk_config.capacity =
7048 + mic->mic_virtblk.backend_size / SECTOR_SIZE;
7049 + if ((mic->mic_virtblk.backend_size % SECTOR_SIZE) != 0)
7050 + virtblk_dev_page.blk_config.capacity++;
7051 +
7052 + virtblk_dev_page.blk_config.capacity =
7053 + htole64(virtblk_dev_page.blk_config.capacity);
7054 +
7055 + return true;
7056 +}
7057 +
7058 +static bool
7059 +open_backend(struct mic_info *mic)
7060 +{
7061 + if (!set_backend_file(mic))
7062 + goto _error_exit;
7063 + mic->mic_virtblk.backend = open(mic->mic_virtblk.backend_file, O_RDWR);
7064 + if (mic->mic_virtblk.backend < 0) {
7065 + mpsslog("%s: can't open: %s\n", mic->name,
7066 + mic->mic_virtblk.backend_file);
7067 + goto _error_free;
7068 + }
7069 + if (!set_backend_size(mic))
7070 + goto _error_close;
7071 + mic->mic_virtblk.backend_addr = mmap(NULL,
7072 + mic->mic_virtblk.backend_size,
7073 + PROT_READ|PROT_WRITE, MAP_SHARED,
7074 + mic->mic_virtblk.backend, 0L);
7075 + if (mic->mic_virtblk.backend_addr == MAP_FAILED) {
7076 + mpsslog("%s: can't map: %s %s\n",
7077 + mic->name, mic->mic_virtblk.backend_file,
7078 + strerror(errno));
7079 + goto _error_close;
7080 + }
7081 + return true;
7082 +
7083 + _error_close:
7084 + close(mic->mic_virtblk.backend);
7085 + _error_free:
7086 + free(mic->mic_virtblk.backend_file);
7087 + _error_exit:
7088 + return false;
7089 +}
7090 +
7091 +static void
7092 +close_backend(struct mic_info *mic)
7093 +{
7094 + munmap(mic->mic_virtblk.backend_addr, mic->mic_virtblk.backend_size);
7095 + close(mic->mic_virtblk.backend);
7096 + free(mic->mic_virtblk.backend_file);
7097 +}
7098 +
7099 +static bool
7100 +start_virtblk(struct mic_info *mic, struct mic_vring *vring)
7101 +{
7102 + if (((unsigned long)&virtblk_dev_page.blk_config % 8) != 0) {
7103 + mpsslog("%s: blk_config is not 8 byte aligned.\n",
7104 + mic->name);
7105 + return false;
7106 + }
7107 + add_virtio_device(mic, &virtblk_dev_page.dd);
7108 + if (MAP_FAILED == init_vr(mic, mic->mic_virtblk.virtio_block_fd,
7109 + VIRTIO_ID_BLOCK, vring, NULL,
7110 + virtblk_dev_page.dd.num_vq)) {
7111 + mpsslog("%s init_vr failed %s\n",
7112 + mic->name, strerror(errno));
7113 + return false;
7114 + }
7115 + return true;
7116 +}
7117 +
7118 +static void
7119 +stop_virtblk(struct mic_info *mic)
7120 +{
7121 + int vr_size, ret;
7122 +
7123 + vr_size = PAGE_ALIGN(_vring_size(MIC_VRING_ENTRIES,
7124 + MIC_VIRTIO_RING_ALIGN) +
7125 + sizeof(struct _mic_vring_info));
7126 + ret = munmap(mic->mic_virtblk.block_dp,
7127 + MIC_DEVICE_PAGE_END + vr_size * virtblk_dev_page.dd.num_vq);
7128 + if (ret < 0)
7129 + mpsslog("%s munmap errno %d\n", mic->name, errno);
7130 + close(mic->mic_virtblk.virtio_block_fd);
7131 +}
7132 +
7133 +static __u8
7134 +header_error_check(struct vring_desc *desc)
7135 +{
7136 + if (le32toh(desc->len) != sizeof(struct virtio_blk_outhdr)) {
7137 + mpsslog("%s() %d: length is not sizeof(virtio_blk_outhd)\n",
7138 + __func__, __LINE__);
7139 + return -EIO;
7140 + }
7141 + if (!(le16toh(desc->flags) & VRING_DESC_F_NEXT)) {
7142 + mpsslog("%s() %d: alone\n",
7143 + __func__, __LINE__);
7144 + return -EIO;
7145 + }
7146 + if (le16toh(desc->flags) & VRING_DESC_F_WRITE) {
7147 + mpsslog("%s() %d: not read\n",
7148 + __func__, __LINE__);
7149 + return -EIO;
7150 + }
7151 + return 0;
7152 +}
7153 +
7154 +static int
7155 +read_header(int fd, struct virtio_blk_outhdr *hdr, __u32 desc_idx)
7156 +{
7157 + struct iovec iovec;
7158 + struct mic_copy_desc copy;
7159 +
7160 + iovec.iov_len = sizeof(*hdr);
7161 + iovec.iov_base = hdr;
7162 + copy.iov = &iovec;
7163 + copy.iovcnt = 1;
7164 + copy.vr_idx = 0; /* only one vring on virtio_block */
7165 + copy.update_used = false; /* do not update used index */
7166 + return ioctl(fd, MIC_VIRTIO_COPY_DESC, &copy);
7167 +}
7168 +
7169 +static int
7170 +transfer_blocks(int fd, struct iovec *iovec, __u32 iovcnt)
7171 +{
7172 + struct mic_copy_desc copy;
7173 +
7174 + copy.iov = iovec;
7175 + copy.iovcnt = iovcnt;
7176 + copy.vr_idx = 0; /* only one vring on virtio_block */
7177 + copy.update_used = false; /* do not update used index */
7178 + return ioctl(fd, MIC_VIRTIO_COPY_DESC, &copy);
7179 +}
7180 +
7181 +static __u8
7182 +status_error_check(struct vring_desc *desc)
7183 +{
7184 + if (le32toh(desc->len) != sizeof(__u8)) {
7185 + mpsslog("%s() %d: length is not sizeof(status)\n",
7186 + __func__, __LINE__);
7187 + return -EIO;
7188 + }
7189 + return 0;
7190 +}
7191 +
7192 +static int
7193 +write_status(int fd, __u8 *status)
7194 +{
7195 + struct iovec iovec;
7196 + struct mic_copy_desc copy;
7197 +
7198 + iovec.iov_base = status;
7199 + iovec.iov_len = sizeof(*status);
7200 + copy.iov = &iovec;
7201 + copy.iovcnt = 1;
7202 + copy.vr_idx = 0; /* only one vring on virtio_block */
7203 + copy.update_used = true; /* Update used index */
7204 + return ioctl(fd, MIC_VIRTIO_COPY_DESC, &copy);
7205 +}
7206 +
7207 +#ifndef VIRTIO_BLK_T_GET_ID
7208 +#define VIRTIO_BLK_T_GET_ID 8
7209 +#endif
7210 +
7211 +static void *
7212 +virtio_block(void *arg)
7213 +{
7214 + struct mic_info *mic = (struct mic_info *)arg;
7215 + int ret;
7216 + struct pollfd block_poll;
7217 + struct mic_vring vring;
7218 + __u16 avail_idx;
7219 + __u32 desc_idx;
7220 + struct vring_desc *desc;
7221 + struct iovec *iovec, *piov;
7222 + __u8 status;
7223 + __u32 buffer_desc_idx;
7224 + struct virtio_blk_outhdr hdr;
7225 + void *fos;
7226 +
7227 + for (;;) { /* forever */
7228 + if (!open_backend(mic)) { /* No virtblk */
7229 + for (mic->mic_virtblk.signaled = 0;
7230 + !mic->mic_virtblk.signaled;)
7231 + sleep(1);
7232 + continue;
7233 + }
7234 +
7235 + /* backend file is specified. */
7236 + if (!start_virtblk(mic, &vring))
7237 + goto _close_backend;
7238 + iovec = malloc(sizeof(*iovec) *
7239 + le32toh(virtblk_dev_page.blk_config.seg_max));
7240 + if (!iovec) {
7241 + mpsslog("%s: can't alloc iovec: %s\n",
7242 + mic->name, strerror(ENOMEM));
7243 + goto _stop_virtblk;
7244 + }
7245 +
7246 + block_poll.fd = mic->mic_virtblk.virtio_block_fd;
7247 + block_poll.events = POLLIN;
7248 + for (mic->mic_virtblk.signaled = 0;
7249 + !mic->mic_virtblk.signaled;) {
7250 + block_poll.revents = 0;
7251 + /* timeout in 1 sec to see signaled */
7252 + ret = poll(&block_poll, 1, 1000);
7253 + if (ret < 0) {
7254 + mpsslog("%s %d: poll failed: %s\n",
7255 + __func__, __LINE__,
7256 + strerror(errno));
7257 + continue;
7258 + }
7259 +
7260 + if (!(block_poll.revents & POLLIN)) {
7261 +#ifdef DEBUG
7262 + mpsslog("%s %d: block_poll.revents=0x%x\n",
7263 + __func__, __LINE__, block_poll.revents);
7264 +#endif
7265 + continue;
7266 + }
7267 +
7268 + /* POLLIN */
7269 + while (vring.info->avail_idx !=
7270 + le16toh(vring.vr.avail->idx)) {
7271 + /* read header element */
7272 + avail_idx =
7273 + vring.info->avail_idx &
7274 + (vring.vr.num - 1);
7275 + desc_idx = le16toh(
7276 + vring.vr.avail->ring[avail_idx]);
7277 + desc = &vring.vr.desc[desc_idx];
7278 +#ifdef DEBUG
7279 + mpsslog("%s() %d: avail_idx=%d ",
7280 + __func__, __LINE__,
7281 + vring.info->avail_idx);
7282 + mpsslog("vring.vr.num=%d desc=%p\n",
7283 + vring.vr.num, desc);
7284 +#endif
7285 + status = header_error_check(desc);
7286 + ret = read_header(
7287 + mic->mic_virtblk.virtio_block_fd,
7288 + &hdr, desc_idx);
7289 + if (ret < 0) {
7290 + mpsslog("%s() %d %s: ret=%d %s\n",
7291 + __func__, __LINE__,
7292 + mic->name, ret,
7293 + strerror(errno));
7294 + break;
7295 + }
7296 + /* buffer element */
7297 + piov = iovec;
7298 + status = 0;
7299 + fos = mic->mic_virtblk.backend_addr +
7300 + (hdr.sector * SECTOR_SIZE);
7301 + buffer_desc_idx = next_desc(desc);
7302 + desc_idx = buffer_desc_idx;
7303 + for (desc = &vring.vr.desc[buffer_desc_idx];
7304 + desc->flags & VRING_DESC_F_NEXT;
7305 + desc_idx = next_desc(desc),
7306 + desc = &vring.vr.desc[desc_idx]) {
7307 + piov->iov_len = desc->len;
7308 + piov->iov_base = fos;
7309 + piov++;
7310 + fos += desc->len;
7311 + }
7312 + /* Returning NULLs for VIRTIO_BLK_T_GET_ID. */
7313 + if (hdr.type & ~(VIRTIO_BLK_T_OUT |
7314 + VIRTIO_BLK_T_GET_ID)) {
7315 + /*
7316 + VIRTIO_BLK_T_IN - does not do
7317 + anything. Probably for documenting.
7318 + VIRTIO_BLK_T_SCSI_CMD - for
7319 + virtio_scsi.
7320 + VIRTIO_BLK_T_FLUSH - turned off in
7321 + config space.
7322 + VIRTIO_BLK_T_BARRIER - defined but not
7323 + used in anywhere.
7324 + */
7325 + mpsslog("%s() %d: type %x ",
7326 + __func__, __LINE__,
7327 + hdr.type);
7328 + mpsslog("is not supported\n");
7329 + status = -ENOTSUP;
7330 +
7331 + } else {
7332 + ret = transfer_blocks(
7333 + mic->mic_virtblk.virtio_block_fd,
7334 + iovec,
7335 + piov - iovec);
7336 + if (ret < 0 &&
7337 + status != 0)
7338 + status = ret;
7339 + }
7340 + /* write status and update used pointer */
7341 + if (status != 0)
7342 + status = status_error_check(desc);
7343 + ret = write_status(
7344 + mic->mic_virtblk.virtio_block_fd,
7345 + &status);
7346 +#ifdef DEBUG
7347 + mpsslog("%s() %d: write status=%d on desc=%p\n",
7348 + __func__, __LINE__,
7349 + status, desc);
7350 +#endif
7351 + }
7352 + }
7353 + free(iovec);
7354 +_stop_virtblk:
7355 + stop_virtblk(mic);
7356 +_close_backend:
7357 + close_backend(mic);
7358 + } /* forever */
7359 +
7360 + pthread_exit(NULL);
7361 +}
7362 +
7363 +static void
7364 +reset(struct mic_info *mic)
7365 +{
7366 +#define RESET_TIMEOUT 120
7367 + int i = RESET_TIMEOUT;
7368 + setsysfs(mic->name, "state", "reset");
7369 + while (i) {
7370 + char *state;
7371 + state = readsysfs(mic->name, "state");
7372 + if (!state)
7373 + goto retry;
7374 + mpsslog("%s: %s %d state %s\n",
7375 + mic->name, __func__, __LINE__, state);
7376 +
7377 + if (!strcmp(state, "ready")) {
7378 + free(state);
7379 + break;
7380 + }
7381 + free(state);
7382 +retry:
7383 + sleep(1);
7384 + i--;
7385 + }
7386 +}
7387 +
7388 +static int
7389 +get_mic_shutdown_status(struct mic_info *mic, char *shutdown_status)
7390 +{
7391 + if (!strcmp(shutdown_status, "nop"))
7392 + return MIC_NOP;
7393 + if (!strcmp(shutdown_status, "crashed"))
7394 + return MIC_CRASHED;
7395 + if (!strcmp(shutdown_status, "halted"))
7396 + return MIC_HALTED;
7397 + if (!strcmp(shutdown_status, "poweroff"))
7398 + return MIC_POWER_OFF;
7399 + if (!strcmp(shutdown_status, "restart"))
7400 + return MIC_RESTART;
7401 + mpsslog("%s: BUG invalid status %s\n", mic->name, shutdown_status);
7402 + /* Invalid state */
7403 + assert(0);
7404 +};
7405 +
7406 +static int get_mic_state(struct mic_info *mic)
7407 +{
7408 + char *state = NULL;
7409 + enum mic_states mic_state;
7410 +
7411 + while (!state) {
7412 + state = readsysfs(mic->name, "state");
7413 + sleep(1);
7414 + }
7415 + mpsslog("%s: %s %d state %s\n",
7416 + mic->name, __func__, __LINE__, state);
7417 +
7418 + if (!strcmp(state, "ready")) {
7419 + mic_state = MIC_READY;
7420 + } else if (!strcmp(state, "booting")) {
7421 + mic_state = MIC_BOOTING;
7422 + } else if (!strcmp(state, "online")) {
7423 + mic_state = MIC_ONLINE;
7424 + } else if (!strcmp(state, "shutting_down")) {
7425 + mic_state = MIC_SHUTTING_DOWN;
7426 + } else if (!strcmp(state, "reset_failed")) {
7427 + mic_state = MIC_RESET_FAILED;
7428 + } else if (!strcmp(state, "resetting")) {
7429 + mic_state = MIC_RESETTING;
7430 + } else {
7431 + mpsslog("%s: BUG invalid state %s\n", mic->name, state);
7432 + assert(0);
7433 + }
7434 +
7435 + free(state);
7436 + return mic_state;
7437 +};
7438 +
7439 +static void mic_handle_shutdown(struct mic_info *mic)
7440 +{
7441 +#define SHUTDOWN_TIMEOUT 60
7442 + int i = SHUTDOWN_TIMEOUT;
7443 + char *shutdown_status;
7444 + while (i) {
7445 + shutdown_status = readsysfs(mic->name, "shutdown_status");
7446 + if (!shutdown_status) {
7447 + sleep(1);
7448 + continue;
7449 + }
7450 + mpsslog("%s: %s %d shutdown_status %s\n",
7451 + mic->name, __func__, __LINE__, shutdown_status);
7452 + switch (get_mic_shutdown_status(mic, shutdown_status)) {
7453 + case MIC_RESTART:
7454 + mic->restart = 1;
7455 + case MIC_HALTED:
7456 + case MIC_POWER_OFF:
7457 + case MIC_CRASHED:
7458 + free(shutdown_status);
7459 + goto reset;
7460 + default:
7461 + break;
7462 + }
7463 + free(shutdown_status);
7464 + sleep(1);
7465 + i--;
7466 + }
7467 +reset:
7468 + if (!i)
7469 + mpsslog("%s: %s %d timing out waiting for shutdown_status %s\n",
7470 + mic->name, __func__, __LINE__, shutdown_status);
7471 + reset(mic);
7472 +}
7473 +
7474 +static int open_state_fd(struct mic_info *mic)
7475 +{
7476 + char pathname[PATH_MAX];
7477 + int fd;
7478 +
7479 + snprintf(pathname, PATH_MAX - 1, "%s/%s/%s",
7480 + MICSYSFSDIR, mic->name, "state");
7481 +
7482 + fd = open(pathname, O_RDONLY);
7483 + if (fd < 0)
7484 + mpsslog("%s: opening file %s failed %s\n",
7485 + mic->name, pathname, strerror(errno));
7486 + return fd;
7487 +}
7488 +
7489 +static int block_till_state_change(int fd, struct mic_info *mic)
7490 +{
7491 + struct pollfd ufds[1];
7492 + char value[PAGE_SIZE];
7493 + int ret;
7494 +
7495 + ufds[0].fd = fd;
7496 + ufds[0].events = POLLERR | POLLPRI;
7497 + ret = poll(ufds, 1, -1);
7498 + if (ret < 0) {
7499 + mpsslog("%s: %s %d poll failed %s\n",
7500 + mic->name, __func__, __LINE__, strerror(errno));
7501 + return ret;
7502 + }
7503 +
7504 + ret = lseek(fd, 0, SEEK_SET);
7505 + if (ret < 0) {
7506 + mpsslog("%s: %s %d Failed to seek to 0: %s\n",
7507 + mic->name, __func__, __LINE__, strerror(errno));
7508 + return ret;
7509 + }
7510 +
7511 + ret = read(fd, value, sizeof(value));
7512 + if (ret < 0) {
7513 + mpsslog("%s: %s %d Failed to read sysfs entry: %s\n",
7514 + mic->name, __func__, __LINE__, strerror(errno));
7515 + return ret;
7516 + }
7517 +
7518 + return 0;
7519 +}
7520 +
7521 +static void *
7522 +mic_config(void *arg)
7523 +{
7524 + struct mic_info *mic = (struct mic_info *)arg;
7525 + int fd, ret, stat = 0;
7526 +
7527 + fd = open_state_fd(mic);
7528 + if (fd < 0) {
7529 + mpsslog("%s: %s %d open state fd failed %s\n",
7530 + mic->name, __func__, __LINE__, strerror(errno));
7531 + goto exit;
7532 + }
7533 +
7534 + do {
7535 + ret = block_till_state_change(fd, mic);
7536 + if (ret < 0) {
7537 + mpsslog("%s: %s %d block_till_state_change error %s\n",
7538 + mic->name, __func__, __LINE__, strerror(errno));
7539 + goto close_exit;
7540 + }
7541 +
7542 + switch (get_mic_state(mic)) {
7543 + case MIC_SHUTTING_DOWN:
7544 + mic_handle_shutdown(mic);
7545 + break;
7546 + case MIC_READY:
7547 + case MIC_RESET_FAILED:
7548 + ret = kill(mic->pid, SIGTERM);
7549 + mpsslog("%s: %s %d kill pid %d ret %d\n",
7550 + mic->name, __func__, __LINE__,
7551 + mic->pid, ret);
7552 + if (!ret) {
7553 + ret = waitpid(mic->pid, &stat,
7554 + WIFSIGNALED(stat));
7555 + mpsslog("%s: %s %d waitpid ret %d pid %d\n",
7556 + mic->name, __func__, __LINE__,
7557 + ret, mic->pid);
7558 + }
7559 + if (mic->boot_on_resume) {
7560 + setsysfs(mic->name, "state", "boot");
7561 + mic->boot_on_resume = 0;
7562 + }
7563 + goto close_exit;
7564 + default:
7565 + break;
7566 + }
7567 + } while (1);
7568 +
7569 +close_exit:
7570 + close(fd);
7571 +exit:
7572 + init_mic(mic);
7573 + pthread_exit(NULL);
7574 +}
7575 +
7576 +static void
7577 +set_cmdline(struct mic_info *mic)
7578 +{
7579 + char buffer[PATH_MAX];
7580 + int len;
7581 +
7582 + len = snprintf(buffer, PATH_MAX,
7583 + "clocksource=tsc highres=off nohz=off ");
7584 + len += snprintf(buffer + len, PATH_MAX - len,
7585 + "cpufreq_on;corec6_off;pc3_off;pc6_off ");
7586 + len += snprintf(buffer + len, PATH_MAX - len,
7587 + "ifcfg=static;address,172.31.%d.1;netmask,255.255.255.0",
7588 + mic->id + 1);
7589 +
7590 + setsysfs(mic->name, "cmdline", buffer);
7591 + mpsslog("%s: Command line: \"%s\"\n", mic->name, buffer);
7592 + snprintf(buffer, PATH_MAX, "172.31.%d.1", mic->id + 1);
7593 + mpsslog("%s: IPADDR: \"%s\"\n", mic->name, buffer);
7594 +}
7595 +
7596 +static void
7597 +set_log_buf_info(struct mic_info *mic)
7598 +{
7599 + int fd;
7600 + off_t len;
7601 + char system_map[] = "/lib/firmware/mic/System.map";
7602 + char *map, *temp, log_buf[17] = {'\0'};
7603 +
7604 + fd = open(system_map, O_RDONLY);
7605 + if (fd < 0) {
7606 + mpsslog("%s: Opening System.map failed: %d\n",
7607 + mic->name, errno);
7608 + return;
7609 + }
7610 + len = lseek(fd, 0, SEEK_END);
7611 + if (len < 0) {
7612 + mpsslog("%s: Reading System.map size failed: %d\n",
7613 + mic->name, errno);
7614 + close(fd);
7615 + return;
7616 + }
7617 + map = mmap(NULL, len, PROT_READ, MAP_PRIVATE, fd, 0);
7618 + if (map == MAP_FAILED) {
7619 + mpsslog("%s: mmap of System.map failed: %d\n",
7620 + mic->name, errno);
7621 + close(fd);
7622 + return;
7623 + }
7624 + temp = strstr(map, "__log_buf");
7625 + if (!temp) {
7626 + mpsslog("%s: __log_buf not found: %d\n", mic->name, errno);
7627 + munmap(map, len);
7628 + close(fd);
7629 + return;
7630 + }
7631 + strncpy(log_buf, temp - 19, 16);
7632 + setsysfs(mic->name, "log_buf_addr", log_buf);
7633 + mpsslog("%s: log_buf_addr: %s\n", mic->name, log_buf);
7634 + temp = strstr(map, "log_buf_len");
7635 + if (!temp) {
7636 + mpsslog("%s: log_buf_len not found: %d\n", mic->name, errno);
7637 + munmap(map, len);
7638 + close(fd);
7639 + return;
7640 + }
7641 + strncpy(log_buf, temp - 19, 16);
7642 + setsysfs(mic->name, "log_buf_len", log_buf);
7643 + mpsslog("%s: log_buf_len: %s\n", mic->name, log_buf);
7644 + munmap(map, len);
7645 + close(fd);
7646 +}
7647 +
7648 +static void
7649 +change_virtblk_backend(int x, siginfo_t *siginfo, void *p)
7650 +{
7651 + struct mic_info *mic;
7652 +
7653 + for (mic = mic_list.next; mic != NULL; mic = mic->next)
7654 + mic->mic_virtblk.signaled = 1/* true */;
7655 +}
7656 +
7657 +static void
7658 +set_mic_boot_params(struct mic_info *mic)
7659 +{
7660 + set_log_buf_info(mic);
7661 + set_cmdline(mic);
7662 +}
7663 +
7664 +static void *
7665 +init_mic(void *arg)
7666 +{
7667 + struct mic_info *mic = (struct mic_info *)arg;
7668 + struct sigaction ignore = {
7669 + .sa_flags = 0,
7670 + .sa_handler = SIG_IGN
7671 + };
7672 + struct sigaction act = {
7673 + .sa_flags = SA_SIGINFO,
7674 + .sa_sigaction = change_virtblk_backend,
7675 + };
7676 + char buffer[PATH_MAX];
7677 + int err, fd;
7678 +
7679 + /*
7680 + * Currently, one virtio block device is supported for each MIC card
7681 + * at a time. Any user (or test) can send a SIGUSR1 to the MIC daemon.
7682 + * The signal informs the virtio block backend about a change in the
7683 + * configuration file which specifies the virtio backend file name on
7684 + * the host. Virtio block backend then re-reads the configuration file
7685 + * and switches to the new block device. This signalling mechanism may
7686 + * not be required once multiple virtio block devices are supported by
7687 + * the MIC daemon.
7688 + */
7689 + sigaction(SIGUSR1, &ignore, NULL);
7690 +retry:
7691 + fd = open_state_fd(mic);
7692 + if (fd < 0) {
7693 + mpsslog("%s: %s %d open state fd failed %s\n",
7694 + mic->name, __func__, __LINE__, strerror(errno));
7695 + sleep(2);
7696 + goto retry;
7697 + }
7698 +
7699 + if (mic->restart) {
7700 + snprintf(buffer, PATH_MAX, "boot");
7701 + setsysfs(mic->name, "state", buffer);
7702 + mpsslog("%s restarting mic %d\n",
7703 + mic->name, mic->restart);
7704 + mic->restart = 0;
7705 + }
7706 +
7707 + while (1) {
7708 + while (block_till_state_change(fd, mic)) {
7709 + mpsslog("%s: %s %d block_till_state_change error %s\n",
7710 + mic->name, __func__, __LINE__, strerror(errno));
7711 + sleep(2);
7712 + continue;
7713 + }
7714 +
7715 + if (get_mic_state(mic) == MIC_BOOTING)
7716 + break;
7717 + }
7718 +
7719 + mic->pid = fork();
7720 + switch (mic->pid) {
7721 + case 0:
7722 + add_virtio_device(mic, &virtcons_dev_page.dd);
7723 + add_virtio_device(mic, &virtnet_dev_page.dd);
7724 + err = pthread_create(&mic->mic_console.console_thread, NULL,
7725 + virtio_console, mic);
7726 + if (err)
7727 + mpsslog("%s virtcons pthread_create failed %s\n",
7728 + mic->name, strerror(err));
7729 + err = pthread_create(&mic->mic_net.net_thread, NULL,
7730 + virtio_net, mic);
7731 + if (err)
7732 + mpsslog("%s virtnet pthread_create failed %s\n",
7733 + mic->name, strerror(err));
7734 + err = pthread_create(&mic->mic_virtblk.block_thread, NULL,
7735 + virtio_block, mic);
7736 + if (err)
7737 + mpsslog("%s virtblk pthread_create failed %s\n",
7738 + mic->name, strerror(err));
7739 + sigemptyset(&act.sa_mask);
7740 + err = sigaction(SIGUSR1, &act, NULL);
7741 + if (err)
7742 + mpsslog("%s sigaction SIGUSR1 failed %s\n",
7743 + mic->name, strerror(errno));
7744 + while (1)
7745 + sleep(60);
7746 + case -1:
7747 + mpsslog("fork failed MIC name %s id %d errno %d\n",
7748 + mic->name, mic->id, errno);
7749 + break;
7750 + default:
7751 + err = pthread_create(&mic->config_thread, NULL,
7752 + mic_config, mic);
7753 + if (err)
7754 + mpsslog("%s mic_config pthread_create failed %s\n",
7755 + mic->name, strerror(err));
7756 + }
7757 +
7758 + return NULL;
7759 +}
7760 +
7761 +static void
7762 +start_daemon(void)
7763 +{
7764 + struct mic_info *mic;
7765 + int err;
7766 +
7767 + for (mic = mic_list.next; mic; mic = mic->next) {
7768 + set_mic_boot_params(mic);
7769 + err = pthread_create(&mic->init_thread, NULL, init_mic, mic);
7770 + if (err)
7771 + mpsslog("%s init_mic pthread_create failed %s\n",
7772 + mic->name, strerror(err));
7773 + }
7774 +
7775 + while (1)
7776 + sleep(60);
7777 +}
7778 +
7779 +static int
7780 +init_mic_list(void)
7781 +{
7782 + struct mic_info *mic = &mic_list;
7783 + struct dirent *file;
7784 + DIR *dp;
7785 + int cnt = 0;
7786 +
7787 + dp = opendir(MICSYSFSDIR);
7788 + if (!dp)
7789 + return 0;
7790 +
7791 + while ((file = readdir(dp)) != NULL) {
7792 + if (!strncmp(file->d_name, "mic", 3)) {
7793 + mic->next = calloc(1, sizeof(struct mic_info));
7794 + if (mic->next) {
7795 + mic = mic->next;
7796 + mic->id = atoi(&file->d_name[3]);
7797 + mic->name = malloc(strlen(file->d_name) + 16);
7798 + if (mic->name)
7799 + strcpy(mic->name, file->d_name);
7800 + mpsslog("MIC name %s id %d\n", mic->name,
7801 + mic->id);
7802 + cnt++;
7803 + }
7804 + }
7805 + }
7806 +
7807 + closedir(dp);
7808 + return cnt;
7809 +}
7810 +
7811 +void
7812 +mpsslog(char *format, ...)
7813 +{
7814 + va_list args;
7815 + char buffer[4096];
7816 + char ts[52], *ts1;
7817 + time_t t;
7818 +
7819 + if (logfp == NULL)
7820 + return;
7821 +
7822 + va_start(args, format);
7823 + vsprintf(buffer, format, args);
7824 + va_end(args);
7825 +
7826 + time(&t);
7827 + ts1 = ctime_r(&t, ts);
7828 + ts1[strlen(ts1) - 1] = '\0';
7829 + fprintf(logfp, "%s: %s", ts1, buffer);
7830 +
7831 + fflush(logfp);
7832 +}
7833 +
7834 +int
7835 +main(int argc, char *argv[])
7836 +{
7837 + int cnt;
7838 + pid_t pid;
7839 +
7840 + myname = argv[0];
7841 +
7842 + logfp = fopen(LOGFILE_NAME, "a+");
7843 + if (!logfp) {
7844 + fprintf(stderr, "cannot open logfile '%s'\n", LOGFILE_NAME);
7845 + exit(1);
7846 + }
7847 + pid = fork();
7848 + switch (pid) {
7849 + case 0:
7850 + break;
7851 + case -1:
7852 + exit(2);
7853 + default:
7854 + exit(0);
7855 + }
7856 +
7857 + mpsslog("MIC Daemon start\n");
7858 +
7859 + cnt = init_mic_list();
7860 + if (cnt == 0) {
7861 + mpsslog("MIC module not loaded\n");
7862 + exit(3);
7863 + }
7864 + mpsslog("MIC found %d devices\n", cnt);
7865 +
7866 + start_daemon();
7867 +
7868 + exit(0);
7869 +}
7870 diff --git a/samples/mic/mpssd/mpssd.h b/samples/mic/mpssd/mpssd.h
7871 new file mode 100644
7872 index 000000000000..8bd64944aacc
7873 --- /dev/null
7874 +++ b/samples/mic/mpssd/mpssd.h
7875 @@ -0,0 +1,103 @@
7876 +/*
7877 + * Intel MIC Platform Software Stack (MPSS)
7878 + *
7879 + * Copyright(c) 2013 Intel Corporation.
7880 + *
7881 + * This program is free software; you can redistribute it and/or modify
7882 + * it under the terms of the GNU General Public License, version 2, as
7883 + * published by the Free Software Foundation.
7884 + *
7885 + * This program is distributed in the hope that it will be useful, but
7886 + * WITHOUT ANY WARRANTY; without even the implied warranty of
7887 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
7888 + * General Public License for more details.
7889 + *
7890 + * The full GNU General Public License is included in this distribution in
7891 + * the file called "COPYING".
7892 + *
7893 + * Intel MIC User Space Tools.
7894 + */
7895 +#ifndef _MPSSD_H_
7896 +#define _MPSSD_H_
7897 +
7898 +#include <stdio.h>
7899 +#include <stdlib.h>
7900 +#include <string.h>
7901 +#include <fcntl.h>
7902 +#include <unistd.h>
7903 +#include <dirent.h>
7904 +#include <libgen.h>
7905 +#include <pthread.h>
7906 +#include <stdarg.h>
7907 +#include <time.h>
7908 +#include <errno.h>
7909 +#include <sys/dir.h>
7910 +#include <sys/ioctl.h>
7911 +#include <sys/poll.h>
7912 +#include <sys/types.h>
7913 +#include <sys/socket.h>
7914 +#include <sys/stat.h>
7915 +#include <sys/types.h>
7916 +#include <sys/mman.h>
7917 +#include <sys/utsname.h>
7918 +#include <sys/wait.h>
7919 +#include <netinet/in.h>
7920 +#include <arpa/inet.h>
7921 +#include <netdb.h>
7922 +#include <pthread.h>
7923 +#include <signal.h>
7924 +#include <limits.h>
7925 +#include <syslog.h>
7926 +#include <getopt.h>
7927 +#include <net/if.h>
7928 +#include <linux/if_tun.h>
7929 +#include <linux/if_tun.h>
7930 +#include <linux/virtio_ids.h>
7931 +
7932 +#define MICSYSFSDIR "/sys/class/mic"
7933 +#define LOGFILE_NAME "/var/log/mpssd"
7934 +#define PAGE_SIZE 4096
7935 +
7936 +struct mic_console_info {
7937 + pthread_t console_thread;
7938 + int virtio_console_fd;
7939 + void *console_dp;
7940 +};
7941 +
7942 +struct mic_net_info {
7943 + pthread_t net_thread;
7944 + int virtio_net_fd;
7945 + int tap_fd;
7946 + void *net_dp;
7947 +};
7948 +
7949 +struct mic_virtblk_info {
7950 + pthread_t block_thread;
7951 + int virtio_block_fd;
7952 + void *block_dp;
7953 + volatile sig_atomic_t signaled;
7954 + char *backend_file;
7955 + int backend;
7956 + void *backend_addr;
7957 + long backend_size;
7958 +};
7959 +
7960 +struct mic_info {
7961 + int id;
7962 + char *name;
7963 + pthread_t config_thread;
7964 + pthread_t init_thread;
7965 + pid_t pid;
7966 + struct mic_console_info mic_console;
7967 + struct mic_net_info mic_net;
7968 + struct mic_virtblk_info mic_virtblk;
7969 + int restart;
7970 + int boot_on_resume;
7971 + struct mic_info *next;
7972 +};
7973 +
7974 +__attribute__((format(printf, 1, 2)))
7975 +void mpsslog(char *format, ...);
7976 +char *readsysfs(char *dir, char *entry);
7977 +int setsysfs(char *dir, char *entry, char *value);
7978 +#endif
7979 diff --git a/samples/mic/mpssd/sysfs.c b/samples/mic/mpssd/sysfs.c
7980 new file mode 100644
7981 index 000000000000..8dd326936083
7982 --- /dev/null
7983 +++ b/samples/mic/mpssd/sysfs.c
7984 @@ -0,0 +1,102 @@
7985 +/*
7986 + * Intel MIC Platform Software Stack (MPSS)
7987 + *
7988 + * Copyright(c) 2013 Intel Corporation.
7989 + *
7990 + * This program is free software; you can redistribute it and/or modify
7991 + * it under the terms of the GNU General Public License, version 2, as
7992 + * published by the Free Software Foundation.
7993 + *
7994 + * This program is distributed in the hope that it will be useful, but
7995 + * WITHOUT ANY WARRANTY; without even the implied warranty of
7996 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
7997 + * General Public License for more details.
7998 + *
7999 + * The full GNU General Public License is included in this distribution in
8000 + * the file called "COPYING".
8001 + *
8002 + * Intel MIC User Space Tools.
8003 + */
8004 +
8005 +#include "mpssd.h"
8006 +
8007 +#define PAGE_SIZE 4096
8008 +
8009 +char *
8010 +readsysfs(char *dir, char *entry)
8011 +{
8012 + char filename[PATH_MAX];
8013 + char value[PAGE_SIZE];
8014 + char *string = NULL;
8015 + int fd;
8016 + int len;
8017 +
8018 + if (dir == NULL)
8019 + snprintf(filename, PATH_MAX, "%s/%s", MICSYSFSDIR, entry);
8020 + else
8021 + snprintf(filename, PATH_MAX,
8022 + "%s/%s/%s", MICSYSFSDIR, dir, entry);
8023 +
8024 + fd = open(filename, O_RDONLY);
8025 + if (fd < 0) {
8026 + mpsslog("Failed to open sysfs entry '%s': %s\n",
8027 + filename, strerror(errno));
8028 + return NULL;
8029 + }
8030 +
8031 + len = read(fd, value, sizeof(value));
8032 + if (len < 0) {
8033 + mpsslog("Failed to read sysfs entry '%s': %s\n",
8034 + filename, strerror(errno));
8035 + goto readsys_ret;
8036 + }
8037 + if (len == 0)
8038 + goto readsys_ret;
8039 +
8040 + value[len - 1] = '\0';
8041 +
8042 + string = malloc(strlen(value) + 1);
8043 + if (string)
8044 + strcpy(string, value);
8045 +
8046 +readsys_ret:
8047 + close(fd);
8048 + return string;
8049 +}
8050 +
8051 +int
8052 +setsysfs(char *dir, char *entry, char *value)
8053 +{
8054 + char filename[PATH_MAX];
8055 + char *oldvalue;
8056 + int fd, ret = 0;
8057 +
8058 + if (dir == NULL)
8059 + snprintf(filename, PATH_MAX, "%s/%s", MICSYSFSDIR, entry);
8060 + else
8061 + snprintf(filename, PATH_MAX, "%s/%s/%s",
8062 + MICSYSFSDIR, dir, entry);
8063 +
8064 + oldvalue = readsysfs(dir, entry);
8065 +
8066 + fd = open(filename, O_RDWR);
8067 + if (fd < 0) {
8068 + ret = errno;
8069 + mpsslog("Failed to open sysfs entry '%s': %s\n",
8070 + filename, strerror(errno));
8071 + goto done;
8072 + }
8073 +
8074 + if (!oldvalue || strcmp(value, oldvalue)) {
8075 + if (write(fd, value, strlen(value)) < 0) {
8076 + ret = errno;
8077 + mpsslog("Failed to write new sysfs entry '%s': %s\n",
8078 + filename, strerror(errno));
8079 + }
8080 + }
8081 + close(fd);
8082 +done:
8083 + if (oldvalue)
8084 + free(oldvalue);
8085 + return ret;
8086 +}
8087 diff --git a/samples/seccomp/bpf-helper.h b/samples/seccomp/bpf-helper.h
8088 index 38ee70f3cd5b..1d8de9edd858 100644
8089 --- a/samples/seccomp/bpf-helper.h
8090 +++ b/samples/seccomp/bpf-helper.h
8091 @@ -138,7 +138,7 @@ union arg64 {
8092 #define ARG_32(idx) \
8093 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, LO_ARG(idx))
8094
8095 -/* Loads hi into A and lo in X */
8096 +/* Loads lo into M[0] and hi into M[1] and A */
8097 #define ARG_64(idx) \
8098 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, LO_ARG(idx)), \
8099 BPF_STMT(BPF_ST, 0), /* lo -> M[0] */ \
8100 @@ -153,88 +153,107 @@ union arg64 {
8101 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (value), 1, 0), \
8102 jt
8103
8104 -/* Checks the lo, then swaps to check the hi. A=lo,X=hi */
8105 +#define JA32(value, jt) \
8106 + BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, (value), 0, 1), \
8107 + jt
8108 +
8109 +#define JGE32(value, jt) \
8110 + BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (value), 0, 1), \
8111 + jt
8112 +
8113 +#define JGT32(value, jt) \
8114 + BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (value), 0, 1), \
8115 + jt
8116 +
8117 +#define JLE32(value, jt) \
8118 + BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (value), 1, 0), \
8119 + jt
8120 +
8121 +#define JLT32(value, jt) \
8122 + BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (value), 1, 0), \
8123 + jt
8124 +
8125 +/*
8126 + * All the JXX64 checks assume lo is saved in M[0] and hi is saved in both
8127 + * A and M[1]. This invariant is kept by restoring A if necessary.
8128 + */
8129 #define JEQ64(lo, hi, jt) \
8130 + /* if (hi != arg.hi) goto NOMATCH; */ \
8131 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 5), \
8132 BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
8133 + /* if (lo != arg.lo) goto NOMATCH; */ \
8134 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (lo), 0, 2), \
8135 - BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
8136 + BPF_STMT(BPF_LD+BPF_MEM, 1), \
8137 jt, \
8138 - BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
8139 + BPF_STMT(BPF_LD+BPF_MEM, 1)
8140
8141 #define JNE64(lo, hi, jt) \
8142 - BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 5, 0), \
8143 - BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
8144 + /* if (hi != arg.hi) goto MATCH; */ \
8145 + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 3), \
8146 + BPF_STMT(BPF_LD+BPF_MEM, 0), \
8147 + /* if (lo != arg.lo) goto MATCH; */ \
8148 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (lo), 2, 0), \
8149 - BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
8150 + BPF_STMT(BPF_LD+BPF_MEM, 1), \
8151 jt, \
8152 - BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
8153 -
8154 -#define JA32(value, jt) \
8155 - BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, (value), 0, 1), \
8156 - jt
8157 + BPF_STMT(BPF_LD+BPF_MEM, 1)
8158
8159 #define JA64(lo, hi, jt) \
8160 + /* if (hi & arg.hi) goto MATCH; */ \
8161 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, (hi), 3, 0), \
8162 - BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
8163 + BPF_STMT(BPF_LD+BPF_MEM, 0), \
8164 + /* if (lo & arg.lo) goto MATCH; */ \
8165 BPF_JUMP(BPF_JMP+BPF_JSET+BPF_K, (lo), 0, 2), \
8166 - BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
8167 + BPF_STMT(BPF_LD+BPF_MEM, 1), \
8168 jt, \
8169 - BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
8170 + BPF_STMT(BPF_LD+BPF_MEM, 1)
8171
8172 -#define JGE32(value, jt) \
8173 - BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (value), 0, 1), \
8174 - jt
8175 -
8176 -#define JLT32(value, jt) \
8177 - BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (value), 1, 0), \
8178 - jt
8179 -
8180 -/* Shortcut checking if hi > arg.hi. */
8181 #define JGE64(lo, hi, jt) \
8182 + /* if (hi > arg.hi) goto MATCH; */ \
8183 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (hi), 4, 0), \
8184 + /* if (hi != arg.hi) goto NOMATCH; */ \
8185 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 5), \
8186 - BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
8187 + BPF_STMT(BPF_LD+BPF_MEM, 0), \
8188 + /* if (lo >= arg.lo) goto MATCH; */ \
8189 BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (lo), 0, 2), \
8190 - BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
8191 - jt, \
8192 - BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
8193 -
8194 -#define JLT64(lo, hi, jt) \
8195 - BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (hi), 0, 4), \
8196 - BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 5), \
8197 - BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
8198 - BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (lo), 2, 0), \
8199 - BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
8200 + BPF_STMT(BPF_LD+BPF_MEM, 1), \
8201 jt, \
8202 - BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
8203 + BPF_STMT(BPF_LD+BPF_MEM, 1)
8204
8205 -#define JGT32(value, jt) \
8206 - BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (value), 0, 1), \
8207 - jt
8208 -
8209 -#define JLE32(value, jt) \
8210 - BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (value), 1, 0), \
8211 - jt
8212 -
8213 -/* Check hi > args.hi first, then do the GE checking */
8214 #define JGT64(lo, hi, jt) \
8215 + /* if (hi > arg.hi) goto MATCH; */ \
8216 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (hi), 4, 0), \
8217 + /* if (hi != arg.hi) goto NOMATCH; */ \
8218 BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 5), \
8219 - BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
8220 + BPF_STMT(BPF_LD+BPF_MEM, 0), \
8221 + /* if (lo > arg.lo) goto MATCH; */ \
8222 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (lo), 0, 2), \
8223 - BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
8224 + BPF_STMT(BPF_LD+BPF_MEM, 1), \
8225 jt, \
8226 - BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
8227 + BPF_STMT(BPF_LD+BPF_MEM, 1)
8228
8229 #define JLE64(lo, hi, jt) \
8230 - BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (hi), 6, 0), \
8231 - BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 3), \
8232 - BPF_STMT(BPF_LD+BPF_MEM, 0), /* swap in lo */ \
8233 + /* if (hi < arg.hi) goto MATCH; */ \
8234 + BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (hi), 0, 4), \
8235 + /* if (hi != arg.hi) goto NOMATCH; */ \
8236 + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 5), \
8237 + BPF_STMT(BPF_LD+BPF_MEM, 0), \
8238 + /* if (lo <= arg.lo) goto MATCH; */ \
8239 BPF_JUMP(BPF_JMP+BPF_JGT+BPF_K, (lo), 2, 0), \
8240 - BPF_STMT(BPF_LD+BPF_MEM, 1), /* passed: swap hi back in */ \
8241 + BPF_STMT(BPF_LD+BPF_MEM, 1), \
8242 + jt, \
8243 + BPF_STMT(BPF_LD+BPF_MEM, 1)
8244 +
8245 +#define JLT64(lo, hi, jt) \
8246 + /* if (hi < arg.hi) goto MATCH; */ \
8247 + BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (hi), 0, 4), \
8248 + /* if (hi != arg.hi) goto NOMATCH; */ \
8249 + BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, (hi), 0, 5), \
8250 + BPF_STMT(BPF_LD+BPF_MEM, 0), \
8251 + /* if (lo < arg.lo) goto MATCH; */ \
8252 + BPF_JUMP(BPF_JMP+BPF_JGE+BPF_K, (lo), 2, 0), \
8253 + BPF_STMT(BPF_LD+BPF_MEM, 1), \
8254 jt, \
8255 - BPF_STMT(BPF_LD+BPF_MEM, 1) /* failed: swap hi back in */
8256 + BPF_STMT(BPF_LD+BPF_MEM, 1)
8257
8258 #define LOAD_SYSCALL_NR \
8259 BPF_STMT(BPF_LD+BPF_W+BPF_ABS, \
8260 diff --git a/sound/core/seq/seq_fifo.c b/sound/core/seq/seq_fifo.c
8261 index 1d5acbe0c08b..86240d02b530 100644
8262 --- a/sound/core/seq/seq_fifo.c
8263 +++ b/sound/core/seq/seq_fifo.c
8264 @@ -135,6 +135,7 @@ int snd_seq_fifo_event_in(struct snd_seq_fifo *f,
8265 f->tail = cell;
8266 if (f->head == NULL)
8267 f->head = cell;
8268 + cell->next = NULL;
8269 f->cells++;
8270 spin_unlock_irqrestore(&f->lock, flags);
8271
8272 @@ -214,6 +215,8 @@ void snd_seq_fifo_cell_putback(struct snd_seq_fifo *f,
8273 spin_lock_irqsave(&f->lock, flags);
8274 cell->next = f->head;
8275 f->head = cell;
8276 + if (!f->tail)
8277 + f->tail = cell;
8278 f->cells++;
8279 spin_unlock_irqrestore(&f->lock, flags);
8280 }
8281 diff --git a/sound/core/timer.c b/sound/core/timer.c
8282 index ae4ea2e2e7fe..278a332f97bd 100644
8283 --- a/sound/core/timer.c
8284 +++ b/sound/core/timer.c
8285 @@ -1700,9 +1700,21 @@ static int snd_timer_user_params(struct file *file,
8286 return -EBADFD;
8287 if (copy_from_user(&params, _params, sizeof(params)))
8288 return -EFAULT;
8289 - if (!(t->hw.flags & SNDRV_TIMER_HW_SLAVE) && params.ticks < 1) {
8290 - err = -EINVAL;
8291 - goto _end;
8292 + if (!(t->hw.flags & SNDRV_TIMER_HW_SLAVE)) {
8293 + u64 resolution;
8294 +
8295 + if (params.ticks < 1) {
8296 + err = -EINVAL;
8297 + goto _end;
8298 + }
8299 +
8300 + /* Don't allow resolution less than 1ms */
8301 + resolution = snd_timer_resolution(tu->timeri);
8302 + resolution *= params.ticks;
8303 + if (resolution < 1000000) {
8304 + err = -EINVAL;
8305 + goto _end;
8306 + }
8307 }
8308 if (params.queue_size > 0 &&
8309 (params.queue_size < 32 || params.queue_size > 1024)) {
8310 diff --git a/sound/pci/ctxfi/cthw20k1.c b/sound/pci/ctxfi/cthw20k1.c
8311 index 9667cbfb0ca2..ab4cdab5cfa5 100644
8312 --- a/sound/pci/ctxfi/cthw20k1.c
8313 +++ b/sound/pci/ctxfi/cthw20k1.c
8314 @@ -27,12 +27,6 @@
8315 #include "cthw20k1.h"
8316 #include "ct20k1reg.h"
8317
8318 -#if BITS_PER_LONG == 32
8319 -#define CT_XFI_DMA_MASK DMA_BIT_MASK(32) /* 32 bit PTE */
8320 -#else
8321 -#define CT_XFI_DMA_MASK DMA_BIT_MASK(64) /* 64 bit PTE */
8322 -#endif
8323 -
8324 struct hw20k1 {
8325 struct hw hw;
8326 spinlock_t reg_20k1_lock;
8327 @@ -1904,19 +1898,18 @@ static int hw_card_start(struct hw *hw)
8328 {
8329 int err;
8330 struct pci_dev *pci = hw->pci;
8331 + const unsigned int dma_bits = BITS_PER_LONG;
8332
8333 err = pci_enable_device(pci);
8334 if (err < 0)
8335 return err;
8336
8337 /* Set DMA transfer mask */
8338 - if (dma_set_mask(&pci->dev, CT_XFI_DMA_MASK) < 0 ||
8339 - dma_set_coherent_mask(&pci->dev, CT_XFI_DMA_MASK) < 0) {
8340 - dev_err(hw->card->dev,
8341 - "architecture does not support PCI busmaster DMA with mask 0x%llx\n",
8342 - CT_XFI_DMA_MASK);
8343 - err = -ENXIO;
8344 - goto error1;
8345 + if (dma_set_mask(&pci->dev, DMA_BIT_MASK(dma_bits))) {
8346 + dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(dma_bits));
8347 + } else {
8348 + dma_set_mask(&pci->dev, DMA_BIT_MASK(32));
8349 + dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32));
8350 }
8351
8352 if (!hw->io_base) {
8353 diff --git a/sound/pci/ctxfi/cthw20k2.c b/sound/pci/ctxfi/cthw20k2.c
8354 index 9dc2950e1ab7..d86678c2a957 100644
8355 --- a/sound/pci/ctxfi/cthw20k2.c
8356 +++ b/sound/pci/ctxfi/cthw20k2.c
8357 @@ -26,12 +26,6 @@
8358 #include "cthw20k2.h"
8359 #include "ct20k2reg.h"
8360
8361 -#if BITS_PER_LONG == 32
8362 -#define CT_XFI_DMA_MASK DMA_BIT_MASK(32) /* 32 bit PTE */
8363 -#else
8364 -#define CT_XFI_DMA_MASK DMA_BIT_MASK(64) /* 64 bit PTE */
8365 -#endif
8366 -
8367 struct hw20k2 {
8368 struct hw hw;
8369 /* for i2c */
8370 @@ -2029,19 +2023,18 @@ static int hw_card_start(struct hw *hw)
8371 int err = 0;
8372 struct pci_dev *pci = hw->pci;
8373 unsigned int gctl;
8374 + const unsigned int dma_bits = BITS_PER_LONG;
8375
8376 err = pci_enable_device(pci);
8377 if (err < 0)
8378 return err;
8379
8380 /* Set DMA transfer mask */
8381 - if (dma_set_mask(&pci->dev, CT_XFI_DMA_MASK) < 0 ||
8382 - dma_set_coherent_mask(&pci->dev, CT_XFI_DMA_MASK) < 0) {
8383 - dev_err(hw->card->dev,
8384 - "architecture does not support PCI busmaster DMA with mask 0x%llx\n",
8385 - CT_XFI_DMA_MASK);
8386 - err = -ENXIO;
8387 - goto error1;
8388 + if (!dma_set_mask(&pci->dev, DMA_BIT_MASK(dma_bits))) {
8389 + dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(dma_bits));
8390 + } else {
8391 + dma_set_mask(&pci->dev, DMA_BIT_MASK(32));
8392 + dma_set_coherent_mask(&pci->dev, DMA_BIT_MASK(32));
8393 }
8394
8395 if (!hw->io_base) {
8396 diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
8397 index ad4a1e9a3ae1..8f3e5e9d8bdb 100644
8398 --- a/sound/pci/hda/hda_intel.c
8399 +++ b/sound/pci/hda/hda_intel.c
8400 @@ -2208,9 +2208,9 @@ static const struct pci_device_id azx_ids[] = {
8401 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
8402 /* Lewisburg */
8403 { PCI_DEVICE(0x8086, 0xa1f0),
8404 - .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
8405 + .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_SKYLAKE },
8406 { PCI_DEVICE(0x8086, 0xa270),
8407 - .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
8408 + .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_SKYLAKE },
8409 /* Lynx Point-LP */
8410 { PCI_DEVICE(0x8086, 0x9c20),
8411 .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_INTEL_PCH },
8412 diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
8413 index 00c50d58f108..cf0785ddbd14 100644
8414 --- a/sound/pci/hda/patch_realtek.c
8415 +++ b/sound/pci/hda/patch_realtek.c
8416 @@ -5560,6 +5560,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
8417 SND_PCI_QUIRK(0x1028, 0x0725, "Dell Inspiron 3162", ALC255_FIXUP_DELL_SPK_NOISE),
8418 SND_PCI_QUIRK(0x1028, 0x075b, "Dell XPS 13 9360", ALC256_FIXUP_DELL_XPS_13_HEADPHONE_NOISE),
8419 SND_PCI_QUIRK(0x1028, 0x075d, "Dell AIO", ALC298_FIXUP_SPK_VOLUME),
8420 + SND_PCI_QUIRK(0x1028, 0x0798, "Dell Inspiron 17 7000 Gaming", ALC256_FIXUP_DELL_INSPIRON_7559_SUBWOOFER),
8421 SND_PCI_QUIRK(0x1028, 0x164a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8422 SND_PCI_QUIRK(0x1028, 0x164b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
8423 SND_PCI_QUIRK(0x103c, 0x1586, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC2),
8424 @@ -5674,6 +5675,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
8425 SND_PCI_QUIRK(0x17aa, 0x2233, "Thinkpad", ALC292_FIXUP_TPT460),
8426 SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
8427 SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
8428 + SND_PCI_QUIRK(0x17aa, 0x3112, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
8429 SND_PCI_QUIRK(0x17aa, 0x3902, "Lenovo E50-80", ALC269_FIXUP_DMIC_THINKPAD_ACPI),
8430 SND_PCI_QUIRK(0x17aa, 0x3977, "IdeaPad S210", ALC283_FIXUP_INT_MIC),
8431 SND_PCI_QUIRK(0x17aa, 0x3978, "IdeaPad Y410P", ALC269_FIXUP_NO_SHUTUP),
8432 @@ -6047,6 +6049,12 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
8433 SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_DELL1_MIC_NO_PRESENCE,
8434 ALC298_STANDARD_PINS,
8435 {0x17, 0x90170150}),
8436 + SND_HDA_PIN_QUIRK(0x10ec0298, 0x1028, "Dell", ALC298_FIXUP_SPK_VOLUME,
8437 + {0x12, 0xb7a60140},
8438 + {0x13, 0xb7a60150},
8439 + {0x17, 0x90170110},
8440 + {0x1a, 0x03011020},
8441 + {0x21, 0x03211030}),
8442 {}
8443 };
8444