Merge 4.19.210 into android-4.19-stable
Changes in 4.19.210 net: mdio: introduce a shutdown method to mdio device drivers xen-netback: correct success/error reporting for the SKB-with-fraglist case sparc64: fix pci_iounmap() when CONFIG_PCI is not set ext2: fix sleeping in atomic bugs on error scsi: sd: Free scsi_disk device via put_device() usb: testusb: Fix for showing the connection speed usb: dwc2: check return value after calling platform_get_resource() selftests: be sure to make khdr before other targets scsi: ses: Retry failed Send/Receive Diagnostic commands tools/vm/page-types: remove dependency on opt_file for idle page tracking libata: Add ATA_HORKAGE_NO_NCQ_ON_ATI for Samsung 860 and 870 SSD. lib/timerqueue: Rely on rbtree semantics for next timer Linux 4.19.210 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ib6ae9d37c6e94c9a0d8f5875836fb8fdbef9ff70
This commit is contained in:
commit
0e38ed1a85
16 changed files with 112 additions and 52 deletions
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
|||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 209
|
||||
SUBLEVEL = 210
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
|
|
@ -19,8 +19,10 @@ void ioport_unmap(void __iomem *addr)
|
|||
EXPORT_SYMBOL(ioport_map);
|
||||
EXPORT_SYMBOL(ioport_unmap);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
void pci_iounmap(struct pci_dev *dev, void __iomem * addr)
|
||||
{
|
||||
/* nothing to do */
|
||||
}
|
||||
EXPORT_SYMBOL(pci_iounmap);
|
||||
#endif
|
||||
|
|
|
@ -2268,6 +2268,25 @@ static void ata_dev_config_ncq_prio(struct ata_device *dev)
|
|||
|
||||
}
|
||||
|
||||
static bool ata_dev_check_adapter(struct ata_device *dev,
|
||||
unsigned short vendor_id)
|
||||
{
|
||||
struct pci_dev *pcidev = NULL;
|
||||
struct device *parent_dev = NULL;
|
||||
|
||||
for (parent_dev = dev->tdev.parent; parent_dev != NULL;
|
||||
parent_dev = parent_dev->parent) {
|
||||
if (dev_is_pci(parent_dev)) {
|
||||
pcidev = to_pci_dev(parent_dev);
|
||||
if (pcidev->vendor == vendor_id)
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int ata_dev_config_ncq(struct ata_device *dev,
|
||||
char *desc, size_t desc_sz)
|
||||
{
|
||||
|
@ -2284,6 +2303,13 @@ static int ata_dev_config_ncq(struct ata_device *dev,
|
|||
snprintf(desc, desc_sz, "NCQ (not used)");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (dev->horkage & ATA_HORKAGE_NO_NCQ_ON_ATI &&
|
||||
ata_dev_check_adapter(dev, PCI_VENDOR_ID_ATI)) {
|
||||
snprintf(desc, desc_sz, "NCQ (not used)");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ap->flags & ATA_FLAG_NCQ) {
|
||||
hdepth = min(ap->scsi_host->can_queue, ATA_MAX_QUEUE);
|
||||
dev->flags |= ATA_DFLAG_NCQ;
|
||||
|
@ -4575,9 +4601,11 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
|||
{ "Samsung SSD 850*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM, },
|
||||
{ "Samsung SSD 860*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM, },
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM |
|
||||
ATA_HORKAGE_NO_NCQ_ON_ATI, },
|
||||
{ "Samsung SSD 870*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM, },
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM |
|
||||
ATA_HORKAGE_NO_NCQ_ON_ATI, },
|
||||
{ "FCCT*M500*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
||||
ATA_HORKAGE_ZERO_AFTER_TRIM, },
|
||||
|
||||
|
@ -6934,6 +6962,8 @@ static int __init ata_parse_force_one(char **cur,
|
|||
{ "ncq", .horkage_off = ATA_HORKAGE_NONCQ },
|
||||
{ "noncqtrim", .horkage_on = ATA_HORKAGE_NO_NCQ_TRIM },
|
||||
{ "ncqtrim", .horkage_off = ATA_HORKAGE_NO_NCQ_TRIM },
|
||||
{ "noncqati", .horkage_on = ATA_HORKAGE_NO_NCQ_ON_ATI },
|
||||
{ "ncqati", .horkage_off = ATA_HORKAGE_NO_NCQ_ON_ATI },
|
||||
{ "dump_id", .horkage_on = ATA_HORKAGE_DUMP_ID },
|
||||
{ "pio0", .xfer_mask = 1 << (ATA_SHIFT_PIO + 0) },
|
||||
{ "pio1", .xfer_mask = 1 << (ATA_SHIFT_PIO + 1) },
|
||||
|
|
|
@ -176,6 +176,16 @@ static int mdio_remove(struct device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void mdio_shutdown(struct device *dev)
|
||||
{
|
||||
struct mdio_device *mdiodev = to_mdio_device(dev);
|
||||
struct device_driver *drv = mdiodev->dev.driver;
|
||||
struct mdio_driver *mdiodrv = to_mdio_driver(drv);
|
||||
|
||||
if (mdiodrv->shutdown)
|
||||
mdiodrv->shutdown(mdiodev);
|
||||
}
|
||||
|
||||
/**
|
||||
* mdio_driver_register - register an mdio_driver with the MDIO layer
|
||||
* @new_driver: new mdio_driver to register
|
||||
|
@ -190,6 +200,7 @@ int mdio_driver_register(struct mdio_driver *drv)
|
|||
mdiodrv->driver.bus = &mdio_bus_type;
|
||||
mdiodrv->driver.probe = mdio_probe;
|
||||
mdiodrv->driver.remove = mdio_remove;
|
||||
mdiodrv->driver.shutdown = mdio_shutdown;
|
||||
|
||||
retval = driver_register(&mdiodrv->driver);
|
||||
if (retval) {
|
||||
|
|
|
@ -492,7 +492,7 @@ check_frags:
|
|||
* the header's copy failed, and they are
|
||||
* sharing a slot, send an error
|
||||
*/
|
||||
if (i == 0 && sharedslot)
|
||||
if (i == 0 && !first_shinfo && sharedslot)
|
||||
xenvif_idx_release(queue, pending_idx,
|
||||
XEN_NETIF_RSP_ERROR);
|
||||
else
|
||||
|
|
|
@ -3455,15 +3455,16 @@ static int sd_probe(struct device *dev)
|
|||
}
|
||||
|
||||
device_initialize(&sdkp->dev);
|
||||
sdkp->dev.parent = dev;
|
||||
sdkp->dev.parent = get_device(dev);
|
||||
sdkp->dev.class = &sd_disk_class;
|
||||
dev_set_name(&sdkp->dev, "%s", dev_name(dev));
|
||||
|
||||
error = device_add(&sdkp->dev);
|
||||
if (error)
|
||||
goto out_free_index;
|
||||
if (error) {
|
||||
put_device(&sdkp->dev);
|
||||
goto out;
|
||||
}
|
||||
|
||||
get_device(dev);
|
||||
dev_set_drvdata(dev, sdkp);
|
||||
|
||||
get_device(&sdkp->dev); /* prevent release before async_schedule */
|
||||
|
|
|
@ -103,9 +103,16 @@ static int ses_recv_diag(struct scsi_device *sdev, int page_code,
|
|||
0
|
||||
};
|
||||
unsigned char recv_page_code;
|
||||
unsigned int retries = SES_RETRIES;
|
||||
struct scsi_sense_hdr sshdr;
|
||||
|
||||
do {
|
||||
ret = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
|
||||
&sshdr, SES_TIMEOUT, 1, NULL);
|
||||
} while (ret > 0 && --retries && scsi_sense_valid(&sshdr) &&
|
||||
(sshdr.sense_key == NOT_READY ||
|
||||
(sshdr.sense_key == UNIT_ATTENTION && sshdr.asc == 0x29)));
|
||||
|
||||
ret = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
|
||||
NULL, SES_TIMEOUT, SES_RETRIES, NULL);
|
||||
if (unlikely(ret))
|
||||
return ret;
|
||||
|
||||
|
@ -137,9 +144,16 @@ static int ses_send_diag(struct scsi_device *sdev, int page_code,
|
|||
bufflen & 0xff,
|
||||
0
|
||||
};
|
||||
struct scsi_sense_hdr sshdr;
|
||||
unsigned int retries = SES_RETRIES;
|
||||
|
||||
do {
|
||||
result = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, buf, bufflen,
|
||||
&sshdr, SES_TIMEOUT, 1, NULL);
|
||||
} while (result > 0 && --retries && scsi_sense_valid(&sshdr) &&
|
||||
(sshdr.sense_key == NOT_READY ||
|
||||
(sshdr.sense_key == UNIT_ATTENTION && sshdr.asc == 0x29)));
|
||||
|
||||
result = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, buf, bufflen,
|
||||
NULL, SES_TIMEOUT, SES_RETRIES, NULL);
|
||||
if (result)
|
||||
sdev_printk(KERN_ERR, sdev, "SEND DIAGNOSTIC result: %8x\n",
|
||||
result);
|
||||
|
|
|
@ -5234,6 +5234,10 @@ int dwc2_hcd_init(struct dwc2_hsotg *hsotg)
|
|||
hcd->has_tt = 1;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
if (!res) {
|
||||
retval = -EINVAL;
|
||||
goto error1;
|
||||
}
|
||||
hcd->rsrc_start = res->start;
|
||||
hcd->rsrc_len = resource_size(res);
|
||||
|
||||
|
|
|
@ -48,10 +48,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
|
|||
struct ext2_sb_info *sbi = EXT2_SB(sb);
|
||||
|
||||
if (block_group >= sbi->s_groups_count) {
|
||||
ext2_error (sb, "ext2_get_group_desc",
|
||||
"block_group >= groups_count - "
|
||||
"block_group = %d, groups_count = %lu",
|
||||
block_group, sbi->s_groups_count);
|
||||
WARN(1, "block_group >= groups_count - "
|
||||
"block_group = %d, groups_count = %lu",
|
||||
block_group, sbi->s_groups_count);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
@ -59,10 +58,9 @@ struct ext2_group_desc * ext2_get_group_desc(struct super_block * sb,
|
|||
group_desc = block_group >> EXT2_DESC_PER_BLOCK_BITS(sb);
|
||||
offset = block_group & (EXT2_DESC_PER_BLOCK(sb) - 1);
|
||||
if (!sbi->s_group_desc[group_desc]) {
|
||||
ext2_error (sb, "ext2_get_group_desc",
|
||||
"Group descriptor not loaded - "
|
||||
"block_group = %d, group_desc = %lu, desc = %lu",
|
||||
block_group, group_desc, offset);
|
||||
WARN(1, "Group descriptor not loaded - "
|
||||
"block_group = %d, group_desc = %lu, desc = %lu",
|
||||
block_group, group_desc, offset);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -440,6 +440,7 @@ enum {
|
|||
ATA_HORKAGE_NOTRIM = (1 << 24), /* don't use TRIM */
|
||||
ATA_HORKAGE_MAX_SEC_1024 = (1 << 25), /* Limit max sects to 1024 */
|
||||
ATA_HORKAGE_MAX_TRIM_128M = (1 << 26), /* Limit max trim size to 128M */
|
||||
ATA_HORKAGE_NO_NCQ_ON_ATI = (1 << 27), /* Disable NCQ on ATI chipset */
|
||||
|
||||
/* DMA mask for user DMA control: User visible values; DO NOT
|
||||
renumber */
|
||||
|
|
|
@ -66,6 +66,9 @@ struct mdio_driver {
|
|||
|
||||
/* Clears up any memory if needed */
|
||||
void (*remove)(struct mdio_device *mdiodev);
|
||||
|
||||
/* Quiesces the device on system shutdown, turns off interrupts etc */
|
||||
void (*shutdown)(struct mdio_device *mdiodev);
|
||||
};
|
||||
#define to_mdio_driver(d) \
|
||||
container_of(to_mdio_common_driver(d), struct mdio_driver, mdiodrv)
|
||||
|
|
|
@ -12,8 +12,7 @@ struct timerqueue_node {
|
|||
};
|
||||
|
||||
struct timerqueue_head {
|
||||
struct rb_root head;
|
||||
struct timerqueue_node *next;
|
||||
struct rb_root_cached rb_root;
|
||||
};
|
||||
|
||||
|
||||
|
@ -29,13 +28,14 @@ extern struct timerqueue_node *timerqueue_iterate_next(
|
|||
*
|
||||
* @head: head of timerqueue
|
||||
*
|
||||
* Returns a pointer to the timer node that has the
|
||||
* earliest expiration time.
|
||||
* Returns a pointer to the timer node that has the earliest expiration time.
|
||||
*/
|
||||
static inline
|
||||
struct timerqueue_node *timerqueue_getnext(struct timerqueue_head *head)
|
||||
{
|
||||
return head->next;
|
||||
struct rb_node *leftmost = rb_first_cached(&head->rb_root);
|
||||
|
||||
return rb_entry(leftmost, struct timerqueue_node, node);
|
||||
}
|
||||
|
||||
static inline void timerqueue_init(struct timerqueue_node *node)
|
||||
|
@ -45,7 +45,6 @@ static inline void timerqueue_init(struct timerqueue_node *node)
|
|||
|
||||
static inline void timerqueue_init_head(struct timerqueue_head *head)
|
||||
{
|
||||
head->head = RB_ROOT;
|
||||
head->next = NULL;
|
||||
head->rb_root = RB_ROOT_CACHED;
|
||||
}
|
||||
#endif /* _LINUX_TIMERQUEUE_H */
|
||||
|
|
|
@ -39,9 +39,10 @@
|
|||
*/
|
||||
bool timerqueue_add(struct timerqueue_head *head, struct timerqueue_node *node)
|
||||
{
|
||||
struct rb_node **p = &head->head.rb_node;
|
||||
struct rb_node **p = &head->rb_root.rb_root.rb_node;
|
||||
struct rb_node *parent = NULL;
|
||||
struct timerqueue_node *ptr;
|
||||
struct timerqueue_node *ptr;
|
||||
bool leftmost = true;
|
||||
|
||||
/* Make sure we don't add nodes that are already added */
|
||||
WARN_ON_ONCE(!RB_EMPTY_NODE(&node->node));
|
||||
|
@ -49,19 +50,17 @@ bool timerqueue_add(struct timerqueue_head *head, struct timerqueue_node *node)
|
|||
while (*p) {
|
||||
parent = *p;
|
||||
ptr = rb_entry(parent, struct timerqueue_node, node);
|
||||
if (node->expires < ptr->expires)
|
||||
if (node->expires < ptr->expires) {
|
||||
p = &(*p)->rb_left;
|
||||
else
|
||||
} else {
|
||||
p = &(*p)->rb_right;
|
||||
leftmost = false;
|
||||
}
|
||||
}
|
||||
rb_link_node(&node->node, parent, p);
|
||||
rb_insert_color(&node->node, &head->head);
|
||||
rb_insert_color_cached(&node->node, &head->rb_root, leftmost);
|
||||
|
||||
if (!head->next || node->expires < head->next->expires) {
|
||||
head->next = node;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
return leftmost;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(timerqueue_add);
|
||||
|
||||
|
@ -78,15 +77,10 @@ bool timerqueue_del(struct timerqueue_head *head, struct timerqueue_node *node)
|
|||
{
|
||||
WARN_ON_ONCE(RB_EMPTY_NODE(&node->node));
|
||||
|
||||
/* update next pointer */
|
||||
if (head->next == node) {
|
||||
struct rb_node *rbn = rb_next(&node->node);
|
||||
|
||||
head->next = rb_entry_safe(rbn, struct timerqueue_node, node);
|
||||
}
|
||||
rb_erase(&node->node, &head->head);
|
||||
rb_erase_cached(&node->node, &head->rb_root);
|
||||
RB_CLEAR_NODE(&node->node);
|
||||
return head->next != NULL;
|
||||
|
||||
return !RB_EMPTY_ROOT(&head->rb_root.rb_root);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(timerqueue_del);
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@ include $(top_srcdir)/scripts/subarch.include
|
|||
ARCH ?= $(SUBARCH)
|
||||
|
||||
.PHONY: khdr
|
||||
.NOTPARALLEL:
|
||||
khdr:
|
||||
make ARCH=$(ARCH) -C $(top_srcdir) headers_install
|
||||
|
||||
|
|
|
@ -278,12 +278,6 @@ nomem:
|
|||
}
|
||||
|
||||
entry->ifnum = ifnum;
|
||||
|
||||
/* FIXME update USBDEVFS_CONNECTINFO so it tells about high speed etc */
|
||||
|
||||
fprintf(stderr, "%s speed\t%s\t%u\n",
|
||||
speed(entry->speed), entry->name, entry->ifnum);
|
||||
|
||||
entry->next = testdevs;
|
||||
testdevs = entry;
|
||||
return 0;
|
||||
|
@ -312,6 +306,14 @@ static void *handle_testdev (void *arg)
|
|||
return 0;
|
||||
}
|
||||
|
||||
status = ioctl(fd, USBDEVFS_GET_SPEED, NULL);
|
||||
if (status < 0)
|
||||
fprintf(stderr, "USBDEVFS_GET_SPEED failed %d\n", status);
|
||||
else
|
||||
dev->speed = status;
|
||||
fprintf(stderr, "%s speed\t%s\t%u\n",
|
||||
speed(dev->speed), dev->name, dev->ifnum);
|
||||
|
||||
restart:
|
||||
for (i = 0; i < TEST_CASES; i++) {
|
||||
if (dev->test != -1 && dev->test != i)
|
||||
|
|
|
@ -1341,7 +1341,7 @@ int main(int argc, char *argv[])
|
|||
if (opt_list && opt_list_mapcnt)
|
||||
kpagecount_fd = checked_open(PROC_KPAGECOUNT, O_RDONLY);
|
||||
|
||||
if (opt_mark_idle && opt_file)
|
||||
if (opt_mark_idle)
|
||||
page_idle_fd = checked_open(SYS_KERNEL_MM_PAGE_IDLE, O_RDWR);
|
||||
|
||||
if (opt_list && opt_pid)
|
||||
|
|
Loading…
Reference in a new issue