diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/bus/arm-ccn.c | 36 | ||||
-rw-r--r-- | drivers/gpu/drm/msm/msm_gem_submit.c | 27 | ||||
-rw-r--r-- | drivers/mtd/nand/davinci_nand.c | 3 | ||||
-rw-r--r-- | drivers/net/can/dev.c | 27 | ||||
-rw-r--r-- | drivers/net/vxlan.c | 2 | ||||
-rw-r--r-- | drivers/scsi/arcmsr/arcmsr_hba.c | 8 | ||||
-rw-r--r-- | drivers/scsi/megaraid/megaraid_sas.h | 2 | ||||
-rw-r--r-- | drivers/staging/lustre/lustre/llite/llite_lib.c | 2 |
8 files changed, 85 insertions, 22 deletions
diff --git a/drivers/bus/arm-ccn.c b/drivers/bus/arm-ccn.c index 27fd0dacad5f..4d523cfe51ce 100644 --- a/drivers/bus/arm-ccn.c +++ b/drivers/bus/arm-ccn.c | |||
@@ -183,6 +183,7 @@ struct arm_ccn { | |||
183 | struct arm_ccn_component *xp; | 183 | struct arm_ccn_component *xp; |
184 | 184 | ||
185 | struct arm_ccn_dt dt; | 185 | struct arm_ccn_dt dt; |
186 | int mn_id; | ||
186 | }; | 187 | }; |
187 | 188 | ||
188 | 189 | ||
@@ -322,6 +323,7 @@ struct arm_ccn_pmu_event { | |||
322 | static ssize_t arm_ccn_pmu_event_show(struct device *dev, | 323 | static ssize_t arm_ccn_pmu_event_show(struct device *dev, |
323 | struct device_attribute *attr, char *buf) | 324 | struct device_attribute *attr, char *buf) |
324 | { | 325 | { |
326 | struct arm_ccn *ccn = pmu_to_arm_ccn(dev_get_drvdata(dev)); | ||
325 | struct arm_ccn_pmu_event *event = container_of(attr, | 327 | struct arm_ccn_pmu_event *event = container_of(attr, |
326 | struct arm_ccn_pmu_event, attr); | 328 | struct arm_ccn_pmu_event, attr); |
327 | ssize_t res; | 329 | ssize_t res; |
@@ -336,6 +338,26 @@ static ssize_t arm_ccn_pmu_event_show(struct device *dev, | |||
336 | if (event->mask) | 338 | if (event->mask) |
337 | res += snprintf(buf + res, PAGE_SIZE - res, ",mask=0x%x", | 339 | res += snprintf(buf + res, PAGE_SIZE - res, ",mask=0x%x", |
338 | event->mask); | 340 | event->mask); |
341 | |||
342 | /* Arguments required by an event */ | ||
343 | switch (event->type) { | ||
344 | case CCN_TYPE_CYCLES: | ||
345 | break; | ||
346 | case CCN_TYPE_XP: | ||
347 | res += snprintf(buf + res, PAGE_SIZE - res, | ||
348 | ",xp=?,port=?,vc=?,dir=?"); | ||
349 | if (event->event == CCN_EVENT_WATCHPOINT) | ||
350 | res += snprintf(buf + res, PAGE_SIZE - res, | ||
351 | ",cmp_l=?,cmp_h=?,mask=?"); | ||
352 | break; | ||
353 | case CCN_TYPE_MN: | ||
354 | res += snprintf(buf + res, PAGE_SIZE - res, ",node=%d", ccn->mn_id); | ||
355 | break; | ||
356 | default: | ||
357 | res += snprintf(buf + res, PAGE_SIZE - res, ",node=?"); | ||
358 | break; | ||
359 | } | ||
360 | |||
339 | res += snprintf(buf + res, PAGE_SIZE - res, "\n"); | 361 | res += snprintf(buf + res, PAGE_SIZE - res, "\n"); |
340 | 362 | ||
341 | return res; | 363 | return res; |
@@ -360,9 +382,9 @@ static umode_t arm_ccn_pmu_events_is_visible(struct kobject *kobj, | |||
360 | } | 382 | } |
361 | 383 | ||
362 | static struct arm_ccn_pmu_event arm_ccn_pmu_events[] = { | 384 | static struct arm_ccn_pmu_event arm_ccn_pmu_events[] = { |
363 | CCN_EVENT_MN(eobarrier, "dir=0,vc=0,cmp_h=0x1c00", CCN_IDX_MASK_OPCODE), | 385 | CCN_EVENT_MN(eobarrier, "dir=1,vc=0,cmp_h=0x1c00", CCN_IDX_MASK_OPCODE), |
364 | CCN_EVENT_MN(ecbarrier, "dir=0,vc=0,cmp_h=0x1e00", CCN_IDX_MASK_OPCODE), | 386 | CCN_EVENT_MN(ecbarrier, "dir=1,vc=0,cmp_h=0x1e00", CCN_IDX_MASK_OPCODE), |
365 | CCN_EVENT_MN(dvmop, "dir=0,vc=0,cmp_h=0x2800", CCN_IDX_MASK_OPCODE), | 387 | CCN_EVENT_MN(dvmop, "dir=1,vc=0,cmp_h=0x2800", CCN_IDX_MASK_OPCODE), |
366 | CCN_EVENT_HNI(txdatflits, "dir=1,vc=3", CCN_IDX_MASK_ANY), | 388 | CCN_EVENT_HNI(txdatflits, "dir=1,vc=3", CCN_IDX_MASK_ANY), |
367 | CCN_EVENT_HNI(rxdatflits, "dir=0,vc=3", CCN_IDX_MASK_ANY), | 389 | CCN_EVENT_HNI(rxdatflits, "dir=0,vc=3", CCN_IDX_MASK_ANY), |
368 | CCN_EVENT_HNI(txreqflits, "dir=1,vc=0", CCN_IDX_MASK_ANY), | 390 | CCN_EVENT_HNI(txreqflits, "dir=1,vc=0", CCN_IDX_MASK_ANY), |
@@ -649,6 +671,12 @@ static int arm_ccn_pmu_event_init(struct perf_event *event) | |||
649 | 671 | ||
650 | /* Validate node/xp vs topology */ | 672 | /* Validate node/xp vs topology */ |
651 | switch (type) { | 673 | switch (type) { |
674 | case CCN_TYPE_MN: | ||
675 | if (node_xp != ccn->mn_id) { | ||
676 | dev_warn(ccn->dev, "Invalid MN ID %d!\n", node_xp); | ||
677 | return -EINVAL; | ||
678 | } | ||
679 | break; | ||
652 | case CCN_TYPE_XP: | 680 | case CCN_TYPE_XP: |
653 | if (node_xp >= ccn->num_xps) { | 681 | if (node_xp >= ccn->num_xps) { |
654 | dev_warn(ccn->dev, "Invalid XP ID %d!\n", node_xp); | 682 | dev_warn(ccn->dev, "Invalid XP ID %d!\n", node_xp); |
@@ -1214,6 +1242,8 @@ static int arm_ccn_init_nodes(struct arm_ccn *ccn, int region, | |||
1214 | 1242 | ||
1215 | switch (type) { | 1243 | switch (type) { |
1216 | case CCN_TYPE_MN: | 1244 | case CCN_TYPE_MN: |
1245 | ccn->mn_id = id; | ||
1246 | return 0; | ||
1217 | case CCN_TYPE_DT: | 1247 | case CCN_TYPE_DT: |
1218 | return 0; | 1248 | return 0; |
1219 | case CCN_TYPE_XP: | 1249 | case CCN_TYPE_XP: |
diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index cd0554f68316..4ff8c334e7c8 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c | |||
@@ -55,6 +55,14 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev, | |||
55 | return submit; | 55 | return submit; |
56 | } | 56 | } |
57 | 57 | ||
58 | static inline unsigned long __must_check | ||
59 | copy_from_user_inatomic(void *to, const void __user *from, unsigned long n) | ||
60 | { | ||
61 | if (access_ok(VERIFY_READ, from, n)) | ||
62 | return __copy_from_user_inatomic(to, from, n); | ||
63 | return -EFAULT; | ||
64 | } | ||
65 | |||
58 | static int submit_lookup_objects(struct msm_gem_submit *submit, | 66 | static int submit_lookup_objects(struct msm_gem_submit *submit, |
59 | struct drm_msm_gem_submit *args, struct drm_file *file) | 67 | struct drm_msm_gem_submit *args, struct drm_file *file) |
60 | { | 68 | { |
@@ -62,6 +70,7 @@ static int submit_lookup_objects(struct msm_gem_submit *submit, | |||
62 | int ret = 0; | 70 | int ret = 0; |
63 | 71 | ||
64 | spin_lock(&file->table_lock); | 72 | spin_lock(&file->table_lock); |
73 | pagefault_disable(); | ||
65 | 74 | ||
66 | for (i = 0; i < args->nr_bos; i++) { | 75 | for (i = 0; i < args->nr_bos; i++) { |
67 | struct drm_msm_gem_submit_bo submit_bo; | 76 | struct drm_msm_gem_submit_bo submit_bo; |
@@ -70,10 +79,15 @@ static int submit_lookup_objects(struct msm_gem_submit *submit, | |||
70 | void __user *userptr = | 79 | void __user *userptr = |
71 | to_user_ptr(args->bos + (i * sizeof(submit_bo))); | 80 | to_user_ptr(args->bos + (i * sizeof(submit_bo))); |
72 | 81 | ||
73 | ret = copy_from_user(&submit_bo, userptr, sizeof(submit_bo)); | 82 | ret = copy_from_user_inatomic(&submit_bo, userptr, sizeof(submit_bo)); |
74 | if (ret) { | 83 | if (unlikely(ret)) { |
75 | ret = -EFAULT; | 84 | pagefault_enable(); |
76 | goto out_unlock; | 85 | spin_unlock(&file->table_lock); |
86 | ret = copy_from_user(&submit_bo, userptr, sizeof(submit_bo)); | ||
87 | if (ret) | ||
88 | goto out; | ||
89 | spin_lock(&file->table_lock); | ||
90 | pagefault_disable(); | ||
77 | } | 91 | } |
78 | 92 | ||
79 | if (submit_bo.flags & ~MSM_SUBMIT_BO_FLAGS) { | 93 | if (submit_bo.flags & ~MSM_SUBMIT_BO_FLAGS) { |
@@ -113,9 +127,12 @@ static int submit_lookup_objects(struct msm_gem_submit *submit, | |||
113 | } | 127 | } |
114 | 128 | ||
115 | out_unlock: | 129 | out_unlock: |
116 | submit->nr_bos = i; | 130 | pagefault_enable(); |
117 | spin_unlock(&file->table_lock); | 131 | spin_unlock(&file->table_lock); |
118 | 132 | ||
133 | out: | ||
134 | submit->nr_bos = i; | ||
135 | |||
119 | return ret; | 136 | return ret; |
120 | } | 137 | } |
121 | 138 | ||
diff --git a/drivers/mtd/nand/davinci_nand.c b/drivers/mtd/nand/davinci_nand.c index 0f88e25123a0..4ead0cc5bac4 100644 --- a/drivers/mtd/nand/davinci_nand.c +++ b/drivers/mtd/nand/davinci_nand.c | |||
@@ -241,6 +241,9 @@ static void nand_davinci_hwctl_4bit(struct mtd_info *mtd, int mode) | |||
241 | unsigned long flags; | 241 | unsigned long flags; |
242 | u32 val; | 242 | u32 val; |
243 | 243 | ||
244 | /* Reset ECC hardware */ | ||
245 | davinci_nand_readl(info, NAND_4BIT_ECC1_OFFSET); | ||
246 | |||
244 | spin_lock_irqsave(&davinci_nand_lock, flags); | 247 | spin_lock_irqsave(&davinci_nand_lock, flags); |
245 | 248 | ||
246 | /* Start 4-bit ECC calculation for read/write */ | 249 | /* Start 4-bit ECC calculation for read/write */ |
diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c index ad535a854e5c..eab132778e67 100644 --- a/drivers/net/can/dev.c +++ b/drivers/net/can/dev.c | |||
@@ -21,6 +21,7 @@ | |||
21 | #include <linux/slab.h> | 21 | #include <linux/slab.h> |
22 | #include <linux/netdevice.h> | 22 | #include <linux/netdevice.h> |
23 | #include <linux/if_arp.h> | 23 | #include <linux/if_arp.h> |
24 | #include <linux/workqueue.h> | ||
24 | #include <linux/can.h> | 25 | #include <linux/can.h> |
25 | #include <linux/can/dev.h> | 26 | #include <linux/can/dev.h> |
26 | #include <linux/can/skb.h> | 27 | #include <linux/can/skb.h> |
@@ -471,9 +472,8 @@ EXPORT_SYMBOL_GPL(can_free_echo_skb); | |||
471 | /* | 472 | /* |
472 | * CAN device restart for bus-off recovery | 473 | * CAN device restart for bus-off recovery |
473 | */ | 474 | */ |
474 | static void can_restart(unsigned long data) | 475 | static void can_restart(struct net_device *dev) |
475 | { | 476 | { |
476 | struct net_device *dev = (struct net_device *)data; | ||
477 | struct can_priv *priv = netdev_priv(dev); | 477 | struct can_priv *priv = netdev_priv(dev); |
478 | struct net_device_stats *stats = &dev->stats; | 478 | struct net_device_stats *stats = &dev->stats; |
479 | struct sk_buff *skb; | 479 | struct sk_buff *skb; |
@@ -513,6 +513,14 @@ restart: | |||
513 | netdev_err(dev, "Error %d during restart", err); | 513 | netdev_err(dev, "Error %d during restart", err); |
514 | } | 514 | } |
515 | 515 | ||
516 | static void can_restart_work(struct work_struct *work) | ||
517 | { | ||
518 | struct delayed_work *dwork = to_delayed_work(work); | ||
519 | struct can_priv *priv = container_of(dwork, struct can_priv, restart_work); | ||
520 | |||
521 | can_restart(priv->dev); | ||
522 | } | ||
523 | |||
516 | int can_restart_now(struct net_device *dev) | 524 | int can_restart_now(struct net_device *dev) |
517 | { | 525 | { |
518 | struct can_priv *priv = netdev_priv(dev); | 526 | struct can_priv *priv = netdev_priv(dev); |
@@ -526,8 +534,8 @@ int can_restart_now(struct net_device *dev) | |||
526 | if (priv->state != CAN_STATE_BUS_OFF) | 534 | if (priv->state != CAN_STATE_BUS_OFF) |
527 | return -EBUSY; | 535 | return -EBUSY; |
528 | 536 | ||
529 | /* Runs as soon as possible in the timer context */ | 537 | cancel_delayed_work_sync(&priv->restart_work); |
530 | mod_timer(&priv->restart_timer, jiffies); | 538 | can_restart(dev); |
531 | 539 | ||
532 | return 0; | 540 | return 0; |
533 | } | 541 | } |
@@ -548,8 +556,8 @@ void can_bus_off(struct net_device *dev) | |||
548 | netif_carrier_off(dev); | 556 | netif_carrier_off(dev); |
549 | 557 | ||
550 | if (priv->restart_ms) | 558 | if (priv->restart_ms) |
551 | mod_timer(&priv->restart_timer, | 559 | schedule_delayed_work(&priv->restart_work, |
552 | jiffies + (priv->restart_ms * HZ) / 1000); | 560 | msecs_to_jiffies(priv->restart_ms)); |
553 | } | 561 | } |
554 | EXPORT_SYMBOL_GPL(can_bus_off); | 562 | EXPORT_SYMBOL_GPL(can_bus_off); |
555 | 563 | ||
@@ -658,6 +666,7 @@ struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max) | |||
658 | return NULL; | 666 | return NULL; |
659 | 667 | ||
660 | priv = netdev_priv(dev); | 668 | priv = netdev_priv(dev); |
669 | priv->dev = dev; | ||
661 | 670 | ||
662 | if (echo_skb_max) { | 671 | if (echo_skb_max) { |
663 | priv->echo_skb_max = echo_skb_max; | 672 | priv->echo_skb_max = echo_skb_max; |
@@ -667,7 +676,7 @@ struct net_device *alloc_candev(int sizeof_priv, unsigned int echo_skb_max) | |||
667 | 676 | ||
668 | priv->state = CAN_STATE_STOPPED; | 677 | priv->state = CAN_STATE_STOPPED; |
669 | 678 | ||
670 | init_timer(&priv->restart_timer); | 679 | INIT_DELAYED_WORK(&priv->restart_work, can_restart_work); |
671 | 680 | ||
672 | return dev; | 681 | return dev; |
673 | } | 682 | } |
@@ -748,8 +757,6 @@ int open_candev(struct net_device *dev) | |||
748 | if (!netif_carrier_ok(dev)) | 757 | if (!netif_carrier_ok(dev)) |
749 | netif_carrier_on(dev); | 758 | netif_carrier_on(dev); |
750 | 759 | ||
751 | setup_timer(&priv->restart_timer, can_restart, (unsigned long)dev); | ||
752 | |||
753 | return 0; | 760 | return 0; |
754 | } | 761 | } |
755 | EXPORT_SYMBOL_GPL(open_candev); | 762 | EXPORT_SYMBOL_GPL(open_candev); |
@@ -764,7 +771,7 @@ void close_candev(struct net_device *dev) | |||
764 | { | 771 | { |
765 | struct can_priv *priv = netdev_priv(dev); | 772 | struct can_priv *priv = netdev_priv(dev); |
766 | 773 | ||
767 | del_timer_sync(&priv->restart_timer); | 774 | cancel_delayed_work_sync(&priv->restart_work); |
768 | can_flush_echo_skb(dev); | 775 | can_flush_echo_skb(dev); |
769 | } | 776 | } |
770 | EXPORT_SYMBOL_GPL(close_candev); | 777 | EXPORT_SYMBOL_GPL(close_candev); |
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 940f78e41993..d9e873c3a273 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
@@ -635,7 +635,7 @@ static struct sk_buff **vxlan_gro_receive(struct sk_buff **head, | |||
635 | } | 635 | } |
636 | } | 636 | } |
637 | 637 | ||
638 | pp = eth_gro_receive(head, skb); | 638 | pp = call_gro_receive(eth_gro_receive, head, skb); |
639 | 639 | ||
640 | out: | 640 | out: |
641 | skb_gro_remcsum_cleanup(skb, &grc); | 641 | skb_gro_remcsum_cleanup(skb, &grc); |
diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c index 2926295a936d..c9f87cdc85c1 100644 --- a/drivers/scsi/arcmsr/arcmsr_hba.c +++ b/drivers/scsi/arcmsr/arcmsr_hba.c | |||
@@ -2300,7 +2300,8 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, | |||
2300 | } | 2300 | } |
2301 | case ARCMSR_MESSAGE_WRITE_WQBUFFER: { | 2301 | case ARCMSR_MESSAGE_WRITE_WQBUFFER: { |
2302 | unsigned char *ver_addr; | 2302 | unsigned char *ver_addr; |
2303 | int32_t user_len, cnt2end; | 2303 | uint32_t user_len; |
2304 | int32_t cnt2end; | ||
2304 | uint8_t *pQbuffer, *ptmpuserbuffer; | 2305 | uint8_t *pQbuffer, *ptmpuserbuffer; |
2305 | ver_addr = kmalloc(ARCMSR_API_DATA_BUFLEN, GFP_ATOMIC); | 2306 | ver_addr = kmalloc(ARCMSR_API_DATA_BUFLEN, GFP_ATOMIC); |
2306 | if (!ver_addr) { | 2307 | if (!ver_addr) { |
@@ -2309,6 +2310,11 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, | |||
2309 | } | 2310 | } |
2310 | ptmpuserbuffer = ver_addr; | 2311 | ptmpuserbuffer = ver_addr; |
2311 | user_len = pcmdmessagefld->cmdmessage.Length; | 2312 | user_len = pcmdmessagefld->cmdmessage.Length; |
2313 | if (user_len > ARCMSR_API_DATA_BUFLEN) { | ||
2314 | retvalue = ARCMSR_MESSAGE_FAIL; | ||
2315 | kfree(ver_addr); | ||
2316 | goto message_out; | ||
2317 | } | ||
2312 | memcpy(ptmpuserbuffer, | 2318 | memcpy(ptmpuserbuffer, |
2313 | pcmdmessagefld->messagedatabuffer, user_len); | 2319 | pcmdmessagefld->messagedatabuffer, user_len); |
2314 | spin_lock_irqsave(&acb->wqbuffer_lock, flags); | 2320 | spin_lock_irqsave(&acb->wqbuffer_lock, flags); |
diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h index 14e5c7cea929..1fcd31c6b37b 100644 --- a/drivers/scsi/megaraid/megaraid_sas.h +++ b/drivers/scsi/megaraid/megaraid_sas.h | |||
@@ -1862,7 +1862,7 @@ struct megasas_instance_template { | |||
1862 | }; | 1862 | }; |
1863 | 1863 | ||
1864 | #define MEGASAS_IS_LOGICAL(scp) \ | 1864 | #define MEGASAS_IS_LOGICAL(scp) \ |
1865 | (scp->device->channel < MEGASAS_MAX_PD_CHANNELS) ? 0 : 1 | 1865 | ((scp->device->channel < MEGASAS_MAX_PD_CHANNELS) ? 0 : 1) |
1866 | 1866 | ||
1867 | #define MEGASAS_DEV_INDEX(inst, scp) \ | 1867 | #define MEGASAS_DEV_INDEX(inst, scp) \ |
1868 | ((scp->device->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + \ | 1868 | ((scp->device->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + \ |
diff --git a/drivers/staging/lustre/lustre/llite/llite_lib.c b/drivers/staging/lustre/lustre/llite/llite_lib.c index a27af7882170..d60425996948 100644 --- a/drivers/staging/lustre/lustre/llite/llite_lib.c +++ b/drivers/staging/lustre/lustre/llite/llite_lib.c | |||
@@ -1323,7 +1323,7 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr, bool hsm_import) | |||
1323 | attr->ia_valid |= ATTR_MTIME | ATTR_CTIME; | 1323 | attr->ia_valid |= ATTR_MTIME | ATTR_CTIME; |
1324 | } | 1324 | } |
1325 | 1325 | ||
1326 | /* POSIX: check before ATTR_*TIME_SET set (from inode_change_ok) */ | 1326 | /* POSIX: check before ATTR_*TIME_SET set (from setattr_prepare) */ |
1327 | if (attr->ia_valid & TIMES_SET_FLAGS) { | 1327 | if (attr->ia_valid & TIMES_SET_FLAGS) { |
1328 | if ((!uid_eq(current_fsuid(), inode->i_uid)) && | 1328 | if ((!uid_eq(current_fsuid(), inode->i_uid)) && |
1329 | !capable(CFS_CAP_FOWNER)) | 1329 | !capable(CFS_CAP_FOWNER)) |