aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/s390
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-12-11 17:27:06 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2014-12-11 17:27:06 -0500
commit70e71ca0af244f48a5dcf56dc435243792e3a495 (patch)
treef7d9c4c4d9a857a00043e9bf6aa2d6f533a34778 /drivers/s390
parentbae41e45b7400496b9bf0c70c6004419d9987819 (diff)
parent00c83b01d58068dfeb2e1351cca6fccf2a83fa8f (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Pull networking updates from David Miller: 1) New offloading infrastructure and example 'rocker' driver for offloading of switching and routing to hardware. This work was done by a large group of dedicated individuals, not limited to: Scott Feldman, Jiri Pirko, Thomas Graf, John Fastabend, Jamal Hadi Salim, Andy Gospodarek, Florian Fainelli, Roopa Prabhu 2) Start making the networking operate on IOV iterators instead of modifying iov objects in-situ during transfers. Thanks to Al Viro and Herbert Xu. 3) A set of new netlink interfaces for the TIPC stack, from Richard Alpe. 4) Remove unnecessary looping during ipv6 routing lookups, from Martin KaFai Lau. 5) Add PAUSE frame generation support to gianfar driver, from Matei Pavaluca. 6) Allow for larger reordering levels in TCP, which are easily achievable in the real world right now, from Eric Dumazet. 7) Add a variable of napi_schedule that doesn't need to disable cpu interrupts, from Eric Dumazet. 8) Use a doubly linked list to optimize neigh_parms_release(), from Nicolas Dichtel. 9) Various enhancements to the kernel BPF verifier, and allow eBPF programs to actually be attached to sockets. From Alexei Starovoitov. 10) Support TSO/LSO in sunvnet driver, from David L Stevens. 11) Allow controlling ECN usage via routing metrics, from Florian Westphal. 12) Remote checksum offload, from Tom Herbert. 13) Add split-header receive, BQL, and xmit_more support to amd-xgbe driver, from Thomas Lendacky. 14) Add MPLS support to openvswitch, from Simon Horman. 15) Support wildcard tunnel endpoints in ipv6 tunnels, from Steffen Klassert. 16) Do gro flushes on a per-device basis using a timer, from Eric Dumazet. This tries to resolve the conflicting goals between the desired handling of bulk vs. RPC-like traffic. 17) Allow userspace to ask for the CPU upon what a packet was received/steered, via SO_INCOMING_CPU. From Eric Dumazet. 18) Limit GSO packets to half the current congestion window, from Eric Dumazet. 19) Add a generic helper so that all drivers set their RSS keys in a consistent way, from Eric Dumazet. 20) Add xmit_more support to enic driver, from Govindarajulu Varadarajan. 21) Add VLAN packet scheduler action, from Jiri Pirko. 22) Support configurable RSS hash functions via ethtool, from Eyal Perry. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1820 commits) Fix race condition between vxlan_sock_add and vxlan_sock_release net/macb: fix compilation warning for print_hex_dump() called with skb->mac_header net/mlx4: Add support for A0 steering net/mlx4: Refactor QUERY_PORT net/mlx4_core: Add explicit error message when rule doesn't meet configuration net/mlx4: Add A0 hybrid steering net/mlx4: Add mlx4_bitmap zone allocator net/mlx4: Add a check if there are too many reserved QPs net/mlx4: Change QP allocation scheme net/mlx4_core: Use tasklet for user-space CQ completion events net/mlx4_core: Mask out host side virtualization features for guests net/mlx4_en: Set csum level for encapsulated packets be2net: Export tunnel offloads only when a VxLAN tunnel is created gianfar: Fix dma check map error when DMA_API_DEBUG is enabled cxgb4/csiostor: Don't use MASTER_MUST for fw_hello call net: fec: only enable mdio interrupt before phy device link up net: fec: clear all interrupt events to support i.MX6SX net: fec: reset fep link status in suspend function net: sock: fix access via invalid file descriptor net: introduce helper macro for_each_cmsghdr ...
Diffstat (limited to 'drivers/s390')
-rw-r--r--drivers/s390/net/Kconfig2
-rw-r--r--drivers/s390/net/ctcm_sysfs.c8
-rw-r--r--drivers/s390/net/lcs.c11
-rw-r--r--drivers/s390/net/qeth_core.h16
-rw-r--r--drivers/s390/net/qeth_core_main.c24
-rw-r--r--drivers/s390/net/qeth_l2_main.c2
-rw-r--r--drivers/s390/net/qeth_l3.h4
-rw-r--r--drivers/s390/net/qeth_l3_main.c10
8 files changed, 35 insertions, 42 deletions
diff --git a/drivers/s390/net/Kconfig b/drivers/s390/net/Kconfig
index 8b3f55991805..f1b5111bbaba 100644
--- a/drivers/s390/net/Kconfig
+++ b/drivers/s390/net/Kconfig
@@ -71,7 +71,7 @@ config CLAW
71config QETH 71config QETH
72 def_tristate y 72 def_tristate y
73 prompt "Gigabit Ethernet device support" 73 prompt "Gigabit Ethernet device support"
74 depends on CCW && NETDEVICES && IP_MULTICAST && QDIO 74 depends on CCW && NETDEVICES && IP_MULTICAST && QDIO && ETHERNET
75 help 75 help
76 This driver supports the IBM System z OSA Express adapters 76 This driver supports the IBM System z OSA Express adapters
77 in QDIO mode (all media types), HiperSockets interfaces and z/VM 77 in QDIO mode (all media types), HiperSockets interfaces and z/VM
diff --git a/drivers/s390/net/ctcm_sysfs.c b/drivers/s390/net/ctcm_sysfs.c
index 6bcfbbb20f04..47773c4d235a 100644
--- a/drivers/s390/net/ctcm_sysfs.c
+++ b/drivers/s390/net/ctcm_sysfs.c
@@ -44,8 +44,8 @@ static ssize_t ctcm_buffer_write(struct device *dev,
44 return -ENODEV; 44 return -ENODEV;
45 } 45 }
46 46
47 rc = sscanf(buf, "%u", &bs1); 47 rc = kstrtouint(buf, 0, &bs1);
48 if (rc != 1) 48 if (rc)
49 goto einval; 49 goto einval;
50 if (bs1 > CTCM_BUFSIZE_LIMIT) 50 if (bs1 > CTCM_BUFSIZE_LIMIT)
51 goto einval; 51 goto einval;
@@ -151,8 +151,8 @@ static ssize_t ctcm_proto_store(struct device *dev,
151 151
152 if (!priv) 152 if (!priv)
153 return -ENODEV; 153 return -ENODEV;
154 rc = sscanf(buf, "%d", &value); 154 rc = kstrtoint(buf, 0, &value);
155 if ((rc != 1) || 155 if (rc ||
156 !((value == CTCM_PROTO_S390) || 156 !((value == CTCM_PROTO_S390) ||
157 (value == CTCM_PROTO_LINUX) || 157 (value == CTCM_PROTO_LINUX) ||
158 (value == CTCM_PROTO_MPC) || 158 (value == CTCM_PROTO_MPC) ||
diff --git a/drivers/s390/net/lcs.c b/drivers/s390/net/lcs.c
index 0a7d87c372b8..92190aa20b9f 100644
--- a/drivers/s390/net/lcs.c
+++ b/drivers/s390/net/lcs.c
@@ -1943,15 +1943,16 @@ static ssize_t
1943lcs_portno_store (struct device *dev, struct device_attribute *attr, const char *buf, size_t count) 1943lcs_portno_store (struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
1944{ 1944{
1945 struct lcs_card *card; 1945 struct lcs_card *card;
1946 int value, rc; 1946 int rc;
1947 s16 value;
1947 1948
1948 card = dev_get_drvdata(dev); 1949 card = dev_get_drvdata(dev);
1949 1950
1950 if (!card) 1951 if (!card)
1951 return 0; 1952 return 0;
1952 1953
1953 rc = sscanf(buf, "%d", &value); 1954 rc = kstrtos16(buf, 0, &value);
1954 if (rc != 1) 1955 if (rc)
1955 return -EINVAL; 1956 return -EINVAL;
1956 /* TODO: sanity checks */ 1957 /* TODO: sanity checks */
1957 card->portno = value; 1958 card->portno = value;
@@ -2007,8 +2008,8 @@ lcs_timeout_store (struct device *dev, struct device_attribute *attr, const char
2007 if (!card) 2008 if (!card)
2008 return 0; 2009 return 0;
2009 2010
2010 rc = sscanf(buf, "%u", &value); 2011 rc = kstrtouint(buf, 0, &value);
2011 if (rc != 1) 2012 if (rc)
2012 return -EINVAL; 2013 return -EINVAL;
2013 /* TODO: sanity checks */ 2014 /* TODO: sanity checks */
2014 card->lancmd_timeout = value; 2015 card->lancmd_timeout = value;
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h
index e7646ce3d659..7a8bb9f78e76 100644
--- a/drivers/s390/net/qeth_core.h
+++ b/drivers/s390/net/qeth_core.h
@@ -380,11 +380,6 @@ enum qeth_header_ids {
380#define QETH_HDR_EXT_CSUM_TRANSP_REQ 0x20 380#define QETH_HDR_EXT_CSUM_TRANSP_REQ 0x20
381#define QETH_HDR_EXT_UDP 0x40 /*bit off for TCP*/ 381#define QETH_HDR_EXT_UDP 0x40 /*bit off for TCP*/
382 382
383static inline int qeth_is_last_sbale(struct qdio_buffer_element *sbale)
384{
385 return (sbale->eflags & SBAL_EFLAGS_LAST_ENTRY);
386}
387
388enum qeth_qdio_buffer_states { 383enum qeth_qdio_buffer_states {
389 /* 384 /*
390 * inbound: read out by driver; owned by hardware in order to be filled 385 * inbound: read out by driver; owned by hardware in order to be filled
@@ -843,13 +838,6 @@ struct qeth_trap_id {
843/*some helper functions*/ 838/*some helper functions*/
844#define QETH_CARD_IFNAME(card) (((card)->dev)? (card)->dev->name : "") 839#define QETH_CARD_IFNAME(card) (((card)->dev)? (card)->dev->name : "")
845 840
846static inline struct qeth_card *CARD_FROM_CDEV(struct ccw_device *cdev)
847{
848 struct qeth_card *card = dev_get_drvdata(&((struct ccwgroup_device *)
849 dev_get_drvdata(&cdev->dev))->dev);
850 return card;
851}
852
853static inline int qeth_get_micros(void) 841static inline int qeth_get_micros(void)
854{ 842{
855 return (int) (get_tod_clock() >> 12); 843 return (int) (get_tod_clock() >> 12);
@@ -894,7 +882,6 @@ const char *qeth_get_cardname_short(struct qeth_card *);
894int qeth_realloc_buffer_pool(struct qeth_card *, int); 882int qeth_realloc_buffer_pool(struct qeth_card *, int);
895int qeth_core_load_discipline(struct qeth_card *, enum qeth_discipline_id); 883int qeth_core_load_discipline(struct qeth_card *, enum qeth_discipline_id);
896void qeth_core_free_discipline(struct qeth_card *); 884void qeth_core_free_discipline(struct qeth_card *);
897void qeth_buffer_reclaim_work(struct work_struct *);
898 885
899/* exports for qeth discipline device drivers */ 886/* exports for qeth discipline device drivers */
900extern struct qeth_card_list_struct qeth_core_card_list; 887extern struct qeth_card_list_struct qeth_core_card_list;
@@ -913,7 +900,6 @@ int qeth_core_hardsetup_card(struct qeth_card *);
913void qeth_print_status_message(struct qeth_card *); 900void qeth_print_status_message(struct qeth_card *);
914int qeth_init_qdio_queues(struct qeth_card *); 901int qeth_init_qdio_queues(struct qeth_card *);
915int qeth_send_startlan(struct qeth_card *); 902int qeth_send_startlan(struct qeth_card *);
916int qeth_send_stoplan(struct qeth_card *);
917int qeth_send_ipa_cmd(struct qeth_card *, struct qeth_cmd_buffer *, 903int qeth_send_ipa_cmd(struct qeth_card *, struct qeth_cmd_buffer *,
918 int (*reply_cb) 904 int (*reply_cb)
919 (struct qeth_card *, struct qeth_reply *, unsigned long), 905 (struct qeth_card *, struct qeth_reply *, unsigned long),
@@ -954,8 +940,6 @@ int qeth_snmp_command(struct qeth_card *, char __user *);
954int qeth_query_oat_command(struct qeth_card *, char __user *); 940int qeth_query_oat_command(struct qeth_card *, char __user *);
955int qeth_query_switch_attributes(struct qeth_card *card, 941int qeth_query_switch_attributes(struct qeth_card *card,
956 struct qeth_switch_info *sw_info); 942 struct qeth_switch_info *sw_info);
957int qeth_query_card_info(struct qeth_card *card,
958 struct carrier_info *carrier_info);
959int qeth_send_control_data(struct qeth_card *, int, struct qeth_cmd_buffer *, 943int qeth_send_control_data(struct qeth_card *, int, struct qeth_cmd_buffer *,
960 int (*reply_cb)(struct qeth_card *, struct qeth_reply*, unsigned long), 944 int (*reply_cb)(struct qeth_card *, struct qeth_reply*, unsigned long),
961 void *reply_param); 945 void *reply_param);
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c
index fd22c811cbe1..f407e3763432 100644
--- a/drivers/s390/net/qeth_core_main.c
+++ b/drivers/s390/net/qeth_core_main.c
@@ -718,6 +718,13 @@ static int qeth_check_idx_response(struct qeth_card *card,
718 return 0; 718 return 0;
719} 719}
720 720
721static struct qeth_card *CARD_FROM_CDEV(struct ccw_device *cdev)
722{
723 struct qeth_card *card = dev_get_drvdata(&((struct ccwgroup_device *)
724 dev_get_drvdata(&cdev->dev))->dev);
725 return card;
726}
727
721static void qeth_setup_ccw(struct qeth_channel *channel, unsigned char *iob, 728static void qeth_setup_ccw(struct qeth_channel *channel, unsigned char *iob,
722 __u32 len) 729 __u32 len)
723{ 730{
@@ -1431,6 +1438,7 @@ static void qeth_start_kernel_thread(struct work_struct *work)
1431 } 1438 }
1432} 1439}
1433 1440
1441static void qeth_buffer_reclaim_work(struct work_struct *);
1434static int qeth_setup_card(struct qeth_card *card) 1442static int qeth_setup_card(struct qeth_card *card)
1435{ 1443{
1436 1444
@@ -3232,7 +3240,7 @@ int qeth_check_qdio_errors(struct qeth_card *card, struct qdio_buffer *buf,
3232} 3240}
3233EXPORT_SYMBOL_GPL(qeth_check_qdio_errors); 3241EXPORT_SYMBOL_GPL(qeth_check_qdio_errors);
3234 3242
3235void qeth_buffer_reclaim_work(struct work_struct *work) 3243static void qeth_buffer_reclaim_work(struct work_struct *work)
3236{ 3244{
3237 struct qeth_card *card = container_of(work, struct qeth_card, 3245 struct qeth_card *card = container_of(work, struct qeth_card,
3238 buffer_reclaim_work.work); 3246 buffer_reclaim_work.work);
@@ -4126,7 +4134,7 @@ static int qeth_setadp_promisc_mode_cb(struct qeth_card *card,
4126 4134
4127 qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd); 4135 qeth_default_setadapterparms_cb(card, reply, (unsigned long)cmd);
4128 if (cmd->hdr.return_code) { 4136 if (cmd->hdr.return_code) {
4129 QETH_CARD_TEXT_(card, 4, "prmrc%2.2x", cmd->hdr.return_code); 4137 QETH_CARD_TEXT_(card, 4, "prmrc%x", cmd->hdr.return_code);
4130 setparms->data.mode = SET_PROMISC_MODE_OFF; 4138 setparms->data.mode = SET_PROMISC_MODE_OFF;
4131 } 4139 }
4132 card->info.promisc_mode = setparms->data.mode; 4140 card->info.promisc_mode = setparms->data.mode;
@@ -4493,13 +4501,13 @@ static int qeth_snmp_command_cb(struct qeth_card *card,
4493 snmp = &cmd->data.setadapterparms.data.snmp; 4501 snmp = &cmd->data.setadapterparms.data.snmp;
4494 4502
4495 if (cmd->hdr.return_code) { 4503 if (cmd->hdr.return_code) {
4496 QETH_CARD_TEXT_(card, 4, "scer1%i", cmd->hdr.return_code); 4504 QETH_CARD_TEXT_(card, 4, "scer1%x", cmd->hdr.return_code);
4497 return 0; 4505 return 0;
4498 } 4506 }
4499 if (cmd->data.setadapterparms.hdr.return_code) { 4507 if (cmd->data.setadapterparms.hdr.return_code) {
4500 cmd->hdr.return_code = 4508 cmd->hdr.return_code =
4501 cmd->data.setadapterparms.hdr.return_code; 4509 cmd->data.setadapterparms.hdr.return_code;
4502 QETH_CARD_TEXT_(card, 4, "scer2%i", cmd->hdr.return_code); 4510 QETH_CARD_TEXT_(card, 4, "scer2%x", cmd->hdr.return_code);
4503 return 0; 4511 return 0;
4504 } 4512 }
4505 data_len = *((__u16 *)QETH_IPA_PDU_LEN_PDU1(data)); 4513 data_len = *((__u16 *)QETH_IPA_PDU_LEN_PDU1(data));
@@ -4717,7 +4725,7 @@ static int qeth_query_card_info_cb(struct qeth_card *card,
4717 return 0; 4725 return 0;
4718} 4726}
4719 4727
4720int qeth_query_card_info(struct qeth_card *card, 4728static int qeth_query_card_info(struct qeth_card *card,
4721 struct carrier_info *carrier_info) 4729 struct carrier_info *carrier_info)
4722{ 4730{
4723 struct qeth_cmd_buffer *iob; 4731 struct qeth_cmd_buffer *iob;
@@ -4730,7 +4738,6 @@ int qeth_query_card_info(struct qeth_card *card,
4730 return qeth_send_ipa_cmd(card, iob, qeth_query_card_info_cb, 4738 return qeth_send_ipa_cmd(card, iob, qeth_query_card_info_cb,
4731 (void *)carrier_info); 4739 (void *)carrier_info);
4732} 4740}
4733EXPORT_SYMBOL_GPL(qeth_query_card_info);
4734 4741
4735static inline int qeth_get_qdio_q_format(struct qeth_card *card) 4742static inline int qeth_get_qdio_q_format(struct qeth_card *card)
4736{ 4743{
@@ -5113,6 +5120,11 @@ static inline int qeth_create_skb_frag(struct qeth_qdio_buffer *qethbuffer,
5113 return 0; 5120 return 0;
5114} 5121}
5115 5122
5123static inline int qeth_is_last_sbale(struct qdio_buffer_element *sbale)
5124{
5125 return (sbale->eflags & SBAL_EFLAGS_LAST_ENTRY);
5126}
5127
5116struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card, 5128struct sk_buff *qeth_core_get_next_skb(struct qeth_card *card,
5117 struct qeth_qdio_buffer *qethbuffer, 5129 struct qeth_qdio_buffer *qethbuffer,
5118 struct qdio_buffer_element **__element, int *__offset, 5130 struct qdio_buffer_element **__element, int *__offset,
diff --git a/drivers/s390/net/qeth_l2_main.c b/drivers/s390/net/qeth_l2_main.c
index c2679bfe7f66..d02cd1a67943 100644
--- a/drivers/s390/net/qeth_l2_main.c
+++ b/drivers/s390/net/qeth_l2_main.c
@@ -1512,7 +1512,7 @@ static void qeth_bridge_state_change(struct qeth_card *card,
1512 1512
1513 QETH_CARD_TEXT(card, 2, "brstchng"); 1513 QETH_CARD_TEXT(card, 2, "brstchng");
1514 if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) { 1514 if (qports->entry_length != sizeof(struct qeth_sbp_port_entry)) {
1515 QETH_CARD_TEXT_(card, 2, "BPsz%.8d", qports->entry_length); 1515 QETH_CARD_TEXT_(card, 2, "BPsz%04x", qports->entry_length);
1516 return; 1516 return;
1517 } 1517 }
1518 extrasize = sizeof(struct qeth_sbp_port_entry) * qports->num_entries; 1518 extrasize = sizeof(struct qeth_sbp_port_entry) * qports->num_entries;
diff --git a/drivers/s390/net/qeth_l3.h b/drivers/s390/net/qeth_l3.h
index 29c1c00e3a0f..551a4b4c03fd 100644
--- a/drivers/s390/net/qeth_l3.h
+++ b/drivers/s390/net/qeth_l3.h
@@ -42,10 +42,6 @@ struct qeth_ipato_entry {
42}; 42};
43 43
44 44
45void qeth_l3_ipaddr4_to_string(const __u8 *, char *);
46int qeth_l3_string_to_ipaddr4(const char *, __u8 *);
47void qeth_l3_ipaddr6_to_string(const __u8 *, char *);
48int qeth_l3_string_to_ipaddr6(const char *, __u8 *);
49void qeth_l3_ipaddr_to_string(enum qeth_prot_versions, const __u8 *, char *); 45void qeth_l3_ipaddr_to_string(enum qeth_prot_versions, const __u8 *, char *);
50int qeth_l3_string_to_ipaddr(const char *, enum qeth_prot_versions, __u8 *); 46int qeth_l3_string_to_ipaddr(const char *, enum qeth_prot_versions, __u8 *);
51int qeth_l3_create_device_attributes(struct device *); 47int qeth_l3_create_device_attributes(struct device *);
diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
index afebb9709763..625227ad16ee 100644
--- a/drivers/s390/net/qeth_l3_main.c
+++ b/drivers/s390/net/qeth_l3_main.c
@@ -55,12 +55,12 @@ static int qeth_l3_isxdigit(char *buf)
55 return 1; 55 return 1;
56} 56}
57 57
58void qeth_l3_ipaddr4_to_string(const __u8 *addr, char *buf) 58static void qeth_l3_ipaddr4_to_string(const __u8 *addr, char *buf)
59{ 59{
60 sprintf(buf, "%i.%i.%i.%i", addr[0], addr[1], addr[2], addr[3]); 60 sprintf(buf, "%i.%i.%i.%i", addr[0], addr[1], addr[2], addr[3]);
61} 61}
62 62
63int qeth_l3_string_to_ipaddr4(const char *buf, __u8 *addr) 63static int qeth_l3_string_to_ipaddr4(const char *buf, __u8 *addr)
64{ 64{
65 int count = 0, rc = 0; 65 int count = 0, rc = 0;
66 unsigned int in[4]; 66 unsigned int in[4];
@@ -78,12 +78,12 @@ int qeth_l3_string_to_ipaddr4(const char *buf, __u8 *addr)
78 return 0; 78 return 0;
79} 79}
80 80
81void qeth_l3_ipaddr6_to_string(const __u8 *addr, char *buf) 81static void qeth_l3_ipaddr6_to_string(const __u8 *addr, char *buf)
82{ 82{
83 sprintf(buf, "%pI6", addr); 83 sprintf(buf, "%pI6", addr);
84} 84}
85 85
86int qeth_l3_string_to_ipaddr6(const char *buf, __u8 *addr) 86static int qeth_l3_string_to_ipaddr6(const char *buf, __u8 *addr)
87{ 87{
88 const char *end, *end_tmp, *start; 88 const char *end, *end_tmp, *start;
89 __u16 *in; 89 __u16 *in;
@@ -2502,7 +2502,7 @@ static int qeth_l3_arp_query(struct qeth_card *card, char __user *udata)
2502 rc = -EFAULT; 2502 rc = -EFAULT;
2503 goto free_and_out; 2503 goto free_and_out;
2504 } 2504 }
2505 QETH_CARD_TEXT_(card, 4, "qacts"); 2505 QETH_CARD_TEXT(card, 4, "qacts");
2506 } 2506 }
2507free_and_out: 2507free_and_out:
2508 kfree(qinfo.udata); 2508 kfree(qinfo.udata);